TensorFlow学习之路(五)

在前面四个章节中,我们已经成功构建好了图像以及预测了结果
小小有些激动的我还是有些不爽,毕竟还是使用着数据集来进行的结果预测,谁知道是不是串通着来骗我的,emmm,那么,今天我们自己手写一个数字进行检测看看能不能通过我们训练的模型检测出来
首先我们先用一张A4纸写一个数字,写正常点别龙飞凤舞就行,我写了个数字3
在这里插入图片描述

图片打开与处理

import cv2
import matplotlib.pyplot as plt

#读取图片
img=cv2.imread('num.png')
#转换灰度图
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

显示看一下
在这里插入图片描述
emmmm[心情复杂],一言难尽,画面好嘈杂啊,来我们滤个波
加个高斯自适应滤波

#高斯自适应滤波
img = cv2.medianBlur(img,5)
gauss = cv2.GaussianBlur(img, (3, 3), 1)
value = cv2.getTrackbarPos("value", "Threshold")
if (value < 3):
    value = 3
if (value % 2 == 0):
    value = value + 1
img = cv2.adaptiveThreshold(gauss, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, value, 1)
img = cv2.medianBlur(img,5)

在这里插入图片描述
完美,注意我这里使用了两次中值滤波,因为我发现第一次中值滤波后使用高斯还是有很多噪点,干脆在多一次滤波,然后就可以得到很完美的图像
当我沉浸在滤波的小窃喜里面的时候,突然想起,我的模型是白底黑字啊,这个肯定识别不了
emmm,那就。。那就。。把图片反过来吧

#图片取反
img=cv2.bitwise_not(img)

在这里插入图片描述
好了,不愧是我

图片的尺寸格式处理

在前面的章节有提到,神经网络的输入格式是3x32x32的Float32的格式,我们必须严格按照他的格式来,我们缩放处理一下图像格式

#缩放图像
img=cv2.resize(img,32,32)
#转换类型
img=img.astype('float32')
#正则化
img/=255

同时为了满足维度要求,我们还要增加维度

#增加维度为输入的规定格式
img=img.reshape(1,32,32,1)

加载模型并预测

以上图像已经完全符合模型的输入要求了
在此之前我们已经训练好了模型存在本地了,现在只需要把模型加载出来就好了

#加载模型
model=tf.keras.models.load_model('model.h5')

加载好模型之后直接进行预测就可以看到结果了

#预测结果
pred=model.predict(img)
#输出预测的最大概率值
print(pred.argmax())

好的,我亲爱的朋友们,它给我输出了个2
它哪像2了??
它明摆了欺负我,嘲讽我呢,你才2
整理好心情,我们在滤波的那里调整一下




调整完后预测一下
在这里插入图片描述
3:你才是7你全家才是7
7:对啊,我全家都是7
【好冷】
仔细认真观察完图片后我发现
emmm难不成我写的3不标准?
直到我重新写了个3
在这里插入图片描述
在这里插入图片描述
【欢呼声】
好感动,识别成功了,此时我摸着高斯滤波的头:这事真不怪你,这个3缺了个心眼都能识别出来,真不是你的问题
后来我又重新写了好几个3放过来检测
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
100%正确率
计算机玄学。。
下次我们用图像分割识别手写手机号
拜拜
ps:附上源码文件
https://download.csdn.net/download/AcStudio/12253549

猜你喜欢

转载自blog.csdn.net/AcStudio/article/details/104924328