少し前に、私は研究室でプロジェクトを引き継ぎ、パーティーAを扱った後、インターフェースを提供しました。コア部分は、yolo3のテキスト検出とcnocrのテキスト認識です。テキスト認識では、事前にトレーニングされたモデルのトレーニングデータセットとプロジェクトアプリケーションのデータ分布の間に大きなギャップがあるため(最も明白なのは、認識される文字の範囲が異なることです)、モデルは再訓練された。パーティーAの友達の気まぐれに応えて、私は意図的に午後を過ごし、再訓練の方法を考え出しました。このブログは記録のために特別に書かれています。
1.cnocrを再トレーニングする理由
"""
识别范围不同,cnocr提供的模型只能够识别:中文字符,英文字符与若干特殊字符。
但实际应用中,希腊字母也是较为常见的。
经排查,cnocr的模型仅能识别包括:α与β两个希腊字母!
这对于一个理工科男是绝对不能忍的,重训,必须重训!
"""
2.準備
cnocrプロジェクトファイルをダウンロードします。
git clone https://github.com/breezedeus/cnocr.git
cd cnocr
3、データセットの準備
/cnocr/scripts/cnocr_train.pyには2つのデータセットcaptchaとcn_ocrが記載されていますが、読者はプロジェクトの問題に関連するリンクを見つけることができます。以下は、主に私たちがどのように私たち自身のデータを準備するかについて話します。
1)図に示すように、新しいフォルダデータセットを作成し、フォルダに新しいサブディレクトリself_dataset_001を作成します。ここで、独自のデータセットを作成します。
2)コンピューターでMicrosoft Yahei(msyh)フォントを見つけます。例としてwindows10を取り上げます。「C:\ Windows \ Fonts」の下にあるmsyh.ttcを見つけてコピーします(もちろん、他の印刷フォントを識別したい場合)。他のフォントを使用することもできます)。
3)では/ cnocr /例の下にlabel_cn.txt:見ることができます開いて、ファイル(しかし、なぜ、ギリシャ語ではないアルファベット= =)6000繰り返さない文字の合計を、すべての一般的な文字と文字や特殊文字をカバーし、コピーワン新しく作成したデータセットにコピーします。
4)ではself_dataset_001二つの新しい準備の下 の.txt ファイル、すなわち:train.txt と test.txtの 次のように読み取ります:
、2つのフォルダの内容が同じである場合、それらはすべて1行ずつテキストであり、形式は次のとおりです。
xxxxxxxxxx.jpg
"""
根据模型本身的训练设置需要,每一行都是 10 个字符,这里小编是为了方便随便找了几段文本拼凑的。
"""
このような命名は、編集者自身が作成したコードに関連しています。編集者は模索中にコードを変更しようとしているので、プロセスとコードはあまりエレガントではないかもしれません、ただ笑ってください!
5)以下の生成ファイルを実行します。
"""
/cnocr/datasets/data_generator.py
"""
import os
import matplotlib.pyplot as plt
import numpy as np
import pygame
pygame.init()
font = pygame.font.Font('msyh.ttc', 64)
def writing(txt, pth):
r_txt = font.render(txt, True, (0, 0, 0), (255, 255, 255))
pygame.image.save(r_txt, os.path.join(pth, txt+'.jpg'))
def indexing(txt):
res = []
for i in range(len(txt)):
try:
res.append(standards.index(txt[i]+'\n')+1)
except:
new_chrs.append(txt[i])
res.append(len(standards)+len(new_chrs)+1)
return res
if __name__ == '__main__':
pth = 'self_dataset_001'
f_tr = open(os.path.join(pth, 'train.txt'), encoding='utf-8-sig')
f_ts = open(os.path.join(pth, 'test.txt' ), encoding='utf-8-sig')
f_st = open('label_cn.txt', 'r', encoding='utf-8-sig')
f_tr2 = open(os.path.join(pth, 'train2.txt'), 'w', encoding='utf-8-sig')
f_ts2 = open(os.path.join(pth, 'test2.txt' ), 'w', encoding='utf-8-sig')
train_items = f_tr.readlines()
test_items = f_ts.readlines()
standards = f_st.readlines()
new_chrs = []
f_tr.close()
f_ts.close()
f_st.close()
for i in range(len(train_items)):
txt = train_items[i].split(".")[0]
idxes = indexing(txt)
img = writing(txt, pth)
cnt = "train_%06d.jpg"%i
os.rename(os.path.join(pth, txt+'.jpg'), os.path.join(pth, cnt))
for idx in idxes:
cnt = cnt + " {}".format(idx)
f_tr2.write(cnt+'\n')
for i in range(len(train_items)):
txt = test_items[i].split(".")[0]
idxes = indexing(txt)
img = writing(txt, pth)
cnt = "test_%06d.jpg"%i
os.rename(os.path.join(pth, txt+'.jpg'), os.path.join(pth, cnt))
for idx in idxes:
cnt = cnt + " {}".format(idx)
f_ts2.write(cnt+'\n')
fh = open('label_cn.txt', 'a', encoding='utf-8-sig')
for nw in new_chrs:
fh.write(nw+'\n')
fh.close()
その結果 、train.txt と test.txtの各行について、「train_xxxxxx.jpg」または「test_xxxxxx.jpg」の画像がレンダリングされ、 self_dataset_001の下に保存されます 。
同時に、他の2つの.txt ファイルがこのサブディレクトリに生成され ます:train2.txt と test2.txt。フォームは次のとおりです。
つまり、各行の形式は次のとおりです。
train_xxxxxx.jpg idx1 idx2 idx3 idx4 idx5 idx6 idx7 idx8 idx9 idx10
"""
11个字段,
第一个对应文件名,方便代码读取对应的文字图像;
后面跟着的10个数字,按顺序对应文字图像里每个字符在 label_cn.txt 文件中的索引(从 1 开始)
"""
エディター がdata_generator.pyファイルのlabel_cn.txtの末尾に新しい文字を自動的に追加する機能を追加したことは注目に値し ます。
第四に、トレーニングを開始します
次の図に示すように、/ cnocr / scripts / cnocr_train.pyのパーサーの定義を変更します。つまり、データセットに関連する3つのパラメーターのデフォルト値を変更します。
/ cnocrディレクトリに戻り、以下を実行します。
python scripts/cnocr_train.py --cpu 2 --num_proc 4 --loss ctc
トレーニングには時間がかかります。終了後は、cnocrが言及した交換モデルのようになります。これは試していません。トレーニング方法を予備的に理解しているだけです。熱心な読者が成功することを願っています。 。あなたは私にどんな提案もすることができます!