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
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')
tewest
Trả lờiXóachạy trên nền tảng gì thế admin
Trả lờiXóa