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

相关文章

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

idea粘贴空格时显示NBSP的问题及解决方案

《idea粘贴空格时显示NBSP的问题及解决方案》在IDEA中粘贴代码时出现大量空格占位符NBSP,可以通过取消勾选AdvancedSettings中的相应选项来解决... 目录1、背景介绍2、解决办法3、处理完成总结1、背景介绍python在idehttp://www.chinasem.cna粘贴代码,出

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr