├── .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 | ![](./images/result/python_client_result.jpg) 325 | 326 | 最后,在Python中将上述结果可视化可以得到以下结果 327 | 328 | ![](./images/result/python_vis_result.jpg) -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------