SORU
23 ŞUBAT 2012, PERŞEMBE


Basit Haneli Tanıma OCR OpenCV-Python

"Rakam Tanıma" OpenCV-Python (cv2). OCR uygulamak için çalışıyorum ( Sadece öğrenme amaçlı ). OpenCV de KNearest ve SVM özelliklerini öğrenmek istiyorum.

Her basamak için 100 örnekleri(resimler) var. Onları eğitmek istiyorum.

OpenCV örnek ile birlikte gelen bir örnek letter_recog.py var. Ama ben hala nasıl yapacağımı bulamadım. Örnekleri, tepkiler vs. ne anlamıyorum. Ayrıca, ben bunu anlamamıştım ilk başta bir txt dosyası, ilk yükler.

Biraz aradıktan sonra, bir letter_recognition bulabilirim.cpp örnekleri veri. Ve cv2 için yapılmış bir kod kullandım.Letter_recog.py model KNearest ( sadece test için):

import numpy as np
import cv2

fn = 'letter-recognition.data'
a = np.loadtxt(fn, np.float32, delimiter=',', converters={ 0 : lambda ch : ord(ch)-ord('A') })
samples, responses = a[:,1:], a[:,0]

model = cv2.KNearest()
retval = model.train(samples,responses)
retval, results, neigh_resp, dists = model.find_nearest(samples, k = 10)
print results.ravel()

20000, ne olduğunu anlamadım bana büyüklükteki bir dizi verdi.

Soru:

1) Ne letter_recognition.veri dosyası ? Nasıl kendi veri kümesinden dosya oluşturmak için?

2) Ne sonuçlar geliyor.() reval belirtmek?

3) Ne kadar basit bir rakam tanıma aracı letter_recognition kullanarak yazabiliriz.veri dosya ( ya) KNearest veya SVM?

CEVAP
8 Mart 2012, PERŞEMBE


Peki, yukarıdaki sorunu çözmek için sorumu kendim egzersiz yapmaya karar verdim. İstediğim basit bir OCR OpenCV içinde KNearest veya SVM özelliklerini kullanarak uygulamaktır. Aşağıda ne yaptım ve nasıl olduğunu. ( basit OCR amaçlı KNearest kullanmayı öğrenmek için).

1)İlk sorum letter_recognition üzereydi.veri OpenCV örnekleri ile birlikte geliyor dosya. O dosyanın içinde ne olduğunu bilmek istedim.

Bir mektup, bu mektubun 16 özellikleri ile birlikte içerir.

Ve this SOF bulmama yardımcı oldu. Bu 16 özellikleri kağıtLetter Recognition Using Holland-Style Adaptive Classifiersaçıklanmıştır. Sonunda bazı özellikleri anlamıyordum ()

2)Tüm bu özellikler anlamadan bildiğimden, zor olan yöntem. diğer belgeler de denedim, ama bir acemi için biraz zor oldu.

So I just decided to take all the pixel values as my features. (doğruluk veya performansı hakkında endişeli değildi, ben sadece, en azından doğruluk ile çalışmak istiyordu)

Eğitim bilgilerim için resme aldım:

enter image description here

( Eğitim veri miktarı daha az olduğunu biliyorum. Ama, tüm harfleri aynı yazı tipi ve boyutu olduğundan, bu denemeye) karar verdim.

Eğitim için veri hazırlamak, OpenCV küçük bir kod hazırladım. Bir şeyler aşağıdaki işlemleri gerçekleştirir:

a) Bu resmi yükler.

b) basamak ( belli ki yanlış algılamaları önlemek için harflerin dağılımı ve alan ve yükseklik kısıtlamaları bulma uygulayarak) Seçer.

c) bir mektup etrafında sınırlayıcı dikdörtgeni Çizer ve key press manually bekleyin. Bu sefer bizbasamak kendimizi tuşuna basınharfe karşılık gelen kutusunda.

d) bir Kez, ilgili sayı tuşuna basılı tutun yeniden boyutlandırır bu kutu için 10x10 ve kaydeder 100 piksel değerleri bir dizi (örnekleri) ve ilgili el ile girilen basamaklı bir dizi(burada, tepkiler).

e) ayrı txt dosyalarında iki diziler kaydedin.

Basamak manuel sınıflandırma sonunda, tren veriler, tüm rakamları( tren.png) elle kendimiz etiketli görüntü aşağıdaki gibi görünecektir:

enter image description here

Aşağıda ( tabii ki değil) temiz yukarıdaki amaç için kullandığım kod:

import sys

import numpy as np
import cv2

im = cv2.imread('pitrain.png')
im3 = im.copy()

gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2)

#################      Now finding Contours         ###################

contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

samples =  np.empty((0,100))
responses = []
keys = [i for i in range(48,58)]

for cnt in contours:
    if cv2.contourArea(cnt)>50:
        [x,y,w,h] = cv2.boundingRect(cnt)

        if  h>28:
            cv2.rectangle(im,(x,y),(x w,y h),(0,0,255),2)
            roi = thresh[y:y h,x:x w]
            roismall = cv2.resize(roi,(10,10))
            cv2.imshow('norm',im)
            key = cv2.waitKey(0)

            if key == 27:  # (escape to quit)
                sys.exit()
            elif key in keys:
                responses.append(int(chr(key)))
                sample = roismall.reshape((1,100))
                samples = np.append(samples,sample,0)

responses = np.array(responses,np.float32)
responses = responses.reshape((responses.size,1))
print "training complete"

np.savetxt('generalsamples.data',samples)
np.savetxt('generalresponses.data',responses)

Şimdi eğitim ve test bölümüne giriyoruz.

Test aşaması için aynı olan görüntü, aşağıda eğitmek için kullanılan mektup türü kullandım.

enter image description here

Bizim gibi eğitim izler:

a) biz txt dosyalarını Yüklemek zaten daha önce kaydedilmiş

b) kullanıyoruz sınıflandırıcı bir örneği ( burada, KNearest) oluşturun

c) Sonra KNearest kullanıyoruz.tren veri tren çalışır

Sınama amacıyla, aşağıdaki gibi yapıyoruz

a) Biz görüntü testi için kullanılan bir yük

b) resmi olarak önceki süreç ve her basamak kontur yöntemleri kullanarak ayıklayın

c) Beraberlik için sınırlayıcı kutu, daha önce yaptıkları gibi, 10x10, ve bir dizi piksel değerlerini depolamak için yeniden boyutlandırmak.

d) Sonra KNearest kullanıyoruz.() işlevi find_nearest verdiğimiz bir yakın öğeyi bulmak için. Şanslı, doğru rakamı tanır.)

Son iki basamak ( eğitim ve test) tek kodda dahil:

import cv2
import numpy as np

#######   training part    ############### 
samples = np.loadtxt('generalsamples.data',np.float32)
responses = np.loadtxt('generalresponses.data',np.float32)
responses = responses.reshape((responses.size,1))

model = cv2.KNearest()
model.train(samples,responses)

############################# testing part  #########################

im = cv2.imread('pi.png')
out = np.zeros(im.shape,np.uint8)
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)

contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    if cv2.contourArea(cnt)>50:
        [x,y,w,h] = cv2.boundingRect(cnt)
        if  h>28:
            cv2.rectangle(im,(x,y),(x w,y h),(0,255,0),2)
            roi = thresh[y:y h,x:x w]
            roismall = cv2.resize(roi,(10,10))
            roismall = roismall.reshape((1,100))
            roismall = np.float32(roismall)
            retval, results, neigh_resp, dists = model.find_nearest(roismall, k = 1)
            string = str(int((results[0][0])))
            cv2.putText(out,string,(x,y h),0,1,(0,255,0))

cv2.imshow('im',im)
cv2.imshow('out',out)
cv2.waitKey(0)

Ve aldığım sonuç aşağıda yaradı:

enter image description here


Here it worked with 100% accuracy, for which the reason, i assume, is all digits are of same kind and same size.

Ama herhangi bir şekilde, bu yeni başlayanlar ( yani umarım) gitmek için iyi bir başlangıç.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • Kamikazeepanda

    Kamikazeepan

    5 ŞUBAT 2006
  • Viktorija A.

    Viktorija A.

    28 Mart 2009