【人工智能项目】深度学习实现汉字书法识别

背景介绍

竞赛数据提供100个汉字书法单字,包括碑帖,手写书法,古汉字等。图片全部为单通道宽度jpg,宽高不定。

数据集介绍

  • 训练集:每个汉字400张图片,共计40000张图片,训练集是标注好的数据,图片按照图片上的文字分类到不同的文件夹中,也就是生活文件夹的名字就是文件夹里面所有图片的标签。

  • 测试集:

    • 第一部分:每汉字100张图片共计10000张图片,供参赛人员测试算法模型
    • 第二部分:每汉子50张以上图片共1643张图片,用来评测。
  • 提交csv文件

    • 文件第一列是测试集中图片文件的文件名,第二列是推断出来的图片上文字可能的五个汉字。

思路

  • 提取数据集
  • 定义fine-tune模型
  • VGG16模型
  • ResNet50模型
  • Xception模型
  • InceptionV3模型

具体流程

提取数据集

# 导入所需的模块
import os
import cv2
import numpy as npfrom sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
# 获取标签的编码器
train_path = "/content/train"
label_char = os.listdir(train_path)
label_char.sort()
encode_label = LabelBinarizer()
encode_label.fit(label_char)

LabelBinarizer(neg_label=0, pos_label=1, sparse_output=False)

# 定义读取图片函数
def get_img(file_path,img_rows,img_cols):image = cv2.imread(file_path,0)image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)image = cv2.resize(image,(img_rows,img_cols))feature = np.array(image,dtype=np.uint8)return feature
# 定义加载训练集的函数def load_train_data(train_path,img_rows,img_cols):x_train = []y_train = []dirs = os.listdir(train_path)for dir_name in dirs:path = train_path + "/" + dir_namefor img_name in os.listdir(path):feature = get_img(os.path.join(path,img_name),img_rows,img_cols)label = dir_namex_train.append(feature)y_train.append(label)# 对y_train进行one-hot编码y_train = np.array(encode_label.transform(y_train),dtype=np.uint8)# 对x_train进行转换x_train = np.array(x_train, dtype=np.uint8)# 对训练集进行随机打乱,并划分训练集和验证集x_train,x_valid,y_train,y_valid = train_test_split(x_train,y_train,test_size=0.2,random_state=2019)return x_train,x_valid,y_train,y_valid
# 定义加载测试集的函数
def load_test_data(test_path,img_rows,img_cols):x_test_id = []x_test = []img_names = os.listdir(test_path)for img_name in img_names:feature = get_img(os.path.join(test_path,img_name),img_rows,img_cols)id = img_namex_test_id.append(id)x_test.append(feature)#对x_test进行转换x_test = np.array(x_test,dtype=np.uint8)return x_test,x_test_id
# 加载训练和验证数据和标签
img_rows,img_cols = 224,224
x_train,x_valid,y_train,y_valid = load_train_data(train_path,img_rows,img_cols)
# 加载待预测的数据和标签
test_path = "/content/test2"
x_test,x_test_id = load_test_data(test_path,img_rows,img_cols)
# 查看一下数据和标签
print(x_train.shape)
print(y_train.shape)
print(x_valid.shape)
print(y_valid.shape)
print(x_test.shape)
print(x_test_id[:5])

# 查看一下数据和标签
import matplotlib.pyplot as plt
%matplotlib inlineprint(label_char[y_train[0].argmax()])plt.imshow(x_train[0])

fine-tune模型

选择keras中预训练好的模型,进行fine-tune。

# 导入开发需要的库
from keras import optimizers, Input
from keras.applications import  imagenet_utilsfrom keras.models import *
from keras.layers import *
from keras.optimizers import *
from keras.callbacks import *
from keras.applications import *from sklearn.preprocessing import *
from sklearn.model_selection import *
from sklearn.metrics import *
# 绘制训练过程中的 loss 和 acc 变化曲线
import matplotlib.pyplot as plt
%matplotlib inlinedef history_plot(history_fit):plt.figure(figsize=(12,6))# summarize history for accuracyplt.subplot(121)plt.plot(history_fit.history["acc"])plt.plot(history_fit.history["val_acc"])plt.title("model accuracy")plt.ylabel("accuracy")plt.xlabel("epoch")plt.legend(["train", "valid"], loc="upper left")# summarize history for lossplt.subplot(122)plt.plot(history_fit.history["loss"])plt.plot(history_fit.history["val_loss"])plt.title("model loss")plt.ylabel("loss")plt.xlabel("epoch")plt.legend(["train", "test"], loc="upper left")plt.show()
# fine-tune 模型
def fine_tune_model(model, optimizer, batch_size, epochs, freeze_num):'''discription: 对指定预训练模型进行fine-tune,并保存为.hdf5格式MODEL:传入的模型,VGG16, ResNet50, ...optimizer: fine-tune all layers 的优化器, first part默认用adadeltabatch_size: 每一批的尺寸,建议32/64/128epochs: fine-tune all layers的代数freeze_num: first part冻结卷积层的数量'''# first: 仅训练全连接层(权重随机初始化的)# 冻结所有卷积层for layer in model.layers[:freeze_num]:layer.trainable = Falsemodel.compile(optimizer='adadelta', loss='categorical_crossentropy',metrics=['accuracy'])model.fit(x=x_train, y=y_train, batch_size=batch_size, epochs=2, shuffle=True, verbose=1, validation_data=(x_valid, y_valid))print('Finish step_1')# second: fine-tune all layersfor layer in model.layers[:]:layer.trainable = Truerc = ReduceLROnPlateau(monitor='val_loss',factor=0.5,patience=2,verbose=1,min_delta=1e-4,mode='min')model_name = model.name  + '.hdf5'mc = ModelCheckpoint(model_name, monitor='val_loss', save_best_only=True,mode='min')model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])history_fit = model.fit(x=x_train, y=y_train, batch_size=batch_size, epochs=epochs, shuffle=True, verbose=1, validation_data=(x_valid, y_valid),callbacks=[mc, rc])print('Finish fine-tune')#展示fine-tune过程中的loss和accuracy变化曲线history_plot(history_fit)

VGG16

a.定义VGG16模型

# 定义一个VGG16的模型
def vgg16_model(img_rows, img_cols):x = Input(shape=(img_rows, img_cols, 3))x = Lambda(imagenet_utils.preprocess_input)(x)base_model = VGG16(input_tensor=x, weights='imagenet', include_top=False, pooling='avg')x = base_model.outputx = Dense(1024, activation='relu', name='fc1')(x)x = Dropout(0.5)(x)predictions = Dense(100, activation='softmax', name='predictions')(x)vgg_model = Model(inputs=base_model.input, outputs=predictions, name='vgg16')return vgg_model
# 创建VGG16模型
img_rows, img_cols = 224, 224
vgg_model = vgg16_model(img_rows,img_cols)
# 列出每一层的序号和名字
for i,layer in enumerate(vgg_model.layers):print(i,layer.name)


b.VGG16模型训练

# 模型训练
optimizer = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)batch_size = 32
epochs = 10
freeze_num = 19fine_tune_model(vgg_model, optimizer, batch_size, epochs, freeze_num)



c.VGG16模型预测

# 加载模型权重
vgg_model.load_weights("vgg16.hdf5")
# 获取预测结果
y_preds = vgg_model.predict(x_test)
# 测试预测的结果
print(x_test.shape[0])
plt.imshow(x_test[2])test_img = np.expand_dims(x_test[2],axis=0)
y_pred = vgg_model.predict(test_img)
print(y_pred.shape)labels=[]
pred_dict = {key:value for key,value in enumerate(y_pred[0])}
pred_sorted = sorted(pred_dict.items(), key=lambda item:(-item[1]))
top_5 = " "
for j in range(5):index = pred_sorted[j][0]top_5 += label_char[index]labels.append(top_5) print(labels)

from pandas import DataFrame# 定义创建csv文件的函数
def create_submission(y_preds,x_test_id):labels = []for i,_ in enumerate(x_test_id):  # key代表预测的character的序号,value代表预测概率pred_dict = {key:value for key,value in enumerate(y_preds[i])} pred_sorted = sorted(pred_dict.items(), key=lambda item:(-item[1])) # pred_sorted: [(k1,v1), (k2,v2), ...]top_5 = ''for j in range(5):index = pred_sorted[j][0]top_5 += label_char[index]labels.append(top_5) result = DataFrame(labels,columns=["labels"])result.insert(0,"filename",x_test_id)result.to_csv("submit.csv",index=None)print("create submission succesfuly")
# 生成csv文件
create_submission(y_preds,x_test_id)
import pandas as pd
# 预览一下提交文件
predict_df = pd.read_csv("submit.csv")
predict_df.head()

ResNet

a.ResNet50模型定义

# 定义一个ResNet50的模型
def restnet50_model(img_rows, img_cols):x = Input(shape=(img_rows, img_cols, 3))x = Lambda(imagenet_utils.preprocess_input)(x)base_model = ResNet50(input_tensor=x, weights='imagenet', include_top=False, pooling='avg')x = base_model.outputx = Dense(1024, activation='relu', name='fc1')(x)x = Dropout(0.5)(x)predictions = Dense(100, activation='softmax', name='predictions')(x)resnet_model = Model(inputs=base_model.input, outputs=predictions, name='resnet50')return resnet_model
# 创建ResNet50模型img_rows, img_cols = 224, 224
resnet_model = restnet50_model(img_rows,img_cols)
# 列出每一层的序号和名字
for i,layer in enumerate(resnet_model.layers):print(i,layer.name)

b.ResNet50模型训练

# 模型训练optimizer = optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08)batch_size = 32
epochs = 10
freeze_num = 175fine_tune_model(resnet_model, optimizer, batch_size, epochs, freeze_num)


c.ResNet模型预测

# 加载模型权重
resnet_model.load_weights("resnet50.hdf5")
# 获取预测结果
y_preds = resnet_model.predict(x_test)
from pandas import DataFrame# 定义创建csv文件的函数
def create_submission(y_preds,x_test_id):labels = []for i,_ in enumerate(x_test_id):  # key代表预测的character的序号,value代表预测概率pred_dict = {key:value for key,value in enumerate(y_preds[i])} pred_sorted = sorted(pred_dict.items(), key=lambda item:(-item[1])) # pred_sorted: [(k1,v1), (k2,v2), ...]top_5 = ''for j in range(5):index = pred_sorted[j][0]top_5 += label_char[index]labels.append(top_5) result = DataFrame(labels,columns=["labels"])result.insert(0,"filename",x_test_id)result.to_csv("submit2.csv",index=None)print("create submission succesfuly")
# 生成csv文件
create_submission(y_preds,x_test_id)
import pandas as pd
# 预览一下提交文件
predict_df = pd.read_csv("submit2.csv")
predict_df.head()

Xception

a.定义Xception模型

# 定义一个Xception的模型
def xception_model(img_rows, img_cols):x = Input(shape=(img_rows, img_cols, 3))x = Lambda(imagenet_utils.preprocess_input)(x)base_model = Xception(input_tensor=x, weights='imagenet', include_top=False, pooling='avg')x = base_model.outputx = Dense(1024, activation='relu', name='fc1')(x)x = Dropout(0.5)(x)predictions = Dense(100, activation='softmax', name='predictions')(x)xception_model = Model(inputs=base_model.input, outputs=predictions, name='xception')return xception_model
# 创建Xception模型img_rows, img_cols = 224, 224
xception_model = xception_model(img_rows,img_cols)
# 列出每一层的序号和名字
for i,layer in enumerate(xception_model.layers):print(i,layer.name)

b.Xception模型训练

# 模型训练optimizer = optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08)batch_size = 32
epochs = 15
freeze_num = 132fine_tune_model(xception_model, optimizer, batch_size, epochs, freeze_num)

c.Xception模型预测

# 加载模型权重
xception_model.load_weights("xception.hdf5")
# 获取预测结果
y_preds = xception_model.predict(x_test)
from pandas import DataFrame# 定义创建csv文件的函数
def create_submission(y_preds,x_test_id):labels = []for i,_ in enumerate(x_test_id):  # key代表预测的character的序号,value代表预测概率pred_dict = {key:value for key,value in enumerate(y_preds[i])} pred_sorted = sorted(pred_dict.items(), key=lambda item:(-item[1])) # pred_sorted: [(k1,v1), (k2,v2), ...]top_5 = ''for j in range(5):index = pred_sorted[j][0]top_5 += label_char[index]labels.append(top_5) result = DataFrame(labels,columns=["labels"])result.insert(0,"filename",x_test_id)result.to_csv("submit3.csv",index=None)print("create submission succesfuly")
# 生成csv文件
create_submission(y_preds,x_test_id)
import pandas as pd
# 预览一下提交文件
predict_df = pd.read_csv("submit.csv")
predict_df.head()

InceptionV3

a.InceptionV3模型定义

# 定义一个Inception的模型
def inception_model(img_rows, img_cols):x = Input(shape=(img_rows, img_cols, 3))x = Lambda(imagenet_utils.preprocess_input)(x)base_model = inception_v3.InceptionV3(input_tensor=x, weights='imagenet', include_top=False, pooling='avg')x = base_model.outputx = Dense(1024, activation='relu', name='fc1')(x)x = Dropout(0.5)(x)predictions = Dense(100, activation='softmax', name='predictions')(x)inception_model = Model(inputs=base_model.input, outputs=predictions, name='inceptionv3')return inception_model
# 创建Incpetion模型img_rows, img_cols = 224, 224
inception_model = inception_model(img_rows,img_cols)
# 列出每一层的序号和名字
for i,layer in enumerate(inception_model.layers):print(i,layer.name)

b.InceptionV3模型训练

# 模型训练optimizer = optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08)batch_size = 32
epochs = 15
freeze_num = 311fine_tune_model(inception_model, optimizer, batch_size, epochs, freeze_num)



c.InceptionV3模型预测

# 加载模型权重
inception_model.load_weights("inceptionv3.hdf5")
# 获取预测结果
y_preds = inception_model.predict(x_test)
from pandas import DataFrame# 定义创建csv文件的函数
def create_submission(y_preds,x_test_id):labels = []for i,_ in enumerate(x_test_id):  # key代表预测的character的序号,value代表预测概率pred_dict = {key:value for key,value in enumerate(y_preds[i])} pred_sorted = sorted(pred_dict.items(), key=lambda item:(-item[1])) # pred_sorted: [(k1,v1), (k2,v2), ...]top_5 = ''for j in range(5):index = pred_sorted[j][0]top_5 += label_char[index]labels.append(top_5) result = DataFrame(labels,columns=["labels"])result.insert(0,"filename",x_test_id)result.to_csv("submit4.csv",index=None)print("create submission succesfuly")
# 生成csv文件
create_submission(y_preds,x_test_id)
import pandas as pd
# 预览一下提交文件
predict_df = pd.read_csv("submit4.csv")
predict_df.head()

小结

那接着下一个安排走起吧!!!

【人工智能项目】深度学习实现汉字书法识别相关推荐

  1. 【AI参赛经验】深度学习入门指南:从零开始TinyMind汉字书法识别——by:Link

    各位人工智能爱好者,大家好! 由TinyMind发起的#第一届汉字书法识别挑战赛#正在火热进行中,比赛才开始3周,已有数只黑马冲进榜单.目前TOP54全部为90分以上!可谓竞争激烈,高手如林.不是比赛 ...

  2. 深度学习入门指南:从零开始TinyMind汉字书法识别

    深度学习入门指南:从零开始TinyMind汉字书法识别 这几天在刷这个新出的比赛,受举办方邀请谢了一篇文章,也转到CSDN来和大家分享下吧.话说TinyMind不是被CSDN收购了么,我这算不算把统一 ...

  3. 【AI参赛经验】汉字书法识别比赛经验心得——by:microfat_htu

    各位人工智能爱好者,大家好! 由TinyMind发起的#第一届汉字书法识别挑战赛#正在火热进行中,比赛才开始3周,已有数只黑马冲进榜单.目前TOP54全部为90分以上!可谓竞争激烈,高手如林.不是比赛 ...

  4. 【AI参赛经验】汉字书法识别入门—by:真的学不会

    各位人工智能爱好者,大家好! 由TinyMind发起的 #第一届汉字书法识别挑战赛# 正在火热进行中,比赛才开始3周,已有数只黑马冲进榜单.目前TOP54全部为90分以上!可谓竞争激烈,高手如林.不是 ...

  5. 基于深度学习的命名实体识别研究综述——论文研读

    基于深度学习的命名实体识别研究综述 摘要: 0引言 1基于深度学习的命名实体识别方法 1.1基于卷积神经网络的命名实体识别方法 1.2基于循环神经网络的命名实体识别方法 1.3基于Transforme ...

  6. TinyMind第一届汉字书法识别挑战赛

    报名地址:http://www.tinymind.cn/competitions/41?from=blog 比赛介绍 手写字体识别一直是人工智能领域一个热门研究方向,这次我们联合书法领域的权威合作伙伴 ...

  7. TinyMind 汉字书法识别竞赛开启总决赛啦!!

    手写字体识别一直是人工智能领域一个热门研究方向,TinyMind联合书法领域的权威合作伙伴举办了一次汉字书法识别大赛,为广大人工智能和手写字体识别技术爱好者提供了一个练习和交流的机会. 竞赛开始后,高 ...

  8. 【AI竞赛】TinyMind汉字书法识别挑战赛开始报名啦!!

    书法是中国及深受中国文化影响过的国家和地区特有的一种文字美的艺术表现形式.书法艺术的背景是中国传统文化.书法植根于中国传统文化土壤,传统文化是书法赖以生存.发展的背景.我们今天能够看到的汉代以来的书法 ...

  9. 热门 | Google Brain前员工深度盘点2017人工智能和深度学习各大动态

    翻译 | AI科技大本营 参与 | shawn 编辑 | Donna 2017年是人工智能井喷的一年.Google Brain团队前成员Denny Britz在自己的博客WILDML上对过去一年人工智 ...

最新文章

  1. Nginx(九)-- Nginx实际使用配置
  2. centos出现磁盘坏掉,怎么修复和检测。
  3. 5获取http请求头_获取托管者发送http请求报文的解决方案
  4. 针对行业需求服务优质客户 ,网易云信助金融行业“网上冲浪”
  5. hbase 查询固定条数_HBase原理深入
  6. VC内存泄露检查工具:Visual Leak Detector
  7. 无法从套接字中获取更多数据_数据科学中应引起更多关注的一个组成部分
  8. C语言二叉树实验报告流程图,二叉树的建立与遍历实验报告(c语言编写,附源代码).doc...
  9. OpenCV+Python(官方中文版翻译)
  10. 新闻更新延时引发的学习,CACHE的利用。
  11. k8s升级,HA集群1.12.0~HA集群1.13.2
  12. 【大数据部落】R语言实现:混合正态分布EM最大期望估计法
  13. 计算机t恤,PS一分钟技巧!给T恤加个图案竟然这么简单
  14. python xlwt追加_python excel写入及追加写入
  15. 按键精灵脚本与Total Control手机群控系统的完美结合
  16. 代码规范 任重而道远
  17. 如何在2015年后的MacBook Air上安装双系统
  18. mysql语句占位符_sql语句中的占位符?有什么作用
  19. 在java中 数组是作为_2.在Java中,数组是作为____来处理的。
  20. 一个数据录入/查询的应用程序在登录时错误信息解决过程

热门文章

  1. cocos2dx中的颜色混合
  2. python在采购中应用_实例13:用Python批量查询采购物料交期及实际收货日期
  3. 用浏览器快速开启Docker的体验之旅
  4. 【JM】电脑检测不到U盘
  5. html文本框中有一个叉号标志,html 输入框显示“小叉叉”的清空图标
  6. mysql 密码插件 validate_password
  7. 在线扫描php后门_webshell后门扫描-PHP版
  8. 激光三角测距原理概述
  9. [激光器原理与应用-4]:激光器的内部结构与工作原理
  10. 如何进行期货日内趋势量化交易系统的设计?这篇文章可以给你启发!