位置: IT常识 - 正文

【Tensorflow深度学习】实现手写字体识别、预测实战(附源码和数据集 超详细)(tensorflow gan)

编辑:rootadmin
【Tensorflow深度学习】实现手写字体识别、预测实战(附源码和数据集 超详细)

推荐整理分享【Tensorflow深度学习】实现手写字体识别、预测实战(附源码和数据集 超详细)(tensorflow gan),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:tensorflowgpu,tensorflow deeplab,tensorflow v1,tensorflow dlib,tensorflow deeplab,tensorflow deeplab,tensorflow deepfm,tensorflow 1,内容如对您有帮助,希望把文章链接给更多的朋友!

需要源码和数据集请点赞关注收藏后评论区留言私信~~~

一、数据集简介

下面用到的数据集基于IAM数据集的英文手写字体自动识别应用,IAM数据库主要包含手写的英文文本,可用于训练和测试手写文本识别以及执行作者的识别和验证,该数据库在ICDAR1999首次发布,并据此开发了基于隐马尔可夫模型的手写句子识别系统,并于ICPR2000发布,IAM包含不受约束的手写文本,以300dpi的分辨率扫描并保存为具有256级灰度的PNG图像,IAM手写数据库目前最新的版本为3.0,其主要结构如下

约700位作家贡献笔迹样本

超过1500页扫描文本

约6000个独立标记的句子

超过一万行独立标记的文本

超过十万个独立标记的空间

展示如下 有许多张手写照片 

 

 

二、实现步骤 1:数据清洗

删除文件中备注说明以及错误结果,统计正确笔迹图形的数量,最后将整理后的数据进行随机无序化处理

2:样本分类

接下来对数据进行分类 按照8:1:1的比例将样本数据集分为三类数据集,分别是训练数据集 验证数据集和测试数据集,针对训练数据集进行训练可以获得模型,而测试数据集主要用于测试模型的有效性

3:实现字符和数字映射

利用Tensorflow库的Keras包的StringLookup函数实现从字符到数字的映射 主要参数说明如下

【Tensorflow深度学习】实现手写字体识别、预测实战(附源码和数据集 超详细)(tensorflow gan)

max_tokens:单词大小的最大值

num_oov_indices:out of vocabulary的大小

mask_token:表示屏蔽输入的大小

oov_token:仅当invert为True时使用 OOV索引的返回值 默认为UNK

4:进行卷积变化 

通过Conv2D函数实现二维卷积变换 主要参数说明如下

filters:整数值 代表输出空间的维度

kernel_size:一个整数或元组列表 指定卷积窗口的高度和宽度

strides:一个整数或元组列表 指定卷积沿高度和宽度的步幅

padding:输出图像的填充方式

activation:激活函数

三、效果展示 

读取部分手写样本的真实文本信息如下

训练结束后 得到训练模型 导入测试手写文本数据 进行手写笔迹预测 部分结果如下

四、结果总结 

观察预测结果可知,基于均值池化以及训练过程预警极值,大部分的英文字符能够得到准确的预测判定,训练的精度持续得到改善,损失值控制在比较合理的区间内,没有发生预测准确度连续多次无法改进的场景,模型稳定性较好

五、代码

部分代码如下 需要全部代码请点赞关注收藏后评论区留言私信~~~

from tensorflow.keras.layers.experimental.preprocessing import StringLookupfrom tensorflow import kerasimport matplotlib.pyplot as pltimport tensorflow as tfimport numpy as npimport osplt.rcParams['font.family'] = ['Microsoft YaHei']np.random.seed(0)tf.random.set_seed(0)# ## 切分数据# In[ ]:corpus_read = open("data/words.txt", "r").readlines()corpus = []length_corpus=0for word in corpus_read: if lit(" ")[1] == "ok"): corpus.append(word)np.random.shuffle(corpus)length_corpus=len(corpus)print(length_corpus)corpus[400:405]# 划分数据,按照 80:10:10 比例分配给训练:有效:测试 数据# In[ ]:train_flag = int(0.8 * len(corpus))test_flag = int(0.9 * len(corpus))train_data = corpus[:train_flag]validation_data = corpus[train_flag:test_flag]test_data = corpus[test_flag:]train_data_len=len(train_data)validation_data_len=len(validation_data)test_data_len=len(test_data)print("训练样本大小:", train_data_len)print("验证样本大小:", validation_data_len)print("测试样本大小:",test_data_len )# In[ ]:image_direct = "data\images"def retrieve_image_info(data): image_location = [] sample = [] for (i, corpus_row) in enumerate(data): corpus_strip = corpus_row.strip() corpus_strip = corpus_strip.split(" ") image_name = corpus_strip[0] leve1 = image_name.split("-")[0] leve2 = image_name.split("-")[1] image_location_detail = os.path.join( image_direct, leve1, leve1 + "-" + leve2, image_name + ".png" ) if os.path.getsize(image_location_detail) >0 : image_location.append(image_location_detail) sample.append(corpus_row.split("\n")[0]) print("手写图像路径:",image_location[0],"手写文本信息:",sample[0]) return image_location, sampletrain_image, train_tag = retrieve_image_info(train_data)validation_image, validation_tag = retrieve_image_info(validation_data)test_image, test_tag = retrieve_image_info(test_data)# In[ ]:# 查找训练数据词汇最大长度train_tag_extract = []vocab = set()max_len = 0for tag in train_tag: tag = tag.split(" ")[-1].strip() for i in tag: vocab.add(i) max_len = max(max_len, len(tag)) train_tag_extract.append(tag)print("最大长度: ", max_len)print("单词大小: ", len(vocab))print("单词内容: ", vocab)train_tag_extract[40:45]# In[ ]:print(train_tag[50:54])print(validation_tag[10:14])print(test_tag[80:84])def extract_tag_info(tags): extract_tag = [] for tag in tags: tag = tag.split(" ")[-1].strip() extract_tag.append(tag) return extract_tagtrain_tag_tune = extract_tag_info(train_tag)validation_tag_tune = extract_tag_info(validation_tag)test_tag_tune = extract_tag_info(test_tag)print(train_tag_tune[50:54])print(validation_tag_tune[10:14])print(test_tag_tune[80:84])# In[ ]:AUTOTUNE = tf.data.AUTOTUNE# 映射单词到数字string_to_no = StringLookup(vocabulary=list(vocab), invert=False)# 映射数字到单词no_map_string = StringLookup( vocabulary=string_to_no.get_vocabulary(), invert=True)# In[ ]:def distortion_free_resize(image, img_size): w, h = img_size image = tf.image.resize(image, size=(h, w), preserve_aspect_ratio=True, antialias=False, name=None) # 计算填充区域大小 pad_height = h - tf.shape(image)[0] pad_width = w - tf.shape(image)[1] if pad_height % 2 != 0: height = pad_height // 2 pad_height_top = height + 1 pad_height_bottom = height else: pad_height_top = pad_height_bottom = pad_height // 2 if pad_width % 2 != 0: width = pad_width // 2 pad_width_left = width + 1 pad_width_right = width else: pad_width_left = pad_width_right = pad_width // 2 image = tf.pad( image, paddings=[ [pad_height_top, pad_height_bottom], [pad_width_left, pad_width_right], [0, 0], ], ) image = tf.transpose(image, perm=[1, 0, 2]) image = tf.image.flip_left_right(image) return image# In[ ]:batch_size = 64padding_token = 99image_width = 128image_height = 32def preprocess_image(image_path, img_size=(image_width, image_height)): image = tf.io.read_file(image_path) image = tf.image.decode_png(image, 1) image = distortion_free_resize(image, img_size) image = tf.cast(image, tf.float32) / 255.0 return imagedef vectorize_tag(tag): tag = string_to_no(tf.strings.unicode_split(tag, input_encoding="UTF-8")) length = tf.shape(tag)[0] pad_amount = max_len - length tag = tf.pad(tag, paddings=[[0, pad_amount]], constant_values=padding_token) return tagdef process_images_tags(image_path, tag): image = preprocess_image(image_path) tag = vectorize_tag(tag) return {"image": image, "tag": tag}def prepare_dataset(image_paths, tags): dataset = tf.data.Dataset.from_tensor_slices((image_paths, tags)).map( process_images_tags, num_parallel_calls=AUTOTUNE ) return dataset.batch(batch_size).cache().prefetch(AUTOTUNE)# In[ ]:train_final = prepare_dataset(train_image, train_tag_extract )validation_final = prepare_dataset(validation_image, validation_tag_tune )test_final = prepare_dataset(test_image, test_tag_tune )print(train_final.take(1))print(train_final)# In[ ]:plt.rcParams['font.family'] = ['Microsoft YaHei']for data in train_final.take(1): images, tags = data["image"], data["tag"] _, ax = plt.subplots(4, 4, figsize=(15, 8)) for i in range(16): img = images[i] img = tf.image.flip_left_right(img) img = tf.transpose(img, perm=[1, 0, 2]) img = (img * 255.0).numpy().clip(0, 255).astype(np.uint8) img = img[:, :, 0] tag = tags[i] indices = tf.gather(tag, tf.where(tf.math.not_equal(tag, padding_token))) tag = tf.strings.reduce_join(no_map_string(indices)) tag = tag.numpy().decode("utf-8") ax[i // 4, i % 4].imshow(img) ax[i // 4, i % 4].set_title(u"真实文本:%s"%tag) ax[i // 4, i % 4].axis("on")plt.show()# In[ ]:class CTCLoss(keras.layers.Layer): def call(self, y_true, y_pred): batch_len = tf.cast(tf.shape(y_true)[0], dtype="int64") input_length = tf.cast(tf.shape(y_pred)[1], dtype="int64") tag_length = tf.cast(tf.shape(y_true)[1], dtype="int64") input_length = input_length * tf.ones(shape=(batch_len, 1), dtype="int64") tag_length = tag_length * tf.ones(shape=(batch_len, 1), dtype="int64") loss = keras.backend.ctc_batch_cost(y_true, y_pred, input_length, tag_length) self.add_loss(loss) return lossdef generate_model(): # Inputs to the model input_img = keras.Input(shape=(image_width, image_height, 1), name="image") tags = keras.layers.Input(name="tag", shape=(None,)) # First conv block. t = keras.layers.Conv2D( filters=32, kernel_size=(3, 3), activation="relu", kernel_initializer="he_normal", padding="same", name="ConvolutionLayer1")(input_img) t = keras.layers.AveragePooling2D((2, 2), name="AveragePooling_one")(t) # Second conv block. t = keras.layers.Conv2D( filters=64, kernel_size=(3, 3), activation="relu", kernel_initializer="he_normal", padding="same", name="ConvolutionLayer2")(t) t = keras.layers.AveragePooling2D((2, 2), name="AveragePooling_two")(t) #re_shape = (t,[(image_width // 4), -1]) #tf.dtypes.cast(t, tf.int32) re_shape = ((image_width // 4), (image_height // 4) * 64) t = keras.layers.Reshape(target_shape=re_shape, name="reshape")(t) t = keras.layers.Dense(64, activation="relu", name="denseone",use_bias=False, kernel_initializer='glorot_uniform', bias_initializer='zeros')(t) t = keras.layers.Dropout(0.4)(t) # RNNs. t = keras.layers.Bidirectional( keras.layers.LSTM(128, return_sequences=True, dropout=0.4) )(t) t = keras.layers.Bidirectional( keras.layers.LSTM(64, return_sequences=True, dropout=0.4) )(t) t = keras.layers.Dense( len(string_to_no.get_vocabulary())+2, activation="softmax", name="densetwo" )(t) # Add CTC layer for calculating CTC loss at each step. output = CTCLoss(name="ctc_loss")(tags, t) # Define the model. model = keras.models.Model( inputs=[input_img, tags], outputs=output, name="handwriting" ) # Optimizer. # Compile the model and return. model.compile(optimizer=keras.optimizers.Adam()) return model# Get the model.model = generate_model()model.summary()# In[ ]:validation_images = []validation_tags = []for batch in validation_final: validation_images.append(batch["image"]) validation_tags.append(batch["tag"])# In[ ]:#epochs = 20 model = generate_model()prediction_model = keras.models.Model( model.get_layer(name="image").input, model.get_layer(name="densetwo").output)#edit_distance_callback = EarlyStoppingAtLoss()epochs = 60early_stopping_patience = 10# Add early stoppingearly_stopping = keras.callbacks.EarlyStopping( monitor="val_loss", patience=early_stopping_patience, restore_best_weights=True)# Train the model.history = model.fit( train_final, validation_data=validation_final, epochs=60,callbacks=[early_stopping])# ## Inference# In[ ]:plt.rcParams['font.family'] = ['Microsoft YaHei']# A utility function to decode the output of the network.def handwriting_prediction(pred): input_len = np.ones(pred.shape[0]) * pred.shape[1] = [] for j in results: j = tf.gather(j, tf.where(tf.math.not_equal(j, -1))) j = tf.strings.reduce_join(no_map_string(j)).numpy().decode("utf-8") output_text.append(j) return output_text# Let's check results on some test samples.for test in test_final.take(1): test_images = test["image"] _, ax = plt.subplots(4, 4, figsize=(15, 8)) predit = prediction_model.predict(test_images) predit_text = handwriting_prediction(predit) for k in range(16): img = test_images[k] img = tf.image.flip_left_right(img) img = tf.transpose(img, perm=[1, 0, 2]) img = (img * 255.0).numpy().clip(0, 255).astype(np.uint8) img = img[:, :, 0] title = f"预测结果: {predit_text[k]}"# In[ ]:

创作不易 觉得有帮助请点赞关注收藏~~~

本文链接地址:https://www.jiuchutong.com/zhishi/299085.html 转载请保留说明!

上一篇:无人驾驶学习笔记-LeGO-LOAM 算法源码学习总结(无人驾驶基础知识)

下一篇:开源代码 | FMCW-MIMO雷达仿真MATLAB(开源代码网站github)

  • 红米note11打字声音怎么关(红米手机打字声音)

    红米note11打字声音怎么关(红米手机打字声音)

  • ipad扬声器在哪里设置(iPad扬声器在哪里)

    ipad扬声器在哪里设置(iPad扬声器在哪里)

  • xsmax来电闪光灯怎么设置(苹果xsmax来电闪光灯打开了怎么不闪?)

    xsmax来电闪光灯怎么设置(苹果xsmax来电闪光灯打开了怎么不闪?)

  • 小米放大器重置方法(小米放大器重置搜不到)

    小米放大器重置方法(小米放大器重置搜不到)

  • 四g手机可以升级五g吗(四g手机可以升五g网络吗)

    四g手机可以升级五g吗(四g手机可以升五g网络吗)

  • 三星s8+怎么退出安全模式(三星s8+怎么退出账号)

    三星s8+怎么退出安全模式(三星s8+怎么退出账号)

  • 电脑上的手机模拟大师是什么东西(电脑上的手机模拟大师是流氓软件吗)

    电脑上的手机模拟大师是什么东西(电脑上的手机模拟大师是流氓软件吗)

  • 苹果手机自带软件可以卸载吗(苹果手机自带软件哪些没有用可以删除?)

    苹果手机自带软件可以卸载吗(苹果手机自带软件哪些没有用可以删除?)

  • 华为呼叫转移网络异常(华为呼叫转移网络或sim卡出错什么意思)

    华为呼叫转移网络异常(华为呼叫转移网络或sim卡出错什么意思)

  • c盘temp可以清空吗(c盘怎么清除temp)

    c盘temp可以清空吗(c盘怎么清除temp)

  • 苹果手机有锁卡贴是什么意思(苹果手机有锁卡贴机可以升级系统吗)

    苹果手机有锁卡贴是什么意思(苹果手机有锁卡贴机可以升级系统吗)

  • 小米cc9美图定制版什么时候上市的(小米cc9美图定制版和小米cc9手机壳通用吗)

    小米cc9美图定制版什么时候上市的(小米cc9美图定制版和小米cc9手机壳通用吗)

  • word不小心关闭没保存(word不小心关闭没保存2010)

    word不小心关闭没保存(word不小心关闭没保存2010)

  • 文库自动续费怎么能关(文库移动端连续包月怎么取消)

    文库自动续费怎么能关(文库移动端连续包月怎么取消)

  • 为什么挂完电话会放歌(为什么挂完电话手机会有音乐播放)

    为什么挂完电话会放歌(为什么挂完电话手机会有音乐播放)

  • 苹果8p怎么设置点击亮屏(苹果8p怎么设置高清通话)

    苹果8p怎么设置点击亮屏(苹果8p怎么设置高清通话)

  • 没保存的ppt可以找回吗(ppt如果没有保存可以找回来吗)

    没保存的ppt可以找回吗(ppt如果没有保存可以找回来吗)

  • iphone11pro和promax区别(苹果11pro11promax)

    iphone11pro和promax区别(苹果11pro11promax)

  • 淘宝钉钉是什么(淘宝钉钉是什么意思)

    淘宝钉钉是什么(淘宝钉钉是什么意思)

  • facetime激活出错(FaceTime激活出错请再试一次)

    facetime激活出错(FaceTime激活出错请再试一次)

  • 盒马鲜生如何加盟(盒马鲜生如何加盟开分店)

    盒马鲜生如何加盟(盒马鲜生如何加盟开分店)

  • 微信聊天儿记录能恢复吗(微信聊天儿记录删除怎么找回来)

    微信聊天儿记录能恢复吗(微信聊天儿记录删除怎么找回来)

  • 玩上古世纪卡,该怎么解决卡的问题?(端游上古世纪)

    玩上古世纪卡,该怎么解决卡的问题?(端游上古世纪)

  • 小程序开发必备功能的吐血整理【个人中心界面样式大全】(小程序开发必备的东西有哪些)

    小程序开发必备功能的吐血整理【个人中心界面样式大全】(小程序开发必备的东西有哪些)

  • CCF-CSP真题《202212-2 训练计划》思路+python,c++满分题解(2020ccf csp报名和考试时间)

    CCF-CSP真题《202212-2 训练计划》思路+python,c++满分题解(2020ccf csp报名和考试时间)

  • 应交税费负数调整到其他流动资产
  • 怎么修改金税盘登录密码
  • 企业纳税申报表包括哪些表
  • 已认证红字信息表
  • 可辨认净资产和所有者权益的区别
  • 建筑业预缴税款都要填哪些表
  • 岗位津贴和岗位补贴
  • 非营利组织项目
  • 制造费用明细账实例图
  • 制造费用属于资产类账户吗
  • 品牌使用费的账务处理
  • 招行理财产品哪些可靠
  • 一般纳税人收小规模普票可以算成本吗
  • 失控发票已取得怎么处理
  • 有限责任公司(自然人投资或控股)属于什么经济类型
  • 不需要抵扣的怎么直接进费用
  • 银行汇款风险提示
  • 没有签订劳动合同员工离职怎么处理
  • 公益性捐赠公告
  • 应交税费借方余额怎么处理
  • 残保金和工会经费需要计提吗
  • 房地产企业预缴增值税及附加税
  • 资产负债表损益表现金流量表
  • 将商业承兑汇票进行贴现 符有追索权的会计分录
  • 预提保障金和交税的区别
  • 退还工会经费会退回吗
  • 收到招标公司开的发票
  • 刚注册的有限公司可以马上注销吗
  • 罂粟是不是草果
  • wind10记事本在哪
  • 出售报废的边角料收入会计分录
  • php $_files
  • 政府机关出租房屋要交税吗
  • 没报关的货物还需要开发票嘛
  • 国有划拨土地给集体企业怎么办
  • 轨迹评价
  • 用代码说话
  • docker部署架构图
  • 年报企业所得税的分录怎么做
  • 基于个人同意处理个人信息的个人什么撤回其同意
  • 预收安装费的会计分录
  • 分公司二季度安全生产分析会内容
  • 诉讼代理费计入事业单位什么科目
  • 织梦百科
  • 新公司财务需要哪些东西
  • 主营业务收入在哪个报表里面
  • 股东借款怎么转为利润分配
  • 年金现值和终值的计算
  • 抵扣旅客运输服务申报时填哪行
  • 个人所得税汇算清缴
  • 增值税加计抵减怎么算
  • 企业所得税不能税前扣除项目
  • 税前扣除凭证按照用途分为哪些
  • 有限合伙企业如何报税
  • 给员工发工资时要交税吗
  • 部门召开会议
  • 受疫情影响较大的上市公司
  • 展厅租赁税率
  • 行政单位的财务报表包括哪些
  • 企业进出口总额
  • 增值税对企业
  • 商品进销差价的作用
  • 会计凭证装订后应当加贴封条
  • 用指定用户名访问网络
  • 如何禁止mac adobe acrobat联网
  • apache是什么文件
  • windows media player在播放文件时遇到问题怎么解决
  • winxp如何进入bios
  • win 10文件
  • window8输入法怎么设置
  • linux curl命令使用
  • 写出javascript的数据类型
  • 抽象类和接口的区别简答题
  • jquery制作简单的网页
  • node.js import
  • jquery创建表单
  • javascript入门教学
  • 一般纳税人开劳务费税率是多少2023
  • 河北省国税局发展前景
  • 婚姻登记处婚俗改革宣传
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设