目標
この章で
- 私たちは、k最近傍の基本的なOCRアプリケーション上に構築するために私たちの知識を使用します。
- 私たちは、OpenCVのは、数字と文字のデータセットが付属して使用しようとします。
OCR手書きの数字
私たちの目標は、手書きの数字を読むことができるアプリケーションを構築することです。この目的のために、我々はいくつかの必要があるtrain_data
とtest_data
。画像とOpenCVのdigits.png
(フォルダ内opencv/samples/data/
含む)には、5000
手書きの数字(それぞれ番号500)。各番号はある20x20
イメージに。したがって、我々の最初のステップは、に分割する画像で5000
異なる数。各番号のために、我々は、平らにされる400
画素の行。それは、すべての画素の強度値である私たちのトレーニングセット、です。これは、我々が作成できる最も単純な機能のセットです。私たちは前に各番号になる250
サンプルが使用されtrain_data
、その後、250
サンプルを使用しましたtest_data
。それでは、それらを準備しましょう。
import numpy as np
import cv2 as cv
img = cv.imread('digits.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 现在我们将图像分割为5000个单元格,每个单元格为20x20
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
# 使其成为一个Numpy数组。它的大小将是(50,100,20,20)
x = np.array(cells)
# 现在我们准备train_data和test_data。
train = x[:,:50].reshape(-1,400).astype(np.float32) # Size = (2500,400)
test = x[:,50:100].reshape(-1,400).astype(np.float32) # Size = (2500,400)
# 为训练和测试数据创建标签
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = train_labels.copy()
# 初始化kNN,训练数据,然后使用k = 1的测试数据对其进行测试
knn = cv.ml.KNearest_create()
knn.train(train, cv.ml.ROW_SAMPLE, train_labels)
ret,result,neighbours,dist = knn.findNearest(test,k=5)
# 现在,我们检查分类的准确性
#为此,将结果与test_labels进行比较,并检查哪个错误
matches = result==test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/result.size
print( accuracy )
したがって、私たちの基本的なOCRアプリケーションは準備ができています。私の精度にこの特定の例では、91%でした。選択の精度を高める方法は、より多くのトレーニングデータ、特に不正なデータを追加することです。したがって、あなたがトレーニングデータを見つけることができないアプリケーションを起動する代わりにするたびに、私がファイルから直接このデータを読み込む次回のためにそれを保存し、分類を開始することをお勧めします。あなたはこれを行うには、いくつかのnumpyの機能(例えばnp.savetxt、np.savez、np.loadなど)を使用することができます。詳細については、マニュアルを確認してください。
# 保存数据
np.savez('knn_data.npz',train=train, train_labels=train_labels)
# 现在加载数据
with np.load('knn_data.npz') as data:
print( data.files )
train = data['train']
train_labels = data['train_labels']
私のシステムでは、それは程度かかり4.4 MB
メモリ。我々は機能として強度値(UINT8データ)を使用しているので、それはデータ最初に変換することが最良であるnp.uint8
、そしてそれを取り揃えています。この場合は、のみを使用1.1 MB
。次にロード時、あなたは戻って変換することができますfloat32
。
OCRの文字
次に、我々は英語の文字で同じことを行うが、ミーティングわずかな変化のデータと機能します。ここでは、OpenCVの代わりの画像、およびには、opencv/samples/cpp/
データファイルフォルダが付属していますletter-recognitiontion.data
。あなたがそれを開くと、ゴミのように見えることがあり、一見20,000行が表示されます。実際には、各行の最初の列は、私たちのラベルである文字、です。次の16桁の数字は、その異なる機能です。これらの機能は、UCI機械学習リポジトリから取得されます。これらの機能の詳細については、あなたがこのページで見つけることができます。
既存の2万サンプル、だから最初の10,000のトレーニングサンプルなどのデータ、および試験サンプルとして残っ万ます。私たちは、直接文字を使用することはできませんので、我々は、文字のASCII文字を変更する必要があります。
import cv2 as cv
import numpy as np
# 加载数据,转换器将字母转换为数字
data= np.loadtxt('letter-recognition.data', dtype= 'float32', delimiter = ',',
converters= {0: lambda ch: ord(ch)-ord('A')})
# 将数据分为两个,每个10000个以进行训练和测试
train, test = np.vsplit(data,2)
# 将火车数据和测试数据拆分为特征和响应
responses, trainData = np.hsplit(train,[1])
labels, testData = np.hsplit(test,[1])
# 初始化kNN, 分类, 测量准确性
knn = cv.ml.KNearest_create()
knn.train(trainData, cv.ml.ROW_SAMPLE, responses)
ret, result, neighbours, dist = knn.findNearest(testData, k=5)
correct = np.count_nonzero(result == labels)
accuracy = correct*100.0/10000
print( accuracy )
それは私の精度を提供します93.22%
。あなたは、精度を向上させたい場合は同様に、あなたは繰り返し、各レベルでの誤ったデータを追加することができます。
その他のリソース
練習
AIは注意パンチョン・ステーションのブログを歓迎:
http://panchuang.net/
OpenCVの中国の公式文書:
http://woshicver.com/
ようこそ注意パンチョンのブログのリソースの概要駅:
http://docs.panchuang.net/