深層学習の実践 5-畳み込みニューラル ネットワーク (CNN) 中国語 OCR 認識プロジェクト

記事ディレクトリ

1. 事前作業

  1. インポートライブラリ
  2. 画像生成機能
  3. データのインポート
  4. データセット関数を生成する

2. CNNモデルの構築
3. 学習モデルの機能
4. 学習モデルと結果
5. 検証

皆さんこんにちは、Weixue AI です。今日は畳み込みニューラル ネットワーク (CNN) を使用して独自の OCR 認識ツールを実現する中国語 OCR 認識ツールを紹介します。
OCR 認識システムの目的は非常に単純です。画像内のグラフィックスを引き続き保存できるように画像を変換するだけです。表がある場合、表内のデータと画像内のテキストはすべて保存されます。コンピュータのテキストに変換することで画像データを実現でき、記憶容量を削減でき、認識した文字を再利用して解析できるため、手打ちの時間を節約できます。
中国語 OCR 認識の注意フローチャート:
ここに画像の説明を挿入

1. 事前作業

1.ライブラリをインポートする

import numpy as np 
from PIL import Image, ImageDraw, ImageFont
import cv2
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.utils import plot_model
import matplotlib.pyplot as plt

#导入字体
DroidSansFallbackFull = ImageFont.truetype("DroidSansFallback.ttf", 36, 0)
fonts = [DroidSansFallbackFull,]

2. データセット生成機能

#生成图片,48*48大小
def affineTrans(image, mode, size=(48, 48)):
    # print("AffineTrans ...")
    if mode == 0:  # padding移动
        which = np.array([0, 0, 0, 0])
        which[np.random.randint(0, 4)] = np.random.randint(0, 10)
        which[np.random.randint(0, 4)] = np.random.randint(0, 10)
        image = cv2.copyMakeBorder(image, which[0], which[0], which[0], which[0], cv2.BORDER_CONSTANT, value=0)
        image = cv2.resize(image, size)
    if mode == 1:
        scale = np.random.randint(48, int(48 * 1.4))
        center = [scale / 2, scale / 2]
        image = cv2.resize(image, (scale, scale))
        image = image[int(center[0] - 24):int(center[0] + 24), int(center[1] - 24):int(center[1] + 24)]

    return image

#图片处理 除噪
def noise(image, mode=1):
    # print("Noise ...")
    noise_image = (image.astype(float) / 255) + (np.random.random((48, 48)) * (np.random.random() * 0.3))
    norm = (noise_image - noise_image.min()) / (noise_image.max() - noise_image.min())
    if mode == 1:
        norm = (norm * 255).astype(np.uint8)
    return norm
    
#绘制中文的图片
def DrawChinese(txt, font):
    # print("DrawChinese...")
    image = np.zeros(shape=(48, 48), dtype=np.uint8)
    x = Image.fromarray(image)
    draw = ImageDraw.Draw(x)
    draw.text((8, 2), txt, (255), font=font)
    result = np.array(x)
    return result

#图片标准化
def norm(image):
    # print("norm...")
    return image.astype(np.float) / 255

3. データのインポート

char_set = open("chinese.txt",encoding = "utf-8").readlines()[0]
print(len(char_set[0]))  # 打印字的个数

4. データセット生成関数

# 生成数据:训练集和标签
def Genernate(batchSize, charset):
    # print("Genernate...")
    #    pass
    label = [];
    training_data = [];

    for x in range(batchSize):
        char_id = np.random.randint(0, len(charset))
        font_id = np.random.randint(0, len(fonts))
        y = np.zeros(dtype=np.float, shape=(len(charset)))
        image = DrawChinese(charset[char_id], fonts[font_id])
        image = affineTrans(image, np.random.randint(0, 2))
        # image = noise(image)
        # image = augmentation(image,np.random.randint(0,8))
        image = noise(image)
        image_norm = norm(image)
        image_norm = np.expand_dims(image_norm, 2)

        training_data.append(image_norm)
        y[char_id] = 1
        label.append(y)

    return np.array(training_data), np.array(label)

def Genernator(charset,batchSize):
    print("Generator.....")

    while(1):
        label = [];
        training_data = [];
        for i in range(batchSize):
            char_id = np.random.randint(0, len(charset))
            font_id = np.random.randint(0,len(fonts))
            y = np.zeros(dtype=np.float,shape=(len(charset)))
            image = DrawChinese(charset[char_id],fonts[font_id])
            image = affineTrans(image,np.random.randint(0,2))
            #image = noise(image)
            #image = augmentation(image,np.random.randint(0,8))
            image = noise(image)
            image_norm = norm(image)
            image_norm  = np.expand_dims(image_norm,2)
            y[char_id] = 1
            training_data.append(image_norm)
            label.append(y)

        y[char_id] = 1
        yield (np.array(training_data),np.array(label))

2. CNNモデルの確立

def Getmodel(nb_classes):

    img_rows, img_cols = 48, 48
    nb_filters = 32
    nb_pool = 2
    nb_conv = 4

    model = Sequential()
    print("sequential..")
    model.add(Convolution2D(nb_filters, nb_conv, nb_conv,
                            padding='same',
                            input_shape=(img_rows, img_cols, 1)))
    print("add convolution2D...")
    model.add(Activation('relu'))
    print("activation ...")
    model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
    model.add(Dropout(0.25))
    model.add(Convolution2D(nb_filters, nb_conv, nb_conv,padding='same'))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(1024))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(nb_classes))
    model.add(Activation('softmax'))
    model.compile(loss='categorical_crossentropy',
                  optimizer='adam',
                  metrics=['accuracy'])
    return model

#评估模型
def eval(model, X, Y):
    print("Eval ...")
    res = model.predict(X)

3. 学習モデル機能

#训练函数
def Training(charset):
    model = Getmodel(len(charset))
    while (1):
        X, Y = Genernate(64, charset)
        model.train_on_batch(X, Y)
        print(model.loss)

#训练生成模型
def TrainingGenerator(charset, test=1):

    set = Genernate(64, char_set)
    model = Getmodel(len(charset))
    BatchSize = 64
    model.fit_generator(generator=Genernator(charset, BatchSize), steps_per_epoch=BatchSize * 10, epochs=15,
                        validation_data=set)

    model.save("ocr.h5")

    X = set[0]
    Y = set[1]
    if test == 1:
        print("============6 Test == 1 ")
        for i, one in enumerate(X):
            x = one
            res = model.predict(np.array([x]))
            classes_x = np.argmax(res, axis=1)[0]
            print(classes_x)

            print(u"Predict result:", char_set[classes_x], u"Real result:", char_set[Y[i].argmax()])
            image = (x.squeeze() * 255).astype(np.uint8)
            cv2.imwrite("{0:05d}.png".format(i), image)

4. トレーニングモデルと結果

TrainingGenerator(char_set)  #函数TrainingGenerator 开始训练
Epoch 1/15
640/640 [==============================] - 63s 76ms/step - loss: 8.1078 - accuracy: 3.4180e-04 - val_loss: 8.0596 - val_accuracy: 0.0000e+00
Epoch 2/15
640/640 [==============================] - 102s 159ms/step - loss: 7.5234 - accuracy: 0.0062 - val_loss: 6.2163 - val_accuracy: 0.0781
Epoch 3/15
640/640 [==============================] - 38s 60ms/step - loss: 5.9793 - accuracy: 0.0425 - val_loss: 4.1687 - val_accuracy: 0.3281
Epoch 4/15
640/640 [==============================] - 45s 71ms/step - loss: 5.0450 - accuracy: 0.0889 - val_loss: 3.1590 - val_accuracy: 0.4844
Epoch 5/15
640/640 [==============================] - 37s 58ms/step - loss: 4.5251 - accuracy: 0.1292 - val_loss: 2.5326 - val_accuracy: 0.5938
Epoch 6/15
640/640 [==============================] - 38s 60ms/step - loss: 4.1708 - accuracy: 0.1687 - val_loss: 1.9666 - val_accuracy: 0.7031
Epoch 7/15
640/640 [==============================] - 35s 54ms/step - loss: 3.9068 - accuracy: 0.1951 - val_loss: 1.8039 - val_accuracy: 0.7812
...

910
Predict result: 妻 Real result: 妻
1835
Predict result: 莱 Real result: 莱
3107
Predict result: 阀 Real result: 阀
882
Predict result: 培 Real result: 培
1241
Predict result: 鼓 Real result: 鼓
735
Predict result: 豆 Real result: 豆
1844
Predict result: 巾 Real result: 巾
1714
Predict result: 跌 Real result: 跌
2580
Predict result: 骄 Real result: 骄
1788
Predict result: 氧 Real result: 氧

フォント イメージを生成します。
ここに画像の説明を挿入

五、検証

model = tf.keras.models.load_model("ocr.h5")
img1 = cv2.imread('00001.png',0)
img = cv2.resize(img1,(48,48))

print(img.shape)
img2 = tf.expand_dims(img, 0)
res = model.predict(img2)
classes_x = np.argmax(res, axis=1)[0]
print(classes_x)
print(u"Predict result:", char_set[classes_x]) 

漢字:
ここに画像の説明を挿入
予測結果は「ライ、
データセットの取得についてはプライベートメッセージをください。後の段階ではさらに詳細な OCR 認識機能がある予定ですので、ご期待ください!

過去の作品:
ディープ
ラーニング実践プロジェクト

1. ディープラーニングの実践 1-(keras フレームワーク) エンタープライズ データの分析と予測

2. ディープラーニングの実践 2 - (keras フレームワーク) 企業の信用格付けと予測

3. 深層学習の実践 3 テキスト畳み込みニューラル ネットワーク (TextCNN) ニュース テキスト分類

4. ディープ ラーニング コンバット 4 - 畳み込みニューラル ネットワーク (DenseNet) 数学的グラフィック認識 + トピック パターン認識

5. 深層学習の実践 5-畳み込みニューラル ネットワーク (CNN) 中国語 OCR 認識プロジェクト

6. ディープラーニング戦闘 6 - 畳み込みニューラル ネットワーク (Pytorch) + クラスター分析で大気質と天気予測を実現

7. ディープラーニングの実践 7 - 電子商取引商品レビューの感情分析

8. Deep Learning Combat 8​​ - Life Photo Transformation Comic Photo アプリケーション

9. ディープラーニング実践9-テキスト生成画像-ローカルコンピュータでtext2imgを実現

10. ディープラーニング演習10 ~数式認識~画像のLatex化(img2Latex)

11. ディープラーニング実践11(上級編) - BERTモデルの微調整適用 - テキスト分類の場合

12. ディープラーニング演習 12 (上級編) - Dewarp を使用してテキストの歪みを修正する

13. ディープラーニング実践編13(上級編) - 文字誤り訂正機能、よく誤字を書く友人には頑張ってください

14. ディープラーニング実践14(上級編) - 手書き文字OCR認識、手書きメモも認識可能

15. Deep Learning Combat 15 (Advanced Edition) - 読解は機械に任せる + 質問者になって質問できる

16. ディープラーニング実践16(上級編) - 仮想スクリーンショット認識テキスト - 紙の契約書やフォームの認識も可能

17. ディープラーニング演習17(上級編) - インテリジェントアシスタント編集基盤システムの構築・開発事例

18. Deep Learning Combat 18 (Advanced Edition) - 市販されているNLPタスクを実現できるNLP融合システムの15タスク

19. Deep Learning 実践 19 (上級編) - ChatGPT のローカル実装展開テスト、ChatGPT を独自のプラットフォームに実装可能

…(アップグレード保留中)

おすすめ

転載: blog.csdn.net/weixin_42878111/article/details/124710216#comments_27201393