検証コードローテーション印刷テキスト認識実際の戦闘
このテキストは主に、回転する印刷されたテキスト検証コードの認識トレーニングについて説明しています。適切な読者は、検証コードの認識経験がある人、または現在検証コードを見つけようとしている人です。この論文では、CRNN + CTCを使用してテキストを認識し、トレーニングによってサンプルデータの認識率は97%に達しました。この記事では、主にプロジェクトプロセス全体を実際の戦闘コード表示の形式で説明します。これは、誰もが理解して試すのに便利です。
CRNNモデルの紹介
論文论文:画像ベースのシーケンス認識のためのエンドツーエンドのトレーニング可能なニューラルネットワークとそのシーンテキスト認識への応用
中国語の翻訳:CRNN紙の翻訳-中国語版
CRNNの基本的なネットワーク構造
ネットワークアーキテクチャ。アーキテクチャは3つの部分で構成されています。
- 入力画像から特徴シーケンスを抽出する畳み込み層。畳み込み層は通常のCNNネットワークであり、入力画像の畳み込み特徴マップを抽出するために使用されます。
- ループレイヤーは、各フレームのラベル分布を予測します。ループネットワークレイヤーは、深い双方向LSTMネットワークであり、畳み込み特徴に基づいてテキストシーケンスの特徴を抽出し続けます。
- 転写層は、各フレームの予測を最終的なラベルシーケンスに変換し、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 # 数据集最大循环训练次数
データセットについて
グループへの参加を歓迎します。さらに、グループ福祉は完全なモデルテストを提供し、完全なデータセットはグループの所有者に連絡できます。
プロジェクトステートメント
このプロジェクトは、回転するテキスト検証コード技術の実際的な戦いを提供します。このプロジェクトは個人的な調査のみを目的としています。商業活動を行ったり、ウェブサイトを攻撃したりしないでください。