体験型テキスト選択-テキストラベル認識CRNNプロジェクト実際の戦闘共有

検証コードローテーション印刷テキスト認識実際の戦闘

このテキストは主に、回転する印刷されたテキスト検証コードの認識トレーニングについて説明しています。適切な読者は、検証コードの認識経験がある人、または現在検証コードを見つけようとしている人です。この論文では、CRNN + CTCを使用してテキストを認識し、トレーニングによってサンプルデータの認識率は97%に達しました。この記事では、主にプロジェクトプロセス全体を実際の戦闘コード表示の形式で説明します。これは、誰もが理解して試すのに便利です。

ここに写真の説明を挿入

CRNNモデルの紹介

論文论文:画像ベースのシーケンス認識のためのエンドツーエンドのトレーニング可能なニューラルネットワークとそのシーンテキスト認識への応用

中国語の翻訳:CRNN紙の翻訳-中国語版

CRNNの基本的なネットワーク構造

ここに写真の説明を挿入
ネットワークアーキテクチャ。アーキテクチャは3つの部分で構成されています。

  1. 入力画像から特徴シーケンスを抽出する畳み込み層。畳み込み層は通常のCNNネットワークであり、入力画像の畳み込み特徴マップを抽出するために使用されます。
  2. ループレイヤーは、各フレームのラベル分布を予測します。ループネットワークレイヤーは、深い双方向LSTMネットワークであり、畳み込み特徴に基づいてテキストシーケンスの特徴を抽出し続けます。
  3. 転写層は、各フレームの予測を最終的なラベルシーケンスに変換し、RNN出力がソフトマックスとして作成された後、文字として出力されます。

CRNNの下部にある畳み込みレイヤーは、各入力画像から特徴シーケンスを自動的に抽出します。畳み込みネットワークの上に、畳み込み層によって出力される特徴シーケンスの各フレームを予測するために、反復ネットワークが構築されます。CRNNの上の転写層は、ループ層の各フレームの予測をラベルシーケンスに変換するために使用されます。CRNNはさまざまなタイプのネットワークアーキテクチャ(CNNやRNNなど)で構成されていますが、損失関数を介して共同でトレーニングすることができます。

pytorchはネットワークモデルコードを実装します

class BidirectionalLSTM(nn.Module):
    def __init__(self, nIn, nHidden, nOut):
        super(BidirectionalLSTM, self).__init__()
        self.rnn = nn.LSTM(nIn, nHidden, bidirectional=True)
        self.embedding = nn.Linear(nHidden * 2, nOut)

    def forward(self, input):
        recurrent, _ = self.rnn(input)
        T, b, h = recurrent.size()
        t_rec = recurrent.view(T * b, h)
        output = self.embedding(t_rec)  # [T * b, nOut]
        output = output.view(T, b, -1)

        return output

class CRNN(nn.Module):
    def __init__(self, imgH, nc, nclass, nh, n_rnn=2, leakyRelu=False):
        super(CRNN, self).__init__()
        assert imgH % 16 == 0, 'imgH has to be a multiple of 16'
        ks = [3, 3, 3, 3, 3, 3, 2]
        ps = [1, 1, 1, 1, 1, 1, 0]
        ss = [1, 1, 1, 1, 1, 1, 1]
        nm = [64, 128, 256, 256, 512, 512, 512]
        cnn = nn.Sequential()

        def convRelu(i, batchNormalization=False):
            nIn = nc if i == 0 else nm[i - 1]
            nOut = nm[i]
            cnn.add_module('conv{0}'.format(i), nn.Conv2d(nIn, nOut, ks[i], ss[i], ps[i]))
            if batchNormalization:
                cnn.add_module('batchnorm{0}'.format(i), nn.BatchNorm2d(nOut))
            if leakyRelu:
                cnn.add_module('relu{0}'.format(i), nn.LeakyReLU(0.2, inplace=True))
            else:
                cnn.add_module('relu{0}'.format(i), nn.ReLU(True))

        convRelu(0)
        cnn.add_module('pooling{0}'.format(0), nn.MaxPool2d(2, 2))  # 64x16x64
        convRelu(1)
        cnn.add_module('pooling{0}'.format(1), nn.MaxPool2d(2, 2))  # 128x8x32
        convRelu(2, True)
        convRelu(3)
        cnn.add_module('pooling{0}'.format(2), nn.MaxPool2d((2, 2), (2, 1), (0, 1)))  # 256x4x16
        convRelu(4, True)
        convRelu(5)
        cnn.add_module('pooling{0}'.format(3), nn.MaxPool2d((2, 2), (2, 1), (0, 1)))  # 512x2x16
        convRelu(6, True)  # 512x1x16

        self.cnn = cnn
        self.rnn = nn.Sequential(BidirectionalLSTM(512, nh, nh), BidirectionalLSTM(nh, nh, nclass))

    def forward(self, input):
        conv = self.cnn(input)
        b, c, h, w = conv.size()
        assert h == 1, "the height of conv must be 1"
        conv = conv.squeeze(2)
        conv = conv.permute(2, 0, 1)
        output = self.rnn(conv)
        output = F.log_softmax(output, dim=2)
        return output

    def backward_hook(self, module, grad_input, grad_output):
        for g in grad_input:
            g[g != g] = 0

モデルトレーニング関連(GitHubに提出されたコード)

コードウェアハウス

https://github.com/CaoYuGang/crnn_word_captcha

データセット

このプロジェクトには、82Wのトレーニングセットと1.9Wのテストセットがあります。データセットの命名方法は、2033のテキストをカバーする「textcontent_datavalue.jpg」を採用しています。
ここに写真の説明を挿入

トレーニング

# 生成用于训练的mdb文件--out文件输出路径, --folder数据集存放路径, 用此指令生成训练集文件和测试集文件
python tool/create_dataset.py --out data/train --folder path/to/folder
# 用于生成所有文字的映射文件,--trainfolder训练集路径,--testfolder测试集路径
python tool/select_words.py --trainfolder /path/train --testfolder path/test
# 训练模型--trainroot用于训练的mdb路径,--valroot用于测试的mdb训练路径
python train.py --trainroot data/train --valroot data/test

トレーニングパーツパラメータの分解の説明

cuda = True # 是否使用GPU训练
multi_gpu = False # 是否使用多GPU进行训练
ngpu = 1 # 多GPU训练时的gpu数量
workers = 0 # 加载数据的worker,在机器允许的情况下设为8或16,降低CPU调度,提高训练效率

# training process
displayInterval = 100 # 每隔多少次训练展示损失率
valInterval = 1000 # 每隔多少次训练测试模型
saveInterval = 10 # 每隔多少次循环保存模型

nepoch = 1000 # 数据集最大循环训练次数

データセットについて

ここに写真の説明を挿入

グループへの参加を歓迎します。さらに、グループ福祉は完全なモデルテストを提供し、完全なデータセットはグループの所有者に連絡できます。

プロジェクトステートメント

このプロジェクトは、回転するテキスト検証コード技術の実際的な戦いを提供します。このプロジェクトは個人的な調査のみを目的としています。商業活動を行ったり、ウェブサイトを攻撃したりしないでください。

おすすめ

転載: blog.csdn.net/caoyugangsg/article/details/109263061