標籤:org mic max pat pre spec network out tps
Theano下用CNN(卷積神經網路)做車牌中文字元OCR
原文地址:http://m.blog.csdn.net/article/details?id=50989742
之前時間一直在看 Michael Nielsen 先生的 Deep Learning 教程。
用了他的代碼在theano下測試了下中文車牌字元的識別。由於我沒有GPU,簡單的在進行了16個epoch之後,識別率達到了 98.41% ,由於映像本來品質就不高,達到這個識別率,效果挺不錯了。
一共 31 類 車牌中文字元資料來源於中文車牌識別項目 EasyPR 的資料集 . 由於資料集分布很不均勻。可能會導致個別類別擬合不一致,而降低識別率。所以使用隨機輕微扭曲映像的方式來產生新的資料以保證資料集各個類目的數量的均衡。
下面是用於輕微扭曲映像來產生更多樣本的函數。
def rotRandrom(img,factor,size): """ 使映像輕微的畸變 img 輸入映像 factor 畸變的參數 size 為圖片的目尺規寸 """ img = img.reshape(size); shape = size; pts1 = np.float32([[0,0],[0,shape[0]],[shape[1],0],[shape[1],shape[0]]]) pts2 = np.float32([[r(factor),r(factor)],[0,shape[0]-r(factor)],[shape[1]-r(factor),0],[shape[1]-r(factor),shape[0]-r(factor)]]) M = cv2.getPerspectiveTransform(pts1,pts2); dst = cv2.warpPerspective(img,M,(shape[0],shape[1])); return dst.ravel();
在訓練的時候 使用的CNN結構如下
啟用函數都為 ReLu
Conv(kernel size 5*5 ) * 25個 feature map->
Pooling 2*2 ->
Conv(kernel size 5*5) * 16個feature map->
Pooling 2*2 ->
FullConnectedLayer 120 個 Neurons ->
FullConnectedLayer 84個 Neurons ->
Softmax Output 31類
import network3from network3 import Networkfrom network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayerfrom network3 import ReLUtraining_data, validation_data, test_data= network3.load_data_cPickle("./data.pkl")mini_batch_size = 10
net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(25, 1, 5, 5), poolsize=(2, 2), activation_fn=ReLU), ConvPoolLayer(image_shape=(mini_batch_size, 25, 12, 12), filter_shape=(16, 25, 5, 5), poolsize=(2, 2), activation_fn=ReLU), FullyConnectedLayer(n_in=16*4*4, n_out=120, activation_fn=ReLU), FullyConnectedLayer(n_in=120, n_out=84, activation_fn=ReLU), SoftmaxLayer(n_in=84, n_out=31)], mini_batch_size )
net.SGD(training_data, 60, mini_batch_size, 0.03, validation_data, test_data, lmbda=0.1)
這個函數用於製作自己的資料。
def make_dataset(dirn): set = []; labels = [] ; def findinside(dirname,code,): print "code",code; print "dirname",dirname; for parent,dirnames,filenames in os.walk(dirname): adder = 1400 - len(filenames) len_d = len(filenames) for filename in filenames: path =parent+"/"+filename if(path.endswith(".jpg")): img = cv2.imread(path,cv2.CV_LOAD_IMAGE_GRAYSCALE); img = cv2.resize(img,(28,28)); img = img.astype(np.float32)/255; set.append(img.ravel()); labels.append(code); for i in range(adder): c_index = int(np.random.rand() * len_d); l_set = len(set) set.append(rotrandom.rotRandrom( set[l_set-len_d + c_index],0.88,(28,28))); labels.append(code); print len(set),dirname,len(filenames) for parent,dirnames,filenames in os.walk(dirn): num = len(dirnames); for i in range(num): c_path = dir_chars + "/"+ dirnames[i]; findinside(c_path,i); shuffle = np.random.permutation(len(set)); print len(set) set = np.array(set); labels = np.array(labels); set, labels = set[shuffle], labels[shuffle] train_n = int(0.9*len(set)) training_set,test_set = np.split(set, [train_n]) training_labels, test_labels = np.split(labels, [train_n]) print training_labels validation_set = test_set.copy(); validation_labels = test_set.copy(); training_data = [training_set,training_labels] validation_data = [validation_set,validation_labels] test_data = [test_set,test_labels] data = [ training_data, validation_data, test_data]; fileid = open("./data.pkl","wb") cPickle.dump(data,fileid)dir_chars = "./charsChinese"make_dataset(dir_chars);
在進行了第14個epoch之後獲得了 98.41% 訓練時間大概在10分鐘左右。
Training mini-batch number 0Training mini-batch number 1000Training mini-batch number 2000Training mini-batch number 3000Epoch 0: validation accuracy 89.15%This is the best validation accuracy to date.The corresponding test accuracy is 89.15%Training mini-batch number 4000Training mini-batch number 5000Training mini-batch number 6000Training mini-batch number 7000Epoch 1: validation accuracy 94.65%This is the best validation accuracy to date.The corresponding test accuracy is 94.65%Training mini-batch number 8000Training mini-batch number 9000Training mini-batch number 10000Training mini-batch number 11000Epoch 2: validation accuracy 95.44%This is the best validation accuracy to date.The corresponding test accuracy is 95.44%Training mini-batch number 12000Training mini-batch number 13000Training mini-batch number 14000Training mini-batch number 15000Epoch 3: validation accuracy 96.13%This is the best validation accuracy to date.The corresponding test accuracy is 96.13%Training mini-batch number 16000Training mini-batch number 17000Training mini-batch number 18000Training mini-batch number 19000Epoch 4: validation accuracy 96.91%This is the best validation accuracy to date.The corresponding test accuracy is 96.91%Training mini-batch number 20000Training mini-batch number 21000Training mini-batch number 22000Training mini-batch number 23000Epoch 5: validation accuracy 96.52%Training mini-batch number 24000Training mini-batch number 25000Training mini-batch number 26000Training mini-batch number 27000Epoch 6: validation accuracy 96.87%Training mini-batch number 28000Training mini-batch number 29000Training mini-batch number 30000Training mini-batch number 31000Epoch 7: validation accuracy 96.87%Training mini-batch number 32000Training mini-batch number 33000Training mini-batch number 34000Training mini-batch number 35000Epoch 8: validation accuracy 97.58%This is the best validation accuracy to date.The corresponding test accuracy is 97.58%Training mini-batch number 36000Training mini-batch number 37000Training mini-batch number 38000Training mini-batch number 39000Epoch 9: validation accuracy 97.49%Training mini-batch number 40000Training mini-batch number 41000Training mini-batch number 42000Epoch 10: validation accuracy 97.60%This is the best validation accuracy to date.The corresponding test accuracy is 97.60%Training mini-batch number 43000Training mini-batch number 44000Training mini-batch number 45000Training mini-batch number 46000Epoch 11: validation accuracy 97.93%This is the best validation accuracy to date.The corresponding test accuracy is 97.93%Training mini-batch number 47000Training mini-batch number 48000Training mini-batch number 49000Training mini-batch number 50000Epoch 12: validation accuracy 97.83%Training mini-batch number 51000Training mini-batch number 52000Training mini-batch number 53000Training mini-batch number 54000Epoch 13: validation accuracy 98.04%This is the best validation accuracy to date.The corresponding test accuracy is 98.04%Training mini-batch number 55000Training mini-batch number 56000Training mini-batch number 57000Training mini-batch number 58000Epoch 14: validation accuracy 98.20%This is the best validation accuracy to date.The corresponding test accuracy is 98.20%Training mini-batch number 59000Training mini-batch number 60000Training mini-batch number 61000Training mini-batch number 62000Epoch 15: validation accuracy 97.86%Training mini-batch number 63000Training mini-batch number 64000Training mini-batch number 65000Training mini-batch number 66000Epoch 16: validation accuracy 98.41%This is the best validation accuracy to date.The corresponding test accuracy is 98.41%
[轉]Theano下用CNN(卷積神經網路)做車牌中文字元OCR