毕设,课设,注意图片右下角水印。
本文最后有下载链接,如有需要可自行下载!!!
视频演示:
opencv手写汉字识别
运行界面如下所示:
选择图片:
识别:
训练的数据集为:手写汉字图片-HWDB的原始数据来自来自于中科院自动化研究所, 一共包含3000多个汉字。
下面是代码部分:
读取训练图片:
import cv2 as cv
import numpy as np
with open('data.txt','r') as f:
lines=f.readlines()
split=0.2
# np.random.seed(15)
np.random.shuffle(lines)
train_len=int(len(lines)*(1-split))
test_len=len(lines)-train_len
train_lines=lines[:train_len]
test_lines=lines[train_len:]
def change(img,tr=(255,255,255),ll=50):
h,w=img.shape[0],img.shape[1]
da=max(h,w)
rate=da/ll
img=cv.resize(img,(int(w/rate),int(h/rate)))
h2,w2=img.shape[0],img.shape[1]
t=int((ll-h2)/2)
b=ll-h2-t
l=int((ll-w2)/2)
r=ll-w2-l
img=cv.copyMakeBorder(img,t,b,l,r,cv.BORDER_CONSTANT,value=tr)
return img
def get_data(dd=True,batch_size=32):
x=[]
y=[]
while True:
if dd:
linss=train_lines
else:linss=test_lines
for lin in linss:
name=lin.split()[0]
lab=lin.split()[1]
lab=np.eye(1311)[int(lab)]
src=cv.imread(name)
src=change(src)
#数据增强
t=np.random.randint(0,15)
src = cv.copyMakeBorder(src, t, t, t, t, cv.BORDER_CONSTANT, value=(255,255,255))
src=cv.resize(src,(50,50))
# cv.imshow('a1122', src)
# cv.waitKey(0)
gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)
thred=np.where(gray>220,0,255).astype('uint8')
thred=(thred/255).astype('float32')
x.append(thred)
y.append(lab)
if len(x)==batch_size:
train_x=np.array(x).astype('float32')
train_y=np.array(y).astype('float32')
x=[]
y=[]
yield train_x,train_y
if __name__ == '__main__':
get_data()
搭建网络训练数据:
import tensorflow as tf
from tensorflow.keras.callbacks import (EarlyStopping, ReduceLROnPlateau,
TensorBoard,ModelCheckpoint)
from tensorflow.keras.layers import Dense,Flatten,Dropout,Input
from tensorflow.keras import Model
from generate_data import get_data,train_len,test_len
#tf.random.set_seed(16)
def mmod(shape=(50,50)):
inputs=Input(shape=shape)
inp=Flatten()(inputs)
x1=Dense(1500,activation='relu')(inp)
x2=Dense(1500,activation='relu')(x1)
x2 = Dense(1500, activation='relu')(x2)
x3 = Dense(1311, activation='softmax')(x2)
model=Model(inputs,x3)
return model
model=mmod()
model.summary()
model.load_weights('model_data/ep019-loss1.797-val_loss2.295.h5')
if __name__ == '__main__':
batch_size=50
model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
log_dir='logs/'
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3, verbose=1)
checkpoint = ModelCheckpoint(log_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',
monitor='val_loss', save_weights_only=True, save_best_only=False, period=1)
model.fit_generator(get_data(batch_size=batch_size),
steps_per_epoch=train_len//batch_size,
validation_data=get_data(dd=False,batch_size=batch_size),
validation_steps=test_len//batch_size,
epochs=50,
callbacks=[reduce_lr,checkpoint])
本文的代码及训练使用的数据集都已放在下面的下载链接中,已做好gui界面,直接运行即可。
下载以后只需要运行main.py即可,如需要配置环境可私信作者。
下载地址:https://gitee.com/mqwdasddqw/project-download-address