五十から四| OCR手書きデータセットを使用してOpenCVの-PythonはKNNを実行します

目標

この章で

  • 私たちは、k最近傍の基本的なOCRアプリケーション上に構築するために私たちの知識を使用します。
  • 私たちは、OpenCVのは、数字と文字のデータセットが付属して使用しようとします。

OCR手書きの数字

私たちの目標は、手書きの数字を読むことができるアプリケーションを構築することです。この目的のために、我々はいくつかの必要があるtrain_datatest_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/

公開された372元の記事 ウォンの賞賛1063 ビュー67万+

おすすめ

転載: blog.csdn.net/fendouaini/article/details/105092188