Tensorflow手写汉字识别训练精度99%,为什么测试准确率才50%?教你一招轻松解决图像自动裁切处理问题

本文主要是介绍Tensorflow手写汉字识别训练精度99%,为什么测试准确率才50%?教你一招轻松解决图像自动裁切处理问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目场景:

应用在Tensorflow手写汉字识别测试场景


问题描述:

最近有个小伙伴做毕业设计找到了我,他很奇怪为什么在用tensorflow进行手写汉字训练的时候,明明精度都已经达到了99%,但是测试的时候,却总是识别错误。

于是我找他拿到源码,首先肯定是先跑起来再说。小伙伴用Flask给自己搭了个用鼠标手写汉字的微服务器。

具体如下:
中文汉字识别1
可以明显看到,这个书字写的还是算很标准的,但是左边top5里面识别准确率最高的竟然是“为”字。

刚开始小伙伴以为是训练精度不够,还特意训练了一晚上,训练了近13万步,精度都达到了99%,应该没问题,可是测试出来为什么却相差这么大?


原因分析:

遇到这种情况,小伙伴们不要慌,我们第一时间应该从训练集去思考,因为如果训练精度已经很高,但测试精度却很低,很有可能是训练采用的样本和测试使用的数据间相差很大。

于是我就翻出它的训练样本集看看关于汉字“书”这块的训练样本。

训练样本-书
对比下面测试样本图片,我们来看一看。聪明的小伙伴们应该看出差别来了吧?
在这里插入图片描述
貌似就是测试样本周围留白太多了,导致测试样本与训练样本有很大差异,自然在测试样本中准确率就不会太高了,那真的是这样吗?

我们再来测试下,把文字写满整个框,测试下准确率吧。瞬间准确率就提高到99%啦,原因找到,就这样结束了吗?那就太low了,我们程序员不应该就这样就算了,代码是写给人来服务的,不能让人去迁就代码。

在这里插入图片描述接下来我们研究下更加人性化的解决方案吧

解决方案:

问题的根源就是:要把汉字周围留白去掉。

那我们就开始图像处理,直接用图像处理中的强者Opencv吧!

这里大家要注意图像处理基本套路:先灰度化,后生成二值图像,然后找轮廓,求出外接最大矩形,最后裁切

这个套路可以用到很多地方,小伙伴收藏用起来,以后图像处理不迷路!

代码如下:

import cv2
import timedef cv_show(name, img):'''用于显示图片'''cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()def image_prepare(image_path):'''用于图片自动裁切留白'''im = cv2.imread(image_path)  #读取图片im = cv2.resize(im, (64, 64)) #用于统一图片尺寸# cv_show('yi', im)gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) #用于转化灰度ret, thresh = cv2.threshold(gray, 155, 255, cv2.THRESH_BINARY_INV) #生成二值化图像,注意这里要反转下# cv_show('out_1', thresh)_, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #寻找所有图片轮廓# draw_img = im.copy()# res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2) # 画出图片轮廓# cv_show('res', res)min_x = 0min_y = 0max_x = 0max_y = 0for i, cnt in enumerate(contours):if i == 0:x, y, w, h = cv2.boundingRect(cnt)min_x = xmin_y = ymax_x = x + wmax_y = y + helse:x, y, w, h = cv2.boundingRect(cnt)if x < min_x:min_x = xif y < min_y:min_y = yif (x + w) > max_x:max_x = x + wif (x + h) > max_y:max_y = y + harea = (max_x-min_x) * (max_y-min_y)# print(max_x,min_x)# print(max_y,min_y)# print(area)if area > 700: # 这里是针对汉字一做的面积判断,如果面积小于700,则直接保留原图,否则做自动裁切处理if min_x >= 2 & min_y >= 2 & max_y <= 61 & max_x <= 61:im = im[(min_y - 2):(max_y + 2), (min_x - 2):(max_x + 2)]else:im = im[min_y:max_y, min_x:max_x]try:im = cv2.resize(im, (64, 64))except:print('请不要靠近边缘')else:print(area)return im# cv_show('image', im)return imdef crop_new_image(image_path):im = image_prepare(image_path)cv2.imwrite(image_path, im)if __name__ == '__main__':im = image_prepare(image_path=r'image/text_finish.png')cv2.imwrite(r'image/text_finish4.png', im)

把这个图像自动裁切周围留白函数放到主代码中,运行一下,看看效果吧!

测试中还发现关于汉字“一”的bug,如果把汉字一的留白全去掉,则会出现很大不准,所以这里用了面积大小做了个判断,如果小于阈值,则用原图,不进行裁切。

在这里插入图片描述
问题得到最终解决,拿走不谢!

眼瞅着马上也要到一年一度的盛大毕业季了,在这里,也祝所有今年毕业的小伙伴们,都能顺顺利利毕业,最后找到自己心仪的工作。

码字不易,小伙伴们可以支持下我 关注、收藏,点赞,一键三连

另外如果有任何问题,可以随时评论区留言或者私信我。

本文只供大家学习相关知识使用,不以任何商业盈利为目的,转载或分享请注明相关来源。如涉及到相关侵权,请联系我删除。
欢迎志同道合者互相交流学习,可以加我微信号:Zhihua_Steven,或者扫以下二维码添加我的微信。

个人微信号

这篇关于Tensorflow手写汉字识别训练精度99%,为什么测试准确率才50%?教你一招轻松解决图像自动裁切处理问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/294053

相关文章

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,