OpenCV + CNN 大神符识别

Posted aoru45

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV + CNN 大神符识别相关的知识,希望对你有一定的参考价值。

数据集

Mnist数据集:http://yann.lecun.com/exdb/mnist/

 

训练

 1 import numpy as np
 2 from keras.datasets import mnist
 3 from keras.models import Sequential
 4 from keras.layers import Dense,Activation,Conv2D,MaxPooling2D,Flatten,Dropout,BatchNormalization,ZeroPadding2D
 5 from keras.optimizers import Adam
 6 from keras import backend as K
 7 K.backend()
 8 import tensorflow as tf
 9 import cv2 as cv
10 import pandas as pd
11 #加载数据
12 datas=pd.read_csv("mnist_train.csv")
13 images=datas.iloc[:,1:].values
14 x_image=images.astype(np.float)
15 x_image=np.multiply(x_image,1.0/255.0)
16 labels=datas.iloc[:,0].values
17 x_image[0]
18 labels[0]
19 #CNN模型加载
20 def loadCNN():
21     model = Sequential()
22     model.add(Conv2D(32,(3,3),padding="valid",input_shape=(28,28,1)))
23     convout1 = Activation("relu")
24     model.add(convout1)
25     model.add(BatchNormalization(epsilon=1e-6,axis=1))
26     model.add(MaxPooling2D(pool_size=(2,2)))
27     model.add(ZeroPadding2D((1,1)))
28     model.add(Conv2D(48,(3,3)))
29     convout2 = Activation("relu")
30     model.add(convout2)
31     model.add(BatchNormalization(epsilon=1e-6,axis=1))
32     model.add(MaxPooling2D(pool_size=(2,2)))
33     model.add(Conv2D(64,(2,2)))
34     convout3 = Activation("relu")
35     model.add(convout3)
36     model.add(BatchNormalization(epsilon=1e-6,axis=1))
37     model.add(MaxPooling2D(pool_size=(2,2)))
38     model.add(Dropout(0.5))
39     model.add(Flatten())
40     model.add(Dense(3168))
41     model.add(Activation("relu"))
42     model.add(Dense(10))
43     model.add(Activation("softmax"))
44     model.compile(loss="categorical_crossentropy",optimizer="adam",metrics=[accuracy])
45     model.summary()
46     model.get_config()
47     return model
48 #训练加存储
49 from keras.utils import to_categorical
50 x_input = x_image.reshape([-1,28,28,1])
51 y_input = to_categorical(labels, num_classes=10)
52 print(y_input.shape)
53 model = loadCNN()
54 hist = model.fit(x_input,y_input,batch_size = 32,epochs=15,verbose=1, validation_split=0.2)
55 model.save_weights("model/mnist.hdf5",overwrite=True)
 1 Layer (type)                 Output Shape              Param #   
 2 =================================================================
 3 conv2d_1 (Conv2D)            (None, 26, 26, 32)        320       
 4 _________________________________________________________________
 5 activation_1 (Activation)    (None, 26, 26, 32)        0         
 6 _________________________________________________________________
 7 batch_normalization_1 (Batch (None, 26, 26, 32)        104       
 8 _________________________________________________________________
 9 max_pooling2d_1 (MaxPooling2 (None, 13, 13, 32)        0         
10 _________________________________________________________________
11 zero_padding2d_1 (ZeroPaddin (None, 15, 15, 32)        0         
12 _________________________________________________________________
13 conv2d_2 (Conv2D)            (None, 13, 13, 48)        13872     
14 _________________________________________________________________
15 activation_2 (Activation)    (None, 13, 13, 48)        0         
16 _________________________________________________________________
17 batch_normalization_2 (Batch (None, 13, 13, 48)        52        
18 _________________________________________________________________
19 max_pooling2d_2 (MaxPooling2 (None, 6, 6, 48)          0         
20 _________________________________________________________________
21 conv2d_3 (Conv2D)            (None, 5, 5, 64)          12352     
22 _________________________________________________________________
23 activation_3 (Activation)    (None, 5, 5, 64)          0         
24 _________________________________________________________________
25 batch_normalization_3 (Batch (None, 5, 5, 64)          20        
26 _________________________________________________________________
27 max_pooling2d_3 (MaxPooling2 (None, 2, 2, 64)          0         
28 _________________________________________________________________
29 dropout_1 (Dropout)          (None, 2, 2, 64)          0         
30 _________________________________________________________________
31 flatten_1 (Flatten)          (None, 256)               0         
32 _________________________________________________________________
33 dense_1 (Dense)              (None, 3168)              814176    
34 _________________________________________________________________
35 activation_4 (Activation)    (None, 3168)              0         
36 _________________________________________________________________
37 dense_2 (Dense)              (None, 10)                31690     
38 _________________________________________________________________
39 activation_5 (Activation)    (None, 10)                0         
40 =================================================================
41 Total params: 872,586
42 Trainable params: 872,498
43 Non-trainable params: 88
44 _________________________________________________________________
45 Train on 47999 samples, validate on 12000 samples
46 Epoch 1/15
47 47999/47999 [==============================] - 1641s 34ms/step - loss: 0.2381 - acc: 0.9250 - val_loss: 0.0724 - val_acc: 0.9762
48 Epoch 2/15
49 47999/47999 [==============================] - 1634s 34ms/step - loss: 0.1009 - acc: 0.9693 - val_loss: 0.0486 - val_acc: 0.9852
50 Epoch 3/15
51 47999/47999 [==============================] - 1626s 34ms/step - loss: 0.0787 - acc: 0.9768 - val_loss: 0.0472 - val_acc: 0.9863
52 Epoch 4/15
53 47999/47999 [==============================] - 1619s 34ms/step - loss: 0.0623 - acc: 0.9805 - val_loss: 0.0358 - val_acc: 0.9892
54 Epoch 5/15
55 47999/47999 [==============================] - 1627s 34ms/step - loss: 0.0568 - acc: 0.9829 - val_loss: 0.0427 - val_acc: 0.9878
56 Epoch 6/15
57 47999/47999 [==============================] - 1631s 34ms/step - loss: 0.0496 - acc: 0.9847 - val_loss: 0.0355 - val_acc: 0.9908
58 Epoch 7/15
59 47999/47999 [==============================] - 1626s 34ms/step - loss: 0.0430 - acc: 0.9871 - val_loss: 0.0284 - val_acc: 0.9922
60 Epoch 8/15
61 47999/47999 [==============================] - 1632s 34ms/step - loss: 0.0390 - acc: 0.9877 - val_loss: 0.0269 - val_acc: 0.9922
62 Epoch 9/15
63 47999/47999 [==============================] - 1632s 34ms/step - loss: 0.0363 - acc: 0.9886 - val_loss: 0.0341 - val_acc: 0.9904
64 Epoch 10/15
65 47999/47999 [==============================] - 1634s 34ms/step - loss: 0.0315 - acc: 0.9896 - val_loss: 0.0321 - val_acc: 0.9908
66 Epoch 11/15
67 47999/47999 [==============================] - 1626s 34ms/step - loss: 0.0301 - acc: 0.9907 - val_loss: 0.0325 - val_acc: 0.9912
68 Epoch 12/15
69 47999/47999 [==============================] - 1638s 34ms/step - loss: 0.0284 - acc: 0.9906 - val_loss: 0.0280 - val_acc: 0.9928
70 Epoch 13/15
71 47999/47999 [==============================] - 1635s 34ms/step - loss: 0.0261 - acc: 0.9920 - val_loss: 0.0313 - val_acc: 0.9919
72 Epoch 14/15
73 47999/47999 [==============================] - 1642s 34ms/step - loss: 0.0246 - acc: 0.9923 - val_loss: 0.0246 - val_acc: 0.9935
74 Epoch 15/15
75 47999/47999 [==============================] - 1639s 34ms/step - loss: 0.0228 - acc: 0.9926 - val_loss: 0.0288 - val_acc: 0.9922

测试

 1 def test():
 2     model = loadCNN()
 3     model.load_weights("model/mnist.hdf5")
 4     cap = cv.VideoCapture("test.wmv")
 5     while(cap.isOpened()):
 6         ret,frame = cap.read()
 7         img = draw(model,frame)
 8         cv.imshow("2",img)
 9         if cv.waitKey(1) == 27:
10             break
11     cap.release()
12     cv.destroyAllWindows()
13 
14     
15 def draw(model,img):
16     kernel = np.ones((3,3),np.uint8)
17     gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
18     lower_hsv = np.array([0,0,223])
19     upper_hsv = np.array([198,38,255])
20     ROI = cv.cvtColor(img,cv.COLOR_BGR2HSV)
21     frame = cv.inRange(ROI,lower_hsv,upper_hsv)
22     image,contours, hierarchy= cv.findContours(frame,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
23     i=0
24     for contour in contours:
25         if len(contour) >3:
26             x,y,w,h = cv.boundingRect(contour)
27             if w/h>=1.35 and w>15 and h >20 and w <=45:
28                 #print(x,y,w,h)
29                 p_img = gray[y:y+h, x+w//2-h//2:x+w//2+h//2]
30                 p_img = cv.erode(p_img,kernel)
31                 p_img = cv.resize(p_img,(28,28),interpolation= cv.INTER_LINEAR)
32                 ph,pw = p_img.shape
33                 for hx in range(ph):
34                     for wy in range(pw):
35                         p_img[hx][wy] = 255- p_img[hx][wy]
36                 p_img = np.array(p_img,f)
37                 p_img = p_img/ 255.0
38                 p_img = p_img.reshape([-1,28,28,1])
39                 pdt = np.argmax(model.predict(p_img))
40                 cv.putText(img,str(pdt),(x,y),cv.FONT_HERSHEY_COMPLEX,0.8,(0,0,255),1)
41                 ####这里用来判断
42                 #print(x,y,w,h)
43                 #cv.rectangle(img, (x+ w//2-h//2,y), (x+w//2+h//2, y + h), (0, 0, 225), 3)
44     #cv.drawContours(img, contours, -1, (0, 0, 255), 3)
45     #print(i)
46     return img
47 test()

技术分享图片

以上是关于OpenCV + CNN 大神符识别的主要内容,如果未能解决你的问题,请参考以下文章

基于SVM,KNN,CNN的数字图像识别

写个神经网络,让她认得我`(?????)(Tensorflow,opencv,dlib,cnn,人脸识别)

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

[转]Theano下用CNN(卷积神经网络)做车牌中文字符OCR

印章文字识别

Tensorflow实现CNN简单手写数字识别(Python)