Nhận dạng chữ cái viết tay

Chào các bạn , blog hôm nay là màn mở đầu cho một năm 2019 của mình.
Chẳng là những ngày cuối 2018 hứng khởi xem mấy bài trên Viblo của bạn cùng lớp thấy hay quá nên thử làm luôn. Đó là bài Chấm thi tự động bằng Opencv và Deep Learning, các bạn có thể xem tại ĐÂY.

Blog này mình muốn đề cập đến phần tạo model bằng CNN để nhận diện các đáp án( A, B, C, D). Nếu các bạn muốn phạm vi nhận diện lớn hơn, đừng lo lắng vì việc tạo model vẫn tương tự như vậy thôi.😁

Nếu bạn nào đã ghé thăm blog "Mnist Digit" của mình thì thấy nó hoàn toàn giống nhau nhé 😀

Về dataset thì mình lấy bộ A-Z handwritten của Kaggle khá là lớn. Dataset

  • 26 class
  • mỗi dòng đại diện cho một hình ảnh chữ cái size 28x28, trong đó Col đầu tiên là nhãn cho sample, tiếp tục 784 col sau là giá trị pixel của hình ảnh đã được trải phẳng( flatten)
  • 56080 dòng đầu tiên là dữ liệu cho 4 class A, B, C, D
Source code: mình để epoch = 6 chạy cho nhanh và kết quả khá ổn(99,87%)  nên cũng chưa thử tăng epoch lên hơn, các bạn có thể thử nhé!

import pandas as pd

data = pd.read_csv('train_update.csv')
dataset = data.iloc[:,:].values

import numpy as np
np.random.shuffle(dataset)
X_train = dataset[:,1:]
y_train = dataset[:,:1]

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.utils import np_utils
from keras.optimizers import RMSprop
from keras.callbacks import ReduceLROnPlateau
from keras.preprocessing.image import ImageDataGenerator
from sklearn.model_selection import train_test_split

def cnn_model(result_class_size):
    model = Sequential()
    model.add(Conv2D(32, (5, 5), input_shape=(28, 28, 1), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(16, (3, 3), activation='relu'))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(130, activation='relu'))
    model.add(Dense(50, activation='relu'))
    model.add(Dense(result_class_size, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy'])
    return model

arr_train_y = np_utils.to_categorical(y_train[:,:1])
model = cnn_model(arr_train_y.shape[1])
model.summary()

df_train_x = X_train / 255arr_train_x_28x28 = np.reshape(df_train_x, (df_train_x.shape[0], 28, 28, 1))

random_seed = 3split_train_x, split_val_x, split_train_y, split_val_y, = train_test_split(arr_train_x_28x28, arr_train_y,                                                                           test_size=0.08, random_state=random_seed)

reduce_lr = ReduceLROnPlateau(monitor='val_acc',                              factor=0.5,                              patience=3,                              min_lr=0.00001)

datagen = ImageDataGenerator(
    rotation_range=10,    zoom_range=0.1,    width_shift_range=0.1,    height_shift_range=0.1)

datagen.fit(split_train_x)

model.fit_generator(datagen.flow(split_train_x, split_train_y, batch_size=64),                    epochs=5, validation_data=(split_val_x, split_val_y),                    verbose=2, steps_per_epoch=700                    , callbacks=[reduce_lr])

model.save('abcd_handwriteen_update.h5')

Nhận xét

Đăng nhận xét

Bài đăng phổ biến từ blog này

ASP.NET MVC 5- Ứng dụng quản lý sinh viên

[Phần 3]: Controllers