网站开发前端课程文旅策划公司

bicheng/2026/1/16 18:45:10/文章来源:
网站开发前端课程,文旅策划公司,郑州网站专业建设qq,手机医疗网站文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 #x1f525; 优质竞赛项目系列#xff0c;今天要分享的是 #x1f6a9; 深度学习中文汉字识别 该项目较为新颖#xff0c;适合作为竞赛课题方向#xff0c;学长非常推荐#xf… 文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 优质竞赛项目系列今天要分享的是 深度学习中文汉字识别 该项目较为新颖适合作为竞赛课题方向学长非常推荐 学长这里给一个题目综合评分(每项满分5分) 难度系数3分工作量3分创新点4分 更多资料, 项目分享 https://gitee.com/dancheng-senior/postgraduate 1 数据集合 学长手有3755个汉字一级字库的印刷体图像数据集我们可以利用它们进行接下来的3755个汉字的识别系统的搭建。 用深度学习做文字识别用的网络当然是CNN那具体使用哪个经典网络VGG?RESNET还是其他我想了下越深的网络训练得到的模型应该会更好但是想到训练的难度以及以后线上部署时预测的速度我觉得首先建立一个比较浅的网络基于LeNet的改进做基本的文字识别然后再根据项目需求再尝试其他的网络结构。这次任务所使用的深度学习框架是强大的Tensorflow。 2 网络构建 第一步当然是搭建网络和计算图 其实文字识别就是一个多分类任务比如这个3755文字识别就是3755个类别的分类任务。我们定义的网络非常简单基本就是LeNet的改进版值得注意的是我们加入了batch normalization。另外我们的损失函数选择sparse_softmax_cross_entropy_with_logits优化器选择了Adam学习率设为0.1 ​ #network: conv2d-max_pool2d-conv2d-max_pool2d-conv2d-max_pool2d-conv2d-conv2d-max_pool2d-fully_connected-fully_connecteddef build_graph(top_k):keep_prob tf.placeholder(dtypetf.float32, shape[], namekeep_prob)images tf.placeholder(dtypetf.float32, shape[None, 64, 64, 1], nameimage_batch)labels tf.placeholder(dtypetf.int64, shape[None], namelabel_batch)is_training tf.placeholder(dtypetf.bool, shape[], nametrain_flag)with tf.device(/gpu:5):#给slim.conv2d和slim.fully_connected准备了默认参数batch_normwith slim.arg_scope([slim.conv2d, slim.fully_connected],normalizer_fnslim.batch_norm,normalizer_params{is_training: is_training}):conv3_1 slim.conv2d(images, 64, [3, 3], 1, paddingSAME, scopeconv3_1)max_pool_1 slim.max_pool2d(conv3_1, [2, 2], [2, 2], paddingSAME, scopepool1)conv3_2 slim.conv2d(max_pool_1, 128, [3, 3], paddingSAME, scopeconv3_2)max_pool_2 slim.max_pool2d(conv3_2, [2, 2], [2, 2], paddingSAME, scopepool2)conv3_3 slim.conv2d(max_pool_2, 256, [3, 3], paddingSAME, scopeconv3_3)max_pool_3 slim.max_pool2d(conv3_3, [2, 2], [2, 2], paddingSAME, scopepool3)conv3_4 slim.conv2d(max_pool_3, 512, [3, 3], paddingSAME, scopeconv3_4)conv3_5 slim.conv2d(conv3_4, 512, [3, 3], paddingSAME, scopeconv3_5)max_pool_4 slim.max_pool2d(conv3_5, [2, 2], [2, 2], paddingSAME, scopepool4)flatten slim.flatten(max_pool_4)fc1 slim.fully_connected(slim.dropout(flatten, keep_prob), 1024,activation_fntf.nn.relu, scopefc1)logits slim.fully_connected(slim.dropout(fc1, keep_prob), FLAGS.charset_size, activation_fnNone,scopefc2)# 因为我们没有做热编码所以使用sparse_softmax_cross_entropy_with_logitsloss tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logitslogits, labelslabels))accuracy tf.reduce_mean(tf.cast(tf.equal(tf.argmax(logits, 1), labels), tf.float32))update_ops tf.get_collection(tf.GraphKeys.UPDATE_OPS)if update_ops:updates tf.group(*update_ops)loss control_flow_ops.with_dependencies([updates], loss)global_step tf.get_variable(step, [], initializertf.constant_initializer(0.0), trainableFalse)optimizer tf.train.AdamOptimizer(learning_rate0.1)train_op slim.learning.create_train_op(loss, optimizer, global_stepglobal_step)probabilities tf.nn.softmax(logits)# 绘制loss accuracy曲线tf.summary.scalar(loss, loss)tf.summary.scalar(accuracy, accuracy)merged_summary_op tf.summary.merge_all()# 返回top k 个预测结果及其概率返回top K accuracypredicted_val_top_k, predicted_index_top_k tf.nn.top_k(probabilities, ktop_k)accuracy_in_top_k tf.reduce_mean(tf.cast(tf.nn.in_top_k(probabilities, labels, top_k), tf.float32))return {images: images,labels: labels,keep_prob: keep_prob,top_k: top_k,global_step: global_step,train_op: train_op,loss: loss,is_training: is_training,accuracy: accuracy,accuracy_top_k: accuracy_in_top_k,merged_summary_op: merged_summary_op,predicted_distribution: probabilities,predicted_index_top_k: predicted_index_top_k,predicted_val_top_k: predicted_val_top_k} 3 模型训练 训练之前我们应设计好数据怎么样才能高效地喂给网络训练。 首先我们先创建数据流图这个数据流图由一些流水线的阶段组成阶段间用队列连接在一起。第一阶段将生成文件名我们读取这些文件名并且把他们排到文件名队列中。第二阶段从文件中读取数据使用Reader产生样本而且把样本放在一个样本队列中。根据你的设置实际上也可以拷贝第二阶段的样本使得他们相互独立这样就可以从多个文件中并行读取。在第二阶段的最后是一个排队操作就是入队到队列中去在下一阶段出队。因为我们是要开始运行这些入队操作的线程所以我们的训练循环会使得样本队列中的样本不断地出队。 入队操作都在主线程中进行,Session中可以多个线程一起运行。 在数据输入的应用场景中入队操作是从硬盘中读取输入放到内存当中速度较慢。 使用QueueRunner可以创建一系列新的线程进行入队操作让主线程继续使用数据。如果在训练神经网络的场景中就是训练网络和读取数据是异步的主线程在训练网络另一个线程在将数据从硬盘读入内存。 ​ # batch的生成 def input_pipeline(self, batch_size, num_epochsNone, augFalse):# numpy array 转 tensorimages_tensor tf.convert_to_tensor(self.image_names, dtypetf.string)labels_tensor tf.convert_to_tensor(self.labels, dtypetf.int64)# 将image_list ,label_list做一个slice处理input_queue tf.train.slice_input_producer([images_tensor, labels_tensor], num_epochsnum_epochs)labels input_queue[1]images_content tf.read_file(input_queue[0])images tf.image.convert_image_dtype(tf.image.decode_png(images_content, channels1), tf.float32)if aug:images self.data_augmentation(images)new_size tf.constant([FLAGS.image_size, FLAGS.image_size], dtypetf.int32)images tf.image.resize_images(images, new_size)image_batch, label_batch tf.train.shuffle_batch([images, labels], batch_sizebatch_size, capacity50000,min_after_dequeue10000)# print image_batch, image_batch.get_shape()return image_batch, label_batch训练时数据读取的模式如上面所述那训练代码则根据该架构设计如下 ​ def train():print(Begin training)# 填好数据读取的路径train_feeder DataIterator(data_dir./dataset/train/)test_feeder DataIterator(data_dir./dataset/test/)model_name chinese-rec-modelwith tf.Session(configtf.ConfigProto(gpu_optionsgpu_options, allow_soft_placementTrue)) as sess:# batch data 获取train_images, train_labels train_feeder.input_pipeline(batch_sizeFLAGS.batch_size, augTrue)test_images, test_labels test_feeder.input_pipeline(batch_sizeFLAGS.batch_size)graph build_graph(top_k1) # 训练时top k 1saver tf.train.Saver()sess.run(tf.global_variables_initializer())# 设置多线程协调器coord tf.train.Coordinator()threads tf.train.start_queue_runners(sesssess, coordcoord)train_writer tf.summary.FileWriter(FLAGS.log_dir /train, sess.graph)test_writer tf.summary.FileWriter(FLAGS.log_dir /val)start_step 0# 可以从某个step下的模型继续训练if FLAGS.restore:ckpt tf.train.latest_checkpoint(FLAGS.checkpoint_dir)if ckpt:saver.restore(sess, ckpt)print(restore from the checkpoint {0}.format(ckpt))start_step int(ckpt.split(-)[-1])logger.info(:::Training Start:::)try:i 0while not coord.should_stop():i 1start_time time.time()train_images_batch, train_labels_batch sess.run([train_images, train_labels])feed_dict {graph[images]: train_images_batch,graph[labels]: train_labels_batch,graph[keep_prob]: 0.8,graph[is_training]: True}_, loss_val, train_summary, step sess.run([graph[train_op], graph[loss], graph[merged_summary_op], graph[global_step]],feed_dictfeed_dict)train_writer.add_summary(train_summary, step)end_time time.time()logger.info(the step {0} takes {1} loss {2}.format(step, end_time - start_time, loss_val))if step FLAGS.max_steps:breakif step % FLAGS.eval_steps 1:test_images_batch, test_labels_batch sess.run([test_images, test_labels])feed_dict {graph[images]: test_images_batch,graph[labels]: test_labels_batch,graph[keep_prob]: 1.0,graph[is_training]: False}accuracy_test, test_summary sess.run([graph[accuracy], graph[merged_summary_op]],feed_dictfeed_dict)if step 300:test_writer.add_summary(test_summary, step)logger.info(Eval a batch)logger.info(the step {0} test accuracy: {1}.format(step, accuracy_test))logger.info(Eval a batch)if step % FLAGS.save_steps 1:logger.info(Save the ckpt of {0}.format(step))saver.save(sess, os.path.join(FLAGS.checkpoint_dir, model_name),global_stepgraph[global_step])except tf.errors.OutOfRangeError:logger.info(Train Finished)saver.save(sess, os.path.join(FLAGS.checkpoint_dir, model_name), global_stepgraph[global_step])finally:# 达到最大训练迭代数的时候清理关闭线程coord.request_stop()coord.join(threads)执行以下指令进行模型训练。因为我使用的是TITAN X所以感觉训练时间不长大概1个小时可以训练完毕。训练过程的loss和accuracy变换曲线如下图所示 然后执行指令设置最大迭代步数为16002每100步进行一次验证每500步存储一次模型。 ​ python Chinese_OCR.py --modetrain --max_steps16002 --eval_steps100 --save_steps5004 模型性能评估 我们的需要对模模型进行评估我们需要计算模型的top 1 和top 5的准确率。 执行指令 python Chinese_OCR.py --modevalidation​ def validation():print(Begin validation)test_feeder DataIterator(data_dir./dataset/test/)final_predict_val []final_predict_index []groundtruth []with tf.Session(configtf.ConfigProto(gpu_optionsgpu_options,allow_soft_placementTrue)) as sess:test_images, test_labels test_feeder.input_pipeline(batch_sizeFLAGS.batch_size, num_epochs1)graph build_graph(top_k5)saver tf.train.Saver()sess.run(tf.global_variables_initializer())sess.run(tf.local_variables_initializer()) # initialize test_feeders inside statecoord tf.train.Coordinator()threads tf.train.start_queue_runners(sesssess, coordcoord)ckpt tf.train.latest_checkpoint(FLAGS.checkpoint_dir)if ckpt:saver.restore(sess, ckpt)print(restore from the checkpoint {0}.format(ckpt))logger.info(:::Start validation:::)try:i 0acc_top_1, acc_top_k 0.0, 0.0while not coord.should_stop():i 1start_time time.time()test_images_batch, test_labels_batch sess.run([test_images, test_labels])feed_dict {graph[images]: test_images_batch,graph[labels]: test_labels_batch,graph[keep_prob]: 1.0,graph[is_training]: False}batch_labels, probs, indices, acc_1, acc_k sess.run([graph[labels],graph[predicted_val_top_k],graph[predicted_index_top_k],graph[accuracy],graph[accuracy_top_k]], feed_dictfeed_dict)final_predict_val probs.tolist()final_predict_index indices.tolist()groundtruth batch_labels.tolist()acc_top_1 acc_1acc_top_k acc_kend_time time.time()logger.info(the batch {0} takes {1} seconds, accuracy {2}(top_1) {3}(top_k).format(i, end_time - start_time, acc_1, acc_k))except tf.errors.OutOfRangeError:logger.info(Validation Finished)acc_top_1 acc_top_1 * FLAGS.batch_size / test_feeder.sizeacc_top_k acc_top_k * FLAGS.batch_size / test_feeder.sizelogger.info(top 1 accuracy {0} top k accuracy {1}.format(acc_top_1, acc_top_k))finally:coord.request_stop()coord.join(threads)return {prob: final_predict_val, indices: final_predict_index, groundtruth: groundtruth}5 文字预测 刚刚做的那一步只是使用了我们生成的数据集作为测试集来检验模型性能这种检验是不大准确的因为我们日常需要识别的文字样本不会像是自己合成的文字那样的稳定和规则。那我们尝试使用该模型对一些实际场景的文字进行识别真正考察模型的泛化能力。 首先先编写好预测的代码 ​ def inference(name_list):print(inference)image_set[]# 对每张图进行尺寸标准化和归一化for image in name_list:temp_image Image.open(image).convert(L)temp_image temp_image.resize((FLAGS.image_size, FLAGS.image_size), Image.ANTIALIAS)temp_image np.asarray(temp_image) / 255.0temp_image temp_image.reshape([-1, 64, 64, 1])image_set.append(temp_image)# allow_soft_placement 如果你指定的设备不存在允许TF自动分配设备with tf.Session(configtf.ConfigProto(gpu_optionsgpu_options,allow_soft_placementTrue)) as sess:logger.info(start inference)# images tf.placeholder(dtypetf.float32, shape[None, 64, 64, 1])# Pass a shadow label 0. This label will not affect the computation graph.graph build_graph(top_k3)saver tf.train.Saver()# 自动获取最后一次保存的模型ckpt tf.train.latest_checkpoint(FLAGS.checkpoint_dir)if ckpt: saver.restore(sess, ckpt)val_list[]idx_list[]# 预测每一张图for item in image_set:temp_image itempredict_val, predict_index sess.run([graph[predicted_val_top_k], graph[predicted_index_top_k]],feed_dict{graph[images]: temp_image,graph[keep_prob]: 1.0,graph[is_training]: False})val_list.append(predict_val)idx_list.append(predict_index)#return predict_val, predict_indexreturn val_list,idx_list这里需要说明一下我会把我要识别的文字图像存入一个叫做tmp的文件夹内里面的图像按照顺序依次编号我们识别时就从该目录下读取所有图片仅内存进行逐一识别。 ​ # 获待预测图像文件夹内的图像名字 def get_file_list(path):list_name[]files os.listdir(path)files.sort()for file in files:file_path os.path.join(path, file)list_name.append(file_path)return list_name那我们使用训练好的模型进行汉字预测观察效果。首先我从一篇论文pdf上用截图工具截取了一段文字然后使用文字切割算法把文字段落切割为单字如下图因为有少量文字切割失败所以丢弃了一些单字。 从一篇文章中用截图工具截取文字段落。 切割出来的单字黑底白字。 最后将所有的识别文字按顺序组合成段落可以看出汉字识别完全正确说明我们的基于深度学习的OCR系统还是相当给力 至此支持3755个汉字识别的OCR系统已经搭建完毕经过测试效果还是很不错。这是一个没有经过太多优化的模型在模型评估上top 1的正确率达到了99.9%这是一个相当优秀的效果了所以说在一些比较理想的环境下的文字识别的效果还是比较给力但是对于复杂场景的或是一些干扰比较大的文字图像识别起来的效果可能不会太理想这就需要针对特定场景做进一步优化。 6 最后 更多资料, 项目分享 https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

女生做网站编辑怎么样网站建设济南

1、前言 前面完成了winform版,wpf版,为什么要搞个cmd版,因为前面介绍了mqtt的报文结构,重点分析了【连接报文】,【订阅报文】,【发布报文】,这节就要就看看实际报文是怎么组装的,这…

网站程序网站分为几部分

1、Spring框架的单例bean是线程安全的吗? 2、什么是AOP? 3、Spring的事务是如何实现的? 4、Spring事务失效的场景 5、SpringBean的声明周期 6、Spring的循环依赖 7、SpringMVC的执行流程 8、SpringBoot自动配置原理 9、Spring常见注解

网站开发质量控制计划建设互联网站机房需要哪些设备

编译器:Qt 5.12.2Visual Studio 2015 视觉库:OpenCV 4.5.5 能够加载MP4格式视频、读取、定位二维码并输出与反馈信息的软件 需要演示Demo可私信

魏县企业做网站推广网络营销总监岗位职责

进程基本概念: 1.进程: 程序:存放在外存中的一段数据组成的文件 进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息(根据CPU占用率排序&a…

网站建设网页企业网站开发开题报告

第一次使用ant design的List列表组件,设置gutter间隔属性后,页面出现了横向滚动条,查阅文档发现是由于加间隔后导致容器宽度被撑开,ant design官方默认给外层容器加了margin-left和margin-right 解决方法是在外层容器预留一定的pa…

网站导航结构营销型外贸网站制作

SouthLeetCode-打卡24年02月第1周 // Date : 2024/02/01 ~ 2024/02/04 034.合并两个有序链表 (1) 题目描述 034#LeetCode.21.#北岸计划2024/02/01 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 (2) 题解代码 cla…

品牌策划网站推荐那些空号检测网站是怎么做的

背景 OBD 是OceanBase的命令行部署工具,在 obd V2.5.0 版本之前,其主要功能主要是部署各类组件,例如 oceanbase-ce,obproxy-ce,obagent 等。然而,它并不支持组件的变更操作以及组件内部的扩缩容调整。具体来说: 1、若…

网站设计与应用方向论文网站的资讯内容

【 黄金消息面分析】:周一(4月15日)亚市盘初,金价开盘跳涨13美元,报2357.71美元/盎司,随后延续涨势,最高触及2372.45美元/盎司,目前金价回落至2354.19美元/盎司,如果中东局势未进一步恶化&#…

做淘宝客网站能有效果吗wordpress没有水印

题目 思路&#xff1a; 对于字符串a&#xff0c;b, (a.size() < b.size()), 考虑对字符串b满足什么条件&#xff1a; 由1、3可知a是b的前后缀&#xff0c;由2知b有一个周期是3&#xff0c;即a.size()&#xff0c;所以b是用多个a拼接而成的&#xff0c;有因为a是b的前后缀&…

在洪雅网站做企业招聘浙江网站建设有哪些

1、前言 轮廓,是指图像中或者物体的外边缘线条。在简单的几何图形中,图形的轮廓是由平滑的线条构成,容易被识别。但不规则的图形或者生活中常见的物体轮廓复杂,识别起来比较困难 2、findContours函数 这里先介绍函数的参数,具体的含义会在下面实验中阐述 opencv 提供的轮…

网站正在建设中怎么办如何免费查询企业信息

本来今天想写个NTP的文章&#xff0c;但是因为小米昨天的这个操作一直想夸一下&#xff0c;所以写写雷布斯&#xff0c;吹吹雷布斯。我是米粉&#xff0c;肯定是米粉&#xff0c;前段时间还有读者来问我&#xff0c;现在能不能入手小米的股票&#xff0c;这个我不敢给建议&…

上海免费网站建设服务外贸网站首页

&#xff08;1&#xff09;G1_FullGC的概念辨析 SerialGC&#xff1a;串行的&#xff0c;ParallelGC&#xff1a;并行的 &#xff0c;CMS和G1都是并发的 这几种垃圾回收器的新生代回收机制时相同的&#xff0c;SerialGC和ParalledGC&#xff1a;老年代内存不足触发的叫FullGC…

江西建设监督网站引流推广的方法

背景 最近项目要有向外部提供服务的能力&#xff0c;但是考虑到数据安全问题&#xff0c;要对接口进行加解密&#xff1b;实现加解密的方案有很多&#xff0c;比如过滤器、拦截器、继承RequestResponseBodyMethodProcessor什么的&#xff0c;不过我最近正在了解ResponseBodyAd…

佛山市建设工程交易中心网站学视频剪辑报个班的多少钱

目录 相似度计算基于用户的协同过滤&#xff08;UserCF&#xff09;算法评估基于物品的协同过滤&#xff08;ItemCF&#xff09;协同过滤算法的权重改进协同过滤算法的问题分析思考学习参考 相似度计算 杰卡德&#xff08;Jaccard&#xff09;相似系数 Jaccard 系数是衡量两个…

网站哪里可以做做网站还赚钱么

在学习玩string后我们开始学习vector&#xff0c;本篇博客将对vector进行简单的介绍&#xff0c;还会对vector一些常用的函数进行讲解 vector的介绍 实际上vector就是一个数组的数据结构&#xff0c;但是vector是由C编写而成的&#xff0c;他和数组也有本质上的区别&#xff…

陕西住房与建设厅网站西部数码

1、600余家互联网企业发出倡议&#xff1a;积极维护防汛救灾网络秩序、截至目前&#xff0c;包括百度、微博、抖音、快手、小红书、哔哩哔哩、阿里、腾讯等8家超大型互联网平台在内的600余家企业发出倡议书&#xff0c;唱响了万众一心、聚力救灾救援的网上主旋律 2、苏州调整耗…

求一个做健身餐的网站气象服务网站建设

题目链接 2719. 统计整数数目 - 力扣&#xff08;LeetCode&#xff09; 解题思路 题目实际上求的是[num1,...num2]中&#xff0c;数位和在[min_sum,...max_sum]的数的个数。对于这种区间[l,...r]的问题&#xff0c;我们可以考虑转化为求[1,...r]和[1,...l-1]的答案&#xff…

网站建设备案多长时间重庆市公司网站备案在哪了

文件上传一个经常用到的功能&#xff0c;它有许多中实现的方案。 页面表单 RFC1897规范 http协议上传 页面控件(flash/html5/activeX/applet) RFC1897规范 http协议上传 页面控件(flash/html5/activeX/applet) 自定义数据规范 http协议上传 页面控件(flash/html5/act…

做毕业设计的参考文献网站wordpress标签加icon

1024“程序员节”&#xff0c;58同城招聘研究院发布程序员行业大数据报告显示&#xff0c;程序员男性占比高达87.29%。 作者&#xff1a;朝晖 1024“程序员节”&#xff0c;58同城招聘研究院发布程序员行业大数据报告显示&#xff0c;程序员男性占比高达87.29%&#xff0c;北…

网站设计制作托管维护翻页h5制作软件

java实现pdf转word的办法有&#xff1a; 1、pdfbox poi 2、free spire.pdf 3、aspose-pdf free spire.pdf 的效果比aspose-pdf稍差一些&#xff0c;但是 aspose-pdf 是付费的&#xff0c;spire.pdf也有付费版本