圖片驗證碼訓練

圖片打碼

1.項目git地址

https://github.com/kerlomz/captcha_trainer

2.安裝模塊

pip install -r requirements.txt

3.創建項目

python make_dataset.py img_test
#這時候會報錯

4.添加配置文件

cd projects/img_test/ 上傳下面的配置文件
# - requirement.txt  -  GPU: tensorflow-gpu, CPU: tensorflow
# - If you use the GPU version, you need to install some additional applications.
# MemoryUsage: 顯存佔用率,推薦0.6-0.8之間
System:
  MemoryUsage: 0.6
  Version: 2

# CNNNetwork: [CNN5, ResNet50, DenseNet]
# RecurrentNetwork: [CuDNNBiLSTM, CuDNNLSTM, CuDNNGRU, BiLSTM, LSTM, GRU, BiGRU, NoRecurrent]
# - 推薦配置爲 不定長問題:CNN5+GRU ,定長:CNN5/DenseNet/ResNet50
# UnitsNum: RNN層的單元數 [16, 64, 128, 256, 512]
# - 神經網絡在隱層中使用大量神經元,就是做升維,將糾纏在一起的特徵或概念分開。
# Optimizer: 優化器算法 [AdaBound, Adam, Momentum]
# OutputLayer: [LossFunction, Decoder]
# - LossFunction: 損失函數 [CTC, CrossEntropy]
# - Decoder: 解碼器 [CTC, CrossEntropy]
NeuralNet:
  CNNNetwork: CNN5
  RecurrentNetwork: GRU
  UnitsNum: 64
  Optimizer: RAdam
  OutputLayer:
    LossFunction: CTC
    Decoder: CTC


# ModelName: 模型名/項目名,同時也對應編譯後的pb模型文件名
# ModelField: 模型處理的數據類型,目前只支持圖像 [Image, Text]
# ModelScene: 模型處理的場景類型,目前只支持分類場景 [Classification]
# - 目前只支持 “圖像分類” 這一種場景.
Model:
  ModelName: YWY
  ModelField: Image
  ModelScene: Classification

# FieldParam 分爲 Image, Text 兩種,不同數據類型時可配置的參數不同,目前只提供 Image 一種。
# ModelField 爲 Image 時:
# - Category: 提供默認的內置解決方案:
# -- [ALPHANUMERIC(含大小寫英文數字), ALPHANUMERIC_LOWER(小寫英文數字),
# -- ALPHANUMERIC_UPPER(大寫英文數字),NUMERIC(數字), ALPHABET_LOWER(小寫字母),
# -- ALPHABET_UPPER(大寫字母), ALPHABET(大小寫字母),
# -- ALPHANUMERIC_CHS_3500_LOWER(小寫字母數字混合中文常用3500)]
# - 或者可以自定義指定分類集如下(中文亦可):
# -- ['Cat', 'Lion', 'Tiger', 'Fish', 'BigCat']
# - Resize: 重置尺寸,對應網絡的輸入: [ImageWidth, ImageHeight/-1, ImageChannel]
# - ImageChannel: 圖像通道,3爲原圖,1爲灰度 [1, 3]
# - 爲了配合部署服務根據圖片尺寸自動選擇對應的模型,由此誕生以下參數(ImageWidth,ImageHeight):
# -- ImageWidth: 圖片寬度.
# -- ImageHeight: 圖片高度.
# - MaxLabelNum: 該參數在使用CTC損失函數時將被忽略,僅用於使用交叉熵作爲損失函數/標籤數固定時使用
# ModelField 爲 Text 時:
# - 該類型暫時不支持
FieldParam:
  Category: ALPHANUMERIC_UPPER
  Resize: [120, 44]
  ImageChannel: 1
  ImageWidth: 88
  ImageHeight: 33
  MaxLabelNum: 4
  OutputSplit: 
  AutoPadding: True


# 該配置應用於數據源的標籤獲取.
# LabelFrom: 標籤來源,目前只支持 從文件名提取 [FileName, XML, LMDB]
# ExtractRegex: 正則提取規則,對應於 從文件名提取 方案 FileName:
# - 默認匹配形如 apple_20181010121212.jpg 的文件.
# - 默認正則爲 .*?(?=_.*\.)
# LabelSplit: 該規則僅用於 從文件名提取 方案:
# - 文件名中的分割符形如: cat&big cat&lion_20181010121212.png,那麼分隔符爲 &
# - The Default is null.
Label:
  LabelFrom: FileName
  ExtractRegex: .*?(?=_)
  LabelSplit: 


# DatasetPath: [Training/Validation], 打包爲TFRecords格式的訓練集/驗證集的本地絕對路徑。
# SourcePath:  [Training/Validation], 未打包的訓練集/驗證集源文件夾的本地絕對路徑。
# ValidationSetNum: 驗證集數目,僅當未配置驗證集源文件夾時用於系統隨機抽樣用作驗證集使用。
# - 該選項用於懶人訓練模式,當樣本極度不均衡時建議手動設定合理的驗證集。
# SavedSteps: 當 Session.run() 被執行一次爲一步(1.x版本),保存訓練過程的步數,默認爲100。
# ValidationSteps: 用於計算準確率,驗證模型的步數,默認爲每500步驗證一次。
# EndAcc: 結束訓練的條件之準確率 [EndAcc*100]% 到達該條件時結束任務並編譯模型。
# EndCost: 結束訓練的條件之Cost值 EndCost 到達該條件時結束任務並編譯模型。
# EndEpochs: 結束訓練的條件之樣本訓練輪數 Epoch 到達該條件時結束任務並編譯模型。
# BatchSize: 批次大小,每一步用於訓練的樣本數量,不宜過大或過小,建議64。
# ValidationBatchSize: 驗證集批次大小,每個驗證準確率步時,用於驗證的樣本數量。
# LearningRate: 學習率 [0.1, 0.01, 0.001, 0.0001] fine-tuning 時選用較小的學習率。
Trains:
  DatasetPath:
    Training:
      - ./projects/img_test/dataset/Trains.0.tfrecords    #圖片TFRecords打包
    Validation:
      - ./projects/img_test/dataset/Validation.0.tfrecords  #圖片TFRecords打包
  SourcePath:
    Training: /home/public/img_test/images     #訓練集所在路徑圖片多的
    Validation: /home/public/img_test/images2  #測試集所在路徑圖片少的
  ValidationSetNum: 100
  SavedSteps: 100
  ValidationSteps: 500
  EndAcc: 0.95
  EndCost: 0.5
  EndEpochs: 2
  BatchSize: 64
  ValidationBatchSize: 100
  LearningRate: 0.001

# 以下爲數據增廣的配置
# Binaryzation: 該參數爲 list 類型,包含二值化的上界和下界,值爲 int 類型,參數爲 -1 表示未啓用。
# MedianBlur: 該參數爲 int 類型,參數爲 -1 表示未啓用。
# GaussianBlur: 該參數爲 int 類型,參數爲 -1 表示未啓用。
# EqualizeHist: 該參數爲 bool 類型。
# Laplace: 該參數爲 bool 類型。
# WarpPerspective: 該參數爲 bool 類型。
# Rotate: 該參數爲大於 0 的 int 類型,參數爲 -1 表示未啓用。
# PepperNoise: 該參數爲小於 1 的 float 類型,參數爲 -1 表示未啓用。
# Brightness: 該參數爲 bool 類型。
# Saturation: 該參數爲 bool 類型。
# Hue: 該參數爲 bool 類型。
# Gamma: 該參數爲 bool 類型。
# ChannelSwap: 該參數爲 bool 類型。
# RandomBlank: 該參數爲大於 0 的 int 類型,參數爲 -1 表示未啓用。
# RandomTransition: 該參數爲大於 0 的 int 類型,參數爲 -1 表示未啓用。
DataAugmentation:
  Binaryzation: -1
  MedianBlur: -1
  GaussianBlur: -1
  EqualizeHist: False
  Laplace: False
  WarpPerspective: False
  Rotate: -1
  PepperNoise: -1.0
  Brightness: False
  Saturation: False
  Hue: False
  Gamma: False
  ChannelSwap: False
  RandomBlank: -1
  RandomTransition: -1
  RandomCaptcha: 
     Enable: False
     FontPath: 

# 以下爲預處理的配置
# Binaryzation: 該參數爲 list 類型,包含二值化的上界和下界,值爲 int 類型,參數爲 -1 表示未啓用。
# ReplaceTransparent: 使用白色替換透明背景
# HorizontalStitching: 水平拆分拼接,適用於上下分層
# ConcatFrames: 根據幀索引列表水平合併幀
# BlendFrames: 根據幀索引列表融合幀內容
Pretreatment:
  Binaryzation: -1
  ReplaceTransparent: True
  HorizontalStitching: False
  ConcatFrames: -1
  BlendFrames: -1
  ExecuteMap: {}

5.把圖片訓練成if格式

python make_dataset.py img_test

6.開始訓練

python trains.py img_test

7.運行模型

在項目的out文件吧 pb文件和yaml文件複製到同一目錄下

8.腳本

# -*- coding: utf-8 -*-
# @File     : muggle_ocr.py
# @Software : PyCharm
# @Desc     : 模型調用客戶端

import io
import os
import cv2
import pickle
import yaml
import binascii
import numpy as np
import PIL.Image as PIL_Image
from enum import Enum, unique
import tensorflow as tf
from tensorflow.python.framework.errors_impl import NotFoundError

init_img = b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x02\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x08\x06\x06\x07\x06\x05\x08\x07\x07\x07\t\t\x08\n\x0c\x14\r\x0c\x0b\x0b\x0c\x19\x12\x13\x0f\x14\x1d\x1a\x1f\x1e\x1d\x1a\x1c\x1c $.\' ",#\x1c\x1c(7),01444\x1f\'9=82<.342\xff\xdb\x00C\x01\t\t\t\x0c\x0b\x0c\x18\r\r\x182!\x1c!22222222222222222222222222222222222222222222222222\xff\xc0\x00\x11\x08\x00\x1e\x00[\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01}\x01\x02\x03\x00\x04\x11\x05\x12!1A\x06\x13Qa\x07"q\x142\x81\x91\xa1\x08#B\xb1\xc1\x15R\xd1\xf0$3br\x82\t\n\x16\x17\x18\x19\x1a%&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x11\x00\x02\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04\x00\x01\x02w\x00\x01\x02\x03\x11\x04\x05!1\x06\x12AQ\x07aq\x13"2\x81\x08\x14B\x91\xa1\xb1\xc1\t#3R\xf0\x15br\xd1\n\x16$4\xe1%\xf1\x17\x18\x19\x1a&\'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf5\xf1P_j6\xfat"I\xd8\x8c\xf0\xaa9,}\xaa\xc0\xac\xad{\\\xd0\xb4\x18a\xb8\xd7.\xe0\xb7Vb"\xf3\x01b\xc7\xbe\xd0\x01\'\xb7ARj\xcb\x9aN\xab\x06\xadlg\x800\n\xdbJ\xb7Pk7Y\xf1;\xe8\xda\xa2[=\xae\xf8J\x07.\x0f g\x06\xbc\xff\x00K\xf1\xfc\xbav\xa3t4\x8f\x0ck:\xad\xbc\x8eH1@\xe9\xb5{\x10\n\x92{zR\xcb\xf1?H\xb9\xf1<GX\xd1u\x8b\x18\xcc\x1eKG=\xb7 \x93\xd4\x8c\xe7\x1f\x85\\\x12\xbe\xa3\x83W\xf7\x8fJ\xbd\xd7\x83X[\xcd\xa6bs<\x9e^\xe5R\xde_\xcaNH\x1c\xf6\xc7\xd4\x8a\x9bJ\xba\x966T\xb9\x9eIE\xc0\xdf\x1bH\x02\x95q\xf7\xa3 p\x08\xf4\xf65\xe6\xban\xbfec{\xfd\xa7\xa5\xea\x16\xcdg\xe6\x05h~\xd2\x85\xf1\xe8\xcb\x9c\x8f\xc4W\xa1#\xc5\xa8Ev-X\x15\x99V\xea\xd9\x87f\xef\xfa\xf5\xfa\x9a\xb9\xd3\xe5\xd5lUJ|\xba\xadQ\xca\\kZ\xfe\xb6\xf6\xabov\xf1\x8dA\xe4\x16\xf6\xb0\x00\x9bcC\x82\xce\xfdG\xd0WK\xa1x\x1a\x1d*\xf2\xce\xfa[\xc7\x92\xe2\xdbv\xc4\x8d\x02F7\x0c7\x1c\x93\x9fRI5\xcb\xe9w\xf0X\xc5\xa7\\\xb3\x8f3K\xbe\x9a;\xb4\x07,\x90\xc9\xf7X\x81\xd8\x1d\xa3\xd3\x83]\xb5\xc7\x8dt\x1bt\xca^\x8b\x96?u-\x94\xc8X\xf6\x03\x15\x89\x89\xd1\x8ap\xac\x7f\r\xeb\x89\xe2\r0\xde,-\x03,\xaf\x1b\xc4\xe7\xe6B\x0f\x7f|b\xb6EP\x87v\xa6\xd2\x9am\x029\xfb\xa3p\xb6s5\xa4q\xc9r\x10\x98\x92V*\xac\xd8\xe0\x12\x01 g\xda\xb2to\r\x8bK\xa3\xaa\xea\xb3.\xa1\xadH0\xd7\x0c\xb8XG\xf7!_\xe0Q\xf9\x9e\xa4\x9a\xdd\x14\xf1Rjq\x93}\xbeo\x12\xad\xfe\x9b\xa7\xce\x92\x01\xb6E\x94\x05\x04\xe3\x19\xfaV\xbd\xa6\x91\xa8\x7fm\xc5\xa8\xde4\x0e|\xa2\x92\x00=\xf28\xf6\xf5\xad\xf1O\x15I\xb4$\xecek>\x15\xd0\xbcE\x11\x8fV\xd2\xad\xae\x81\xe7s\xa6\x1c}\x18`\x8f\xce\xb8\x89>\x13Ma\xab+\xf8c]\xd4\xb4ke\x1b\x90%\xc1\x928\xcfB67\xde\xfcH\xafO\x14\xf1HG\x8f\xddx/\xe2>\x97\xa8\x8dF\xc7Q\xd2\xf5yUJ\x96h\xc5\xbc\xb2\xa9\xea\x18cc\x0f\xa95\x8e<Q\xabi\xd3J<]\xa3x\x93JEb\xad6\x9bn\x9eQ\xf5\xf9\x80\x03\x1e\xe0\x9c\x8a\xf7\xb1O\x14\x12y\xe7\x85~"\xfc<\xb5\xd3E\xa6\x9b\xac\xacX&GI\xe3\x91df=I\xca\xfc\xc7\xe9\x9a\xeb\xb4\x8f\x15\xe9:\xe5\xe1\xb6\xd3\xde\xeaVT.dk)\xa3\x8f\x00\x81\xf7\xd9\x02\x93\xcf@j\xfc\x1au\x8d\xbd\xdc\x97p\xd9[\xc7s \xda\xf3$J\x1d\x87\\\x16\x03$U\xc1L@i\xb4\xa6\x9b@\x1f\xff\xd9'
WORK_PATH = os.path.dirname(__file__)
SPACE_TOKEN = ['']
NUMBER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
ALPHA_UPPER = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
               'V', 'W', 'X', 'Y', 'Z']
ALPHA_LOWER = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
               'v', 'w', 'x', 'y', 'z']
ARITHMETIC = ['(', ')', '+', '-', '×', '÷', '=']

CHINESE_3500 = [
    '一', '乙', '二', '十', '丁', '廠', '七', '卜', '人', '入', '八', '九', '幾', '兒', '了', '力', '乃', '刀', '又', '三',
    '於', '幹', '虧', '士', '工', '土', '才', '寸', '下', '大', '丈', '與', '萬', '上', '小', '口', '巾', '山', '千', '乞',
    '川', '億', '個', '勺', '久', '凡', '及', '夕', '丸', '麼', '廣', '亡', '門', '義', '之', '屍', '弓', '己', '已', '子',
    '衛', '也', '女', '飛', '刃', '習', '叉', '馬', '鄉', '豐', '王', '井', '開', '夫', '天', '無', '元', '專', '雲', '扎',
    '藝', '木', '五', '支', '廳', '不', '太', '犬', '區', '歷', '尤', '友', '匹', '車', '巨', '牙', '屯', '比', '互', '切',
    '瓦', '止', '少', '日', '中', '岡', '貝', '內', '水', '見', '午', '牛', '手', '毛', '氣', '升', '長', '仁', '什', '片',
    '僕', '化', '仇', '幣', '仍', '僅', '斤', '爪', '反', '介', '父', '從', '今', '兇', '分', '乏', '公', '倉', '月', '氏',
    '勿', '欠', '風', '丹', '勻', '烏', '鳳', '勾', '文', '六', '方', '火', '爲', '鬥', '憶', '訂', '計', '戶', '認', '心',
    '尺', '引', '醜', '巴', '孔', '隊', '辦', '以', '允', '予', '勸', '雙', '書', '幻', '玉', '刊', '示', '末', '未', '擊',
    '打', '巧', '正', '撲', '扒', '功', '扔', '去', '甘', '世', '古', '節', '本', '術', '可', '丙', '左', '厲', '右', '石',
    '布', '龍', '平', '滅', '軋', '東', '卡', '北', '佔', '業', '舊', '帥', '歸', '且', '旦', '目', '葉', '甲', '申', '叮',
    '電', '號', '田', '由', '史', '只', '央', '兄', '叼', '叫', '另', '叨', '嘆', '四', '生', '失', '禾', '丘', '付', '仗',
    '代', '仙', '們', '儀', '白', '仔', '他', '斥', '瓜', '乎', '叢', '令', '用', '甩', '印', '樂', '句', '匆', '冊', '犯',
    '外', '處', '冬', '鳥', '務', '包', '飢', '主', '市', '立', '閃', '蘭', '半', '汁', '匯', '頭', '漢', '寧', '穴', '它',
    '討', '寫', '讓', '禮', '訓', '必', '議', '訊', '記', '永', '司', '尼', '民', '出', '遼', '奶', '奴', '加', '召', '皮',
    '邊', '發', '孕', '聖', '對', '臺', '矛', '糾', '母', '幼', '絲', '式', '刑', '動', '扛', '寺', '吉', '扣', '考', '託',
    '老', '執', '鞏', '圾', '擴', '掃', '地', '揚', '場', '耳', '共', '芒', '亞', '芝', '朽', '樸', '機', '權', '過', '臣',
    '再', '協', '西', '壓', '厭', '在', '有', '百', '存', '而', '頁', '匠', '誇', '奪', '灰', '達', '列', '死', '成', '夾',
    '軌', '邪', '劃', '邁', '畢', '至', '此', '貞', '師', '塵', '尖', '劣', '光', '當', '早', '吐', '嚇', '蟲', '曲', '團',
    '同', '吊', '喫', '因', '吸', '嗎', '嶼', '帆', '歲', '回', '豈', '剛', '則', '肉', '網', '年', '朱', '先', '丟', '舌',
    '竹', '遷', '喬', '偉', '傳', '乒', '乓', '休', '伍', '伏', '優', '伐', '延', '件', '任', '傷', '價', '份', '華', '仰',
    '仿', '夥', '僞', '自', '血', '向', '似', '後', '行', '舟', '全', '會', '殺', '合', '兆', '企', '衆', '爺', '傘', '創',
    '肌', '朵', '雜', '危', '旬', '旨', '負', '各', '名', '多', '爭', '色', '壯', '衝', '冰', '莊', '慶', '亦', '劉', '齊',
    '交', '次', '衣', '產', '決', '充', '妄', '閉', '問', '闖', '羊', '並', '關', '米', '燈', '州', '汗', '污', '江', '池',
    '湯', '忙', '興', '宇', '守', '宅', '字', '安', '講', '軍', '許', '論', '農', '諷', '設', '訪', '尋', '那', '迅', '盡',
    '導', '異', '孫', '陣', '陽', '收', '階', '陰', '防', '奸', '如', '婦', '好', '她', '媽', '戲', '羽', '觀', '歡', '買',
    '紅', '纖', '級', '約', '紀', '馳', '巡', '壽', '弄', '麥', '形', '進', '戒', '吞', '遠', '違', '運', '扶', '撫', '壇',
    '技', '壞', '擾', '拒', '找', '批', '扯', '址', '走', '抄', '壩', '貢', '攻', '赤', '折', '抓', '扮', '搶', '孝', '均',
    '拋', '投', '墳', '抗', '坑', '坊', '抖', '護', '殼', '志', '扭', '塊', '聲', '把', '報', '卻', '劫', '芽', '花', '芹',
    '芬', '蒼', '芳', '嚴', '蘆', '勞', '克', '蘇', '杆', '槓', '杜', '材', '村', '杏', '極', '李', '楊', '求', '更', '束',
    '豆', '兩', '麗', '醫', '辰', '勵', '否', '還', '殲', '來', '連', '步', '堅', '旱', '盯', '呈', '時', '吳', '助', '縣',
    '裏', '呆', '園', '曠', '圍', '呀', '噸', '足', '郵', '男', '困', '吵', '串', '員', '聽', '吩', '吹', '嗚', '吧', '吼',
    '別', '崗', '帳', '財', '針', '釘', '告', '我', '亂', '利', '禿', '秀', '私', '每', '兵', '估', '體', '何', '但', '伸',
    '作', '伯', '伶', '傭', '低', '你', '住', '位', '伴', '身', '皁', '佛', '近', '徹', '役', '返', '餘', '希', '坐', '谷',
    '妥', '含', '鄰', '岔', '肝', '肚', '腸', '龜', '免', '狂', '猶', '角', '刪', '條', '卵', '島', '迎', '飯', '飲', '系',
    '言', '凍', '狀', '畝', '況', '牀', '庫', '療', '應', '冷', '這', '序', '辛', '棄', '冶', '忘', '閒', '間', '悶', '判',
    '竈', '燦', '弟', '汪', '沙', '汽', '沃', '泛', '溝', '沒', '沈', '沉', '懷', '憂', '快', '完', '宋', '宏', '牢', '究',
    '窮', '災', '良', '證', '啓', '評', '補', '初', '社', '識', '訴', '診', '詞', '譯', '君', '靈', '即', '層', '尿', '尾',
    '遲', '局', '改', '張', '忌', '際', '陸', '阿', '陳', '阻', '附', '妙', '妖', '妨', '努', '忍', '勁', '雞', '驅', '純',
    '紗', '納', '綱', '駁', '縱', '紛', '紙', '紋', '紡', '驢', '紐', '奉', '玩', '環', '武', '青', '責', '現', '表', '規',
    '抹', '攏', '拔', '揀', '擔', '坦', '押', '抽', '拐', '拖', '拍', '者', '頂', '拆', '擁', '抵', '拘', '勢', '抱', '垃',
    '拉', '攔', '拌', '幸', '招', '坡', '披', '撥', '擇', '擡', '其', '取', '苦', '若', '茂', '蘋', '苗', '英', '範', '直',
    '茄', '莖', '茅', '林', '枝', '杯', '櫃', '析', '板', '松', '槍', '構', '傑', '述', '枕', '喪', '或', '畫', '臥', '事',
    '刺', '棗', '雨', '賣', '礦', '碼', '廁', '奔', '奇', '奮', '態', '歐', '壟', '妻', '轟', '頃', '轉', '斬', '輪', '軟',
    '到', '非', '叔', '肯', '齒', '些', '虎', '虜', '腎', '賢', '尚', '旺', '具', '果', '味', '昆', '國', '昌', '暢', '明',
    '易', '昂', '典', '固', '忠', '咐', '呼', '鳴', '詠', '呢', '岸', '巖', '帖', '羅', '幟', '嶺', '凱', '敗', '販', '購',
    '圖', '釣', '制', '知', '垂', '牧', '物', '乖', '刮', '稈', '和', '季', '委', '佳', '侍', '供', '使', '例', '版', '侄',
    '偵', '側', '憑', '僑', '佩', '貨', '依', '的', '迫', '質', '欣', '徵', '往', '爬', '彼', '徑', '所', '舍', '金', '命',
    '斧', '爸', '採', '受', '乳', '貪', '念', '貧', '膚', '肺', '肢', '腫', '脹', '朋', '股', '肥', '服', '脅', '周', '昏',
    '魚', '兔', '狐', '忽', '狗', '備', '飾', '飽', '飼', '變', '京', '享', '店', '夜', '廟', '府', '底', '劑', '郊', '廢',
    '淨', '盲', '放', '刻', '育', '閘', '鬧', '鄭', '券', '卷', '單', '炒', '炊', '炕', '炎', '爐', '沫', '淺', '法', '泄',
    '河', '沾', '淚', '油', '泊', '沿', '泡', '注', '瀉', '泳', '泥', '沸', '波', '潑', '澤', '治', '怖', '性', '怕', '憐',
    '怪', '學', '寶', '宗', '定', '宜', '審', '宙', '官', '空', '簾', '實', '試', '郎', '詩', '肩', '房', '誠', '襯', '衫',
    '視', '話', '誕', '詢', '該', '詳', '建', '肅', '錄', '隸', '居', '屆', '刷', '屈', '弦', '承', '孟', '孤', '陝', '降',
    '限', '妹', '姑', '姐', '姓', '始', '駕', '參', '艱', '線', '練', '組', '細', '駛', '織', '終', '駐', '駝', '紹', '經',
    '貫', '奏', '春', '幫', '珍', '玻', '毒', '型', '掛', '封', '持', '項', '垮', '挎', '城', '撓', '政', '赴', '趙', '擋',
    '挺', '括', '拴', '拾', '挑', '指', '墊', '掙', '擠', '拼', '挖', '按', '揮', '挪', '某', '甚', '革', '薦', '巷', '帶',
    '草', '繭', '茶', '荒', '茫', '蕩', '榮', '故', '胡', '南', '藥', '標', '枯', '柄', '棟', '相', '查', '柏', '柳', '柱',
    '柿', '欄', '樹', '要', '鹹', '威', '歪', '研', '磚', '釐', '厚', '砌', '砍', '面', '耐', '耍', '牽', '殘', '殃', '輕',
    '鴉', '皆', '背', '戰', '點', '臨', '覽', '豎', '省', '削', '嘗', '是', '盼', '眨', '哄', '顯', '啞', '冒', '映', '星',
    '昨', '畏', '趴', '胃', '貴', '界', '虹', '蝦', '蟻', '思', '螞', '雖', '品', '咽', '罵', '譁', '咱', '響', '哈', '咬',
    '咳', '哪', '炭', '峽', '罰', '賤', '貼', '骨', '鈔', '鍾', '鋼', '鑰', '鉤', '卸', '缸', '拜', '看', '矩', '怎', '牲',
    '選', '適', '秒', '香', '種', '秋', '科', '重', '復', '竿', '段', '便', '倆', '貸', '順', '修', '保', '促', '侮', '儉',
    '俗', '俘', '信', '皇', '泉', '鬼', '侵', '追', '俊', '盾', '待', '律', '很', '須', '敘', '劍', '逃', '食', '盆', '膽',
    '勝', '胞', '胖', '脈', '勉', '狹', '獅', '獨', '狡', '獄', '狠', '貿', '怨', '急', '饒', '蝕', '餃', '餅', '彎', '將',
    '獎', '哀', '亭', '亮', '度', '跡', '庭', '瘡', '瘋', '疫', '疤', '姿', '親', '音', '帝', '施', '聞', '閥', '閣', '差',
    '養', '美', '姜', '叛', '送', '類', '迷', '前', '首', '逆', '總', '煉', '炸', '炮', '爛', '剃', '潔', '洪', '灑', '澆',
    '濁', '洞', '測', '洗', '活', '派', '洽', '染', '濟', '洋', '洲', '渾', '濃', '津', '恆', '恢', '恰', '惱', '恨', '舉',
    '覺', '宣', '室', '宮', '憲', '突', '穿', '竊', '客', '冠', '語', '扁', '襖', '祖', '神', '祝', '誤', '誘', '說', '誦',
    '墾', '退', '既', '屋', '晝', '費', '陡', '眉', '孩', '除', '險', '院', '娃', '姥', '姨', '姻', '嬌', '怒', '架', '賀',
    '盈', '勇', '怠', '柔', '壘', '綁', '絨', '結', '繞', '驕', '繪', '給', '絡', '駱', '絕', '絞', '統', '耕', '耗', '豔',
    '泰', '珠', '班', '素', '蠶', '頑', '盞', '匪', '撈', '栽', '捕', '振', '載', '趕', '起', '鹽', '捎', '捏', '埋', '捉',
    '捆', '捐', '損', '都', '哲', '逝', '撿', '換', '挽', '熱', '恐', '壺', '挨', '恥', '耽', '恭', '蓮', '莫', '荷', '獲',
    '晉', '惡', '真', '框', '桂', '檔', '桐', '株', '橋', '桃', '格', '校', '核', '樣', '根', '索', '哥', '速', '逗', '慄',
    '配', '翅', '辱', '脣', '夏', '礎', '破', '原', '套', '逐', '烈', '殊', '顧', '轎', '較', '頓', '斃', '致', '柴', '桌',
    '慮', '監', '緊', '黨', '曬', '眠', '曉', '鴨', '晃', '晌', '暈', '蚊', '哨', '哭', '恩', '喚', '啊', '唉', '罷', '峯',
    '圓', '賊', '賄', '錢', '鉗', '鑽', '鐵', '鈴', '鉛', '缺', '氧', '特', '犧', '造', '乘', '敵', '秤', '租', '積', '秧',
    '秩', '稱', '祕', '透', '筆', '笑', '筍', '債', '借', '值', '倚', '傾', '倒', '倘', '俱', '倡', '候', '俯', '倍', '倦',
    '健', '臭', '射', '躬', '息', '徒', '徐', '艦', '艙', '般', '航', '途', '拿', '爹', '愛', '頌', '翁', '脆', '脂', '胸',
    '胳', '髒', '膠', '腦', '狸', '狼', '逢', '留', '皺', '餓', '戀', '槳', '漿', '衰', '高', '席', '準', '座', '脊', '症',
    '病', '疾', '疼', '疲', '效', '離', '唐', '資', '涼', '站', '剖', '競', '部', '旁', '旅', '畜', '閱', '羞', '瓶', '拳',
    '粉', '料', '益', '兼', '烤', '烘', '煩', '燒', '燭', '煙', '遞', '濤', '浙', '澇', '酒', '涉', '消', '浩', '海', '塗',
    '浴', '浮', '流', '潤', '浪', '浸', '漲', '燙', '湧', '悟', '悄', '悔', '悅', '害', '寬', '家', '宵', '宴', '賓', '窄',
    '容', '宰', '案', '請', '朗', '諸', '讀', '扇', '襪', '袖', '袍', '被', '祥', '課', '誰', '調', '冤', '諒', '談', '誼',
    '剝', '懇', '展', '劇', '屑', '弱', '陵', '陶', '陷', '陪', '娛', '娘', '通', '能', '難', '預', '桑', '絹', '繡', '驗',
    '繼', '球', '理', '捧', '堵', '描', '域', '掩', '捷', '排', '掉', '堆', '推', '掀', '授', '教', '掏', '掠', '培', '接',
    '控', '探', '據', '掘', '職', '基', '著', '勒', '黃', '萌', '蘿', '菌', '菜', '萄', '菊', '萍', '菠', '營', '械', '夢',
    '梢', '梅', '檢', '梳', '梯', '桶', '救', '副', '票', '戚', '爽', '聾', '襲', '盛', '雪', '輔', '輛', '虛', '雀', '堂',
    '常', '匙', '晨', '睜', '眯', '眼', '懸', '野', '啦', '晚', '啄', '距', '躍', '略', '蛇', '累', '唱', '患', '唯', '崖',
    '嶄', '崇', '圈', '銅', '鏟', '銀', '甜', '梨', '犁', '移', '笨', '籠', '笛', '符', '第', '敏', '做', '袋', '悠', '償',
    '偶', '偷', '您', '售', '停', '偏', '假', '得', '銜', '盤', '船', '斜', '盒', '鴿', '悉', '欲', '彩', '領', '腳', '脖',
    '臉', '脫', '象', '夠', '猜', '豬', '獵', '貓', '猛', '餡', '館', '湊', '減', '毫', '麻', '癢', '痕', '廊', '康', '庸',
    '鹿', '盜', '章', '竟', '商', '族', '旋', '望', '率', '着', '蓋', '粘', '粗', '粒', '斷', '剪', '獸', '清', '添', '淋',
    '淹', '渠', '漸', '混', '漁', '淘', '液', '淡', '深', '婆', '梁', '滲', '情', '惜', '慚', '悼', '懼', '惕', '驚', '慘',
    '慣', '寇', '寄', '宿', '窯', '密', '謀', '謊', '禍', '謎', '逮', '敢', '屠', '彈', '隨', '蛋', '隆', '隱', '婚', '嬸',
    '頸', '績', '緒', '續', '騎', '繩', '維', '綿', '綢', '綠', '琴', '斑', '替', '款', '堪', '搭', '塔', '越', '趁', '趨',
    '超', '提', '堤', '博', '揭', '喜', '插', '揪', '搜', '煮', '援', '裁', '擱', '摟', '攪', '握', '揉', '斯', '期', '欺',
    '聯', '散', '惹', '葬', '葛', '董', '葡', '敬', '蔥', '落', '朝', '辜', '葵', '棒', '棋', '植', '森', '椅', '椒', '棵',
    '棍', '棉', '棚', '棕', '惠', '惑', '逼', '廚', '廈', '硬', '確', '雁', '殖', '裂', '雄', '暫', '雅', '輩', '悲', '紫',
    '輝', '敞', '賞', '掌', '晴', '暑', '最', '量', '噴', '晶', '喇', '遇', '喊', '景', '踐', '跌', '跑', '遺', '蛙', '蛛',
    '蜓', '喝', '喂', '喘', '喉', '幅', '帽', '賭', '賠', '黑', '鑄', '鋪', '鏈', '銷', '鎖', '鋤', '鍋', '鏽', '鋒', '銳',
    '短', '智', '毯', '鵝', '剩', '稍', '程', '稀', '稅', '筐', '等', '築', '策', '篩', '筒', '答', '筋', '箏', '傲', '傅',
    '牌', '堡', '集', '焦', '傍', '儲', '奧', '街', '懲', '御', '循', '艇', '舒', '番', '釋', '禽', '臘', '脾', '腔', '魯',
    '猾', '猴', '然', '饞', '裝', '蠻', '就', '痛', '童', '闊', '善', '羨', '普', '糞', '尊', '道', '曾', '焰', '港', '湖',
    '渣', '溼', '溫', '渴', '滑', '灣', '渡', '遊', '滋', '溉', '憤', '慌', '惰', '愧', '愉', '慨', '割', '寒', '富', '竄',
    '窩', '窗', '遍', '裕', '褲', '裙', '謝', '謠', '謙', '屬', '屢', '強', '粥', '疏', '隔', '隙', '絮', '嫂', '登', '緞',
    '緩', '編', '騙', '緣', '瑞', '魂', '肆', '攝', '摸', '填', '搏', '塌', '鼓', '擺', '攜', '搬', '搖', '搞', '塘', '攤',
    '蒜', '勤', '鵲', '藍', '墓', '幕', '蓬', '蓄', '蒙', '蒸', '獻', '禁', '楚', '想', '槐', '榆', '樓', '概', '賴', '酬',
    '感', '礙', '碑', '碎', '碰', '碗', '碌', '雷', '零', '霧', '雹', '輸', '督', '齡', '鑑', '睛', '睡', '睬', '鄙', '愚',
    '暖', '盟', '歇', '暗', '照', '跨', '跳', '跪', '路', '跟', '遣', '蛾', '蜂', '嗓', '置', '罪', '罩', '錯', '錫', '鑼',
    '錘', '錦', '鍵', '鋸', '矮', '辭', '稠', '愁', '籌', '籤', '簡', '毀', '舅', '鼠', '催', '傻', '像', '躲', '微', '愈',
    '遙', '腰', '腥', '腹', '騰', '腿', '觸', '解', '醬', '痰', '廉', '新', '韻', '意', '糧', '數', '煎', '塑', '慈', '煤',
    '煌', '滿', '漠', '源', '濾', '濫', '滔', '溪', '溜', '滾', '濱', '粱', '灘', '慎', '譽', '塞', '謹', '福', '羣', '殿',
    '闢', '障', '嫌', '嫁', '疊', '縫', '纏', '靜', '碧', '璃', '牆', '撇', '嘉', '摧', '截', '誓', '境', '摘', '摔', '聚',
    '蔽', '慕', '暮', '蔑', '模', '榴', '榜', '榨', '歌', '遭', '酷', '釀', '酸', '磁', '願', '需', '弊', '裳', '顆', '嗽',
    '蜻', '蠟', '蠅', '蜘', '賺', '鍬', '鍛', '舞', '穩', '算', '籮', '管', '僚', '鼻', '魄', '貌', '膜', '膊', '膀', '鮮',
    '疑', '饅', '裹', '敲', '豪', '膏', '遮', '腐', '瘦', '辣', '竭', '端', '旗', '精', '歉', '熄', '熔', '漆', '漂', '漫',
    '滴', '演', '漏', '慢', '寨', '賽', '察', '蜜', '譜', '嫩', '翠', '熊', '凳', '騾', '縮', '慧', '撕', '撒', '趣', '趟',
    '撐', '播', '撞', '撤', '增', '聰', '鞋', '蕉', '蔬', '橫', '槽', '櫻', '橡', '飄', '醋', '醉', '震', '黴', '瞞', '題',
    '暴', '瞎', '影', '踢', '踏', '踩', '蹤', '蝶', '蝴', '囑', '墨', '鎮', '靠', '稻', '黎', '稿', '稼', '箱', '箭', '篇',
    '僵', '躺', '僻', '德', '艘', '膝', '膛', '熟', '摩', '顏', '毅', '糊', '遵', '潛', '潮', '懂', '額', '慰', '劈', '操',
    '燕', '薯', '薪', '薄', '顛', '橘', '整', '融', '醒', '餐', '嘴', '蹄', '器', '贈', '默', '鏡', '贊', '籃', '邀', '衡',
    '膨', '雕', '磨', '凝', '辨', '辯', '糖', '糕', '燃', '澡', '激', '懶', '壁', '避', '繳', '戴', '擦', '鞠', '藏', '霜',
    '霞', '瞧', '蹈', '螺', '穗', '繁', '辮', '贏', '糟', '糠', '燥', '臂', '翼', '驟', '鞭', '覆', '蹦', '鐮', '翻', '鷹',
    '警', '攀', '蹲', '顫', '瓣', '爆', '疆', '壤', '耀', '躁', '嚼', '嚷', '籍', '魔', '灌', '蠢', '霸', '露', '囊', '罐',
    '匕', '刁', '丐', '歹', '戈', '夭', '侖', '譏', '冗', '鄧', '艾', '夯', '凸', '盧', '叭', '嘰', '皿', '凹', '囚', '矢',
    '乍', '爾', '馮', '玄', '邦', '迂', '邢', '芋', '芍', '吏', '夷', '籲', '呂', '吆', '屹', '廷', '迄', '臼', '仲', '倫',
    '伊', '肋', '旭', '匈', '鳧', '妝', '亥', '汛', '諱', '訝', '訛', '訟', '訣', '弛', '阱', '馱', '馴', '紉', '玖', '瑪',
    '韌', '摳', '扼', '汞', '扳', '掄', '坎', '塢', '抑', '擬', '抒', '芙', '蕪', '葦', '芥', '芯', '芭', '杖', '杉', '巫',
    '杈', '甫', '匣', '軒', '滷', '肖', '吱', '吠', '嘔', '吶', '吟', '嗆', '吻', '吭', '邑', '囤', '吮', '嶇', '牡', '佑',
    '佃', '伺', '囪', '肛', '肘', '甸', '狽', '鳩', '彤', '灸', '刨', '庇', '吝', '廬', '閏', '兌', '灼', '沐', '沛', '汰',
    '瀝', '淪', '洶', '滄', '滬', '忱', '詛', '詐', '罕', '屁', '墜', '妓', '姊', '妒', '緯', '玫', '卦', '坷', '坯', '拓',
    '坪', '坤', '拄', '擰', '拂', '拙', '拇', '拗', '茉', '昔', '苛', '苫', '苟', '苞', '茁', '苔', '枉', '樞', '枚', '楓',
    '杭', '鬱', '礬', '奈', '奄', '毆', '歧', '卓', '曇', '哎', '咕', '呵', '嚨', '呻', '咒', '咆', '咖', '帕', '賬', '貶',
    '貯', '氛', '秉', '嶽', '俠', '僥', '侶', '侈', '卑', '劊', '剎', '餚', '覓', '忿', '甕', '骯', '肪', '獰', '龐', '瘧',
    '疙', '疚', '卒', '氓', '炬', '沽', '沮', '泣', '濘', '泌', '沼', '怔', '怯', '寵', '宛', '衩', '祈', '詭', '帚', '屜',
    '弧', '彌', '陋', '陌', '函', '姆', '蝨', '叄', '紳', '駒', '絆', '繹', '契', '貳', '玷', '玲', '珊', '拭', '拷', '拱',
    '挾', '垢', '垛', '拯', '荊', '茸', '茬', '莢', '茵', '茴', '蕎', '薺', '葷', '熒', '荔', '棧', '柑', '柵', '檸', '枷',
    '勃', '柬', '砂', '泵', '硯', '鷗', '軸', '韭', '虐', '昧', '盹', '咧', '暱', '昭', '盅', '勳', '哆', '咪', '喲', '幽',
    '鈣', '鈍', '鈉', '欽', '鈞', '鈕', '氈', '氫', '秕', '俏', '俄', '俐', '侯', '徊', '衍', '胚', '朧', '胎', '猙', '餌',
    '巒', '奕', '諮', '颯', '閨', '閩', '籽', '婁', '爍', '炫', '窪', '柒', '涎', '洛', '恃', '恍', '恬', '恤', '宦', '誡',
    '誣', '祠', '誨', '屏', '屎', '遜', '隕', '姚', '娜', '蚤', '駭', '耘', '耙', '秦', '匿', '埂', '捂', '捍', '袁', '捌',
    '挫', '摯', '搗', '捅', '埃', '耿', '聶', '荸', '莽', '萊', '莉', '瑩', '鶯', '梆', '棲', '樺', '栓', '桅', '樁', '賈',
    '酌', '砸', '砰', '礫', '殉', '逞', '哮', '嘮', '哺', '剔', '蚌', '蚜', '畔', '蚣', '蚪', '蚓', '哩', '圃', '鴦', '唁',
    '哼', '唆', '峭', '唧', '峻', '賂', '贓', '鉀', '鉚', '氨', '秫', '笆', '俺', '賃', '倔', '殷', '聳', '舀', '豺', '豹',
    '頒', '胯', '胰', '臍', '膿', '逛', '卿', '鴕', '鴛', '餒', '凌', '悽', '衷', '郭', '齋', '疹', '紊', '瓷', '羔', '烙',
    '浦', '渦', '渙', '滌', '澗', '涕', '澀', '悍', '憫', '竅', '諾', '誹', '袒', '諄', '祟', '恕', '娩', '駿', '瑣', '麩',
    '琉', '琅', '措', '捺', '捶', '赦', '埠', '捻', '掐', '掂', '掖', '擲', '撣', '摻', '勘', '聊', '娶', '菱', '菲', '萎',
    '菩', '螢', '乾', '蕭', '薩', '菇', '彬', '梗', '梧', '梭', '曹', '醞', '酗', '廂', '硅', '碩', '奢', '盔', '匾', '顱',
    '彪', '眶', '晤', '曼', '晦', '冕', '啡', '畦', '趾', '啃', '蛆', '蚯', '蛉', '蛀', '唬', '唾', '啤', '啥', '嘯', '崎',
    '邏', '崔', '崩', '嬰', '賒', '銬', '鐺', '鋁', '鍘', '銑', '銘', '矯', '秸', '穢', '笙', '笤', '偎', '傀', '軀', '兜',
    '釁', '徘', '徙', '舶', '舷', '舵', '斂', '翎', '脯', '逸', '凰', '猖', '祭', '烹', '庶', '庵', '痊', '閻', '闡', '眷',
    '焊', '煥', '鴻', '涯', '淑', '淌', '淮', '淆', '淵', '淫', '淳', '淤', '澱', '涮', '涵', '惦', '悴', '惋', '寂', '窒',
    '諜', '諧', '襠', '袱', '禱', '謁', '謂', '諺', '尉', '墮', '隅', '婉', '頗', '綽', '繃', '綜', '綻', '綴', '巢', '琳',
    '琢', '瓊', '揍', '堰', '揩', '攬', '揖', '彭', '揣', '攙', '搓', '壹', '搔', '葫', '募', '蔣', '蒂', '韓', '棱', '椰',
    '焚', '椎', '棺', '榔', '橢', '粟', '棘', '酣', '酥', '硝', '硫', '頰', '靂', '翹', '鑿', '棠', '晰', '鼎', '喳', '遏',
    '晾', '疇', '跋', '跛', '蛔', '蜒', '蛤', '鵑', '喻', '啼', '喧', '嵌', '賦', '贖', '賜', '銼', '鋅', '甥', '掰', '氮',
    '氯', '黍', '筏', '牘', '粵', '逾', '醃', '腋', '腕', '猩', '蝟', '憊', '敦', '痘', '痢', '瘓', '竣', '翔', '奠', '遂',
    '焙', '滯', '湘', '渤', '渺', '潰', '濺', '湃', '愕', '惶', '寓', '窖', '窘', '僱', '謗', '犀', '隘', '媒', '媚', '婿',
    '緬', '纜', '締', '縷', '騷', '瑟', '鵡', '瑰', '搪', '聘', '斟', '靴', '靶', '蓖', '蒿', '蒲', '蓉', '楔', '椿', '楷',
    '欖', '楞', '楣', '酪', '碘', '硼', '碉', '輻', '輯', '頻', '睹', '睦', '瞄', '嗜', '嗦', '暇', '畸', '蹺', '跺', '蜈',
    '蝸', '蛻', '蛹', '嗅', '嗡', '嗤', '署', '蜀', '幌', '錨', '錐', '杴', '錠', '錳', '稚', '頹', '筷', '魁', '衙', '膩',
    '腮', '腺', '鵬', '肄', '猿', '穎', '煞', '雛', '饃', '餾', '稟', '痹', '廓', '癡', '靖', '謄', '漓', '溢', '溯', '溶',
    '滓', '溺', '寞', '窺', '窟', '寢', '褂', '裸', '謬', '媳', '嫉', '縛', '繽', '剿', '贅', '熬', '赫', '蔫', '摹', '蔓',
    '蔗', '藹', '熙', '蔚', '兢', '榛', '榕', '酵', '碟', '碴', '鹼', '碳', '轅', '轄', '雌', '墅', '嘁', '踊', '蟬', '嘀',
    '幔', '鍍', '舔', '薰', '箍', '箕', '簫', '輿', '僧', '孵', '瘩', '瘟', '彰', '粹', '漱', '漩', '漾', '慷', '寡', '寥',
    '譚', '褐', '褪', '隧', '嫡', '纓', '攆', '撩', '撮', '撬', '擒', '墩', '撰', '鞍', '蕊', '蘊', '樊', '樟', '橄', '敷',
    '豌', '醇', '磕', '磅', '碾', '憋', '嘶', '嘲', '嘹', '蝠', '蠍', '蝌', '蝗', '蝙', '嘿', '幢', '鑷', '鎬', '稽', '簍',
    '膘', '鯉', '鯽', '褒', '癟', '瘤', '癱', '凜', '澎', '潭', '潦', '澳', '潘', '澈', '瀾', '澄', '憔', '懊', '憎', '翩',
    '褥', '譴', '鶴', '憨', '履', '嬉', '豫', '繚', '撼', '擂', '擅', '蕾', '薛', '薇', '擎', '翰', '噩', '櫥', '橙', '瓢',
    '蟥', '霍', '霎', '轍', '冀', '踱', '蹂', '蟆', '螃', '螟', '噪', '鸚', '黔', '穆', '篡', '篷', '篙', '籬', '儒', '膳',
    '鯨', '癮', '瘸', '糙', '燎', '瀕', '憾', '懈', '窿', '繮', '壕', '藐', '檬', '檐', '檁', '檀', '礁', '磷', '了', '瞬',
    '瞳', '瞪', '曙', '蹋', '蟋', '蟀', '嚎', '贍', '鐐', '魏', '簇', '儡', '徽', '爵', '朦', '臊', '鱷', '糜', '癌', '懦',
    '豁', '臀', '藕', '藤', '瞻', '囂', '鰭', '癩', '瀑', '襟', '璧', '戳', '攢', '孽', '蘑', '藻', '鱉', '蹭', '蹬', '簸',
    '簿', '蟹', '靡', '癬', '羹', '鬢', '攘', '蠕', '巍', '鱗', '糯', '譬', '霹', '躪', '髓', '蘸', '鑲', '瓤', '矗', '圳',
    '珏', '蕙', '旻', '涅', '攸', '嘛', '醪', '繆', '噗', '瞨', '靳', '帷', '徨',
]

FLOAT = ['.']

DOCUMENT_SYMBOLS = [
    '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[',
    ']', '^', '_', '`', '{', '|', '}', '~', '°', '±', '·', '×', 'à', 'é', '÷', 'ü', 'α', 'β', 'О', 'П', 'Р', '–', '—',
    '―', '‘', '’', '“', '”', '…', '‰', '′', '※', '℃', 'Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', '→', '↓', '∈', '√', '∩', '∵', '∶', '≠',
    '≤', '≥', '①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩', '⑴', '⑵', '⑶', '⑾', '⑿', '⒀', '⒁', '⒂', '⒃',
    '⒄', '⒅', '⒆', '⒈', '⒉', '⒊', '─', '━', '│', '┌', '┐', '╱', '■', '□', '▲', '△', '◆', '◇', '○', '◎', '●',
    '★', '☆', '、', '。', '〇', '〈', '〉', '《', '》', '「', '」', '『', '』', '【', '】', '〔', '〕', '︰', '﹐',
    '﹑', '﹒', '﹔', '﹖', '(', ')', '+', ',', '.', '~', '¥'
]

DOCUMENT_CHS = [
    '一', '丁', '七', '萬', '丈', '三', '上', '下', '不', '與', '丐', '醜', '專', '且', '丕', '世', '丘', '丙', '業', '叢',
    '東', '絲', '丞', '丟', '兩', '嚴', '喪', '個', '丫', '中', '豐', '串', '臨', '丸', '丹', '爲', '主', '麗', '舉', '乂',
    '乃', '久', '麼', '義', '之', '烏', '乍', '乎', '乏', '樂', '乒', '乓', '喬', '乖', '乘', '乙', '九', '乞', '也', '習',
    '鄉', '書', '乩', '買', '亂', '乳', '乾', '了', '予', '爭', '事', '二', '於', '虧', '雲', '互', '亓', '五', '井', '亙',
    '亞', '些', '亟', '亡', '亢', '交', '亥', '亦', '產', '亨', '畝', '享', '京', '亭', '亮', '親', '亳', '褻', '亶', '亹',
    '人', '億', '什', '仁', '仃', '仄', '僅', '僕', '仇', '今', '介', '仍', '從', '侖', '倉', '仔', '仕', '他', '仗', '付',
    '仙', '仞', '仡', '代', '令', '以', '儀', '仫', '們', '仰', '仲', '件', '價', '任', '份', '仿', '企', '伉', '伊', '伋',
    '伍', '伎', '伏', '伐', '休', '衆', '優', '夥', '會', '傴', '傘', '偉', '傳', '傷', '倫', '傖', '僞', '佇', '伯', '估',
    '伴', '伶', '伸', '伺', '伻', '似', '伽', '佃', '但', '佈', '位', '低', '住', '佐', '佑', '體', '何', '佗', '佘', '餘',
    '佚', '佛', '作', '佝', '佞', '佟', '你', '傭', '佤', '佩', '佬', '佯', '佰', '佳', '佶', '佻', '佼', '使', '侃', '侄',
    '侈', '例', '侍', '侏', '侑', '侔', '侗', '供', '依', '俠', '侶', '僥', '偵', '側', '僑', '儈', '儕', '儂', '侮', '侯',
    '侵', '便', '促', '俄', '俅', '俊', '俎', '俏', '俐', '俑', '俗', '俘', '俚', '俛', '保', '俞', '俟', '信', '儔', '儼',
    '倆', '儷', '儉', '修', '俯', '俱', '俳', '俸', '俺', '俾', '倍', '倏', '倒', '倔', '倘', '候', '倚', '倜', '借', '倡',
    '倦', '倨', '倩', '倪', '倬', '倭', '債', '值', '傾', '偃', '假', '偈', '偌', '偎', '偏', '偕', '做', '停', '健', '偶',
    '傕', '傣', '儻', '儲', '儺', '催', '傲', '傻', '僇', '僊', '像', '僖', '僚', '僦', '僧', '僭', '僮', '僰', '僳', '僵',
    '價', '僻', '儆', '儇', '儋', '儒', '儙', '儡', '儣', '兒', '兀', '允', '元', '兄', '充', '兆', '先', '光', '克', '免',
    '兌', '兒', '兔', '兕', '兗', '黨', '兜', '兢', '入', '全', '八', '公', '六', '兮', '蘭', '共', '關', '興', '兵', '其',
    '具', '典', '茲', '養', '兼', '獸', '冀', '囅', '內', '岡', '冉', '冊', '再', '冏', '冑', '冒', '冕', '冗', '寫', '軍',
    '農', '冠', '冢', '冤', '冥', '冬', '馮', '冰', '衝', '決', '況', '冶', '冷', '凍', '冽', '淨', '悽', '準', '凇', '涼',
    '凋', '凌', '減', '湊', '凜', '凝', '幾', '凡', '鳳', '鳧', '憑', '凱', '凰', '凳', '兇', '凸', '凹', '出', '擊', '函',
    '鑿', '刀', '刁', '刃', '分', '切', '刈', '刊', '芻', '刎', '刑', '劃', '刓', '刖', '列', '劉', '則', '剛', '創', '初',
    '刪', '判', '刨', '利', '別', '剄', '刮', '到', '刳', '制', '刷', '券', '剎', '刺', '刻', '劊', '剁', '劑', '剃', '削',
    '剌', '前', '剎', '剮', '劍', '剔', '剖', '剜', '剝', '劇', '剩', '剪', '副', '割', '剽', '剿', '劈', '劓', '劙', '力',
    '勸', '辦', '功', '加', '務', '劣', '動', '助', '努', '劫', '劬', '劭', '勵', '勁', '勞', '劾', '勢', '勃', '勇', '勉',
    '勳', '勐', '勒', '勖', '勘', '募', '勤', '勺', '勾', '勿', '勻', '包', '匆', '匈', '匍', '匏', '匐', '匕', '化', '北',
    '匙', '匝', '匠', '匡', '匣', '匪', '匱', '匳', '匹', '區', '醫', '匾', '匿', '十', '千', '卅', '升', '午', '卉', '半',
    '華', '協', '卑', '卒', '卓', '單', '賣', '南', '博', '卜', '卞', '佔', '卡', '盧', '滷', '卦', '臥', '衛', '卬', '卮',
    '卯', '印', '危', '即', '卻', '卵', '卷', '卸', '巹', '卿', '廠', '厄', '廳', '歷', '厲', '壓', '厭', '厙', '廁', '釐',
    '厚', '厝', '原', '廂', '厥', '廈', '廚', '廄', '廝', '去', '縣', '參', '又', '叉', '及', '友', '雙', '反', '發', '叔',
    '取', '受', '變', '敘', '叛', '叟', '疊', '叡', '口', '古', '句', '另', '叨', '叩', '只', '叫', '召', '叭', '叮', '可',
    '臺', '叱', '史', '右', '叵', '葉', '號', '司', '嘆', '叼', '嘰', '籲', '喫', '各', '吆', '合', '吉', '吊', '同', '名',
    '後', '吏', '吐', '向', '吒', '嚇', '呂', '嗎', '君', '吝', '吞', '吟', '吠', '否', '吧', '噸', '吩', '含', '聽', '吭',
    '吮', '啓', '吱', '吳', '吵', '吸', '吹', '吻', '吼', '吾', '呀', '呃', '呆', '呈', '告', '吶', '囈', '嘔', '唄', '員',
    '嗆', '嗚', '呢', '呤', '呦', '周', '呱', '味', '呵', '呶', '呷', '呻', '呼', '命', '咀', '咂', '咄', '咆', '咋', '和',
    '咎', '詠', '咐', '咒', '咔', '咕', '咖', '嚨', '咚', '嚀', '咣', '吒', '咦', '咧', '諮', '咪', '咫', '咬', '咯', '咱',
    '咳', '鹹', '咻', '咽', '咿', '哀', '品', '哂', '哄', '哆', '哇', '哈', '哉', '哌', '響', '哎', '哏', '啞', '譁', '噲',
    '噥', '喲', '哥', '哦', '哧', '哨', '哩', '哪', '哭', '哮', '哲', '哺', '哼', '哽', '唁', '唆', '脣', '唉', '唏', '唐',
    '唑', '唔', '嘮', '嗩', '喚', '唧', '唬', '售', '唯', '唱', '唳', '唶', '唾', '唿', '啁', '啃', '啄', '商', '啊', '啐',
    '啕', '啖', '啜', '啡', '啤', '啥', '啦', '嘖', '啪', '嗇', '齧', '囉', '啱', '啶', '嘯', '啻', '啼', '啾', '喀', '喁',
    '喂', '喃', '善', '喆', '喇', '喉', '喊', '喋', '喏', '喑', '喔', '喘', '喙', '喜', '喝', '喟', '喧', '喱', '喳', '噴',
    '喹', '喻', '嘍', '嚳', '嗄', '嗅', '嗌', '嗑', '嗒', '嗓', '嗔', '嗖', '嗛', '嗜', '嗝', '嗟', '嗡', '嗣', '嗤', '嗥',
    '嗦', '嗨', '嗪', '囁', '嗯', '嗲', '噯', '嗷', '嗽', '嗾', '嘀', '嘈', '嘉', '嘌', '嘎', '噓', '嘛', '嘟', '嚶', '嘭',
    '囑', '嘲', '嘴', '嘶', '嘹', '嘻', '嘿', '噉', '噌', '噎', '噔', '噗', '噙', '嚕', '噢', '噤', '器', '噩', '噪', '噫',
    '噬', '噭', '噱', '噶', '噻', '嚅', '嚋', '嚎', '嚏', '嚓', '囂', '嚬', '嚭', '嚰', '嚷', '嚼', '囊', '囐', '囔', '囚',
    '四', '回', '因', '團', '囤', '囫', '園', '困', '囪', '圍', '圇', '囹', '固', '國', '圖', '囿', '圃', '圄', '圓', '圈',
    '圉', '圜', '土', '聖', '在', '圩', '圭', '圯', '地', '圳', '壙', '場', '圾', '址', '坂', '均', '坊', '坌', '坍', '坎',
    '壞', '坐', '坑', '塊', '堅', '壇', '壩', '塢', '墳', '墜', '坡', '坤', '坦', '坨', '坪', '坭', '坯', '坳', '坷', '坻',
    '坼', '垂', '垃', '壟', '型', '壘', '垓', '垛', '垝', '垠', '垢', '垣', '墾', '堊', '墊', '垮', '埃', '埋', '城', '埒',
    '埔', '域', '埠', '埤', '埶', '培', '基', '埽', '堂', '堃', '堆', '塹', '墮', '堙', '堡', '堤', '堪', '堰', '堵', '塌',
    '塑', '塔', '塘', '塞', '填', '塾', '墀', '境', '墅', '墉', '墓', '牆', '增', '墟', '墠', '墨', '墩', '壁', '壅', '壑',
    '壕', '壖', '壤', '士', '壬', '壯', '聲', '殼', '壺', '壹', '處', '備', '復', '夏', '夔', '夕', '外', '夙', '多', '夜',
    '夠', '夡', '夤', '夥', '大', '天', '太', '夫', '夭', '央', '夯', '失', '頭', '夷', '誇', '夾', '奪', '奩', '奐', '奄',
    '奇', '奈', '奉', '奮', '奎', '奏', '契', '奔', '奕', '獎', '套', '奘', '奚', '奠', '奡', '奢', '奧', '奭', '女', '奴',
    '奶', '奸', '她', '好', '妁', '如', '妃', '妄', '妝', '婦', '媽', '妊', '妍', '妒', '妓', '妖', '妗', '妙', '妞', '妤',
    '妥', '妨', '嫵', '嫗', '嬀', '妮', '妲', '妳', '妹', '妻', '妾', '姁', '姆', '姊', '始', '姐', '姑', '姒', '姓', '委',
    '姍', '姚', '姜', '姝', '姞', '姣', '姥', '姨', '姬', '姮', '奼', '姻', '姿', '娀', '威', '娃', '婁', '婭', '嬈', '嬌',
    '孌', '娉', '娑', '娓', '娘', '娜', '娟', '娠', '娡', '娣', '娥', '娩', '娛', '媧', '嫺', '娶', '娼', '婀', '婆', '婉',
    '婊', '婕', '婚', '婢', '婧', '婪', '嬰', '嬸', '婷', '婺', '婿', '媒', '媚', '媛', '媢', '媼', '媲', '媳', '媵', '媸',
    '媾', '嫁', '嫂', '嫄', '嫉', '嫌', '嬪', '嫖', '嫚', '嫜', '嫡', '嫣', '嫦', '嫩', '嫪', '嬙', '嬃', '嬉', '嬖', '嬗',
    '嬛', '嬴', '孀', '子', '孑', '孔', '孕', '字', '存', '孫', '孚', '孛', '孜', '孝', '孟', '孢', '季', '孤', '孥', '學',
    '孩', '孿', '孰', '孱', '孳', '孵', '孺', '孽', '寧', '它', '宅', '宇', '守', '安', '宋', '完', '宏', '宓', '宕', '宗',
    '官', '宙', '定', '宛', '宜', '寶', '實', '寵', '審', '客', '宣', '室', '宥', '宦', '憲', '宮', '宰', '害', '宴', '宵',
    '家', '宸', '容', '寬', '賓', '宿', '寂', '寄', '寅', '密', '寇', '富', '寐', '寒', '寓', '寖', '寘', '寢', '寞', '察',
    '寡', '寤', '寥', '寨', '寰', '寸', '對', '寺', '尋', '導', '壽', '封', '射', '將', '尉', '尊', '小', '少', '爾', '尖',
    '塵', '尚', '嘗', '尤', '堯', '尬', '就', '尷', '屍', '尹', '尺', '尻', '尼', '盡', '尾', '尿', '局', '屁', '層', '居',
    '屈', '屜', '屆', '屋', '屎', '屏', '屑', '展', '屬', '屠', '屢', '屣', '履', '屨', '屯', '山', '屹', '嶼', '歲', '豈',
    '岌', '岐', '岑', '岔', '嶇', '崗', '嵐', '島', '巖', '岫', '岬', '嶺', '岱', '嶽', '岷', '岸', '巋', '嶧', '峇', '峋',
    '峒', '峙', '峽', '嶢', '嶠', '崢', '巒', '峨', '峪', '峭', '峯', '峻', '嶗', '崍', '崆', '崇', '崎', '崔', '崖', '崚',
    '崛', '崧', '崩', '嶄', '崴', '嵋', '嵌', '嶸', '嵩', '嵬', '嵯', '嶂', '嶓', '嶙', '嶲', '嶶', '嶷', '巂', '巔', '巉',
    '巍', '川', '州', '巡', '巢', '工', '左', '巧', '巨', '鞏', '巫', '差', '己', '已', '巳', '巴', '巷', '巽', '巾', '巿',
    '幣', '市', '布', '帥', '帆', '帇', '師', '希', '幃', '帳', '帑', '帔', '帕', '帖', '簾', '帚', '帛', '幟', '帝', '帶',
    '幀', '帨', '席', '幫', '帷', '常', '幗', '帽', '冪', '幄', '幅', '幌', '幔', '幕', '幛', '襆', '幡', '幢', '幤', '幹',
    '平', '年', '並', '幸', '幺', '幻', '幼', '幽', '廣', '莊', '慶', '庇', '牀', '序', '廬', '廡', '庫', '應', '底', '庖',
    '店', '廟', '庚', '府', '龐', '廢', '庠', '庥', '度', '座', '庭', '庳', '庵', '庶', '康', '庸', '庾', '廉', '廊', '廓',
    '廖', '廛', '廨', '廩', '延', '廷', '建', '廿', '開', '弁', '異', '棄', '弄', '弈', '弊', '弋', '式', '弒', '弒', '弓',
    '引', '弗', '弘', '弛', '弟', '張', '弢', '彌', '弦', '弧', '弩', '弭', '彎', '弱', '張', '彈', '強', '弼', '彀', '彊',
    '歸', '當', '錄', '彗', '彘', '彝', '形', '彤', '彥', '彩', '彪', '彬', '彭', '彰', '影', '彷', '役', '徹', '彼', '往',
    '徵', '徂', '徑', '待', '徇', '很', '徉', '徊', '律', '後', '徐', '徒', '徠', '得', '徘', '徙', '徜', '御', '徨', '循',
    '徭', '微', '徳', '徵', '德', '徼', '徽', '心', '必', '憶', '忌', '忍', '懺', '忐', '忑', '忒', '忖', '志', '忘', '忙',
    '忝', '忠', '忡', '忤', '憂', '忪', '快', '忱', '念', '忻', '忽', '忿', '懷', '態', '慫', '悵', '愴', '怍', '怎', '怏',
    '怒', '怔', '怕', '怖', '怙', '怛', '憐', '思', '怠', '怡', '急', '怦', '性', '怨', '怪', '怫', '怯', '怵', '總', '懟',
    '懌', '恂', '恃', '戀', '恍', '恐', '恆', '恕', '恙', '恚', '恝', '恢', '恣', '恤', '恨', '恩', '恪', '恫', '恬', '恭',
    '息', '恰', '懇', '惡', '慟', '懨', '愷', '惻', '惱', '惲', '恿', '悄', '悉', '悌', '悍', '悒', '悔', '悖', '悚', '悝',
    '悞', '悟', '悠', '患', '悅', '您', '愨', '懸', '慳', '憫', '悲', '悴', '悸', '悻', '悼', '情', '惆', '惇', '驚', '惋',
    '惑', '惕', '惘', '惚', '惜', '惟', '惠', '惦', '懼', '慘', '懲', '憊', '愜', '慚', '憚', '慣', '惰', '想', '惴', '惶',
    '惹', '惺', '愀', '愁', '愆', '愈', '愉', '愍', '愎', '意', '愕', '愚', '愛', '感', '慍', '愣', '憤', '憒', '愧', '愫',
    '愬', '願', '慈', '慌', '慎', '懾', '慕', '慙', '慝', '慢', '慧', '慨', '慰', '慵', '慷', '憋', '憎', '憔', '憧', '憨',
    '憩', '憬', '憾', '懂', '懈', '懊', '懋', '懣', '懶', '懜', '懦', '懵', '懿', '戇', '戈', '戊', '戌', '戍', '戎', '戲',
    '成', '我', '戒', '戕', '或', '戧', '戰', '戚', '戛', '戟', '戢', '截', '戮', '戳', '戴', '戶', '戾', '房', '所', '扁',
    '扃', '扇', '扈', '扉', '手', '扌', '才', '扎', '撲', '扒', '打', '扔', '託', '扛', '扞', '扢', '扣', '執', '擴', '捫',
    '掃', '揚', '扭', '扮', '扯', '擾', '扳', '扶', '批', '扼', '找', '承', '技', '抄', '抉', '把', '抑', '抒', '抓', '投',
    '抖', '抗', '折', '撫', '拋', '摶', '摳', '掄', '搶', '護', '報', '抨', '披', '擡', '抱', '抵', '抹', '押', '抽', '抿',
    '拂', '拄', '擔', '拆', '拇', '拈', '拉', '拊', '拌', '拍', '拎', '拐', '拒', '拓', '拔', '拖', '拗', '拘', '拙', '拚',
    '招', '拜', '擬', '攏', '揀', '擁', '攔', '擰', '撥', '擇', '括', '拭', '拮', '拯', '拱', '拳', '拴', '拷', '拼', '拽',
    '拾', '拿', '持', '掛', '指', '挈', '按', '挎', '挑', '挖', '摯', '攣', '撾', '撻', '挾', '撓', '擋', '掙', '擠', '揮',
    '挨', '挪', '挫', '振', '挹', '挺', '挽', '捂', '捅', '捆', '捉', '捋', '捍', '捎', '捏', '捐', '捕', '撈', '損', '撿',
    '換', '搗', '捧', '捭', '據', '捱', '捶', '捷', '捺', '捻', '捽', '掀', '掂', '掇', '授', '掉', '掌', '掏', '掐', '排',
    '掖', '掘', '掠', '探', '掣', '接', '控', '推', '掩', '措', '掬', '掰', '擄', '擲', '摻', '摜', '掾', '揄', '揆', '揉',
    '揍', '描', '提', '插', '揖', '揜', '握', '揣', '揩', '揪', '揭', '援', '揶', '攬', '攙', '擱', '摟', '攪', '搏', '搐',
    '搒', '搓', '搔', '搜', '搞', '搠', '搢', '搤', '搪', '搬', '搭', '搴', '攜', '搽', '摁', '攝', '擺', '搖', '擯', '攤',
    '摒', '摔', '摘', '摞', '摧', '摩', '摸', '摹', '撂', '撇', '撐', '撒', '撕', '撝', '撞', '撤', '撩', '撬', '播', '撮',
    '撰', '攆', '擷', '攛', '撼', '擂', '擅', '操', '擎', '擒', '擘', '擻', '擢', '擦', '攀', '攢', '攘', '攥', '攫', '支',
    '收', '攸', '改', '攻', '放', '政', '故', '效', '敵', '敏', '救', '敕', '敖', '教', '斂', '敝', '敞', '敢', '散', '敦',
    '敬', '數', '敲', '整', '敷', '斄', '文', '齋', '斌', '斐', '斑', '斕', '鬥', '料', '斛', '斜', '斟', '斡', '斤', '斥',
    '斧', '斬', '斫', '斷', '斯', '新', '斲', '方', '於', '施', '旁', '旃', '旄', '旅', '旋', '旌', '旎', '族', '旒', '旖',
    '旗', '旘', '無', '既', '日', '旦', '舊', '旨', '早', '旬', '旭', '旱', '旳', '時', '曠', '旺', '旻', '昀', '昂', '昃',
    '昆', '昇', '昊', '昌', '明', '昏', '易', '昔', '昕', '曇', '星', '映', '春', '昧', '昨', '昭', '是', '昱', '昴', '暱',
    '晝', '顯', '晁', '晃', '晉', '晌', '晏', '曬', '曉', '曄', '暈', '暉', '晗', '晚', '晞', '晟', '晡', '晤', '晦', '晨',
    '普', '景', '晰', '晴', '晶', '智', '晾', '暫', '暄', '暇', '暑', '暖', '暗', '曖', '暨', '暮', '暲', '暴', '暹', '暾',
    '曙', '曛', '曜', '曝', '曦', '曩', '曪', '曰', '曲', '曳', '更', '曷', '書', '曹', '曼', '曾', '替', '最', '月', '有',
    '朋', '服', '朐', '朔', '朕', '朗', '望', '朝', '期', '朦', '木', '未', '末', '本', '札', '術', '朱', '樸', '朵', '機',
    '朽', '殺', '雜', '權', '杅', '杆', '杉', '杌', '李', '杏', '材', '村', '杓', '杖', '杜', '杞', '束', '槓', '條', '來',
    '楊', '杪', '杭', '杯', '傑', '杲', '杳', '杵', '杷', '杼', '松', '板', '極', '構', '枇', '枉', '枋', '析', '枕', '林',
    '枚', '果', '枝', '樅', '樞', '棗', '櫪', '槍', '楓', '梟', '枯', '枰', '枳', '枵', '架', '枷', '枸', '柄', '柈', '柏',
    '某', '柑', '染', '柔', '柘', '柚', '櫃', '柞', '檸', '柢', '查', '柩', '柬', '柯', '柰', '柱', '柳', '柴', '柿', '梔',
    '柵', '標', '棧', '櫛', '棟', '櫟', '欄', '樹', '栓', '棲', '慄', '校', '栩', '株', '樣', '核', '根', '格', '栽', '欒',
    '桀', '桂', '桃', '桅', '框', '案', '桌', '桎', '桐', '桑', '桓', '桔', '桞', '椏', '橈', '楨', '檔', '橋', '樺', '檜',
    '槳', '樁', '桶', '梁', '梃', '梅', '梆', '梏', '梓', '梗', '梢', '夢', '梧', '梨', '梭', '梯', '械', '梳', '梵', '檢',
    '櫺', '棉', '棋', '棍', '棒', '棓', '棕', '棘', '棚', '棠', '棣', '森', '棰', '棱', '棵', '棹', '棺', '椀', '槨', '椅',
    '植', '椎', '椐', '椒', '櫝', '橢', '椰', '椹', '椽', '椿', '楂', '楔', '楗', '楚', '楞', '楠', '楣', '楫', '楮', '楯',
    '楷', '楸', '楹', '樓', '概', '欖', '榆', '櫬', '櫚', '榔', '榕', '榛', '榜', '榧', '榨', '榫', '榭', '榱', '榴', '榷',
    '榻', '榼', '槁', '槃', '槊', '槌', '槐', '檻', '檳', '槽', '槿', '樊', '樗', '樟', '模', '橫', '樭', '檣', '櫻', '樵',
    '樽', '樾', '橄', '橇', '橐', '橘', '橙', '橡', '橪', '櫥', '櫓', '檀', '檄', '檇', '檐', '檠', '檬', '欃', '欠', '次',
    '歡', '欣', '歟', '歐', '欲', '欷', '欺', '欻', '款', '歃', '歆', '歇', '歉', '歌', '歔', '歘', '歙', '止', '正', '此',
    '步', '武', '歧', '歪', '歹', '死', '殲', '歿', '殂', '殃', '殄', '殆', '殤', '殉', '殊', '殘', '殞', '殮', '殖', '殫',
    '殛', '殯', '殪', '毆', '段', '殷', '殽', '殿', '毀', '轂', '毅', '毋', '母', '每', '毐', '毒', '毓', '比', '畢', '毗',
    '斃', '毛', '氈', '毫', '毯', '毿', '氅', '氆', '氌', '氏', '氐', '民', '氓', '氣', '氖', '氛', '氟', '氡', '氫', '氤',
    '氦', '氧', '氨', '氬', '氮', '氯', '氰', '氳', '水', '永', '汀', '汁', '求', '匯', '漢', '汐', '汕', '汗', '汛', '汜',
    '汝', '汞', '江', '池', '污', '湯', '汧', '汨', '汩', '汪', '汭', '汰', '汲', '汴', '汶', '洶', '汽', '汾', '沁', '沂',
    '沃', '沅', '沇', '沈', '沉', '沌', '沐', '沓', '沔', '沕', '沙', '沛', '溝', '沒', '灃', '瀝', '淪', '滄', '滬', '沫',
    '沬', '沮', '沱', '河', '沸', '油', '治', '沼', '沽', '沾', '沿', '泄', '泅', '泉', '泊', '泌', '泓', '法', '泗', '泛',
    '濘', '泠', '泡', '波', '泣', '泥', '注', '淚', '泫', '泮', '泯', '泰', '泱', '泳', '泵', '瀧', '瀘', '瀉', '潑', '澤',
    '涇', '潔', '洋', '灑', '洗', '洙', '洛', '洞', '洟', '津', '洪', '洫', '洮', '洱', '洲', '洹', '洺', '活', '窪', '洽',
    '派', '流', '浹', '淺', '漿', '澆', '濁', '測', '澮', '濟', '瀏', '滻', '渾', '滸', '濃', '潯', '浙', '浚', '浜', '浞',
    '浣', '浦', '浩', '浪', '浮', '浴', '海', '浸', '浼', '浿', '塗', '涅', '消', '涉', '湧', '涎', '涒', '涓', '涔', '涕',
    '濤', '澇', '漣', '渦', '渙', '滌', '潤', '澗', '漲', '澀', '涪', '涮', '涯', '液', '涵', '涸', '涿', '澱', '淄', '淅',
    '淆', '淇', '淋', '淌', '淑', '淖', '淘', '淙', '淞', '淡', '淤', '淫', '淬', '淮', '深', '淳', '混', '淹', '添', '淼',
    '清', '淵', '漬', '瀆', '漸', '澠', '漁', '瀋', '滲', '渚', '渝', '渠', '渡', '渣', '渤', '渥', '溫', '渭', '港', '渲',
    '渴', '遊', '渺', '湃', '湄', '湍', '湎', '湖', '湘', '湛', '湟', '湫', '湮', '灣', '溼', '潰', '濺', '溉', '溊', '溍',
    '源', '溜', '溟', '溢', '溥', '溧', '溪', '溯', '溲', '溴', '溶', '溷', '溺', '滁', '滂', '滇', '滈', '滋', '滑', '滓',
    '滔', '滕', '滾', '滯', '滿', '濾', '濫', '灤', '濱', '灘', '滴', '漂', '漆', '漉', '漏', '漓', '演', '漕', '漠', '漦',
    '漩', '漪', '漫', '漯', '漱', '漳', '漾', '瀟', '濰', '潏', '潘', '潛', '潞', '潢', '潦', '潭', '潮', '瀦', '潸', '潺',
    '潼', '澄', '澈', '澍', '澎', '澙', '瀾', '澝', '澡', '澧', '澳', '澹', '激', '濂', '瀨', '瀕', '濞', '濠', '濡', '濩',
    '濮', '濯', '瀑', '瀚', '瀛', '瀹', '灊', '灌', '灞', '火', '滅', '燈', '灰', '靈', '竈', '灸', '灼', '災', '燦', '煬',
    '爐', '炊', '炎', '炒', '炔', '炕', '燉', '炙', '煒', '炟', '炫', '炬', '炭', '炮', '炯', '炳', '炷', '炸', '點', '煉',
    '熾', '爍', '爛', '烈', '烘', '烙', '燭', '烜', '烝', '煙', '烤', '煩', '燒', '燁', '燴', '燙', '燼', '熱', '烯', '烷',
    '烹', '烽', '焉', '焊', '焒', '煥', '燜', '燾', '焙', '焚', '焜', '焦', '焯', '焰', '焱', '然', '焻', '煅', '煊', '煌',
    '煎', '煜', '煞', '煤', '煦', '照', '煨', '煮', '煲', '煽', '熄', '熊', '薰', '熔', '熙', '熛', '熟', '熠', '熨', '熬',
    '熹', '燃', '燎', '燔', '燕', '燠', '燥', '燧', '燮', '燹', '爆', '爇', '爨', '爪', '爬', '爰', '愛', '爲', '爵', '父',
    '爺', '爸', '爹', '爻', '爽', '牂', '片', '版', '牌', '牘', '牒', '牖', '牙', '牛', '牝', '牟', '牡', '牢', '犛', '牧',
    '物', '牯', '牲', '牽', '特', '犧', '犀', '犁', '犢', '犍', '犒', '犨', '犬', '犯', '犴', '狀', '獷', '猶', '狁', '狂',
    '狃', '狄', '狽', '狎', '狐', '狒', '狗', '狙', '獮', '獰', '狠', '狡', '狩', '獨', '狹', '獅', '猙', '獄', '猻', '狸',
    '狻', '狼', '獫', '猊', '獵', '獼', '猖', '猗', '猛', '猜', '猝', '猢', '猥', '猩', '豬', '貓', '蝟', '獻', '猱', '猴',
    '猷', '猾', '猿', '獐', '獗', '獘', '獠', '獬', '獺', '獾', '玃', '玄', '率', '玉', '玊', '王', '璣', '玕', '瑪', '玦',
    '玩', '玫', '瑋', '環', '現', '玲', '玳', '玷', '璽', '玻', '珀', '珂', '珅', '珈', '珊', '珍', '珏', '琺', '瓏', '珞',
    '珠', '珥', '珩', '珪', '班', '珮', '璫', '球', '琅', '理', '琉', '璉', '瑣', '琖', '琛', '琢', '琥', '琦', '琨', '琪',
    '琮', '琰', '琳', '琴', '琵', '琶', '瓊', '瑁', '瑕', '瑙', '瑚', '瑛', '瑜', '瑞', '瑟', '瑰', '瑤', '瑾', '璀', '璃',
    '璆', '璇', '璋', '璐', '璜', '璞', '璟', '璧', '璨', '瓚', '瓜', '瓠', '瓢', '瓣', '瓦', '甕', '甌', '瓴', '瓶', '瓷',
    '瓻', '甄', '甑', '甘', '甙', '甚', '甜', '生', '産', '甥', '用', '甩', '甫', '甬', '甭', '田', '由', '甲', '申', '電',
    '男', '甸', '町', '畫', '甾', '畀', '暢', '界', '畎', '畏', '畑', '畔', '留', '畜', '畤', '略', '畦', '番', '畲', '疇',
    '畸', '畼', '畿', '疃', '疆', '疋', '疏', '疑', '療', '疙', '疚', '疝', '瘧', '瘍', '疣', '疤', '疥', '疫', '瘡', '瘋',
    '皰', '疲', '痾', '疵', '疸', '疹', '疼', '疽', '疾', '痂', '病', '症', '癰', '痙', '痊', '痍', '癢', '痔', '痕', '痘',
    '痛', '痞', '痢', '痣', '痤', '痧', '瘓', '癇', '痰', '癡', '痹', '痼', '痿', '瘀', '瘁', '瘐', '瘞', '瘻', '瘙', '瘟',
    '瘠', '瘢', '瘤', '瘥', '瘦', '瘩', '癟', '癱', '瘳', '瘴', '瘵', '瘸', '癮', '癀', '癌', '癔', '癖', '癜', '癩', '癬',
    '癲', '癸', '登', '白', '百', '皁', '皁', '的', '皆', '皇', '皈', '皋', '皎', '皚', '皓', '皖', '皙', '皤', '皮', '皺',
    '皴', '皿', '盂', '盅', '盆', '盈', '益', '盍', '盎', '盞', '鹽', '監', '盒', '盔', '蓋', '盜', '盤', '盛', '盟', '盥',
    '目', '盯', '盱', '盲', '直', '相', '盹', '盼', '盾', '省', '眇', '眈', '眉', '看', '眙', '眛', '真', '眠', '眢', '眥',
    '眨', '眩', '眯', '眶', '眷', '眸', '眺', '眼', '着', '睜', '睇', '睞', '瞼', '睒', '睚', '睛', '睡', '睢', '督', '睦',
    '睨', '睪', '睫', '睬', '睹', '睽', '睾', '睿', '瞀', '瞄', '瞅', '瞋', '瞌', '瞎', '瞑', '瞞', '瞟', '瞠', '瞥', '瞧',
    '矚', '瞪', '瞬', '瞭', '瞰', '瞳', '瞻', '瞽', '瞾', '瞿', '矗', '矛', '矜', '矢', '矣', '知', '矩', '矯', '短', '矮',
    '石', '磯', '矽', '礬', '礦', '碭', '碼', '砂', '砌', '砍', '砒', '研', '磚', '硯', '砝', '砣', '砥', '砧', '砭', '砰',
    '破', '砷', '砸', '礪', '礫', '礎', '硅', '硒', '碩', '硝', '硫', '硬', '確', '硼', '碁', '碉', '碌', '礙', '碎', '碑',
    '碓', '碗', '碘', '磧', '碟', '碣', '碧', '碰', '鹼', '碳', '碴', '碾', '磁', '磅', '磊', '磋', '磐', '磔', '磕', '磛',
    '磨', '磬', '磷', '磺', '礁', '礴', '礶', '示', '礻', '禮', '社', '祀', '祁', '祇', '祈', '祉', '祊', '禕', '祐', '祓',
    '祖', '祗', '祚', '祛', '祜', '祝', '神', '祟', '祠', '祥', '祧', '票', '祭', '禎', '禱', '禍', '祺', '稟', '禁', '祿',
    '禪', '福', '禧', '禨', '禳', '禹', '禺', '離', '禽', '禾', '秀', '私', '禿', '秉', '秋', '種', '秏', '科', '秒', '祕',
    '租', '秤', '秦', '秧', '秩', '積', '稱', '秸', '移', '穢', '稀', '程', '稍', '稅', '稔', '稗', '稚', '稞', '稠', '穌',
    '穩', '稷', '稻', '稼', '稽', '稿', '穆', '穡', '穗', '穰', '穴', '究', '窮', '穹', '空', '穿', '突', '竊', '窄', '窈',
    '窋', '竅', '窵', '窯', '窒', '窕', '窖', '窗', '窘', '竄', '窩', '窟', '窠', '窣', '窺', '竇', '窬', '窶', '窳', '窴',
    '窿', '立', '豎', '站', '競', '竟', '章', '竣', '童', '竭', '端', '竹', '竺', '竽', '竿', '篤', '笄', '笆', '笈', '筍',
    '笑', '筆', '笙', '笛', '笞', '笠', '笤', '笥', '符', '笨', '笫', '第', '笮', '箋', '籠', '等', '筋', '筏', '筐', '築',
    '筒', '答', '策', '篩', '箏', '筠', '筮', '筰', '筱', '筴', '筵', '筷', '籌', '籤', '簡', '箍', '箔', '箕', '算', '管',
    '簀', '篋', '籮', '簫', '箭', '箱', '箴', '箸', '篁', '篃', '篆', '篇', '簣', '簍', '篙', '篝', '篡', '籃', '籬', '篷',
    '篾', '簇', '簋', '簌', '簏', '簧', '簪', '簸', '簿', '籟', '籍', '米', '類', '籽', '粉', '粑', '粒', '粕', '粗', '粘',
    '糶', '糲', '粟', '粵', '粥', '糞', '糧', '粱', '粲', '粳', '粹', '粼', '糉', '精', '糝', '糅', '糊', '糌', '餈', '糕',
    '糖', '糗', '糙', '糜', '糟', '糠', '糯', '系', '紊', '素', '索', '緊', '紫', '紬', '累', '絜', '絮', '縶', '綦', '緃',
    '縠', '縢', '縯', '縻', '繁', '繇', '繻', '纂', '纔', '糾', '紆', '紅', '紂', '纖', '紇', '約', '級', '紈', '紀', '紉',
    '緯', '紜', '紘', '純', '紕', '紗', '綱', '納', '縱', '綸', '紛', '紙', '紋', '紡', '紵', '紐', '紓', '線', '紺', '紲',
    '練', '組', '紳', '細', '織', '終', '絆', '絀', '紹', '繹', '經', '紿', '綁', '絨', '結', '絝', '繞', '絰', '繪', '給',
    '絢', '絳', '絡', '絕', '絞', '統', '綆', '綃', '絹', '繡', '綏', '絛', '繼', '綈', '績', '緒', '綾', '續', '綺', '緋',
    '綽', '繩', '維', '綿', '綬', '繃', '綢', '綹', '綣', '綜', '綻', '綰', '綠', '綴', '緇', '緘', '緬', '纜', '緹', '緲',
    '緝', '緞', '緱', '縋', '緩', '締', '縷', '編', '緡', '緣', '縉', '縛', '縝', '縫', '縗', '縞', '纏', '縊', '繽', '縹',
    '縲', '纓', '縮', '繆', '繚', '繕', '繒', '繮', '繾', '繯', '繳', '纘', '缶', '缸', '缺', '罌', '罃', '罄', '罅', '罐',
    '網', '罔', '罕', '羅', '罘', '罰', '罡', '罷', '罥', '罩', '罪', '置', '署', '羆', '罹', '羈', '羊', '羌', '美', '羑',
    '羔', '羖', '羚', '羞', '羥', '羨', '羣', '羯', '羲', '羸', '羹', '羽', '羿', '翁', '翅', '翊', '翌', '翎', '翔', '翕',
    '翹', '翟', '翠', '翡', '翦', '翩', '翮', '翰', '翱', '翳', '翻', '翼', '耀', '老', '考', '耄', '者', '耆', '耋', '而',
    '耍', '耎', '耐', '耕', '耗', '耘', '耙', '耜', '耦', '耨', '耳', '耶', '聳', '恥', '耽', '耿', '聶', '聆', '聊', '聾',
    '職', '聒', '聯', '聘', '聚', '聵', '聰', '肅', '肄', '肆', '肇', '肉', '肋', '肌', '肓', '肖', '肘', '肚', '肛', '肝',
    '腸', '股', '肢', '肣', '膚', '肥', '肩', '肪', '骯', '肯', '肱', '育', '餚', '肸', '肺', '肽', '腎', '腫', '脹', '脅',
    '胃', '胄', '膽', '背', '胎', '胖', '胙', '胚', '勝', '胝', '胞', '胡', '胤', '胥', '朧', '臚', '脛', '胭', '胯', '胰',
    '胱', '胳', '膠', '胸', '胺', '能', '胾', '脁', '脂', '脆', '脈', '脊', '膾', '髒', '臍', '腦', '膿', '臠', '脖', '腳',
    '脯', '脫', '脲', '臉', '脾', '腆', '腈', '腉', '臘', '腋', '醃', '腐', '腑', '腓', '腔', '腕', '腥', '腩', '齶', '腮',
    '腰', '腱', '腴', '腹', '腺', '膩', '靦', '騰', '腿', '膀', '膈', '膊', '膏', '臏', '膘', '膛', '膜', '膝', '膦', '膨',
    '膳', '膺', '羶', '臀', '臂', '臃', '臆', '臊', '臛', '臣', '臧', '自', '臬', '臭', '臱', '至', '致', '臻', '臼', '臾',
    '舀', '舁', '舂', '舄', '舅', '輿', '舌', '舍', '舐', '舒', '舔', '舛', '舜', '舞', '舟', '舡', '航', '舫', '般', '艦',
    '艙', '舵', '舶', '舷', '船', '艇', '艘', '艮', '良', '艱', '色', '豔', '藝', '艾', '節', '羋', '芋', '芍', '芎', '芒',
    '芘', '芙', '蕪', '芝', '芡', '芥', '蘆', '芪', '芫', '芬', '芭', '芮', '芯', '花', '芳', '芷', '芸', '芹', '芽', '苄',
    '葦', '莧', '萇', '蒼', '苧', '蘇', '苑', '苒', '苓', '苔', '苕', '苗', '苛', '苞', '苟', '苡', '苣', '若', '苦', '苫',
    '苯', '英', '苴', '苷', '蘋', '苻', '茀', '茁', '茂', '範', '茄', '茅', '茆', '茉', '莖', '蘢', '塋', '煢', '茗', '茜',
    '繭', '茨', '茫', '茬', '茭', '茯', '茱', '茴', '茵', '茶', '茸', '茹', '荀', '荃', '荊', '草', '荏', '薦', '荒', '荔',
    '莢', '蓽', '蕎', '薈', '薺', '蕩', '榮', '葷', '滎', '犖', '熒', '蓀', '蔭', '藥', '荷', '荻', '荼', '蒞', '莆', '莉',
    '莎', '莒', '莓', '莘', '莜', '莞', '莠', '莨', '莩', '莫', '萊', '蓮', '萵', '獲', '瑩', '鶯', '莽', '菁', '菅', '菇',
    '菊', '菌', '菏', '菑', '菜', '菟', '菠', '菡', '菩', '菱', '菲', '菽', '萃', '萄', '萌', '萍', '萎', '蘿', '螢', '營',
    '縈', '蕭', '薩', '萸', '落', '葆', '著', '葛', '葡', '董', '葩', '葫', '葬', '葭', '蔥', '葳', '葴', '葵', '葺', '蒂',
    '蕢', '蔣', '蒍', '蒗', '蒙', '蒜', '蒯', '蒲', '蒸', '蒺', '蒽', '蒿', '蓄', '蓉', '蓍', '蓐', '蓓', '蓖', '藍', '薊',
    '驀', '蓬', '蓺', '蓼', '蓿', '蔑', '蔓', '蔗', '蔚', '蔟', '蔡', '蔫', '蔬', '薔', '藺', '藹', '蔽', '蕃', '蕉', '蕊',
    '蕙', '蕤', '蕨', '蘄', '蘊', '蕾', '薄', '薇', '薏', '薛', '薜', '薤', '薨', '薪', '藪', '薯', '薰', '藁', '藉', '藏',
    '藐', '蘚', '藕', '藜', '藤', '藩', '藻', '藿', '蘑', '蘧', '蘸', '虎', '虜', '虐', '慮', '虔', '虛', '虞', '虢', '蟲',
    '虯', '蟣', '蝨', '虹', '虺', '雖', '蝦', '蝕', '蟻', '螞', '蚊', '蚌', '蚓', '蠶', '蠔', '蚡', '蚣', '蚤', '蚩', '蚯',
    '蚰', '蛀', '蛆', '蛇', '蠱', '蛋', '蠣', '蛐', '蛔', '蛙', '蛛', '蛟', '蛤', '蛩', '蛭', '蠻', '蟄', '蟯', '蛹', '蛾',
    '蜀', '蜂', '蜃', '蜇', '蜈', '蜍', '蜒', '蜓', '蜔', '蛻', '蝸', '蜘', '蜚', '蜜', '蠟', '蜥', '蜴', '蜷', '蜻', '蜿',
    '蝄', '蠅', '蟬', '蠍', '蝗', '蝙', '蝠', '蝮', '蝴', '蝶', '螻', '螂', '螃', '融', '蟎', '螫', '螭', '螳', '螺', '螾',
    '蟆', '蟋', '蟒', '蟜', '蟠', '蟭', '蟹', '蟾', '蠕', '蠡', '蠢', '蠹', '血', '釁', '行', '衍', '銜', '街', '衙', '衡',
    '衢', '衣', '補', '表', '衩', '衫', '襯', '袞', '衰', '衲', '衷', '衽', '衾', '衿', '袁', '袂', '襖', '嫋', '袈', '袋',
    '袍', '袒', '袖', '襪', '袤', '被', '襲', '袱', '袴', '裀', '裁', '裂', '裝', '襠', '裔', '裕', '裘', '裙', '裟', '褲',
    '裨', '裰', '裱', '裳', '裴', '裸', '裹', '裾', '褂', '褊', '褐', '褒', '褓', '褚', '褸', '褥', '褪', '褫', '襤', '褶',
    '襁', '襄', '襆', '襜', '襟', '襦', '西', '要', '覃', '覆', '見', '觀', '規', '覓', '視', '覘', '覽', '覺', '覬', '覿',
    '覦', '覲', '覷', '角', '觖', '觚', '觜', '觴', '解', '觥', '觸', '觳', '觽', '言', '訇', '訾', '詈', '詹', '譽', '誓',
    '譄', '警', '譬', '讙', '計', '訂', '訃', '認', '譏', '訐', '訌', '討', '讓', '訕', '訖', '訓', '議', '訊', '記', '講',
    '諱', '謳', '詎', '訝', '訥', '許', '訛', '論', '訟', '諷', '設', '訪', '訣', '證', '詁', '訶', '評', '詛', '識', '詐',
    '訴', '診', '詆', '詞', '詘', '詔', '譯', '詒', '試', '詩', '詰', '詼', '誠', '誅', '話', '誕', '詬', '詮', '詭', '詢',
    '詣', '諍', '該', '詳', '詫', '諢', '詡', '誡', '誣', '語', '誚', '誤', '誥', '誘', '誨', '誑', '說', '誦', '請', '諸',
    '諾', '讀', '誹', '課', '諉', '諛', '誰', '調', '諂', '諒', '諄', '誶', '談', '誼', '謀', '諜', '謊', '諫', '諧', '謔',
    '謁', '謂', '諤', '諭', '讒', '諳', '諺', '諦', '謎', '謨', '謝', '謠', '謗', '諡', '謙', '謐', '謹', '謾', '謫', '謬',
    '譚', '譖', '譙', '譜', '譎', '讞', '譴', '讖', '谷', '谸', '豁', '豆', '豉', '豌', '豕', '豚', '象', '豢', '豨', '豪',
    '豫', '豭', '豳', '豸', '豹', '豺', '貂', '貉', '貊', '貋', '貌', '貔', '贇', '貝', '貞', '負', '貢', '財', '責', '賢',
    '敗', '賬', '貨', '質', '販', '貪', '貧', '貶', '購', '貯', '貫', '貳', '賤', '賁', '貰', '貼', '貴', '貸', '貿', '費',
    '賀', '貽', '賊', '贄', '賈', '賄', '貲', '賃', '賂', '贓', '資', '賅', '賕', '賑', '賚', '賒', '賦', '賭', '齎', '贖',
    '賞', '賜', '賠', '賴', '贅', '賺', '賽', '賾', '贗', '贊', '贇', '贈', '贍', '贏', '贛', '赤', '赦', '赧', '赬', '赫',
    '赭', '走', '赳', '赴', '趙', '趕', '起', '趁', '趄', '超', '越', '趨', '趟', '趣', '趲', '足', '趴', '趵', '躉', '趹',
    '趺', '趾', '跂', '躍', '蹌', '跆', '跋', '跌', '跑', '跖', '跚', '跛', '距', '跟', '跣', '跤', '跨', '跪', '跬', '路',
    '跳', '踐', '蹺', '蹕', '躚', '跺', '躋', '跽', '踉', '踊', '躊', '踏', '踔', '踝', '踞', '踟', '踢', '踣', '踧', '踩',
    '蹤', '躑', '踰', '踱', '踵', '踹', '踽', '蹀', '蹂', '蹄', '蹇', '蹈', '蹉', '蹊', '蹋', '躡', '蹣', '蹙', '蹦', '蹩',
    '蹬', '蹭', '躕', '蹲', '蹴', '蹶', '蹻', '躥', '躁', '躅', '躇', '躪', '躞', '身', '躬', '軀', '躲', '躺', '轘', '車',
    '軋', '軌', '軒', '軔', '轉', '輪', '軟', '轟', '軻', '軸', '軹', '軼', '軫', '軺', '輕', '軾', '載', '轎', '輅', '較',
    '輒', '輔', '輛', '輦', '輩', '輝', '輟', '輜', '輻', '輯', '輸', '轡', '轅', '轄', '輾', '轆', '轍', '辛', '辜', '辭',
    '闢', '辣', '辨', '辯', '辮', '辰', '辱', '邊', '遼', '達', '遷', '迂', '迄', '迅', '過', '邁', '迎', '運', '近', '迓',
    '返', '迕', '還', '這', '進', '遠', '違', '連', '遲', '迢', '迤', '迥', '迦', '迨', '邇', '迪', '迫', '迭', '述', '迷',
    '迸', '跡', '追', '退', '送', '適', '逃', '逅', '逆', '選', '遜', '逋', '逍', '透', '逐', '逑', '遞', '途', '逖', '逗',
    '通', '逛', '逝', '逞', '速', '造', '逡', '逢', '邐', '逮', '逵', '逶', '逸', '邏', '逼', '逾', '遁', '遂', '遇', '遍',
    '遏', '遐', '遑', '遒', '道', '遺', '遘', '遛', '遢', '遣', '遙', '遨', '遫', '遭', '遮', '遴', '遵', '遶', '遹', '遽',
    '避', '邀', '邂', '邃', '邈', '邋', '邑', '鄧', '邕', '邘', '邛', '邠', '邢', '那', '邦', '邪', '鄔', '郵', '邯', '邰',
    '邱', '邳', '邴', '邵', '邸', '鄒', '鄴', '鄰', '邽', '邾', '鬱', '郄', '郅', '郇', '郈', '郊', '郎', '郟', '鄶', '鄭',
    '鄆', '郕', '郜', '郝', '郡', '郢', '酈', '鄖', '部', '郪', '郫', '郭', '郯', '郴', '鄲', '都', '郾', '郿', '鄂', '鄄',
    '鄏', '鄗', '鄙', '鄜', '鄠', '鄢', '鄣', '鄱', '鄳', '酆', '酇', '酉', '酊', '酋', '酌', '配', '酎', '酒', '酗', '酚',
    '醞', '酞', '酡', '酢', '酣', '酤', '酥', '酩', '酪', '酬', '酮', '酯', '酰', '醬', '酵', '酶', '酷', '酸', '酹', '酺',
    '釀', '醇', '醉', '醋', '醍', '醒', '醚', '醛', '醢', '醦', '醪', '醮', '醳', '醴', '醵', '醺', '釂', '採', '釉', '釋',
    '裏', '重', '野', '量', '釐', '金', '釜', '鈇', '鉏', '鑑', '鑾', '鏖', '鐘', '鑙', '鑫', '針', '釘', '釗', '釺', '釧',
    '釩', '釣', '釵', '鈣', '鈈', '鈦', '鉅', '鈍', '鈔', '鍾', '鈉', '鋇', '鋼', '鈐', '鑰', '欽', '鈞', '鎢', '鉤', '鈕',
    '鈀', '鈺', '錢', '鉦', '鉗', '鈷', '鉢', '鈸', '鉞', '鑽', '鉬', '鉀', '鈿', '鈾', '鐵', '鉑', '鈴', '鑠', '鉛', '鉚',
    '鉉', '鐸', '銬', '鐃', '銍', '鐺', '銅', '鋁', '鎧', '銖', '銑', '鋌', '銓', '鎩', '鉻', '銘', '錚', '鏟', '銃', '銨',
    '銀', '鑄', '鋪', '鏈', '鏗', '銷', '鎖', '鋰', '鋤', '鍋', '鏽', '銼', '鋒', '鋅', '鐗', '銳', '銻', '鍺', '錯', '錨',
    '錫', '錮', '鑼', '錘', '錐', '錦', '錠', '鍵', '鋸', '錳', '錙', '鍥', '鏘', '鍔', '鍬', '鍾', '鍛', '鍠', '鍰', '鍍',
    '鎂', '鏤', '鎮', '鎘', '鑷', '鐫', '鎳', '鎬', '鎊', '鎰', '鎔', '鏢', '鏞', '鏡', '鏑', '鏃', '鐐', '鏹', '鑊', '鐳',
    '鐲', '鐮', '鑣', '鑱', '鑲', '長', '開', '間', '闇', '闟', '門', '閃', '閆', '閉', '問', '闖', '閏', '闈', '閒', '閎',
    '間', '閔', '悶', '閘', '鬧', '閨', '聞', '闥', '閩', '閭', '閥', '閣', '閡', '閫', '閱', '閬', '閾', '閹', '閶', '閽',
    '閻', '閼', '闡', '闌', '闊', '闋', '闔', '闐', '闕', '闞', '阜', '隊', '阡', '阪', '阮', '阱', '防', '陽', '陰', '陣',
    '階', '阻', '阿', '陀', '陂', '附', '際', '陸', '隴', '陳', '陘', '陋', '陌', '降', '限', '陝', '陛', '陟', '陡', '院',
    '除', '隕', '險', '陪', '陬', '陲', '陵', '陶', '陷', '隅', '隆', '隋', '隍', '隨', '隱', '隔', '隗', '隘', '隙', '障',
    '隧', '隰', '隳', '隸', '隼', '雋', '難', '雀', '雁', '雄', '雅', '集', '僱', '雉', '雌', '雍', '雎', '雛', '雒', '雕',
    '讎', '雨', '雩', '雪', '雯', '靂', '零', '雷', '雹', '霧', '需', '霽', '霄', '霆', '震', '黴', '霍', '霎', '霓', '霖',
    '霜', '霞', '霣', '靄', '露', '霸', '霹', '霾', '青', '靚', '靖', '靜', '靛', '非', '靠', '靡', '面', '靨', '革', '靳',
    '靴', '靶', '鞅', '鞋', '鞍', '韃', '鞘', '鞚', '鞠', '鞣', '鞫', '鞭', '鞮', '韂', '韋', '韌', '韓', '韙', '韜', '韭',
    '音', '韻', '韶', '頉', '頫', '顒', '頁', '頂', '頃', '項', '順', '須', '頊', '頑', '顧', '頓', '頎', '頒', '頌', '預',
    '顱', '領', '頗', '頸', '頡', '頰', '頜', '潁', '頤', '頻', '頹', '頷', '穎', '顆', '題', '顎', '顓', '顏', '額', '顛',
    '顙', '顫', '顰', '顴', '風', '颯', '颶', '颼', '飄', '飆', '飈', '飛', '食', '飧', '饗', '饜', '餐', '餮', '饕', '饟',
    '飢', '飥', '飪', '飭', '飯', '飲', '餞', '飾', '飽', '飼', '飴', '餌', '饒', '餉', '餃', '餅', '餑', '餓', '餘', '餒',
    '餡', '館', '饋', '饞', '饃', '餺', '餾', '饈', '饅', '饊', '饌', '饢', '首', '香', '馥', '馨', '駆', '駹', '騠', '騳',
    '驩', '馬', '馭', '馱', '馴', '馳', '驅', '駁', '驢', '駔', '駛', '駟', '駙', '駒', '騶', '駐', '駝', '駑', '駕', '驛',
    '駘', '驍', '罵', '駰', '驕', '驊', '駱', '駭', '駢', '驪', '騁', '驗', '騂', '駿', '騏', '騎', '驂', '騙', '騭', '騷',
    '騖', '驁', '騫', '驃', '騾', '驟', '驥', '驤', '骨', '骰', '骶', '骷', '骸', '骼', '髀', '髃', '髏', '髖', '髑', '髓',
    '高', '髡', '髦', '髫', '髭', '髯', '髻', '鬃', '鬢', '鬟', '鬣', '鬲', '鬻', '鬼', '魁', '魂', '魄', '魅', '魘', '魎',
    '魋', '魍', '魏', '魑', '魔', '魭', '鮼', '魚', '魷', '魯', '鮎', '鮒', '鮑', '鮐', '鮭', '鮪', '鮫', '鮮', '鯁', '鯉',
    '鯀', '鯊', '鯫', '鯤', '鯨', '鰓', '鱷', '鰲', '鰭', '鰥', '鱉', '鱖', '鱔', '鱗', '鴈', '鷪', '鳥', '鳩', '雞', '鳶',
    '鳴', '鷗', '鴉', '鴇', '鴆', '鸕', '鴨', '鴞', '鴦', '鴟', '鴛', '鴕', '鷙', '鴿', '鸞', '鴻', '鸝', '鵑', '鵠', '鵝',
    '鵒', '鵡', '鵲', '鵬', '鶉', '鶡', '鶚', '鶻', '鶿', '鶩', '鷂', '鶼', '鶴', '鸚', '鷲', '鷺', '鷹', '鸛', '鹿', '麂',
    '麃', '麋', '麒', '麓', '麝', '麟', '麤', '麥', '麻', '麼', '麾', '黃', '黍', '黎', '黏', '黑', '黔', '默', '黙', '黛',
    '黜', '黝', '黟', '黠', '黶', '黥', '黯', '黽', '黿', '鼉', '鼎', '鼓', '鼠', '鼻', '鼾', '齊', '齮', '齒', '齕', '齗',
    '齡', '齦', '齪', '齲', '齷', '龏', '龍', '龔', '龕', '龜', '偷', '僂', '償', '傀', '傅', '傈', '傍', '傒'
]

SIMPLE_CATEGORY_MODEL = dict(
    NUMERIC=NUMBER,
    ALPHANUMERIC=NUMBER + ALPHA_LOWER + ALPHA_UPPER,
    ALPHANUMERIC_LOWER=NUMBER + ALPHA_LOWER,
    ALPHANUMERIC_UPPER=NUMBER + ALPHA_UPPER,
    ALPHABET_LOWER=ALPHA_LOWER,
    ALPHABET_UPPER=ALPHA_UPPER,
    ALPHABET=ALPHA_LOWER + ALPHA_UPPER,
    ARITHMETIC=NUMBER + ARITHMETIC,
    FLOAT=NUMBER + FLOAT,
    CHS_3500=CHINESE_3500,
    # Older Version
    ALPHANUMERIC_MIX_CHS_3500_LOWER=NUMBER + ALPHA_LOWER + CHINESE_3500,
    # Current Version
    ALPHANUMERIC_CHS_3500_LOWER=NUMBER + ALPHA_LOWER + CHINESE_3500,
    DOCUMENT_OCR=NUMBER + ALPHA_LOWER + ALPHA_UPPER + DOCUMENT_SYMBOLS + DOCUMENT_CHS
)


def encode_maps(source):
    return {category: i for i, category in enumerate(source, 0)}


@unique
class ModelScene(Enum):
    """模型場景枚舉"""
    Classification = 'Classification'


@unique
class ModelField(Enum):
    """模型類別枚舉"""
    Image = 'Image'
    Text = 'Text'


@unique
class ModelType(Enum):
    """識別類別枚舉"""
    Captcha = 'Image'
    OCR = 'Text'


MODEL_SCENE_MAP = {
    'Classification': ModelScene.Classification
}

MODEL_FIELD_MAP = {
    'Image': ModelField.Image,
    'Text': ModelField.Text
}


class ModelConfig(object):

    @staticmethod
    def category_extract(param):
        if isinstance(param, list):
            return param
        if isinstance(param, str):
            if param in SIMPLE_CATEGORY_MODEL.keys():
                return SIMPLE_CATEGORY_MODEL.get(param)
            raise ValueError(
                "Category set configuration error, customized category set should be list type"
            )

    @property
    def model_conf(self) -> dict:
        if self.model_content:
            return self.model_content
        with open(self.model_conf_path, 'r', encoding="utf-8") as sys_fp:
            sys_stream = sys_fp.read()
            return yaml.load(sys_stream, Loader=yaml.SafeLoader)

    def __init__(self, model_conf_path=None, model_content=None):
        self.model_content = model_content
        self.model_path = model_conf_path
        self.graph_path = os.path.dirname(self.model_path) if model_conf_path else ""
        self.model_conf_path = model_conf_path
        self.model_conf_demo = 'model_demo.yaml'

        """MODEL"""
        self.model_root: dict = self.model_conf['Model']
        self.model_name: str = self.model_root.get('ModelName')
        self.model_version: float = self.model_root.get('Version')
        self.model_version = self.model_version if self.model_version else 1.0
        self.model_field_param: str = self.model_root.get('ModelField')
        self.model_field: ModelField = self.param_convert(
            source=self.model_field_param,
            param_map=MODEL_FIELD_MAP,
            text="Current model field ({model_field}) is not supported".format(model_field=self.model_field_param),
            code=50002
        )

        self.model_scene_param: str = self.model_root.get('ModelScene')

        self.model_scene: ModelScene = self.param_convert(
            source=self.model_scene_param,
            param_map=MODEL_SCENE_MAP,
            text="Current model scene ({model_scene}) is not supported".format(model_scene=self.model_scene_param),
            code=50001
        )

        """SYSTEM"""
        self.checkpoint_tag = 'checkpoint'
        self.system_root: dict = self.model_conf['System']
        self.memory_usage: float = self.system_root.get('MemoryUsage')

        """FIELD PARAM - IMAGE"""
        self.field_root: dict = self.model_conf['FieldParam']
        self.category_param = self.field_root.get('Category')
        self.category_value = self.category_extract(self.category_param)
        if self.category_value is None:
            raise Exception(
                "The category set type does not exist, there is no category set named {}".format(self.category_param),
            )
        self.category: list = SPACE_TOKEN + self.category_value
        self.category_num: int = len(self.category)
        self.image_channel: int = self.field_root.get('ImageChannel')
        self.image_width: int = self.field_root.get('ImageWidth')
        self.image_height: int = self.field_root.get('ImageHeight')
        self.resize: list = self.field_root.get('Resize')
        self.output_split = self.field_root.get('OutputSplit')
        self.output_split = self.output_split if self.output_split else ""
        self.corp_params = self.field_root.get('CorpParams')
        self.output_coord = self.field_root.get('OutputCoord')
        self.batch_model = self.field_root.get('BatchModel')

        """PRETREATMENT"""
        self.pretreatment_root = self.model_conf.get('Pretreatment')
        self.pre_binaryzation = self.get_var(self.pretreatment_root, 'Binaryzation', -1)
        self.pre_replace_transparent = self.get_var(self.pretreatment_root, 'ReplaceTransparent', True)
        self.pre_horizontal_stitching = self.get_var(self.pretreatment_root, 'HorizontalStitching', False)
        self.pre_concat_frames = self.get_var(self.pretreatment_root, 'ConcatFrames', -1)
        self.pre_blend_frames = self.get_var(self.pretreatment_root, 'BlendFrames', -1)
        self.exec_map = self.pretreatment_root.get('ExecuteMap')

        """COMPILE_MODEL"""
        if self.graph_path:
            self.compile_model_path = os.path.join(self.graph_path, '{}.pb'.format(self.model_name))
            if not os.path.exists(self.compile_model_path):
                if not os.path.exists(self.graph_path):
                    os.makedirs(self.graph_path)
                raise ValueError(
                    '{} not found, please put the trained model in the current directory.'.format(
                        self.compile_model_path)
                )
            else:
                self.model_exists = True
        else:
            self.model_exists = True if self.model_content else False
            self.compile_model_path = ""

    @staticmethod
    def param_convert(source, param_map: dict, text, code, default=None):
        if source is None:
            return default
        if source not in param_map.keys():
            raise Exception(text)
        return param_map[source]

    def size_match(self, size_str):
        return size_str == self.size_string

    @staticmethod
    def get_var(src: dict, name: str, default=None):
        if not src:
            return default
        return src.get(name)

    @property
    def size_string(self):
        return "{}x{}".format(self.image_width, self.image_height)


class Model(object):
    model_conf: ModelConfig
    graph_bytes: object

    def __init__(self, conf_path: str, source_bytes: bytes = None, key=None):
        if conf_path:
            self.model_conf = ModelConfig(model_conf_path=conf_path)
            self.graph_bytes = None
        if source_bytes:
            model_conf, self.graph_bytes = self.parse_model(source_bytes, key)
            self.model_conf = ModelConfig(model_content=model_conf)

    @staticmethod
    def parse_model(source_bytes: bytes, key=None):
        split_tag = b'-#||#-'

        if not key:
            key = [b"_____" + i.encode("utf8") + b"_____" for i in "&coriander"]
        if isinstance(key, str):
            key = [b"_____" + i.encode("utf8") + b"_____" for i in key]
        key_len_int = len(key)
        model_bytes_list = []
        graph_bytes_list = []
        slice_index = source_bytes.index(key[0])
        split_tag_len = len(split_tag)
        slice_0 = source_bytes[0: slice_index].split(split_tag)
        model_slice_len = len(slice_0[1])
        graph_slice_len = len(slice_0[0])
        slice_len = split_tag_len + model_slice_len + graph_slice_len

        for i in range(key_len_int - 1):
            slice_index = source_bytes.index(key[i])
            slices = source_bytes[slice_index - slice_len: slice_index].split(split_tag)
            model_bytes_list.append(slices[1])
            graph_bytes_list.append(slices[0])
        slices = source_bytes.split(key[-2])[1][:-len(key[-1])].split(split_tag)

        model_bytes_list.append(slices[1])
        graph_bytes_list.append(slices[0])
        model_bytes = b"".join(model_bytes_list)
        model_conf: dict = pickle.loads(model_bytes)
        graph_bytes: bytes = b"".join(graph_bytes_list)
        return model_conf, graph_bytes


class GraphSession(object):
    def __init__(self, model: Model):
        self.model = model
        self.model_conf = model.model_conf
        self.size_str = self.model_conf.size_string
        self.model_name = self.model_conf.model_name
        self.graph_name = self.model_conf.model_name
        self.version = self.model_conf.model_version
        self.graph = tf.Graph()
        self.sess = tf.compat.v1.Session(
            graph=self.graph,
            config=tf.compat.v1.ConfigProto(

                # allow_soft_placement=True,
                # log_device_placement=True,
                gpu_options=tf.compat.v1.GPUOptions(
                    # allocator_type='BFC',
                    allow_growth=True,  # it will cause fragmentation.
                    # per_process_gpu_memory_fraction=self.model_conf.device_usage
                    per_process_gpu_memory_fraction=0.1
                )
            )
        )
        self.graph_def = self.graph.as_graph_def()
        self.loaded = self.load_model()

    def load_model(self):
        # Here is for debugging, positioning error source use.
        # with self.graph.as_default():
        #     saver = tf.train.import_meta_graph('graph/***.meta')
        #     saver.restore(self.sess, tf.train.latest_checkpoint('graph'))
        if not self.model_conf.model_exists:
            self.destroy()
            return False
        try:
            if self.model.graph_bytes:
                graph_def_file = self.model.graph_bytes
            else:
                with tf.io.gfile.GFile(
                        self.model_conf.compile_model_path, "rb"
                ) as f:
                    graph_def_file = f.read()
            self.graph_def.ParseFromString(graph_def_file)
            with self.graph.as_default():
                self.sess.run(tf.compat.v1.global_variables_initializer())
                _ = tf.import_graph_def(self.graph_def, name="")

            print('MuggleOCR Session [{}] Loaded.'.format(self.model_conf.model_name))
            return True
        except NotFoundError:
            print('The system cannot find the model specified.')
            self.destroy()
            return False

    @property
    def session(self):
        return self.sess

    def destroy(self):
        self.sess.close()
        del self.sess


class Interface(object):

    def __init__(self, graph_session: GraphSession):
        self.graph_sess = graph_session
        self.model_conf = graph_session.model_conf
        self.size_str = self.model_conf.size_string
        self.graph_name = self.graph_sess.graph_name
        self.version = self.graph_sess.version
        self.model_category = self.model_conf.category
        if self.graph_sess.loaded:
            self.sess = self.graph_sess.session
            self.dense_decoded = self.sess.graph.get_tensor_by_name("dense_decoded:0")
            self.x = self.sess.graph.get_tensor_by_name('input:0')
            self.sess.graph.finalize()

    @property
    def name(self):
        return self.graph_name

    @property
    def size(self):
        return self.size_str

    def destroy(self):
        self.graph_sess.destroy()

    def predict_batch(self, image_batch, output_split=None):
        predict_text = self.predict_func(
            image_batch,
            self.sess,
            self.dense_decoded,
            self.x,
            self.model_conf,
            output_split
        )
        return predict_text

    @staticmethod
    def decode_maps(categories):
        return {index: category for index, category in enumerate(categories, 0)}

    def predict_func(self, image_batch, _sess, dense_decoded, op_input, model: ModelConfig, output_split=None):

        if output_split is None:
            output_split = model.output_split

        dense_decoded_code = _sess.run(dense_decoded, feed_dict={
            op_input: image_batch,
        })
        decoded_expression = []
        for item in dense_decoded_code:
            expression = ''

            for i in item:
                if i == -1 or i == model.category_num:
                    expression += ''
                else:
                    expression += self.decode_maps(model.category)[i]
            decoded_expression.append(expression)
        return output_split.join(decoded_expression) if len(decoded_expression) > 1 else decoded_expression[0]


class Pretreatment(object):

    def __init__(self, origin):
        self.origin = origin

    def get(self):
        return self.origin

    def binarization(self, value, modify=False):
        ret, _binarization = cv2.threshold(self.origin, value, 255, cv2.THRESH_BINARY)
        if modify:
            self.origin = _binarization
        return _binarization

    @staticmethod
    def preprocessing(image, binaryzation=-1):
        pretreatment = Pretreatment(image)
        if binaryzation > 0:
            pretreatment.binarization(binaryzation, True)
        return pretreatment.get()

    @staticmethod
    def preprocessing_by_func(exec_map, key, src_arr):
        if not exec_map:
            return src_arr
        target_arr = cv2.cvtColor(src_arr, cv2.COLOR_RGB2BGR)
        for sentence in exec_map.get(key):
            if sentence.startswith("@@"):
                target_arr = eval(sentence[2:])
            elif sentence.startswith("$$"):
                exec(sentence[2:])
        return cv2.cvtColor(target_arr, cv2.COLOR_BGR2RGB)


class ImageUtils(object):

    @staticmethod
    def get_bytes_batch(image_bytes):
        try:
            bytes_batch = [image_bytes]
        except binascii.Error:
            return None, "INVALID_BASE64_STRING"
        what_img = [ImageUtils.test_image(i) for i in bytes_batch]
        if None in what_img:
            return None, "INVALID_IMAGE_FORMAT"
        return bytes_batch, "SUCCESS"

    @staticmethod
    def get_image_batch(model: ModelConfig, bytes_batch, param_key=None):
        # Note that there are two return objects here.
        # 1.image_batch, 2.response

        def load_image(image_bytes):
            data_stream = io.BytesIO(image_bytes)
            pil_image = PIL_Image.open(data_stream)

            if pil_image.mode == 'P':
                pil_image = pil_image.convert('RGB')

            rgb = pil_image.split()
            size = pil_image.size

            gif_handle = model.pre_concat_frames != -1 or model.pre_blend_frames != -1

            if len(rgb) > 3 and model.pre_replace_transparent and not gif_handle:
                background = PIL_Image.new('RGB', pil_image.size, (255, 255, 255))
                background.paste(pil_image, (0, 0, size[0], size[1]), pil_image)
                pil_image = background

            im = np.asarray(pil_image)

            if model.image_channel == 1 and len(im.shape) == 3:
                im = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)

            im = Pretreatment.preprocessing_by_func(
                exec_map=model.exec_map,
                key=param_key,
                src_arr=im
            )

            im = Pretreatment.preprocessing(
                image=im,
                binaryzation=model.pre_binaryzation,
            )

            if model.pre_horizontal_stitching:
                up_slice = im[0: int(size[1] / 2), 0: size[0]]
                down_slice = im[int(size[1] / 2): size[1], 0: size[0]]
                im = np.concatenate((up_slice, down_slice), axis=1)

            image = im.astype(np.float32)
            if model.resize[0] == -1:
                ratio = model.resize[1] / size[1]
                resize_width = int(ratio * size[0])
                image = cv2.resize(image, (resize_width, model.resize[1]))
            else:
                image = cv2.resize(image, (model.resize[0], model.resize[1]))
            image = image.swapaxes(0, 1)
            return (image[:, :, np.newaxis] if model.image_channel == 1 else image[:, :]) / 255.

        try:
            image_batch = [load_image(i) for i in bytes_batch]
            return image_batch, "SUCCESS"
        except OSError:
            return None, "IMAGE_DAMAGE"
        except ValueError as _e:
            print(_e)
            return None, "IMAGE_SIZE_NOT_MATCH_GRAPH"

    @staticmethod
    def size_of_image(image_bytes: bytes):
        _null_size = tuple((-1, -1))
        try:
            data_stream = io.BytesIO(image_bytes)
            size = PIL_Image.open(data_stream).size
            return size
        except OSError:
            return _null_size
        except ValueError:
            return _null_size

    @staticmethod
    def test_image(h):
        """JPEG"""
        if h[:3] == b"\xff\xd8\xff":
            return 'jpeg'
        """PNG"""
        if h[:8] == b"\211PNG\r\n\032\n":
            return 'png'
        """GIF ('87 and '89 variants)"""
        if h[:6] in (b'GIF87a', b'GIF89a'):
            return 'gif'
        """TIFF (can be in Motorola or Intel byte order)"""
        if h[:2] in (b'MM', b'II'):
            return 'tiff'
        if h[:2] == b'BM':
            return 'bmp'
        """SGI image library"""
        if h[:2] == b'\001\332':
            return 'rgb'
        """PBM (portable bitmap)"""
        if len(h) >= 3 and \
                h[0] == b'P' and h[1] in b'14' and h[2] in b' \t\n\r':
            return 'pbm'
        """PGM (portable graymap)"""
        if len(h) >= 3 and \
                h[0] == b'P' and h[1] in b'25' and h[2] in b' \t\n\r':
            return 'pgm'
        """PPM (portable pixmap)"""
        if len(h) >= 3 and h[0] == b'P' and h[1] in b'36' and h[2] in b' \t\n\r':
            return 'ppm'
        """Sun raster file"""
        if h[:4] == b'\x59\xA6\x6A\x95':
            return 'rast'
        """X bitmap (X10 or X11)"""
        s = b'#define '
        if h[:len(s)] == s:
            return 'xbm'
        return None


class SDK(object):

    def __init__(self, model_type, conf_path=None):
        """
        :param model_type: 指定預置模型類型
        :param conf_path: 指定自定義模型yaml配置文件(絕對路徑)
        注: 若 conf_path 不爲 None, 則優先使用 conf_path 的值
        """
        if model_type == ModelType.Captcha:
            _conf_path = "./captcha.yaml"
        elif model_type == ModelType.OCR:
            _conf_path = "./ocr.yaml"
        else:
            raise ValueError("參數 model_type 不支持, 只能是 [OCR, Captcha] 之一")

        _conf_path = os.path.join(WORK_PATH, _conf_path)
        self.model = Model(conf_path=conf_path if conf_path else _conf_path)
        self.model_conf = self.model.model_conf
        self.graph_session = GraphSession(self.model)
        self.interface = Interface(self.graph_session)
        self.predict(init_img)

    def predict(self, image_bytes, param_key=None):
        bytes_batch, message = ImageUtils.get_bytes_batch(image_bytes)
        if not bytes_batch:
            raise ValueError(message)
        image_batch, message = ImageUtils.get_image_batch(self.model_conf, bytes_batch, param_key=param_key)
        if not image_batch:
            raise ValueError(message)
        result = self.interface.predict_batch(image_batch, None)
        return result

if __name__ == '__main__':
    with open(r"C:\Users\yuanshi\Desktop\打碼測試\2ABE_dc91cb71a5126af47301eee0ccc7e4bd.jpg","rb") as fr:
        content =fr.read()

    sdk = SDK(model_type=ModelType.Captcha, conf_path=r"C:\Users\yuanshi\Desktop\打碼測試\model\YWY_model.yaml")
    text = sdk.predict(image_bytes=content)
    print(text)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章