├── .gitignore
├── README.md
├── config
├── conf.yaml
└── ppocr_keys_v1.txt
├── demo.go
├── go.mod
├── go.sum
├── images
├── 0.jpg
├── result
│ ├── img_dir_result.jpg
│ ├── python_client_result.jpg
│ ├── python_vis_result.jpg
│ └── single_img_result.jpg
└── test.jpg
├── ocr
├── core.go
├── default_args.go
├── ocr_cls.go
├── ocr_det.go
├── ocr_rec.go
├── postprocess.go
├── preprocess.go
└── utils.go
├── paddle
├── common.go
├── config.go
├── predictor.go
└── tensor.go
└── paddle_c
├── README.md
└── include
└── paddle_c_api.h
/.gitignore:
--------------------------------------------------------------------------------
1 | paddle_c/paddle
2 | paddle_c/third_party
3 | paddle_c/version.txt
4 | inference/
5 | demo
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PaddleOCR-GO
2 |
3 | 本服务是[PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR)的golang部署版本。
4 |
5 | ## 1. 环境准备
6 |
7 | ### 运行环境
8 |
9 | - go: 1.14
10 | - OpenCV: 4.3.0
11 | - PaddlePaddle: 1.8.4
12 | - 编译环境:cmake 3.15.4 | gcc 4.8.5
13 | - 基于Centos 7.4运行环境编译,Windows请自行解决`OpenCV`和`PaddlePaddle`的编译问题
14 |
15 | *另外,以下编译以`.bashrc`个人环境变量配置文件,如果使用`zsh`,请自行更换为`.zshrc`*
16 |
17 | ### 1.1 安装golang
18 |
19 | 从官网下载[golang](https://golang.org/dl/),建议选择1.13版本以上进行安装。下载完成后,直接解压你需要的安装目录,并配置相关环境变量,此处以1.14版本为例。
20 |
21 | ```shell
22 | # 下载golang
23 | wget https://golang.org/dl/go1.14.10.linux-amd64.tar.gz
24 |
25 | # 解压到 /usr/local 目录下
26 | tar -xzvf go1.14.10.linux-amd64.tar.gz -C /usr/local
27 |
28 | # 配置GOROOT,即go的安装目录
29 | echo "export GOROOT=/usr/local/go" >> ~/.bashrc
30 | # 配置GOPATH,即go相关package的安装目录,可自定义一个目录
31 | echo "export GOPATH=$HOME/golang" >> ~/.bashrc
32 | # 配置GOPROXY,即go mod包管理器的下载代理,同时打开mod模式
33 | echo "export GO111MODULE=on" >> ~/.bashrc
34 | echo "export GOPROXY=https://mirrors.aliyun.com/goproxy/" >> ~/.bashrc
35 | source ~/.bashrc
36 | ```
37 |
38 | ### 1.2 编译OpenCV库
39 |
40 | go语言中,OpenCV的使用主要以[gocv](https://github.com/hybridgroup/gocv)包为主,gocv使用cgo调用OpenCV提供接口,因此还是需要编译OpenCV库。
41 |
42 | **踩坑指南之一:[gocv官方实现](https://github.com/hybridgroup/gocv)中,部分接口并没有与原版C++的OpenCV的API保持一致,导致图片处理结果会出现一定的数值偏差。为处理这种偏差,[该仓库](https://github.com/LKKlein/gocv)fork了一份gocv官方源码,并对部分这些不一致的API进行了修正,保证结果与其他语言的一致性。**
43 |
44 | 对于OpenCV的编译,gocv官方提供了[Makefile](https://github.com/LKKlein/gocv/blob/lk/Makefile),可以一键进行安装,具体安装步骤详见[官方指南](https://github.com/LKKlein/gocv/blob/lk/README_ORIGIN.md#ubuntulinux)。
45 |
46 | 这里提供逐步安装的方式,方便排查错误。
47 |
48 | - 下载并解压OpenCV-4.3.0和OpenCV-Contrib-4.3.0
49 |
50 | ```shell
51 | # 创建opencv安装目录
52 | mkdir -p ~/opencv
53 |
54 | # 下载OpenCV
55 | cd ~/opencv
56 | curl -sL https://github.com/opencv/opencv/archive/4.3.0.zip > opencv.zip
57 | unzip -q opencv.zip
58 | rm -rf opencv.zip
59 |
60 | # 下载OpenCV-Contrib
61 | curl -sL https://github.com/opencv/opencv_contrib/archive/4.3.0.zip > opencv-contrib.zip
62 | unzip -q opencv-contrib.zip
63 | rm -rf opencv-contrib.zip
64 | ```
65 |
66 | - 安装相关依赖
67 |
68 | ```shell
69 | sudo yum -y install pkgconfig cmake git gtk2-devel libpng-devel libjpeg-devel libtiff-devel tbb tbb-devel libdc1394-devel
70 | ```
71 |
72 | - 编译安装
73 |
74 | ```shell
75 | mkdir -p ~/.local/opencv-4.3.0
76 | cd ~/opencv/opencv-4.3.0
77 | mkdir build
78 | cd build
79 | cmake -D WITH_IPP=OFF \
80 | -D WITH_OPENGL=OFF \
81 | -D WITH_QT=OFF \
82 | -D BUILD_EXAMPLES=OFF \
83 | -D BUILD_TESTS=OFF \
84 | -D BUILD_PERF_TESTS=OFF \
85 | -D BUILD_opencv_java=OFF \
86 | -D BUILD_opencv_python=OFF \
87 | -D BUILD_opencv_python2=OFF \
88 | -D BUILD_opencv_python3=OFF \
89 | -D OPENCV_GENERATE_PKGCONFIG=ON \
90 | -D CMAKE_INSTALL_PREFIX=$HOME/.local/opencv-4.3.0 \
91 | -D OPENCV_ENABLE_NONFREE=ON \
92 | -D OPENCV_EXTRA_MODULES_PATH=$HOME/opencv/opencv_contrib-4.3.0/modules ..
93 | make -j8
94 | make install
95 | sudo ldconfig
96 | ```
97 |
98 | make进行编译时,可能出现因`xfeatures2d`的两个模块下载失败导致的编译失败,这里只需要手动下载这部分文件到`$HOME/opencv/opencv_contrib-4.3.0/modules/xfeatures2d/src`目录下,然后重新执行`make -j8`即可。这部分文件地址可参考[这里](https://github.com/opencv/opencv_contrib/issues/1301#issuecomment-447181426)给出的链接。
99 |
100 | - 配置环境变量
101 |
102 | ```shell
103 | echo "export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/.local/opencv-4.3.0/lib64/pkgconfig" >> ~/.bashrc
104 | echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/.local/opencv-4.3.0/lib64" >> ~/.bashrc
105 | source ~/.bashrc
106 | ```
107 |
108 | - 验证安装
109 |
110 | ```shell
111 | # 安装gocv包,先mod init
112 | go mod init opencv
113 | go get -u github.com/LKKlein/gocv
114 |
115 | # 验证安装结果
116 | cd $GOPATH/pkg/mod/github.com/!l!k!klein/gocv@v0.28.0
117 | go run ./cmd/version/main.go
118 |
119 | # 输出
120 | # gocv version: 0.28.0
121 | # opencv lib version: 4.3.0
122 | ```
123 |
124 | ### 1.3 编译PaddlePaddle的C语言API
125 |
126 | go语言只能通过cgo调用C语言API,而不能直接与C++进行交互,因此需要编译PaddlePaddle的C语言API。当然,也可以自己写C语言调用C++的代码和头文件,这样就可以直接使用PaddlePaddle提供的已编译的C++推理库,无需自己手动编译,详见[该仓库](https://github.com/LKKlein/paddleocr-go/tree/dev_cxx)。
127 |
128 | - 获取PaddlePaddle源代码
129 |
130 | ```shell
131 | cd ~
132 | git clone --recurse-submodules https://github.com/paddlepaddle/paddle
133 |
134 | # 切换到v1.8.4版本
135 | cd paddle
136 | git checkout v1.8.4
137 |
138 | # 目前版本无论单卡还是多卡都需要先安装nccl
139 | git clone https://github.com/NVIDIA/nccl.git
140 | make -j8
141 | make install
142 | ```
143 |
144 | - 编译Paddle源代码
145 |
146 | **踩坑指南之二:PaddlePaddle的C语言API实现有一个bug,即获取输入输出变量名时只能获取到第一个模型的变量名,后续模型都无法获取输入输出变量名,进而无法获取到模型输出,详情见[issue](https://github.com/PaddlePaddle/Paddle/issues/28309)。因此,编译前需要手动将`paddle/fluid/inference/capi/pd_predictor.cc`文件中`210行`与`215行`的`static`删除。**
147 |
148 | 在处理完该bug之后,才能进行后续编译。相关编译参数见[官方文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html#id12),注意部分参数需要相关依赖,请确保依赖完整再启用。
149 |
150 | ```shell
151 | # 创建c++推理库文件夹
152 | mkdir -p ~/paddle_inference
153 | export PADDLE_ROOT=`$HOME/paddle_inference`
154 |
155 | # 执行编译
156 | mkdir build
157 | cd build
158 | cmake -DFLUID_INFERENCE_INSTALL_DIR=$PADDLE_ROOT \
159 | -DWITH_CONTRIB=OFF \
160 | -DCMAKE_BUILD_TYPE=Release \
161 | -DWITH_PYTHON=OFF \
162 | -DWITH_MKL=ON \
163 | -DWITH_GPU=ON \
164 | -DON_INFER=ON \
165 | --WITH_MKLDNN=ON \
166 | --WITH_XBYAK=ON \
167 | --WITH_DSO=OFF ..
168 | make
169 | make inference_lib_dist
170 | ```
171 |
172 | 编译完成后,可以在`build/fluid_inference_c_install_dir`目录下,看到以下生成的文件
173 |
174 | ```
175 | build/fluid_inference_c_install_dir
176 | ├── paddle
177 | ├── third_party
178 | └── version.txt
179 | ```
180 |
181 | 其中`paddle`就是Paddle库的C语言预测API,`version.txt`中包含当前预测库的版本信息。
182 |
183 |
184 | ## 2. paddleocr-go预测库
185 |
186 | ### 2.1 安装paddleocr-go
187 |
188 | 直接执行安装命令
189 |
190 | ```shell
191 | go get -u github.com/LKKlein/paddleocr-go
192 | ```
193 |
194 | ### 2.2 相关使用API
195 |
196 | 在go中使用import引入包
197 |
198 | ```go
199 | import github.com/LKKlein/paddleocr-go/ocr
200 | ```
201 |
202 | - 预测结果结构体
203 |
204 | ```go
205 | type OCRText struct {
206 | BBox [][]int `json:"bbox"`
207 | Text string `json:"text"`
208 | Score float64 `json:"score"`
209 | }
210 | ```
211 |
212 | 一张图的OCR结果包含多个`OCRText`结果,每个结果包含预测框、预测文本、预测文本得分。
213 |
214 | - OCR预测类
215 |
216 |
217 | ```go
218 | func NewOCRSystem(confFile string, a map[string]interface{}) *OCRSystem
219 | ```
220 |
221 | `OCRSystem`是主要对外提供API的结构;
222 |
223 | `confFile`是yaml配置文件的路径,可在配置文件中修改相关预测参数,也可以传空字符串,这时会全部使用默认配置;
224 |
225 | `a`是可以在代码中直接定义的配置参数,优先级高于配置文件,会覆盖配置文件和默认配置的参数。
226 |
227 | - 单张图预测API
228 |
229 | ```go
230 | func (ocr *OCRSystem) PredictOneImage(img gocv.Mat) []OCRText
231 | ```
232 |
233 |
234 | - 图片文件夹预测API
235 |
236 | ```go
237 | func (ocr *OCRSystem) PredictDirImages(dirname string) map[string][]OCRText
238 | ```
239 |
240 | `dirname`图片文件夹的目录,默认会预测改目录下所有`jpg`和`png`图片,并返回每张图的预测结果。
241 |
242 | - OCR Server
243 |
244 | ```go
245 | func (ocr *OCRSystem) StartServer(port string)
246 | ```
247 |
248 | 开启OCR预测Server,开启后,使用`post`请求上传需要识别的图片至`http://$ip:$port/ocr`即可直接获取该图片上所有文本的识别结果。其中,`$ip`是开启服务的主机`ip`或`127.0.0.1`的本地ip, `$port`是传入的端口参数。
249 |
250 |
251 | ## 3. 预测demo
252 |
253 | ### 3.1 修改预测配置
254 |
255 | 当前给定的配置文件`config/conf.yaml`中,包含了默认的OCR预测配置参数,可根据个人需要更改相关参数。
256 |
257 | 比如,将`use_gpu`改为`false`,使用CPU执行预测;将`det_model_dir`, `rec_model_dir`, `cls_model_dir`都更改为自己的本地模型路径,也或者是更改字典`rec_char_dict_path`的路径。配置参数包含了预测引擎、检测模型、检测阈值、方向分类模型、识别模型及阈值的相关参数,具体参数的意义可参见[PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/whl.md#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E)。
258 |
259 | ### 3.2 编译预测demo
260 |
261 | - 下载`paddleocr-go`代码
262 |
263 | ```shell
264 | git clone https://github.com/LKKlein/paddleocr-go
265 | cd paddleocr-go
266 | ```
267 |
268 | - 准备paddle_c环境
269 |
270 | ```shell
271 | cp -r ~/paddle/build/fluid_inference_c_install_dir/* paddle_c/
272 | ```
273 |
274 | - 编译demo
275 |
276 | ```shell
277 | go build demo.go
278 | ```
279 |
280 | ### 3.3 执行预测demo
281 |
282 | 预测demo提供了三种预测方式,分别是单张图预测、文件夹批量预测、OCR Server预测。三者命令行优先级依次降低。
283 |
284 | #### 3.3.1 单张图预测
285 |
286 | ```shell
287 | ./demo --config config/conf.yaml --image images/test.jpg
288 | ```
289 |
290 | 执行完成,会输出以下内容:
291 |
292 |
293 |
294 | #### 3.3.2 文件夹批量预测
295 |
296 | ```shell
297 | ./demo --config config/conf.yaml --image_dir ./images
298 | ```
299 |
300 | 执行完成,会输出以下内容:
301 |
302 |
303 |
304 | #### 3.3.3 开启OCR Server
305 |
306 | ```shell
307 | ./demo --use_servering --port=18600
308 | ```
309 |
310 | 开启服务后,可以在其他客户端中通过`post`请求进行ocr预测。此处以`Python`客户端为例,如下所示
311 |
312 | ```python
313 | import requests
314 |
315 | files = {'image': open('images/test.jpg','rb')}
316 | url = "http://127.0.0.1:18600/ocr"
317 |
318 | r = requests.post(url, files=files)
319 | print(r.text)
320 | ```
321 |
322 | 执行完成可以得到以下结果
323 |
324 | 
325 |
326 | 最后,在Python中将上述结果可视化可以得到以下结果
327 |
328 | 
--------------------------------------------------------------------------------
/config/conf.yaml:
--------------------------------------------------------------------------------
1 | # params for prediction engine
2 | use_gpu: true
3 | ir_optim: true
4 | enable_mkldnn: false
5 | # use_zero_copy_run: true
6 | use_tensorrt: false
7 | num_cpu_threads: 6
8 | gpu_id: 0
9 | gpu_mem: 2000
10 |
11 | # params for text detector
12 | det_algorithm: "DB"
13 | det_model_dir: "https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar"
14 | det_max_side_len: 960
15 |
16 | # DB parmas
17 | det_db_thresh: 0.3
18 | det_db_box_thresh: 0.5
19 | det_db_unclip_ratio: 2.0
20 |
21 | # EAST parmas
22 | det_east_score_thresh: 0.8
23 | det_east_cover_thresh: 0.1
24 | det_east_nms_thresh: 0.2
25 |
26 | # params for text recognizer
27 | rec_algorithm: "CRNN"
28 | rec_model_dir: "https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar"
29 | rec_image_shape: [3, 32, 320]
30 | rec_char_type: "ch"
31 | rec_batch_num: 30
32 | max_text_length: 25
33 | rec_char_dict_path: "https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/develop/ppocr/utils/ppocr_keys_v1.txt"
34 | use_space_char: true
35 |
36 | # params for text classifier
37 | use_angle_cls: false
38 | cls_model_dir: "https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar"
39 | cls_image_shape: [3, 48, 192]
40 | label_list: ["0", "180"]
41 | cls_batch_num: 30
42 | cls_thresh: 0.9
43 |
44 | lang: ch
45 | det: true
46 | rec: true
47 | cls: false
--------------------------------------------------------------------------------
/config/ppocr_keys_v1.txt:
--------------------------------------------------------------------------------
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 | 2
26 | 0
27 | 8
28 | -
29 | 7
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 | 1
94 | 3
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 | H
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 | 5
632 | 4
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 | 6
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 | s
1034 | u
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 | 9
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 | S
1218 | Y
1219 | F
1220 | D
1221 | A
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 | P
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 | T
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 | r
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 | q
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 | J
2698 | 真
2699 | 轶
2700 | 悬
2701 | 衷
2702 | 靛
2703 | 翊
2704 | 掩
2705 | 哒
2706 | 炅
2707 | 掐
2708 | 冼
2709 | 妮
2710 | l
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 | x
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 | z
3317 | 杀
3318 | 涕
3319 | ±
3320 | 舍
3321 | 铠
3322 | 抵
3323 | 弛
3324 | 段
3325 | 敝
3326 | 镐
3327 | 奠
3328 | 拂
3329 | 轴
3330 | 跛
3331 | 袱
3332 | e
3333 | t
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 | b
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 | L
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 | w
3538 | i
3539 | h
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 | I
3588 | B
3589 | N
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 | M
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 | Z
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 | C
4245 | o
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 | E
4382 | 懦
4383 | 憋
4384 | 汀
4385 | 拚
4386 | 啉
4387 | 腌
4388 | 岸
4389 | f
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 | U
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 | a
4545 | p
4546 | y
4547 | n
4548 | g
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 | Q
4732 | 噤
4733 | 噻
4734 | 竖
4735 | 芗
4736 | 莠
4737 | 潭
4738 | 俊
4739 | 羿
4740 | 耜
4741 | O
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 | k
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 | c
4903 | 眸
4904 | 祭
4905 | 髯
4906 | 啖
4907 | 坳
4908 | 愁
4909 | 芩
4910 | 驮
4911 | 倡
4912 | 巽
4913 | 穰
4914 | 沃
4915 | 胚
4916 | 怒
4917 | 凤
4918 | 槛
4919 | 剂
4920 | 趵
4921 | 嫁
4922 | v
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 | W
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 | R
5128 | G
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 | d
5172 | °
5173 | 喧
5174 | 荀
5175 | 踱
5176 | 侮
5177 | 奋
5178 | 偕
5179 | 饷
5180 | 犍
5181 | 惮
5182 | 坑
5183 | 璎
5184 | 徘
5185 | 宛
5186 | 妆
5187 | 袈
5188 | 倩
5189 | 窦
5190 | 昂
5191 | 荏
5192 | 乖
5193 | K
5194 | 怅
5195 | 撰
5196 | 鳙
5197 | 牙
5198 | 袁
5199 | 酞
5200 | X
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 | m
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 | V
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 | j
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 | G
5693 | I
5694 | A
5695 | #
5696 | N
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 | L
5725 | B
5726 | 㙟
5727 | 畵
5728 | 鴿
5729 | '
5730 | 詩
5731 | 溝
5732 | 嚞
5733 | 屌
5734 | 藔
5735 | 佧
5736 | 玥
5737 | 蘭
5738 | 織
5739 | 1
5740 | 3
5741 | 9
5742 | 0
5743 | 7
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 | K
5823 | O
5824 | R
5825 | 8
5826 | H
5827 | E
5828 | P
5829 | T
5830 | W
5831 | D
5832 | S
5833 | C
5834 | M
5835 | F
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 | V
5878 | 2
5879 | 6
5880 | 齋
5881 | 誠
5882 | 訂
5883 | ´
5884 | 勑
5885 | 雙
5886 | 陳
5887 | 無
5888 | í
5889 | 泩
5890 | 媄
5891 | 夌
5892 | 刂
5893 | i
5894 | c
5895 | t
5896 | o
5897 | r
5898 | a
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 | n
5935 | d
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 | h
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 | Z
6116 | U
6117 | 5
6118 | 4
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 | p
6308 | e
6309 | Y
6310 | 蕒
6311 | 煖
6312 | 頓
6313 | 測
6314 | 試
6315 | 鼽
6316 | 僑
6317 | 碩
6318 | 妝
6319 | 帯
6320 | ≈
6321 | 鐡
6322 | 舖
6323 | 權
6324 | 喫
6325 | 倆
6326 | ˋ
6327 | 該
6328 | 悅
6329 | ā
6330 | 俫
6331 | .
6332 | f
6333 | s
6334 | b
6335 | m
6336 | k
6337 | g
6338 | u
6339 | j
6340 | 貼
6341 | 淨
6342 | 濕
6343 | 針
6344 | 適
6345 | 備
6346 | l
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 | z
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 | 懮
--------------------------------------------------------------------------------
/demo.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "flag"
5 | "log"
6 |
7 | "paddleocr-go/ocr"
8 | )
9 |
10 | var (
11 | confFile string
12 | image string
13 | imageDir string
14 | useServering bool
15 | port string
16 | )
17 |
18 | func init() {
19 | flag.StringVar(&confFile, "config", "config/conf.yaml", "config from ocr system. If not given, will use default config.")
20 | flag.StringVar(&image, "image", "", "image to predict. if not given, will use image_dir")
21 | flag.StringVar(&imageDir, "image_dir", "", "imgs in dir to be predicted. if not given, will check servering")
22 | flag.BoolVar(&useServering, "use_servering", false, "whether to use ocr server. [default: false]")
23 | flag.StringVar(&port, "port", "18600", "which port to serve ocr server. [default: 18600].")
24 | }
25 |
26 | func main() {
27 | flag.Parse()
28 | sys := ocr.NewOCRSystem(confFile, nil)
29 |
30 | if image != "" {
31 | img := ocr.ReadImage(image)
32 | results := sys.PredictOneImage(img)
33 | for _, res := range results {
34 | log.Println(res)
35 | }
36 | return
37 | }
38 |
39 | if imageDir != "" {
40 | results := sys.PredictDirImages(imageDir)
41 | for k, vs := range results {
42 | log.Printf("======== image: %v =======\n", k)
43 | for _, res := range vs {
44 | log.Println(res)
45 | }
46 | }
47 | }
48 |
49 | if useServering {
50 | sys.StartServer(port)
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module paddleocr-go
2 |
3 | go 1.14
4 |
5 | require (
6 | github.com/LKKlein/gocv v0.28.0
7 | github.com/ctessum/go.clipper v0.0.0-20200522184404-9c744fa3e86c
8 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776
9 | )
10 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | github.com/LKKlein/gocv v0.27.0 h1:JGNBMa2HY7HC0VlVHB4gdFjoc9NlyyrQvlUdBMWWSYw=
2 | github.com/LKKlein/gocv v0.27.0/go.mod h1:MP408EL7eakRU3vzjsozzfELSX7HDDGdMpWANV1IOHY=
3 | github.com/LKKlein/gocv v0.28.0 h1:1MMvs9uYf+QGPi86it2pUmN8RRoyMnPLUefKB/Jf1Q0=
4 | github.com/LKKlein/gocv v0.28.0/go.mod h1:MP408EL7eakRU3vzjsozzfELSX7HDDGdMpWANV1IOHY=
5 | github.com/ctessum/go.clipper v0.0.0-20200522184404-9c744fa3e86c h1:VXCsVlam0R2Yl7VET2GxZBPdOa7gFRexyhfWb9v9QtM=
6 | github.com/ctessum/go.clipper v0.0.0-20200522184404-9c744fa3e86c/go.mod h1:KRMo3PCsooJP3LmCwKI76dkd7f3ki3zwYLHR7Iwbi5k=
7 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
8 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
9 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
10 |
--------------------------------------------------------------------------------
/images/0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LKKlein/paddleocr-go/3d5eded97e20eee0f907021e235b218e6c46cbe3/images/0.jpg
--------------------------------------------------------------------------------
/images/result/img_dir_result.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LKKlein/paddleocr-go/3d5eded97e20eee0f907021e235b218e6c46cbe3/images/result/img_dir_result.jpg
--------------------------------------------------------------------------------
/images/result/python_client_result.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LKKlein/paddleocr-go/3d5eded97e20eee0f907021e235b218e6c46cbe3/images/result/python_client_result.jpg
--------------------------------------------------------------------------------
/images/result/python_vis_result.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LKKlein/paddleocr-go/3d5eded97e20eee0f907021e235b218e6c46cbe3/images/result/python_vis_result.jpg
--------------------------------------------------------------------------------
/images/result/single_img_result.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LKKlein/paddleocr-go/3d5eded97e20eee0f907021e235b218e6c46cbe3/images/result/single_img_result.jpg
--------------------------------------------------------------------------------
/images/test.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LKKlein/paddleocr-go/3d5eded97e20eee0f907021e235b218e6c46cbe3/images/test.jpg
--------------------------------------------------------------------------------
/ocr/core.go:
--------------------------------------------------------------------------------
1 | package ocr
2 |
3 | import (
4 | "bytes"
5 | "encoding/json"
6 | "errors"
7 | "image"
8 | "image/color"
9 | "io"
10 | "log"
11 | "math"
12 | "net/http"
13 | "paddleocr-go/paddle"
14 | "path"
15 | "path/filepath"
16 | "sort"
17 | "strings"
18 |
19 | "github.com/LKKlein/gocv"
20 | )
21 |
22 | type PaddleModel struct {
23 | predictor *paddle.Predictor
24 | input *paddle.ZeroCopyTensor
25 | outputs []*paddle.ZeroCopyTensor
26 |
27 | useGPU bool
28 | deviceID int
29 | initGPUMem int
30 | numThreads int
31 | useMKLDNN bool
32 | useTensorRT bool
33 | useIROptim bool
34 | }
35 |
36 | func NewPaddleModel(args map[string]interface{}) *PaddleModel {
37 | return &PaddleModel{
38 | useGPU: getBool(args, "use_gpu", false),
39 | deviceID: getInt(args, "gpu_id", 0),
40 | initGPUMem: getInt(args, "gpu_mem", 1000),
41 | numThreads: getInt(args, "num_cpu_threads", 6),
42 | useMKLDNN: getBool(args, "enable_mkldnn", false),
43 | useTensorRT: getBool(args, "use_tensorrt", false),
44 | useIROptim: getBool(args, "ir_optim", true),
45 | }
46 | }
47 |
48 | func (model *PaddleModel) LoadModel(modelDir string) {
49 | config := paddle.NewAnalysisConfig()
50 | config.DisableGlogInfo()
51 |
52 | config.SetModel(modelDir+"/model", modelDir+"/params")
53 | if model.useGPU {
54 | config.EnableUseGpu(model.initGPUMem, model.deviceID)
55 | } else {
56 | config.DisableGpu()
57 | config.SetCpuMathLibraryNumThreads(model.numThreads)
58 | if model.useMKLDNN {
59 | config.EnableMkldnn()
60 | }
61 | }
62 |
63 | // config.EnableMemoryOptim()
64 | if model.useIROptim {
65 | config.SwitchIrOptim(true)
66 | }
67 |
68 | // false for zero copy tensor
69 | config.SwitchUseFeedFetchOps(false)
70 | config.SwitchSpecifyInputNames(true)
71 |
72 | model.predictor = paddle.NewPredictor(config)
73 | model.input = model.predictor.GetInputTensors()[0]
74 | model.outputs = model.predictor.GetOutputTensors()
75 | }
76 |
77 | type OCRText struct {
78 | BBox [][]int `json:"bbox"`
79 | Text string `json:"text"`
80 | Score float64 `json:"score"`
81 | }
82 |
83 | type TextPredictSystem struct {
84 | detector *DBDetector
85 | cls *TextClassifier
86 | rec *TextRecognizer
87 | }
88 |
89 | func NewTextPredictSystem(args map[string]interface{}) *TextPredictSystem {
90 | sys := &TextPredictSystem{
91 | detector: NewDBDetector(getString(args, "det_model_dir", ""), args),
92 | rec: NewTextRecognizer(getString(args, "rec_model_dir", ""), args),
93 | }
94 | if getBool(args, "use_angle_cls", false) {
95 | sys.cls = NewTextClassifier(getString(args, "cls_model_dir", ""), args)
96 | }
97 | return sys
98 | }
99 |
100 | func (sys *TextPredictSystem) sortBoxes(boxes [][][]int) [][][]int {
101 | sort.Slice(boxes, func(i, j int) bool {
102 | if boxes[i][0][1] < boxes[j][0][1] {
103 | return true
104 | }
105 | if boxes[i][0][1] > boxes[j][0][1] {
106 | return false
107 | }
108 | return boxes[i][0][0] < boxes[j][0][0]
109 | })
110 |
111 | for i := 0; i < len(boxes)-1; i++ {
112 | if math.Abs(float64(boxes[i+1][0][1]-boxes[i][0][1])) < 10 && boxes[i+1][0][0] < boxes[i][0][0] {
113 | boxes[i], boxes[i+1] = boxes[i+1], boxes[i]
114 | }
115 | }
116 | return boxes
117 | }
118 |
119 | func (sys *TextPredictSystem) getRotateCropImage(img gocv.Mat, box [][]int) gocv.Mat {
120 | cropW := int(math.Sqrt(math.Pow(float64(box[0][0]-box[1][0]), 2) + math.Pow(float64(box[0][1]-box[1][1]), 2)))
121 | cropH := int(math.Sqrt(math.Pow(float64(box[0][0]-box[3][0]), 2) + math.Pow(float64(box[0][1]-box[3][1]), 2)))
122 | ptsstd := make([]image.Point, 4)
123 | ptsstd[0] = image.Pt(0, 0)
124 | ptsstd[1] = image.Pt(cropW, 0)
125 | ptsstd[2] = image.Pt(cropW, cropH)
126 | ptsstd[3] = image.Pt(0, cropH)
127 |
128 | points := make([]image.Point, 4)
129 | points[0] = image.Pt(box[0][0], box[0][1])
130 | points[1] = image.Pt(box[1][0], box[1][1])
131 | points[2] = image.Pt(box[2][0], box[2][1])
132 | points[3] = image.Pt(box[3][0], box[3][1])
133 |
134 | M := gocv.GetPerspectiveTransform(points, ptsstd)
135 | defer M.Close()
136 | dstimg := gocv.NewMat()
137 | gocv.WarpPerspectiveWithParams(img, &dstimg, M, image.Pt(cropW, cropH),
138 | gocv.InterpolationCubic, gocv.BorderReplicate, color.RGBA{0, 0, 0, 0})
139 |
140 | if float64(dstimg.Rows()) >= float64(dstimg.Cols())*1.5 {
141 | srcCopy := gocv.NewMat()
142 | gocv.Transpose(dstimg, &srcCopy)
143 | defer dstimg.Close()
144 | gocv.Flip(srcCopy, &srcCopy, 0)
145 | return srcCopy
146 | }
147 | return dstimg
148 | }
149 |
150 | func (sys *TextPredictSystem) Run(img gocv.Mat) []OCRText {
151 | srcimg := gocv.NewMat()
152 | img.CopyTo(&srcimg)
153 | boxes := sys.detector.Run(img)
154 | if len(boxes) == 0 {
155 | return nil
156 | }
157 |
158 | boxes = sys.sortBoxes(boxes)
159 | cropimages := make([]gocv.Mat, len(boxes))
160 | for i := 0; i < len(boxes); i++ {
161 | tmpbox := make([][]int, len(boxes[i]))
162 | for j := 0; j < len(tmpbox); j++ {
163 | tmpbox[j] = make([]int, len(boxes[i][j]))
164 | copy(tmpbox[j], boxes[i][j])
165 | }
166 | cropimg := sys.getRotateCropImage(srcimg, tmpbox)
167 | cropimages[i] = cropimg
168 | }
169 | if sys.cls != nil {
170 | cropimages = sys.cls.Run(cropimages)
171 | }
172 | recResult := sys.rec.Run(cropimages, boxes)
173 | return recResult
174 | }
175 |
176 | type OCRSystem struct {
177 | args map[string]interface{}
178 | tps *TextPredictSystem
179 | }
180 |
181 | func NewOCRSystem(confFile string, a map[string]interface{}) *OCRSystem {
182 | args, err := ReadYaml(confFile)
183 | if err != nil {
184 | log.Printf("Read config file %v failed! Please check. err: %v\n", confFile, err)
185 | log.Println("Program will use default config.")
186 | args = defaultArgs
187 | }
188 | for k, v := range a {
189 | args[k] = v
190 | }
191 | return &OCRSystem{
192 | args: args,
193 | tps: NewTextPredictSystem(args),
194 | }
195 | }
196 |
197 | func (ocr *OCRSystem) StartServer(port string) {
198 | http.HandleFunc("/ocr", ocr.predictHandler)
199 | log.Println("OCR Server has been started on port :", port)
200 | err := http.ListenAndServe(":"+port, nil)
201 | if err != nil {
202 | log.Panicf("http error! error: %v\n", err)
203 | }
204 | }
205 |
206 | func (ocr *OCRSystem) predictHandler(w http.ResponseWriter, r *http.Request) {
207 | if r.Method != "POST" {
208 | w.Write([]byte(errors.New("post method only").Error()))
209 | return
210 | }
211 | r.ParseMultipartForm(32 << 20)
212 | var buf bytes.Buffer
213 | file, header, err := r.FormFile("image")
214 | if err != nil {
215 | w.Write([]byte(err.Error()))
216 | return
217 | }
218 | defer file.Close()
219 | ext := strings.ToLower(path.Ext(header.Filename))
220 | if ext != ".jpg" && ext != ".png" {
221 | w.Write([]byte(errors.New("only support image endswith jpg/png").Error()))
222 | return
223 | }
224 |
225 | io.Copy(&buf, file)
226 | img, err2 := gocv.IMDecode(buf.Bytes(), gocv.IMReadColor)
227 | if err2 != nil {
228 | w.Write([]byte(err2.Error()))
229 | return
230 | }
231 | result := ocr.PredictOneImage(img)
232 | if output, err3 := json.Marshal(result); err3 != nil {
233 | w.Write([]byte(err3.Error()))
234 | } else {
235 | w.Write(output)
236 | }
237 | }
238 |
239 | func (ocr *OCRSystem) PredictOneImage(img gocv.Mat) []OCRText {
240 | return ocr.tps.Run(img)
241 | }
242 |
243 | func (ocr *OCRSystem) PredictDirImages(dirname string) map[string][]OCRText {
244 | if dirname == "" {
245 | return nil
246 | }
247 |
248 | imgs, _ := filepath.Glob(dirname + "/*.jpg")
249 | tmpimgs, _ := filepath.Glob(dirname + "/*.png")
250 | imgs = append(imgs, tmpimgs...)
251 | results := make(map[string][]OCRText, len(imgs))
252 | for i := 0; i < len(imgs); i++ {
253 | imgname := imgs[i]
254 | img := ReadImage(imgname)
255 | res := ocr.PredictOneImage(img)
256 | results[imgname] = res
257 | }
258 | return results
259 | }
260 |
--------------------------------------------------------------------------------
/ocr/default_args.go:
--------------------------------------------------------------------------------
1 | package ocr
2 |
3 | var (
4 | defaultArgs = map[string]interface{}{
5 | "use_gpu": true,
6 | "ir_optim": true,
7 | "enable_mkldnn": false,
8 | "use_tensorrt": false,
9 | "num_cpu_threads": 6,
10 | "gpu_id": 0,
11 | "gpu_mem": 2000,
12 |
13 | "det_algorithm": "DB",
14 | "det_model_dir": "https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar",
15 | "det_max_side_len": 960,
16 |
17 | "det_db_thresh": 0.3,
18 | "det_db_box_thresh": 0.5,
19 | "det_db_unclip_ratio": 2.0,
20 |
21 | "det_east_score_thresh": 0.8,
22 | "det_east_cover_thresh": 0.1,
23 | "det_east_nms_thresh": 0.2,
24 |
25 | "rec_algorithm": "CRNN",
26 | "rec_model_dir": "https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar",
27 | "rec_image_shape": []interface{}{3, 32, 320},
28 | "rec_char_type": "ch",
29 | "rec_batch_num": 30,
30 | "max_text_length": 25,
31 | "rec_char_dict_path": "https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/develop/ppocr/utils/ppocr_keys_v1.txt",
32 | "use_space_char": true,
33 |
34 | "use_angle_cls": false,
35 | "cls_model_dir": "https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar",
36 | "cls_image_shape": []interface{}{3, 48, 192},
37 | "label_list": []interface{}{"0", "180"},
38 | "cls_batch_num": 30,
39 | "cls_thresh": 0.9,
40 |
41 | "lang": "ch",
42 | "det": true,
43 | "rec": true,
44 | "cls": false,
45 | }
46 | )
47 |
--------------------------------------------------------------------------------
/ocr/ocr_cls.go:
--------------------------------------------------------------------------------
1 | package ocr
2 |
3 | import (
4 | "log"
5 | "os"
6 | "time"
7 |
8 | "github.com/LKKlein/gocv"
9 | )
10 |
11 | type TextClassifier struct {
12 | *PaddleModel
13 | batchNum int
14 | thresh float64
15 | shape []int
16 | labels []string
17 | }
18 |
19 | type ClsResult struct {
20 | Score float32
21 | Label int64
22 | }
23 |
24 | func NewTextClassifier(modelDir string, args map[string]interface{}) *TextClassifier {
25 | shapes := []int{3, 48, 192}
26 | if v, ok := args["cls_image_shape"]; ok {
27 | for i, s := range v.([]interface{}) {
28 | shapes[i] = s.(int)
29 | }
30 | }
31 | cls := &TextClassifier{
32 | PaddleModel: NewPaddleModel(args),
33 | batchNum: getInt(args, "cls_batch_num", 30),
34 | thresh: getFloat64(args, "cls_thresh", 0.9),
35 | shape: shapes,
36 | }
37 | if checkModelExists(modelDir) {
38 | home, _ := os.UserHomeDir()
39 | modelDir, _ = downloadModel(home+"/.paddleocr/cls", modelDir)
40 | } else {
41 | log.Panicf("cls model path: %v not exist! Please check!", modelDir)
42 | }
43 | cls.LoadModel(modelDir)
44 | return cls
45 | }
46 |
47 | func (cls *TextClassifier) Run(imgs []gocv.Mat) []gocv.Mat {
48 | batch := cls.batchNum
49 | var clsTime int64 = 0
50 | clsout := make([]ClsResult, len(imgs))
51 | srcimgs := make([]gocv.Mat, len(imgs))
52 | c, h, w := cls.shape[0], cls.shape[1], cls.shape[2]
53 | for i := 0; i < len(imgs); i += batch {
54 | j := i + batch
55 | if len(imgs) < j {
56 | j = len(imgs)
57 | }
58 |
59 | normImgs := make([]float32, (j-i)*c*h*w)
60 | for k := i; k < j; k++ {
61 | tmp := gocv.NewMat()
62 | imgs[k].CopyTo(&tmp)
63 | srcimgs[k] = tmp
64 | img := clsResize(imgs[k], cls.shape)
65 | data := normPermute(img, []float32{0.5, 0.5, 0.5}, []float32{0.5, 0.5, 0.5}, 255.0)
66 | copy(normImgs[(k-i)*c*h*w:], data)
67 | }
68 |
69 | st := time.Now()
70 | cls.input.SetValue(normImgs)
71 | cls.input.Reshape([]int32{int32(j - i), int32(c), int32(h), int32(w)})
72 |
73 | cls.predictor.SetZeroCopyInput(cls.input)
74 | cls.predictor.ZeroCopyRun()
75 | cls.predictor.GetZeroCopyOutput(cls.outputs[0])
76 | cls.predictor.GetZeroCopyOutput(cls.outputs[1])
77 |
78 | var probout [][]float32
79 | var labelout []int64
80 | if len(cls.outputs[0].Shape()) == 2 {
81 | probout = cls.outputs[0].Value().([][]float32)
82 | } else {
83 | labelout = cls.outputs[0].Value().([]int64)
84 | }
85 |
86 | if len(cls.outputs[1].Shape()) == 2 {
87 | probout = cls.outputs[1].Value().([][]float32)
88 | } else {
89 | labelout = cls.outputs[1].Value().([]int64)
90 | }
91 | clsTime += int64(time.Since(st).Milliseconds())
92 |
93 | for no, label := range labelout {
94 | score := probout[no][label]
95 | clsout[i+no] = ClsResult{
96 | Score: score,
97 | Label: label,
98 | }
99 |
100 | if label%2 == 1 && float64(score) > cls.thresh {
101 | gocv.Rotate(srcimgs[i+no], &srcimgs[i+no], gocv.Rotate180Clockwise)
102 | }
103 | }
104 | }
105 | log.Println("cls num: ", len(clsout), ", cls time elapse: ", clsTime, "ms")
106 | return srcimgs
107 | }
108 |
--------------------------------------------------------------------------------
/ocr/ocr_det.go:
--------------------------------------------------------------------------------
1 | package ocr
2 |
3 | import (
4 | "log"
5 | "os"
6 | "time"
7 |
8 | "github.com/LKKlein/gocv"
9 | )
10 |
11 | type DBDetector struct {
12 | *PaddleModel
13 | preProcess DetPreProcess
14 | postProcess DetPostProcess
15 | }
16 |
17 | func NewDBDetector(modelDir string, args map[string]interface{}) *DBDetector {
18 | maxSideLen := getInt(args, "det_max_side_len", 960)
19 | thresh := getFloat64(args, "det_db_thresh", 0.3)
20 | boxThresh := getFloat64(args, "det_db_box_thresh", 0.5)
21 | unClipRatio := getFloat64(args, "det_db_unclip_ratio", 2.0)
22 |
23 | detector := &DBDetector{
24 | PaddleModel: NewPaddleModel(args),
25 | preProcess: NewDBProcess(make([]int, 0), maxSideLen),
26 | postProcess: NewDBPostProcess(thresh, boxThresh, unClipRatio),
27 | }
28 | if checkModelExists(modelDir) {
29 | home, _ := os.UserHomeDir()
30 | modelDir, _ = downloadModel(home+"/.paddleocr/det", modelDir)
31 | } else {
32 | log.Panicf("det model path: %v not exist! Please check!", modelDir)
33 | }
34 | detector.LoadModel(modelDir)
35 | return detector
36 | }
37 |
38 | func (det *DBDetector) Run(img gocv.Mat) [][][]int {
39 | oriH := img.Rows()
40 | oriW := img.Cols()
41 | data, resizeH, resizeW := det.preProcess.Run(img)
42 | st := time.Now()
43 | det.input.SetValue(data)
44 | det.input.Reshape([]int32{1, 3, int32(resizeH), int32(resizeW)})
45 |
46 | det.predictor.SetZeroCopyInput(det.input)
47 | det.predictor.ZeroCopyRun()
48 | det.predictor.GetZeroCopyOutput(det.outputs[0])
49 |
50 | ratioH, ratioW := float64(resizeH)/float64(oriH), float64(resizeW)/float64(oriW)
51 | boxes := det.postProcess.Run(det.outputs[0], oriH, oriW, ratioH, ratioW)
52 | log.Println("det_box num: ", len(boxes), ", time elapse: ", time.Since(st))
53 | return boxes
54 | }
55 |
--------------------------------------------------------------------------------
/ocr/ocr_rec.go:
--------------------------------------------------------------------------------
1 | package ocr
2 |
3 | import (
4 | "log"
5 | "os"
6 | "time"
7 |
8 | "github.com/LKKlein/gocv"
9 | )
10 |
11 | type TextRecognizer struct {
12 | *PaddleModel
13 | batchNum int
14 | textLen int
15 | shape []int
16 | charType string
17 | labels []string
18 | }
19 |
20 | func NewTextRecognizer(modelDir string, args map[string]interface{}) *TextRecognizer {
21 | shapes := []int{3, 32, 320}
22 | if v, ok := args["rec_image_shape"]; ok {
23 | for i, s := range v.([]interface{}) {
24 | shapes[i] = s.(int)
25 | }
26 | }
27 | labelpath := getString(args, "rec_char_dict_path", "./config/ppocr_keys_v1.txt")
28 | labels := readLines2StringSlice(labelpath)
29 | if getBool(args, "use_space_char", true) {
30 | labels = append(labels, " ")
31 | }
32 | rec := &TextRecognizer{
33 | PaddleModel: NewPaddleModel(args),
34 | batchNum: getInt(args, "rec_batch_num", 30),
35 | textLen: getInt(args, "max_text_length", 25),
36 | charType: getString(args, "rec_char_type", "ch"),
37 | shape: shapes,
38 | labels: labels,
39 | }
40 | if checkModelExists(modelDir) {
41 | home, _ := os.UserHomeDir()
42 | modelDir, _ = downloadModel(home+"/.paddleocr/rec/ch", modelDir)
43 | } else {
44 | log.Panicf("rec model path: %v not exist! Please check!", modelDir)
45 | }
46 | rec.LoadModel(modelDir)
47 | return rec
48 | }
49 |
50 | func (rec *TextRecognizer) Run(imgs []gocv.Mat, bboxes [][][]int) []OCRText {
51 | recResult := make([]OCRText, 0, len(imgs))
52 | batch := rec.batchNum
53 | var recTime int64 = 0
54 | c, h, w := rec.shape[0], rec.shape[1], rec.shape[2]
55 | for i := 0; i < len(imgs); i += batch {
56 | j := i + batch
57 | if len(imgs) < j {
58 | j = len(imgs)
59 | }
60 |
61 | maxwhratio := 0.0
62 | for k := i; k < j; k++ {
63 | h, w := imgs[k].Rows(), imgs[k].Cols()
64 | ratio := float64(w) / float64(h)
65 | if ratio > maxwhratio {
66 | maxwhratio = ratio
67 | }
68 | }
69 |
70 | if rec.charType == "ch" {
71 | w = int(32 * maxwhratio)
72 | }
73 | normimgs := make([]float32, (j-i)*c*h*w)
74 |
75 | for k := i; k < j; k++ {
76 | data := crnnPreprocess(imgs[k], rec.shape, []float32{0.5, 0.5, 0.5},
77 | []float32{0.5, 0.5, 0.5}, 255.0, maxwhratio, rec.charType)
78 | copy(normimgs[(k-i)*c*h*w:], data)
79 | }
80 |
81 | st := time.Now()
82 | rec.input.SetValue(normimgs)
83 | rec.input.Reshape([]int32{int32(j - i), int32(c), int32(h), int32(w)})
84 |
85 | rec.predictor.SetZeroCopyInput(rec.input)
86 | rec.predictor.ZeroCopyRun()
87 | rec.predictor.GetZeroCopyOutput(rec.outputs[0])
88 | rec.predictor.GetZeroCopyOutput(rec.outputs[1])
89 |
90 | recIdxBatch := rec.outputs[0].Value().([][]int64)
91 | recIdxLod := rec.outputs[0].Lod()
92 |
93 | predictBatch := rec.outputs[1].Value().([][]float32)
94 | predictLod := rec.outputs[1].Lod()
95 | recTime += int64(time.Since(st).Milliseconds())
96 |
97 | for rno := 0; rno < len(recIdxLod)-1; rno++ {
98 | predIdx := make([]int, 0, 2)
99 | for beg := recIdxLod[rno]; beg < recIdxLod[rno+1]; beg++ {
100 | predIdx = append(predIdx, int(recIdxBatch[beg][0]))
101 | }
102 | if len(predIdx) == 0 {
103 | continue
104 | }
105 | words := ""
106 | for n := 0; n < len(predIdx); n++ {
107 | words += rec.labels[predIdx[n]]
108 | }
109 |
110 | score := 0.0
111 | count := 0
112 | blankPosition := int(rec.outputs[1].Shape()[1])
113 | for beg := predictLod[rno]; beg < predictLod[rno+1]; beg++ {
114 | argMaxID, maxVal := argmax(predictBatch[beg])
115 | if blankPosition-1-argMaxID > 0 {
116 | score += float64(maxVal)
117 | count++
118 | }
119 | }
120 | score = score / float64(count)
121 | recResult = append(recResult, OCRText{
122 | BBox: bboxes[i+rno],
123 | Text: words,
124 | Score: score,
125 | })
126 | }
127 | }
128 | log.Println("rec num: ", len(recResult), ", rec time elapse: ", recTime, "ms")
129 | return recResult
130 | }
131 |
--------------------------------------------------------------------------------
/ocr/postprocess.go:
--------------------------------------------------------------------------------
1 | package ocr
2 |
3 | import (
4 | "image"
5 | "image/color"
6 | "math"
7 | "paddleocr-go/paddle"
8 | "sort"
9 |
10 | "github.com/LKKlein/gocv"
11 | clipper "github.com/ctessum/go.clipper"
12 | )
13 |
14 | type xFloatSortBy [][]float32
15 |
16 | func (a xFloatSortBy) Len() int { return len(a) }
17 | func (a xFloatSortBy) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
18 | func (a xFloatSortBy) Less(i, j int) bool { return a[i][0] < a[j][0] }
19 |
20 | type xIntSortBy [][]int
21 |
22 | func (a xIntSortBy) Len() int { return len(a) }
23 | func (a xIntSortBy) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
24 | func (a xIntSortBy) Less(i, j int) bool { return a[i][0] < a[j][0] }
25 |
26 | type DetPostProcess interface {
27 | Run(output *paddle.ZeroCopyTensor, oriH, oriW int, ratioH, ratioW float64) [][][]int
28 | }
29 |
30 | type DBPostProcess struct {
31 | thresh float64
32 | boxThresh float64
33 | maxCandidates int
34 | unClipRatio float64
35 | minSize int
36 | }
37 |
38 | func NewDBPostProcess(thresh, boxThresh, unClipRatio float64) *DBPostProcess {
39 | return &DBPostProcess{
40 | thresh: thresh,
41 | boxThresh: boxThresh,
42 | unClipRatio: unClipRatio,
43 | maxCandidates: 1000,
44 | minSize: 3,
45 | }
46 | }
47 |
48 | func (d *DBPostProcess) getMinBoxes(rect gocv.RotatedRect) [][]float32 {
49 | points := gocv.NewMat()
50 | gocv.BoxPoints(rect, &points)
51 | defer points.Close()
52 | array := d.mat2slice(points)
53 | sort.Sort(xFloatSortBy(array))
54 |
55 | point1, point2, point3, point4 := array[0], array[1], array[2], array[3]
56 | if array[3][1] <= array[2][1] {
57 | point2, point3 = array[3], array[2]
58 | } else {
59 | point2, point3 = array[2], array[3]
60 | }
61 |
62 | if array[1][1] <= array[0][1] {
63 | point1, point4 = array[1], array[0]
64 | } else {
65 | point1, point4 = array[0], array[1]
66 | }
67 |
68 | array = [][]float32{point1, point2, point3, point4}
69 | return array
70 | }
71 |
72 | func (d *DBPostProcess) mat2slice(mat gocv.Mat) [][]float32 {
73 | array := make([][]float32, mat.Rows())
74 | for i := 0; i < mat.Rows(); i++ {
75 | tmp := make([]float32, mat.Cols())
76 | for j := 0; j < mat.Cols(); j++ {
77 | tmp[j] = mat.GetFloatAt(i, j)
78 | }
79 | array[i] = tmp
80 | }
81 | return array
82 | }
83 |
84 | func (d *DBPostProcess) boxScoreFast(array [][]float32, pred gocv.Mat) float64 {
85 | height, width := pred.Rows(), pred.Cols()
86 | boxX := []float32{array[0][0], array[1][0], array[2][0], array[3][0]}
87 | boxY := []float32{array[0][1], array[1][1], array[2][1], array[3][1]}
88 |
89 | xmin := clip(int(math.Floor(float64(minf(boxX)))), 0, width-1)
90 | xmax := clip(int(math.Ceil(float64(maxf(boxX)))), 0, width-1)
91 | ymin := clip(int(math.Floor(float64(minf(boxY)))), 0, height-1)
92 | ymax := clip(int(math.Ceil(float64(maxf(boxY)))), 0, height-1)
93 |
94 | mask := gocv.NewMatWithSize(ymax-ymin+1, xmax-xmin+1, gocv.MatTypeCV8UC1)
95 | ppt := make([][]image.Point, 1)
96 | ppt[0] = make([]image.Point, 4)
97 | ppt[0][0] = image.Point{int(array[0][0]) - xmin, int(array[0][1]) - ymin}
98 | ppt[0][1] = image.Point{int(array[1][0]) - xmin, int(array[1][1]) - ymin}
99 | ppt[0][2] = image.Point{int(array[2][0]) - xmin, int(array[2][1]) - ymin}
100 | ppt[0][3] = image.Point{int(array[3][0]) - xmin, int(array[3][1]) - ymin}
101 | gocv.FillPoly(&mask, ppt, color.RGBA{0, 0, 1, 0})
102 | croppedImg := pred.Region(image.Rect(xmin, ymin, xmax+1, ymax+1))
103 | s := croppedImg.MeanWithMask(mask)
104 | return s.Val1
105 | }
106 |
107 | func (d *DBPostProcess) unClip(box [][]float32) gocv.RotatedRect {
108 | var area, dist float64
109 | for i := 0; i < 4; i++ {
110 | area += float64(box[i][0]*box[(i+1)%4][1] - box[i][1]*box[(i+1)%4][0])
111 | dist += math.Sqrt(float64(
112 | (box[i][0]-box[(i+1)%4][0])*(box[i][0]-box[(i+1)%4][0]) +
113 | (box[i][1]-box[(i+1)%4][1])*(box[i][1]-box[(i+1)%4][1]),
114 | ))
115 | }
116 | area = math.Abs(area / 2.0)
117 | distance := area * d.unClipRatio / dist
118 | offset := clipper.NewClipperOffset()
119 | path := make([]*clipper.IntPoint, 4)
120 | path[0] = &clipper.IntPoint{X: clipper.CInt(box[0][0]), Y: clipper.CInt(box[0][1])}
121 | path[1] = &clipper.IntPoint{X: clipper.CInt(box[1][0]), Y: clipper.CInt(box[1][1])}
122 | path[2] = &clipper.IntPoint{X: clipper.CInt(box[2][0]), Y: clipper.CInt(box[2][1])}
123 | path[3] = &clipper.IntPoint{X: clipper.CInt(box[3][0]), Y: clipper.CInt(box[3][1])}
124 | offset.AddPath(clipper.Path(path), clipper.JtRound, clipper.EtClosedPolygon)
125 | soln := offset.Execute(distance)
126 |
127 | points := make([]image.Point, 0, 4)
128 | for i := 0; i < len(soln); i++ {
129 | for j := 0; j < len(soln[i]); j++ {
130 | points = append(points, image.Point{int(soln[i][j].X), int(soln[i][j].Y)})
131 | }
132 | }
133 |
134 | var res gocv.RotatedRect
135 | if len(points) <= 0 {
136 | points = make([]image.Point, 4)
137 | points[0] = image.Pt(0, 0)
138 | points[1] = image.Pt(1, 0)
139 | points[2] = image.Pt(1, 1)
140 | points[3] = image.Pt(0, 1)
141 | res = gocv.RotatedRect{
142 | Contour: points,
143 | BoundingRect: image.Rect(0, 0, 1, 1),
144 | Center: gocv.Point2f{X: 0.5, Y: 0.5},
145 | Width: 1,
146 | Height: 1,
147 | Angle: 0,
148 | }
149 | } else {
150 | res = gocv.MinAreaRect(points)
151 | }
152 | return res
153 | }
154 |
155 | func (d *DBPostProcess) boxesFromBitmap(pred gocv.Mat, mask gocv.Mat, ratioH float64, ratioW float64) [][][]int {
156 | height, width := mask.Rows(), mask.Cols()
157 | mask.MultiplyUChar(255)
158 | contours := gocv.FindContours(mask, gocv.RetrievalList, gocv.ChainApproxSimple)
159 | numContours := len(contours)
160 | if numContours > d.maxCandidates {
161 | numContours = d.maxCandidates
162 | }
163 |
164 | boxes := make([][][]int, 0, numContours)
165 | for i := 0; i < numContours; i++ {
166 | contour := contours[i]
167 | boundingbox := gocv.MinAreaRect(contour)
168 | if boundingbox.Width < float32(d.minSize) || boundingbox.Height < float32(d.minSize) {
169 | continue
170 | }
171 | points := d.getMinBoxes(boundingbox)
172 | score := d.boxScoreFast(points, pred)
173 | if score < d.boxThresh {
174 | continue
175 | }
176 |
177 | box := d.unClip(points)
178 | if box.Width < float32(d.minSize+2) || box.Height < float32(d.minSize+2) {
179 | continue
180 | }
181 |
182 | cliparray := d.getMinBoxes(box)
183 | dstHeight, dstWidth := pred.Rows(), pred.Cols()
184 | intcliparray := make([][]int, 4)
185 | for i := 0; i < 4; i++ {
186 | p := []int{
187 | int(float64(clip(int(math.Round(
188 | float64(cliparray[i][0]/float32(width)*float32(dstWidth)))), 0, dstWidth)) / ratioW),
189 | int(float64(clip(int(math.Round(
190 | float64(cliparray[i][1]/float32(height)*float32(dstHeight)))), 0, dstHeight)) / ratioH),
191 | }
192 | intcliparray[i] = p
193 | }
194 | boxes = append(boxes, intcliparray)
195 | }
196 | return boxes
197 | }
198 |
199 | func (d *DBPostProcess) orderPointsClockwise(box [][]int) [][]int {
200 | sort.Sort(xIntSortBy(box))
201 | leftmost := [][]int{box[0], box[1]}
202 | rightmost := [][]int{box[2], box[3]}
203 |
204 | if leftmost[0][1] > leftmost[1][1] {
205 | leftmost[0], leftmost[1] = leftmost[1], leftmost[0]
206 | }
207 |
208 | if rightmost[0][1] > rightmost[1][1] {
209 | rightmost[0], rightmost[1] = rightmost[1], rightmost[0]
210 | }
211 |
212 | return [][]int{leftmost[0], rightmost[0], rightmost[1], leftmost[1]}
213 | }
214 |
215 | func (d *DBPostProcess) filterTagDetRes(boxes [][][]int, oriH, oriW int) [][][]int {
216 | points := make([][][]int, 0, len(boxes))
217 | for i := 0; i < len(boxes); i++ {
218 | boxes[i] = d.orderPointsClockwise(boxes[i])
219 | for j := 0; j < len(boxes[i]); j++ {
220 | boxes[i][j][0] = clip(boxes[i][j][0], 0, oriW-1)
221 | boxes[i][j][1] = clip(boxes[i][j][1], 0, oriH-1)
222 | }
223 | }
224 |
225 | for i := 0; i < len(boxes); i++ {
226 | rectW := int(math.Sqrt(math.Pow(float64(boxes[i][0][0]-boxes[i][1][0]), 2.0) +
227 | math.Pow(float64(boxes[i][0][1]-boxes[i][1][1]), 2.0)))
228 | rectH := int(math.Sqrt(math.Pow(float64(boxes[i][0][0]-boxes[i][3][0]), 2.0) +
229 | math.Pow(float64(boxes[i][0][1]-boxes[i][3][1]), 2.0)))
230 | if rectW <= 4 || rectH <= 4 {
231 | continue
232 | }
233 | points = append(points, boxes[i])
234 | }
235 | return points
236 | }
237 |
238 | func (d *DBPostProcess) Run(output *paddle.ZeroCopyTensor, oriH, oriW int, ratioH, ratioW float64) [][][]int {
239 | v := output.Value().([][][][]float32)
240 |
241 | shape := output.Shape()
242 | height, width := int(shape[2]), int(shape[3])
243 |
244 | pred := gocv.NewMatWithSize(height, width, gocv.MatTypeCV32F)
245 | bitmap := gocv.NewMatWithSize(height, width, gocv.MatTypeCV8UC1)
246 | thresh := float32(d.thresh)
247 | for i := 0; i < height; i++ {
248 | for j := 0; j < width; j++ {
249 | pred.SetFloatAt(i, j, v[0][0][i][j])
250 | if v[0][0][i][j] > thresh {
251 | bitmap.SetUCharAt(i, j, 1)
252 | } else {
253 | bitmap.SetUCharAt(i, j, 0)
254 | }
255 | }
256 | }
257 |
258 | mask := gocv.NewMat()
259 | kernel := gocv.GetStructuringElement(gocv.MorphRect, image.Point{2, 2})
260 | gocv.Dilate(bitmap, &mask, kernel)
261 | boxes := d.boxesFromBitmap(pred, mask, ratioH, ratioW)
262 | dtboxes := d.filterTagDetRes(boxes, oriH, oriW)
263 | return dtboxes
264 | }
265 |
--------------------------------------------------------------------------------
/ocr/preprocess.go:
--------------------------------------------------------------------------------
1 | package ocr
2 |
3 | import (
4 | "image"
5 | "image/color"
6 | "math"
7 |
8 | "github.com/LKKlein/gocv"
9 | )
10 |
11 | func resizeByShape(img gocv.Mat, resizeShape []int) (gocv.Mat, int, int) {
12 | resizeH := resizeShape[0]
13 | resizeW := resizeShape[1]
14 | gocv.Resize(img, &img, image.Pt(resizeW, resizeH), 0, 0, gocv.InterpolationLinear)
15 | return img, resizeH, resizeW
16 | }
17 |
18 | func resizeByMaxLen(img gocv.Mat, maxLen int) (gocv.Mat, int, int) {
19 | oriH := img.Rows()
20 | oriW := img.Cols()
21 | var resizeH, resizeW int = oriH, oriW
22 |
23 | var ratio float64 = 1.0
24 | if resizeH > maxLen || resizeW > maxLen {
25 | if resizeH > resizeW {
26 | ratio = float64(maxLen) / float64(resizeH)
27 | } else {
28 | ratio = float64(maxLen) / float64(resizeW)
29 | }
30 | }
31 |
32 | resizeH = int(float64(resizeH) * ratio)
33 | resizeW = int(float64(resizeW) * ratio)
34 |
35 | if resizeH%32 == 0 {
36 | resizeH = resizeH
37 | } else if resizeH/32 <= 1 {
38 | resizeH = 32
39 | } else {
40 | resizeH = (resizeH/32 - 1) * 32
41 | }
42 |
43 | if resizeW%32 == 0 {
44 | resizeW = resizeW
45 | } else if resizeW/32 <= 1 {
46 | resizeW = 32
47 | } else {
48 | resizeW = (resizeW/32 - 1) * 32
49 | }
50 |
51 | if resizeW <= 0 || resizeH <= 0 {
52 | return gocv.NewMat(), 0, 0
53 | }
54 |
55 | gocv.Resize(img, &img, image.Pt(resizeW, resizeH), 0, 0, gocv.InterpolationLinear)
56 | return img, resizeH, resizeW
57 | }
58 |
59 | func normPermute(img gocv.Mat, mean []float32, std []float32, scaleFactor float32) []float32 {
60 | img.ConvertTo(&img, gocv.MatTypeCV32F)
61 | img.DivideFloat(scaleFactor)
62 | defer img.Close()
63 |
64 | c := gocv.Split(img)
65 | data := make([]float32, img.Rows()*img.Cols()*img.Channels())
66 | for i := 0; i < 3; i++ {
67 | c[i].SubtractFloat(mean[i])
68 | c[i].DivideFloat(std[i])
69 | defer c[i].Close()
70 | x, _ := c[i].DataPtrFloat32()
71 | copy(data[i*img.Rows()*img.Cols():], x)
72 | }
73 | return data
74 | }
75 |
76 | type DetPreProcess interface {
77 | Run(gocv.Mat) ([]float32, int, int)
78 | }
79 |
80 | type DBPreProcess struct {
81 | resizeType int
82 | imageShape []int
83 | maxSideLen int
84 | mean []float32
85 | std []float32
86 | scaleFactor float32
87 | }
88 |
89 | func NewDBProcess(shape []int, sideLen int) *DBPreProcess {
90 | db := &DBPreProcess{
91 | resizeType: 0,
92 | imageShape: shape,
93 | maxSideLen: sideLen,
94 | mean: []float32{0.485, 0.456, 0.406},
95 | std: []float32{0.229, 0.224, 0.225},
96 | scaleFactor: 255.0,
97 | }
98 | if len(shape) > 0 {
99 | db.resizeType = 1
100 | }
101 | if sideLen == 0 {
102 | db.maxSideLen = 2400
103 | }
104 | return db
105 | }
106 |
107 | func (d *DBPreProcess) Run(img gocv.Mat) ([]float32, int, int) {
108 | var resizeH, resizeW int
109 | if d.resizeType == 0 {
110 | img, resizeH, resizeW = resizeByMaxLen(img, d.maxSideLen)
111 | } else {
112 | img, resizeH, resizeW = resizeByShape(img, d.imageShape)
113 | }
114 |
115 | im := normPermute(img, d.mean, d.std, d.scaleFactor)
116 | return im, resizeH, resizeW
117 | }
118 |
119 | func clsResize(img gocv.Mat, resizeShape []int) gocv.Mat {
120 | imgH, imgW := resizeShape[1], resizeShape[2]
121 | h, w := img.Rows(), img.Cols()
122 | ratio := float64(w) / float64(h)
123 | var resizeW int
124 | if math.Ceil(float64(imgH)*ratio) > float64(imgW) {
125 | resizeW = imgW
126 | } else {
127 | resizeW = int(math.Ceil(float64(imgH) * ratio))
128 | }
129 | gocv.Resize(img, &img, image.Pt(resizeW, imgH), 0, 0, gocv.InterpolationLinear)
130 | if resizeW < imgW {
131 | gocv.CopyMakeBorder(img, &img, 0, 0, 0, imgW-resizeW, gocv.BorderConstant, color.RGBA{0, 0, 0, 0})
132 | }
133 | return img
134 | }
135 |
136 | func crnnPreprocess(img gocv.Mat, resizeShape []int, mean []float32, std []float32,
137 | scaleFactor float32, whRatio float64, charType string) []float32 {
138 | imgH := resizeShape[1]
139 | imgW := resizeShape[2]
140 | if charType == "ch" {
141 | imgW = int(32 * whRatio)
142 | }
143 | h, w := img.Rows(), img.Cols()
144 | ratio := float64(w) / float64(h)
145 | var resizeW int
146 | if math.Ceil(float64(imgH)*ratio) > float64(imgW) {
147 | resizeW = imgW
148 | } else {
149 | resizeW = int(math.Ceil(float64(imgH) * ratio))
150 | }
151 | gocv.Resize(img, &img, image.Pt(resizeW, imgH), 0, 0, gocv.InterpolationLinear)
152 |
153 | img.ConvertTo(&img, gocv.MatTypeCV32F)
154 | img.DivideFloat(scaleFactor)
155 | img.SubtractScalar(gocv.NewScalar(float64(mean[0]), float64(mean[1]), float64(mean[2]), 0))
156 | img.DivideScalar(gocv.NewScalar(float64(std[0]), float64(std[1]), float64(std[2]), 0))
157 | defer img.Close()
158 |
159 | if resizeW < imgW {
160 | gocv.CopyMakeBorder(img, &img, 0, 0, 0, imgW-resizeW, gocv.BorderConstant, color.RGBA{0, 0, 0, 0})
161 | }
162 |
163 | c := gocv.Split(img)
164 | data := make([]float32, img.Rows()*img.Cols()*img.Channels())
165 | for i := 0; i < 3; i++ {
166 | defer c[i].Close()
167 | x, _ := c[i].DataPtrFloat32()
168 | copy(data[i*img.Rows()*img.Cols():], x)
169 | }
170 | return data
171 | }
172 |
--------------------------------------------------------------------------------
/ocr/utils.go:
--------------------------------------------------------------------------------
1 | package ocr
2 |
3 | import (
4 | "archive/tar"
5 | "io"
6 | "io/ioutil"
7 | "log"
8 | "net/http"
9 | "os"
10 | "path"
11 | "path/filepath"
12 | "strings"
13 |
14 | "github.com/LKKlein/gocv"
15 | "gopkg.in/yaml.v3"
16 | )
17 |
18 | func getString(args map[string]interface{}, key string, dv string) string {
19 | if f, ok := args[key]; ok {
20 | return f.(string)
21 | }
22 | return dv
23 | }
24 |
25 | func getFloat64(args map[string]interface{}, key string, dv float64) float64 {
26 | if f, ok := args[key]; ok {
27 | return f.(float64)
28 | }
29 | return dv
30 | }
31 |
32 | func getInt(args map[string]interface{}, key string, dv int) int {
33 | if i, ok := args[key]; ok {
34 | return i.(int)
35 | }
36 | return dv
37 | }
38 |
39 | func getBool(args map[string]interface{}, key string, dv bool) bool {
40 | if b, ok := args[key]; ok {
41 | return b.(bool)
42 | }
43 | return dv
44 | }
45 |
46 | func ReadImage(image_path string) gocv.Mat {
47 | img := gocv.IMRead(image_path, gocv.IMReadColor)
48 | if img.Empty() {
49 | log.Printf("Could not read image %s\n", image_path)
50 | os.Exit(1)
51 | }
52 | return img
53 | }
54 |
55 | func clip(value, min, max int) int {
56 | if value <= min {
57 | return min
58 | } else if value >= max {
59 | return max
60 | }
61 | return value
62 | }
63 |
64 | func minf(data []float32) float32 {
65 | v := data[0]
66 | for _, val := range data {
67 | if val < v {
68 | v = val
69 | }
70 | }
71 | return v
72 | }
73 |
74 | func maxf(data []float32) float32 {
75 | v := data[0]
76 | for _, val := range data {
77 | if val > v {
78 | v = val
79 | }
80 | }
81 | return v
82 | }
83 |
84 | func mini(data []int) int {
85 | v := data[0]
86 | for _, val := range data {
87 | if val < v {
88 | v = val
89 | }
90 | }
91 | return v
92 | }
93 |
94 | func maxi(data []int) int {
95 | v := data[0]
96 | for _, val := range data {
97 | if val > v {
98 | v = val
99 | }
100 | }
101 | return v
102 | }
103 |
104 | func argmax(arr []float32) (int, float32) {
105 | max_value, index := arr[0], 0
106 | for i, item := range arr {
107 | if item > max_value {
108 | max_value = item
109 | index = i
110 | }
111 | }
112 | return index, max_value
113 | }
114 |
115 | func checkModelExists(modelPath string) bool {
116 | if isPathExist(modelPath+"/model") && isPathExist(modelPath+"/params") {
117 | return true
118 | }
119 | if strings.HasPrefix(modelPath, "http://") ||
120 | strings.HasPrefix(modelPath, "ftp://") || strings.HasPrefix(modelPath, "https://") {
121 | return true
122 | }
123 | return false
124 | }
125 |
126 | func downloadFile(filepath, url string) error {
127 | resp, err := http.Get(url)
128 | if err != nil {
129 | return err
130 | }
131 | defer resp.Body.Close()
132 |
133 | out, err := os.Create(filepath)
134 | if err != nil {
135 | return err
136 | }
137 | defer out.Close()
138 |
139 | _, err = io.Copy(out, resp.Body)
140 | log.Println("[download_file] from:", url, " to:", filepath)
141 | return err
142 | }
143 |
144 | func isPathExist(path string) bool {
145 | if _, err := os.Stat(path); err == nil {
146 | return true
147 | } else if os.IsNotExist(err) {
148 | return false
149 | }
150 | return false
151 | }
152 |
153 | func downloadModel(modelDir, modelPath string) (string, error) {
154 | if modelPath != "" && (strings.HasPrefix(modelPath, "http://") ||
155 | strings.HasPrefix(modelPath, "ftp://") || strings.HasPrefix(modelPath, "https://")) {
156 | if checkModelExists(modelDir) {
157 | return modelDir, nil
158 | }
159 | _, suffix := path.Split(modelPath)
160 | outPath := filepath.Join(modelDir, suffix)
161 | outDir := filepath.Dir(outPath)
162 | if !isPathExist(outDir) {
163 | os.MkdirAll(outDir, os.ModePerm)
164 | }
165 |
166 | if !isPathExist(outPath) {
167 | err := downloadFile(outPath, modelPath)
168 | if err != nil {
169 | return "", err
170 | }
171 | }
172 |
173 | if strings.HasSuffix(outPath, ".tar") && !checkModelExists(modelDir) {
174 | unTar(modelDir, outPath)
175 | os.Remove(outPath)
176 | return modelDir, nil
177 | }
178 | return modelDir, nil
179 | }
180 | return modelPath, nil
181 | }
182 |
183 | func unTar(dst, src string) (err error) {
184 | fr, err := os.Open(src)
185 | if err != nil {
186 | return err
187 | }
188 | defer fr.Close()
189 |
190 | tr := tar.NewReader(fr)
191 | for {
192 | hdr, err := tr.Next()
193 |
194 | switch {
195 | case err == io.EOF:
196 | return nil
197 | case err != nil:
198 | return err
199 | case hdr == nil:
200 | continue
201 | }
202 |
203 | var dstFileDir string
204 | if strings.Contains(hdr.Name, "model") {
205 | dstFileDir = filepath.Join(dst, "model")
206 | } else if strings.Contains(hdr.Name, "params") {
207 | dstFileDir = filepath.Join(dst, "params")
208 | }
209 |
210 | switch hdr.Typeflag {
211 | case tar.TypeDir:
212 | continue
213 | case tar.TypeReg:
214 | file, err := os.OpenFile(dstFileDir, os.O_CREATE|os.O_RDWR, os.FileMode(hdr.Mode))
215 | if err != nil {
216 | return err
217 | }
218 | _, err2 := io.Copy(file, tr)
219 | if err2 != nil {
220 | return err2
221 | }
222 | file.Close()
223 | }
224 | }
225 |
226 | return nil
227 | }
228 |
229 | func readLines2StringSlice(filepath string) []string {
230 | if strings.HasPrefix(filepath, "http://") || strings.HasPrefix(filepath, "https://") {
231 | home, _ := os.UserHomeDir()
232 | dir := home + "/.paddleocr/rec/"
233 | _, suffix := path.Split(filepath)
234 | f := dir + suffix
235 | if !isPathExist(f) {
236 | err := downloadFile(f, filepath)
237 | if err != nil {
238 | log.Println("download ppocr key file error!")
239 | return nil
240 | }
241 | }
242 | filepath = f
243 | }
244 | content, err := ioutil.ReadFile(filepath)
245 | if err != nil {
246 | log.Println("read ppocr key file error!")
247 | return nil
248 | }
249 | lines := strings.Split(string(content), "\n")
250 | return lines
251 | }
252 |
253 | func ReadYaml(yamlPath string) (map[string]interface{}, error) {
254 | data, err := ioutil.ReadFile(yamlPath)
255 | if err != nil {
256 | return nil, err
257 | }
258 | var body interface{}
259 | if err := yaml.Unmarshal(data, &body); err != nil {
260 | return nil, err
261 | }
262 |
263 | body = convertYaml2Map(body)
264 | return body.(map[string]interface{}), nil
265 | }
266 |
267 | func convertYaml2Map(i interface{}) interface{} {
268 | switch x := i.(type) {
269 | case map[interface{}]interface{}:
270 | m2 := map[string]interface{}{}
271 | for k, v := range x {
272 | m2[k.(string)] = convertYaml2Map(v)
273 | }
274 | return m2
275 | case []interface{}:
276 | for i, v := range x {
277 | x[i] = convertYaml2Map(v)
278 | }
279 | }
280 | return i
281 | }
282 |
--------------------------------------------------------------------------------
/paddle/common.go:
--------------------------------------------------------------------------------
1 | package paddle
2 |
3 | // #cgo CFLAGS: -I../paddle_c/include
4 | // #cgo LDFLAGS: -lpaddle_fluid_c
5 | // #include
6 | import "C"
7 | import "fmt"
8 |
9 | func ConvertCBooleanToGo(b C.bool) bool {
10 | var c_false C.bool
11 | if b != c_false {
12 | return true
13 | }
14 | return false
15 | }
16 |
17 | func numel(shape []int32) int32 {
18 | n := int32(1)
19 | for _, d := range shape {
20 | n *= d
21 | }
22 | return n
23 | }
24 |
25 | func bug(format string, args ...interface{}) error {
26 | return fmt.Errorf("Bug %v", fmt.Sprintf(format, args...))
27 | }
28 |
--------------------------------------------------------------------------------
/paddle/config.go:
--------------------------------------------------------------------------------
1 | package paddle
2 |
3 | // #include
4 | // #include
5 | // #include
6 | import "C"
7 |
8 | import (
9 | "runtime"
10 | "unsafe"
11 | )
12 |
13 | type Precision C.Precision
14 |
15 | const (
16 | Precision_FLOAT32 Precision = C.kFloat32
17 | Precision_INT8 Precision = C.kInt8
18 | Precision_HALF Precision = C.kHalf
19 | )
20 |
21 | type AnalysisConfig struct {
22 | c *C.PD_AnalysisConfig
23 | }
24 |
25 | func NewAnalysisConfig() *AnalysisConfig {
26 | c_config := C.PD_NewAnalysisConfig()
27 | config := &AnalysisConfig{c: c_config}
28 | runtime.SetFinalizer(config, (*AnalysisConfig).finalize)
29 | return config
30 | }
31 |
32 | func (config *AnalysisConfig) finalize() {
33 | C.PD_DeleteAnalysisConfig(config.c)
34 | }
35 |
36 | func (config *AnalysisConfig) SetModel(model, params string) {
37 | c_model := C.CString(model)
38 | defer C.free(unsafe.Pointer(c_model))
39 | var c_params *C.char
40 | if params == "" {
41 | c_params = nil
42 | } else {
43 | c_params = C.CString(params)
44 | defer C.free(unsafe.Pointer(c_params))
45 | }
46 |
47 | C.PD_SetModel(config.c, c_model, c_params)
48 | }
49 |
50 | func (config *AnalysisConfig) ModelDir() string {
51 | return C.GoString(C.PD_ModelDir(config.c))
52 | }
53 |
54 | func (config *AnalysisConfig) ProgFile() string {
55 | return C.GoString(C.PD_ProgFile(config.c))
56 | }
57 |
58 | func (config *AnalysisConfig) ParamsFile() string {
59 | return C.GoString(C.PD_ParamsFile(config.c))
60 | }
61 |
62 | func (config *AnalysisConfig) EnableUseGpu(memory_pool_init_size_mb int, device_id int) {
63 | C.PD_EnableUseGpu(config.c, C.int(memory_pool_init_size_mb), C.int(device_id))
64 | }
65 |
66 | func (config *AnalysisConfig) DisableGpu() {
67 | C.PD_DisableGpu(config.c)
68 | }
69 |
70 | func (config *AnalysisConfig) UseGpu() bool {
71 | return ConvertCBooleanToGo(C.PD_UseGpu(config.c))
72 | }
73 |
74 | func (config *AnalysisConfig) GpuDeviceId() int {
75 | return int(C.PD_GpuDeviceId(config.c))
76 | }
77 |
78 | func (config *AnalysisConfig) MemoryPoolInitSizeMb() int {
79 | return int(C.PD_MemoryPoolInitSizeMb(config.c))
80 | }
81 |
82 | func (config *AnalysisConfig) EnableCudnn() {
83 | C.PD_EnableCUDNN(config.c)
84 | }
85 |
86 | func (config *AnalysisConfig) CudnnEnabled() bool {
87 | return ConvertCBooleanToGo(C.PD_CudnnEnabled(config.c))
88 | }
89 |
90 | func (config *AnalysisConfig) SwitchIrOptim(x bool) {
91 | C.PD_SwitchIrOptim(config.c, C.bool(x))
92 | }
93 |
94 | func (config *AnalysisConfig) IrOptim() bool {
95 | return ConvertCBooleanToGo(C.PD_IrOptim(config.c))
96 | }
97 |
98 | func (config *AnalysisConfig) SwitchUseFeedFetchOps(x bool) {
99 | C.PD_SwitchUseFeedFetchOps(config.c, C.bool(x))
100 | }
101 |
102 | func (config *AnalysisConfig) UseFeedFetchOpsEnabled() bool {
103 | return ConvertCBooleanToGo(C.PD_UseFeedFetchOpsEnabled(config.c))
104 | }
105 |
106 | func (config *AnalysisConfig) SwitchSpecifyInputNames(x bool) {
107 | C.PD_SwitchSpecifyInputNames(config.c, C.bool(x))
108 | }
109 |
110 | func (config *AnalysisConfig) SpecifyInputName() bool {
111 | return ConvertCBooleanToGo(C.PD_SpecifyInputName(config.c))
112 | }
113 |
114 | func (config *AnalysisConfig) EnableTensorRtEngine(workspace_size int, max_batch_size int, min_subgraph_size int, precision Precision, use_static bool, use_calib_mode bool) {
115 | C.PD_EnableTensorRtEngine(config.c, C.int(workspace_size), C.int(max_batch_size), C.int(min_subgraph_size), C.Precision(precision), C.bool(use_static), C.bool(use_calib_mode))
116 | }
117 |
118 | func (config *AnalysisConfig) TensorrtEngineEnabled() bool {
119 | return ConvertCBooleanToGo(C.PD_TensorrtEngineEnabled(config.c))
120 | }
121 |
122 | func (config *AnalysisConfig) SwitchIrDebug(x bool) {
123 | C.PD_SwitchIrDebug(config.c, C.bool(x))
124 | }
125 |
126 | func (config *AnalysisConfig) EnableMkldnn() {
127 | C.PD_EnableMKLDNN(config.c)
128 | }
129 |
130 | func (config *AnalysisConfig) SetCpuMathLibraryNumThreads(n int) {
131 | C.PD_SetCpuMathLibraryNumThreads(config.c, C.int(n))
132 | }
133 |
134 | func (config *AnalysisConfig) CpuMathLibraryNumThreads() int {
135 | return int(C.PD_CpuMathLibraryNumThreads(config.c))
136 | }
137 |
138 | func (config *AnalysisConfig) EnableMkldnnQuantizer() {
139 | C.PD_EnableMkldnnQuantizer(config.c)
140 | }
141 |
142 | func (config *AnalysisConfig) MkldnnQuantizerEnabled() bool {
143 | return ConvertCBooleanToGo(C.PD_MkldnnQuantizerEnabled(config.c))
144 | }
145 |
146 | // SetModelBuffer
147 | // ModelFromMemory
148 |
149 | func (config *AnalysisConfig) EnableMemoryOptim() {
150 | C.PD_EnableMemoryOptim(config.c)
151 | }
152 |
153 | func (config *AnalysisConfig) MemoryOptimEnabled() bool {
154 | return ConvertCBooleanToGo(C.PD_MemoryOptimEnabled(config.c))
155 | }
156 |
157 | func (config *AnalysisConfig) EnableProfile() {
158 | C.PD_EnableProfile(config.c)
159 | }
160 |
161 | func (config *AnalysisConfig) ProfileEnabled() bool {
162 | return ConvertCBooleanToGo(C.PD_ProfileEnabled(config.c))
163 | }
164 |
165 | func (config *AnalysisConfig) DisableGlogInfo() {
166 | C.PD_DisableGlogInfo(config.c)
167 | }
168 |
169 | func (config *AnalysisConfig) DeletePass(pass string) {
170 | c_pass := C.CString(pass)
171 | defer C.free(unsafe.Pointer(c_pass))
172 | C.PD_DeletePass(config.c, c_pass)
173 | }
174 |
175 | func (config *AnalysisConfig) SetInValid() {
176 | C.PD_SetInValid(config.c)
177 | }
178 |
179 | func (config *AnalysisConfig) IsValid() bool {
180 | return ConvertCBooleanToGo(C.PD_IsValid(config.c))
181 | }
182 |
--------------------------------------------------------------------------------
/paddle/predictor.go:
--------------------------------------------------------------------------------
1 | package paddle
2 |
3 | // #include
4 | // #include "paddle_c_api.h"
5 | import "C"
6 |
7 | import (
8 | "reflect"
9 | "runtime"
10 | "unsafe"
11 | )
12 |
13 | type Predictor struct {
14 | c *C.PD_Predictor
15 | }
16 |
17 | func NewPredictor(config *AnalysisConfig) *Predictor {
18 | c_predictor := C.PD_NewPredictor((*config).c)
19 | predictor := &Predictor{c: c_predictor}
20 | runtime.SetFinalizer(predictor, (*Predictor).finalize)
21 | return predictor
22 | }
23 |
24 | func (predictor *Predictor) finalize() {
25 | C.PD_DeletePredictor(predictor.c)
26 | }
27 |
28 | func DeletePredictor(predictor *Predictor) {
29 | C.PD_DeletePredictor(predictor.c)
30 | }
31 |
32 | func (predictor *Predictor) GetInputNum() int {
33 | return int(C.PD_GetInputNum(predictor.c))
34 | }
35 |
36 | func (predictor *Predictor) GetOutputNum() int {
37 | return int(C.PD_GetOutputNum(predictor.c))
38 | }
39 |
40 | func (predictor *Predictor) GetInputName(n int) string {
41 | return C.GoString(C.PD_GetInputName(predictor.c, C.int(n)))
42 | }
43 |
44 | func (predictor *Predictor) GetOutputName(n int) string {
45 | return C.GoString(C.PD_GetOutputName(predictor.c, C.int(n)))
46 | }
47 |
48 | func (predictor *Predictor) GetInputTensors() [](*ZeroCopyTensor) {
49 | var result [](*ZeroCopyTensor)
50 | for i := 0; i < predictor.GetInputNum(); i++ {
51 | tensor := NewZeroCopyTensor()
52 | tensor.c.name = C.PD_GetInputName(predictor.c, C.int(i))
53 | result = append(result, tensor)
54 | }
55 | return result
56 | }
57 |
58 | func (predictor *Predictor) GetOutputTensors() [](*ZeroCopyTensor) {
59 | var result [](*ZeroCopyTensor)
60 | for i := 0; i < predictor.GetOutputNum(); i++ {
61 | tensor := NewZeroCopyTensor()
62 | tensor.c.name = C.PD_GetOutputName(predictor.c, C.int(i))
63 | result = append(result, tensor)
64 | }
65 | return result
66 | }
67 |
68 | func (predictor *Predictor) GetInputNames() []string {
69 | names := make([]string, predictor.GetInputNum())
70 | for i := 0; i < len(names); i++ {
71 | names[i] = predictor.GetInputName(i)
72 | }
73 | return names
74 | }
75 |
76 | func (predictor *Predictor) GetOutputNames() []string {
77 | names := make([]string, predictor.GetOutputNum())
78 | for i := 0; i < len(names); i++ {
79 | names[i] = predictor.GetOutputName(i)
80 | }
81 | return names
82 | }
83 |
84 | func (predictor *Predictor) SetZeroCopyInput(tensor *ZeroCopyTensor) {
85 | C.PD_SetZeroCopyInput(predictor.c, tensor.c)
86 | }
87 |
88 | func (predictor *Predictor) GetZeroCopyOutput(tensor *ZeroCopyTensor) {
89 | C.PD_GetZeroCopyOutput(predictor.c, tensor.c)
90 | tensor.name = C.GoString(tensor.c.name)
91 | var shape []int32
92 | shape_hdr := (*reflect.SliceHeader)(unsafe.Pointer(&shape))
93 | shape_hdr.Data = uintptr(unsafe.Pointer(tensor.c.shape.data))
94 | shape_hdr.Len = int(tensor.c.shape.length / C.sizeof_int)
95 | shape_hdr.Cap = int(tensor.c.shape.length / C.sizeof_int)
96 | tensor.Reshape(shape)
97 | }
98 |
99 | func (predictor *Predictor) ZeroCopyRun() {
100 | C.PD_ZeroCopyRun(predictor.c)
101 | }
102 |
--------------------------------------------------------------------------------
/paddle/tensor.go:
--------------------------------------------------------------------------------
1 | package paddle
2 |
3 | // #include
4 | // #include
5 | // #include
6 | // #include
7 | import "C"
8 |
9 | import (
10 | "bytes"
11 | "encoding/binary"
12 | "reflect"
13 | "runtime"
14 | "unsafe"
15 | )
16 |
17 | type PaddleDType C.PD_DataType
18 |
19 | const (
20 | FLOAT32 PaddleDType = C.PD_FLOAT32
21 | INT32 PaddleDType = C.PD_INT32
22 | INT64 PaddleDType = C.PD_INT64
23 | UINT8 PaddleDType = C.PD_UINT8
24 | UNKDTYPE PaddleDType = C.PD_UNKDTYPE
25 | )
26 |
27 | var types = []struct {
28 | gotype reflect.Type
29 | dtype PaddleDType
30 | }{
31 | {reflect.TypeOf(float32(0)), FLOAT32},
32 | {reflect.TypeOf(int32(0)), INT32},
33 | {reflect.TypeOf(int64(0)), INT64},
34 | {reflect.TypeOf(uint8(0)), UINT8},
35 | }
36 |
37 | func TypeOfShape(dtype PaddleDType, shape []int32) reflect.Type {
38 | var ret reflect.Type
39 | for _, t := range types {
40 | if dtype == PaddleDType(t.dtype) {
41 | ret = t.gotype
42 | break
43 | }
44 | }
45 |
46 | if ret == nil {
47 | panic(bug("Data %v type is not support", dtype))
48 | }
49 |
50 | for range shape {
51 | ret = reflect.SliceOf(ret)
52 | }
53 | return ret
54 | }
55 |
56 | type ZeroCopyTensor struct {
57 | c *C.PD_ZeroCopyTensor
58 | name string
59 | shape []int32
60 | }
61 |
62 | func NewZeroCopyTensor() *ZeroCopyTensor {
63 | c_tensor := C.PD_NewZeroCopyTensor()
64 |
65 | tensor := &ZeroCopyTensor{c: c_tensor}
66 | runtime.SetFinalizer(tensor, (*ZeroCopyTensor).finalize)
67 | return tensor
68 | }
69 |
70 | func (tensor *ZeroCopyTensor) finalize() {
71 | C.PD_DeleteZeroCopyTensor(tensor.c)
72 | }
73 |
74 | func (tensor *ZeroCopyTensor) Shape() []int32 {
75 | return tensor.shape
76 | }
77 |
78 | func (tensor *ZeroCopyTensor) Name() string {
79 | return C.GoString(tensor.c.name)
80 | }
81 |
82 | func (tensor *ZeroCopyTensor) Rename(name string) {
83 | tensor.name = name
84 | tensor.c.name = (*C.char)(unsafe.Pointer(tensor.c.name))
85 | //tensor.c.name = C.CString(tensor.name)
86 | //defer C.free(unsafe.Pointer(tensor.c.name))
87 | }
88 |
89 | func (tensor *ZeroCopyTensor) Reshape(shape []int32) {
90 | tensor.shape = make([]int32, len(shape))
91 | copy(tensor.shape, shape)
92 | length := C.sizeof_int * C.size_t(len(shape))
93 | if tensor.c.shape.capacity < C.size_t(length) {
94 | if tensor.c.shape.capacity != C.size_t(0) {
95 | C.free(tensor.c.shape.data)
96 | }
97 | tensor.c.shape.data = C.malloc(length)
98 | tensor.c.shape.capacity = length
99 | }
100 | tensor.c.shape.length = length
101 | C.memcpy(tensor.c.shape.data, unsafe.Pointer(&shape[0]), length)
102 | }
103 |
104 | func (tensor *ZeroCopyTensor) DataType() PaddleDType {
105 | return PaddleDType(tensor.c.dtype)
106 | }
107 |
108 | func (tensor *ZeroCopyTensor) SetValue(value interface{}) {
109 | val := reflect.ValueOf(value)
110 | shape, dtype := ShapeAndTypeOf(val)
111 | num := numel(shape)
112 | length := C.size_t(SizeofDataType(dtype) * num)
113 | if tensor.c.data.capacity < length {
114 | if tensor.c.data.capacity != C.size_t(0) {
115 | C.free(tensor.c.data.data)
116 | }
117 | tensor.c.data.data = C.malloc(length)
118 | tensor.c.data.capacity = length
119 | }
120 | tensor.c.data.length = length
121 |
122 | switch dtype {
123 | case PaddleDType(UINT8):
124 | data := val.Interface().([]uint8)
125 | C.memcpy(tensor.c.data.data, unsafe.Pointer(&data[0]), length)
126 | case PaddleDType(INT32):
127 | data := val.Interface().([]int32)
128 | C.memcpy(tensor.c.data.data, unsafe.Pointer(&data[0]), length)
129 | case PaddleDType(INT64):
130 | data := val.Interface().([]int64)
131 | C.memcpy(tensor.c.data.data, unsafe.Pointer(&data[0]), length)
132 | case PaddleDType(FLOAT32):
133 | data := val.Interface().([]float32)
134 | C.memcpy(tensor.c.data.data, unsafe.Pointer(&data[0]), length)
135 | }
136 | tensor.c.dtype = C.PD_DataType(dtype)
137 | }
138 |
139 | func TypeOf(dtype PaddleDType, shape []int32) reflect.Type {
140 | var ret reflect.Type
141 | for _, t := range types {
142 | if t.dtype == dtype {
143 | ret = t.gotype
144 | break
145 | }
146 | }
147 |
148 | for range shape {
149 | ret = reflect.SliceOf(ret)
150 | }
151 | return ret
152 | }
153 |
154 | func (tensor *ZeroCopyTensor) Value() interface{} {
155 | t := TypeOf(PaddleDType(tensor.c.dtype), tensor.shape)
156 | value := reflect.New(t)
157 | c_bytes := tensor.c.data.data
158 | length := tensor.c.data.length
159 | var slice []byte
160 | if unsafe.Sizeof(unsafe.Pointer(nil)) == 8 {
161 | slice = (*[1<<50 - 1]byte)(unsafe.Pointer(c_bytes))[:length:length]
162 | } else {
163 | slice = (*[1 << 30]byte)(unsafe.Pointer(c_bytes))[:length:length]
164 | }
165 | r := bytes.NewReader(slice)
166 | DecodeTensor(r, tensor.Shape(), t, value)
167 | return reflect.Indirect(value).Interface()
168 | }
169 |
170 | func (tensor *ZeroCopyTensor) Lod() []uint {
171 | var val []uint
172 | valHdr := (*reflect.SliceHeader)(unsafe.Pointer(&val))
173 | valHdr.Data = uintptr(unsafe.Pointer(tensor.c.lod.data))
174 | valHdr.Len = int(tensor.c.lod.length / C.sizeof_size_t)
175 | valHdr.Cap = int(tensor.c.lod.length / C.sizeof_size_t)
176 | return val
177 | }
178 |
179 | func Endian() binary.ByteOrder {
180 | buf := [2]byte{}
181 | *(*uint16)(unsafe.Pointer(&buf[0])) = uint16(0xABCD)
182 |
183 | var endian binary.ByteOrder
184 |
185 | switch buf {
186 | case [2]byte{0xCD, 0xAB}:
187 | endian = binary.LittleEndian
188 | case [2]byte{0xAB, 0xCD}:
189 | endian = binary.BigEndian
190 | default:
191 | panic("Could not determine native endianness.")
192 | }
193 | return endian
194 | }
195 |
196 | func DecodeTensor(r *bytes.Reader, shape []int32, t reflect.Type, ptr reflect.Value) {
197 | switch t.Kind() {
198 | case reflect.Uint8, reflect.Int32, reflect.Int64, reflect.Float32:
199 | binary.Read(r, Endian(), ptr.Interface())
200 | case reflect.Slice:
201 | value := reflect.Indirect(ptr)
202 | value.Set(reflect.MakeSlice(t, int(shape[0]), int(shape[0])))
203 | if len(shape) == 1 && value.Len() > 0 {
204 | switch value.Index(0).Kind() {
205 | case reflect.Uint8, reflect.Int32, reflect.Int64, reflect.Float32:
206 | binary.Read(r, Endian(), value.Interface())
207 | return
208 | }
209 | }
210 |
211 | for i := 0; i < value.Len(); i++ {
212 | DecodeTensor(r, shape[1:], t.Elem(), value.Index(i).Addr())
213 | }
214 | }
215 | }
216 |
217 | func SizeofDataType(dtype PaddleDType) int32 {
218 | switch dtype {
219 | case UINT8:
220 | return int32(C.sizeof_uchar)
221 | case INT32:
222 | return int32(C.sizeof_int)
223 | case INT64:
224 | return int32(C.sizeof_longlong)
225 | case FLOAT32:
226 | return int32(C.sizeof_float)
227 | }
228 | return -1
229 | }
230 |
231 | func ShapeAndTypeOf(val reflect.Value) (shape []int32, dt PaddleDType) {
232 | gotype := val.Type()
233 | for gotype.Kind() == reflect.Array || gotype.Kind() == reflect.Slice {
234 | shape = append(shape, int32(val.Len()))
235 | if val.Len() > 0 {
236 | val = val.Index(0)
237 | }
238 | gotype = gotype.Elem()
239 | }
240 |
241 | for _, t := range types {
242 | if gotype.Kind() == t.gotype.Kind() {
243 | return shape, PaddleDType(t.dtype)
244 | }
245 | }
246 | return shape, dt
247 | }
248 |
--------------------------------------------------------------------------------
/paddle_c/README.md:
--------------------------------------------------------------------------------
1 | # Paddle C预测库头文件
2 |
3 | ## 编译安装
4 | 使用cmake编译paddle,并打开-DON_INFER=ON,在编译目录下得到fluid_inference_c_install_dir,将该目录下的paddle/include头文件复制到此处。并将该目录下的paddle/lib配置到动态库环境变量。
5 |
6 | 详细编译步骤请参见[README.md](../README.md) 或者官方文档指导 https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html#id12
--------------------------------------------------------------------------------
/paddle_c/include/paddle_c_api.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2019 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 | #pragma once
16 |
17 | #include
18 | #include
19 | #include
20 |
21 | #if defined(_WIN32)
22 | #ifdef PADDLE_ON_INFERENCE
23 | #define PADDLE_CAPI_EXPORT __declspec(dllexport)
24 | #else
25 | #define PADDLE_CAPI_EXPORT __declspec(dllimport)
26 | #endif // PADDLE_ON_INFERENCE
27 | #else
28 | #define PADDLE_CAPI_EXPORT __attribute__((visibility("default")))
29 | #endif // _WIN32
30 |
31 | #ifdef __cplusplus
32 | extern "C" {
33 | #endif
34 |
35 | enum PD_DataType { PD_FLOAT32, PD_INT32, PD_INT64, PD_UINT8, PD_UNKDTYPE };
36 |
37 | typedef enum PD_DataType PD_DataType;
38 |
39 | typedef struct PD_PaddleBuf PD_PaddleBuf;
40 | typedef struct PD_AnalysisConfig PD_AnalysisConfig;
41 | typedef struct PD_Predictor PD_Predictor;
42 |
43 | typedef struct PD_Buffer {
44 | void* data;
45 | size_t length;
46 | size_t capacity;
47 | } PD_Buffer;
48 |
49 | typedef struct PD_ZeroCopyTensor {
50 | PD_Buffer data;
51 | PD_Buffer shape;
52 | PD_Buffer lod;
53 | PD_DataType dtype;
54 | char* name;
55 | } PD_ZeroCopyTensor;
56 |
57 | PADDLE_CAPI_EXPORT extern PD_ZeroCopyTensor* PD_NewZeroCopyTensor();
58 | PADDLE_CAPI_EXPORT extern void PD_DeleteZeroCopyTensor(PD_ZeroCopyTensor*);
59 | PADDLE_CAPI_EXPORT extern void PD_InitZeroCopyTensor(PD_ZeroCopyTensor*);
60 | PADDLE_CAPI_EXPORT extern void PD_DestroyZeroCopyTensor(PD_ZeroCopyTensor*);
61 | PADDLE_CAPI_EXPORT extern void PD_DeleteZeroCopyTensor(PD_ZeroCopyTensor*);
62 |
63 | typedef struct PD_ZeroCopyData {
64 | char* name;
65 | void* data;
66 | PD_DataType dtype;
67 | int* shape;
68 | int shape_size;
69 | } PD_ZeroCopyData;
70 | typedef struct InTensorShape {
71 | char* name;
72 | int* tensor_shape;
73 | int shape_size;
74 | } InTensorShape;
75 |
76 | PADDLE_CAPI_EXPORT extern PD_PaddleBuf* PD_NewPaddleBuf();
77 |
78 | PADDLE_CAPI_EXPORT extern void PD_DeletePaddleBuf(PD_PaddleBuf* buf);
79 |
80 | PADDLE_CAPI_EXPORT extern void PD_PaddleBufResize(PD_PaddleBuf* buf,
81 | size_t length);
82 |
83 | PADDLE_CAPI_EXPORT extern void PD_PaddleBufReset(PD_PaddleBuf* buf, void* data,
84 | size_t length);
85 |
86 | PADDLE_CAPI_EXPORT extern bool PD_PaddleBufEmpty(PD_PaddleBuf* buf);
87 |
88 | PADDLE_CAPI_EXPORT extern void* PD_PaddleBufData(PD_PaddleBuf* buf);
89 |
90 | PADDLE_CAPI_EXPORT extern size_t PD_PaddleBufLength(PD_PaddleBuf* buf);
91 |
92 | // PaddleTensor
93 | typedef struct PD_Tensor PD_Tensor;
94 |
95 | PADDLE_CAPI_EXPORT extern PD_Tensor* PD_NewPaddleTensor();
96 |
97 | PADDLE_CAPI_EXPORT extern void PD_DeletePaddleTensor(PD_Tensor* tensor);
98 |
99 | PADDLE_CAPI_EXPORT extern void PD_SetPaddleTensorName(PD_Tensor* tensor,
100 | char* name);
101 |
102 | PADDLE_CAPI_EXPORT extern void PD_SetPaddleTensorDType(PD_Tensor* tensor,
103 | PD_DataType dtype);
104 |
105 | PADDLE_CAPI_EXPORT extern void PD_SetPaddleTensorData(PD_Tensor* tensor,
106 | PD_PaddleBuf* buf);
107 |
108 | PADDLE_CAPI_EXPORT extern void PD_SetPaddleTensorShape(PD_Tensor* tensor,
109 | int* shape, int size);
110 |
111 | PADDLE_CAPI_EXPORT extern const char* PD_GetPaddleTensorName(
112 | const PD_Tensor* tensor);
113 |
114 | PADDLE_CAPI_EXPORT extern PD_DataType PD_GetPaddleTensorDType(
115 | const PD_Tensor* tensor);
116 |
117 | PADDLE_CAPI_EXPORT extern PD_PaddleBuf* PD_GetPaddleTensorData(
118 | const PD_Tensor* tensor);
119 |
120 | PADDLE_CAPI_EXPORT extern const int* PD_GetPaddleTensorShape(
121 | const PD_Tensor* tensor, int* size);
122 |
123 | // AnalysisPredictor
124 | PADDLE_CAPI_EXPORT extern bool PD_PredictorRun(const PD_AnalysisConfig* config,
125 | PD_Tensor* inputs, int in_size,
126 | PD_Tensor** output_data,
127 | int* out_size, int batch_size);
128 |
129 | PADDLE_CAPI_EXPORT extern bool PD_PredictorZeroCopyRun(
130 | const PD_AnalysisConfig* config, PD_ZeroCopyData* inputs, int in_size,
131 | PD_ZeroCopyData** output, int* out_size);
132 |
133 | // AnalysisConfig
134 | enum Precision { kFloat32 = 0, kInt8, kHalf };
135 | typedef enum Precision Precision;
136 |
137 | PADDLE_CAPI_EXPORT extern PD_AnalysisConfig* PD_NewAnalysisConfig();
138 |
139 | PADDLE_CAPI_EXPORT extern void PD_DeleteAnalysisConfig(
140 | PD_AnalysisConfig* config);
141 |
142 | PADDLE_CAPI_EXPORT extern void PD_SetModel(PD_AnalysisConfig* config,
143 | const char* model_dir,
144 | const char* params_path);
145 |
146 | PADDLE_CAPI_EXPORT
147 | extern void PD_SetProgFile(PD_AnalysisConfig* config, const char* x);
148 |
149 | PADDLE_CAPI_EXPORT extern void PD_SetParamsFile(PD_AnalysisConfig* config,
150 | const char* x);
151 |
152 | PADDLE_CAPI_EXPORT extern void PD_SetOptimCacheDir(PD_AnalysisConfig* config,
153 | const char* opt_cache_dir);
154 |
155 | PADDLE_CAPI_EXPORT extern const char* PD_ModelDir(
156 | const PD_AnalysisConfig* config);
157 |
158 | PADDLE_CAPI_EXPORT extern const char* PD_ProgFile(
159 | const PD_AnalysisConfig* config);
160 |
161 | PADDLE_CAPI_EXPORT extern const char* PD_ParamsFile(
162 | const PD_AnalysisConfig* config);
163 |
164 | PADDLE_CAPI_EXPORT extern void PD_EnableUseGpu(PD_AnalysisConfig* config,
165 | int memory_pool_init_size_mb,
166 | int device_id);
167 |
168 | PADDLE_CAPI_EXPORT extern void PD_DisableGpu(PD_AnalysisConfig* config);
169 |
170 | PADDLE_CAPI_EXPORT extern bool PD_UseGpu(const PD_AnalysisConfig* config);
171 |
172 | PADDLE_CAPI_EXPORT extern int PD_GpuDeviceId(const PD_AnalysisConfig* config);
173 |
174 | PADDLE_CAPI_EXPORT extern int PD_MemoryPoolInitSizeMb(
175 | const PD_AnalysisConfig* config);
176 |
177 | PADDLE_CAPI_EXPORT extern float PD_FractionOfGpuMemoryForPool(
178 | const PD_AnalysisConfig* config);
179 |
180 | PADDLE_CAPI_EXPORT extern void PD_EnableCUDNN(PD_AnalysisConfig* config);
181 |
182 | PADDLE_CAPI_EXPORT extern bool PD_CudnnEnabled(const PD_AnalysisConfig* config);
183 |
184 | PADDLE_CAPI_EXPORT extern void PD_SwitchIrOptim(PD_AnalysisConfig* config,
185 | bool x);
186 |
187 | PADDLE_CAPI_EXPORT extern bool PD_IrOptim(const PD_AnalysisConfig* config);
188 |
189 | PADDLE_CAPI_EXPORT extern void PD_SwitchUseFeedFetchOps(
190 | PD_AnalysisConfig* config, bool x);
191 |
192 | PADDLE_CAPI_EXPORT extern bool PD_UseFeedFetchOpsEnabled(
193 | const PD_AnalysisConfig* config);
194 |
195 | PADDLE_CAPI_EXPORT extern void PD_SwitchSpecifyInputNames(
196 | PD_AnalysisConfig* config, bool x);
197 |
198 | PADDLE_CAPI_EXPORT extern bool PD_SpecifyInputName(
199 | const PD_AnalysisConfig* config);
200 |
201 | PADDLE_CAPI_EXPORT extern void PD_EnableTensorRtEngine(
202 | PD_AnalysisConfig* config, int workspace_size, int max_batch_size,
203 | int min_subgraph_size, Precision precision, bool use_static,
204 | bool use_calib_mode);
205 |
206 | PADDLE_CAPI_EXPORT extern bool PD_TensorrtEngineEnabled(
207 | const PD_AnalysisConfig* config);
208 |
209 | typedef struct PD_MaxInputShape {
210 | char* name;
211 | int* shape;
212 | int shape_size;
213 | } PD_MaxInputShape;
214 |
215 | PADDLE_CAPI_EXPORT extern void PD_SwitchIrDebug(PD_AnalysisConfig* config,
216 | bool x);
217 |
218 | PADDLE_CAPI_EXPORT extern void PD_EnableMKLDNN(PD_AnalysisConfig* config);
219 |
220 | PADDLE_CAPI_EXPORT extern void PD_SetMkldnnCacheCapacity(
221 | PD_AnalysisConfig* config, int capacity);
222 |
223 | PADDLE_CAPI_EXPORT extern bool PD_MkldnnEnabled(
224 | const PD_AnalysisConfig* config);
225 |
226 | PADDLE_CAPI_EXPORT extern void PD_SetCpuMathLibraryNumThreads(
227 | PD_AnalysisConfig* config, int cpu_math_library_num_threads);
228 |
229 | PADDLE_CAPI_EXPORT extern int PD_CpuMathLibraryNumThreads(
230 | const PD_AnalysisConfig* config);
231 |
232 | PADDLE_CAPI_EXPORT extern void PD_EnableMkldnnQuantizer(
233 | PD_AnalysisConfig* config);
234 |
235 | PADDLE_CAPI_EXPORT extern bool PD_MkldnnQuantizerEnabled(
236 | const PD_AnalysisConfig* config);
237 |
238 | PADDLE_CAPI_EXPORT extern void PD_SetModelBuffer(PD_AnalysisConfig* config,
239 | const char* prog_buffer,
240 | size_t prog_buffer_size,
241 | const char* params_buffer,
242 | size_t params_buffer_size);
243 |
244 | PADDLE_CAPI_EXPORT extern bool PD_ModelFromMemory(
245 | const PD_AnalysisConfig* config);
246 |
247 | PADDLE_CAPI_EXPORT extern void PD_EnableMemoryOptim(PD_AnalysisConfig* config);
248 |
249 | PADDLE_CAPI_EXPORT extern bool PD_MemoryOptimEnabled(
250 | const PD_AnalysisConfig* config);
251 |
252 | PADDLE_CAPI_EXPORT extern void PD_EnableProfile(PD_AnalysisConfig* config);
253 |
254 | PADDLE_CAPI_EXPORT extern bool PD_ProfileEnabled(
255 | const PD_AnalysisConfig* config);
256 |
257 | PADDLE_CAPI_EXPORT extern void PD_SetInValid(PD_AnalysisConfig* config);
258 |
259 | PADDLE_CAPI_EXPORT extern bool PD_IsValid(const PD_AnalysisConfig* config);
260 |
261 | PADDLE_CAPI_EXPORT extern void PD_DisableGlogInfo(PD_AnalysisConfig* config);
262 |
263 | PADDLE_CAPI_EXPORT extern void PD_DeletePass(PD_AnalysisConfig* config,
264 | char* pass_name);
265 |
266 | PADDLE_CAPI_EXPORT extern PD_Predictor* PD_NewPredictor(
267 | const PD_AnalysisConfig* config);
268 |
269 | PADDLE_CAPI_EXPORT extern void PD_DeletePredictor(PD_Predictor* predictor);
270 |
271 | PADDLE_CAPI_EXPORT extern int PD_GetInputNum(const PD_Predictor*);
272 |
273 | PADDLE_CAPI_EXPORT extern int PD_GetOutputNum(const PD_Predictor*);
274 |
275 | PADDLE_CAPI_EXPORT extern const char* PD_GetInputName(const PD_Predictor*, int);
276 |
277 | PADDLE_CAPI_EXPORT extern const char* PD_GetOutputName(const PD_Predictor*,
278 | int);
279 |
280 | PADDLE_CAPI_EXPORT extern void PD_SetZeroCopyInput(
281 | PD_Predictor* predictor, const PD_ZeroCopyTensor* tensor);
282 |
283 | PADDLE_CAPI_EXPORT extern void PD_GetZeroCopyOutput(PD_Predictor* predictor,
284 | PD_ZeroCopyTensor* tensor);
285 |
286 | PADDLE_CAPI_EXPORT extern void PD_ZeroCopyRun(PD_Predictor* predictor);
287 |
288 | #ifdef __cplusplus
289 | } // extern "C"
290 | #endif
291 |
--------------------------------------------------------------------------------