手写数字彩色图像识别-Keras实现(基于R语言)

本文摘自《Keras深度学习:入门、实战及进阶》一书。
本小节我们将利用MNIST数据集的训练数据训练模型,MNIST数据集的测试数据评估模型,再利用训练好的模型对本地的50个手写数字图像进行预测,查看预测效果。
在num文件夹中已经保存了50张0~9的彩色数字图像
在这里插入图片描述
使用EBImage包的readImage()函数将num文件夹中的所有数字图像读取到R中。

> library(keras)
> library(EBImage)
> # 图像数据读取
> setwd('../num') # 设置num文件夹为默认路径
> temp <- paste(1:50,'png',sep = '.') 
> mypic <- list()
> for (i in 1:length(temp)) {mypic[[i]] <- readImage(temp[[i]])}

利用for循环语句,已经将50张数字图像读入到R中。利用plot()函数查看读取的数字图像。

> # 绘制数字图像
> par(mfrow=c(10,5))
> for(i in 1:50) plot(mypic[[i]])
> par(mfrow=c(1,1))

在这里插入图片描述
在对数据图像处理前,让我们先查看各个图像的维度大小。以下程序将每张图像的实际值和三个维度的实际大小保存到size对象中,并查看前六张图像的数据情况。

> # 查看各图像的维度大小
> size <- data.frame(pic = 1:50,
+                num = rep(0:9,each = 5),
+                dim1 = sapply(mypic,dim)[1,],
+                dim2 = sapply(mypic,dim)[2,],
+                dim3 = sapply(mypic,dim)[3,])
> head(size)
  pic num dim1 dim2 dim3
1   1   0  122  106    3
2   2   0  119  106    3
3   3   0  126  100    3
4   4   0  125  115    3
5   5   0  124  118    3
6   6   1  100  108    3

数据框size中的dim1、dim2、dim3分别对应图像的像素宽度、像素高度和颜色通道。因为dim3列的值均为3,所以这些数字图像均为彩色图像,需利用colorMode()函数将它们转变为灰色图像。因为各图像的dim1和dim2值不相同,故这些图像大小不一致,需利用resize()函数进行处理。

> # 图像处理
> for (i in 1:length(temp)) {colorMode(mypic[[i]]) <- Grayscale} # 转换为灰色图像
> for (i in 1:length(temp)) {mypic[[i]] <- 1-mypic[[i]]}  # 转换为背景色为黑色,数字为白色的图像
> for (i in 1:length(temp)) {mypic[[i]] <- resize(mypic[[i]], 28, 28)} # 将图像转换为28*28大小
> for (i in 1:length(temp)) {mypic[[i]] <- array_reshape(mypic[[i]], c(28,28,3))} # 将image转变为list
> new <- NULL
> for (i in 1:length(temp)) {new <- rbind(new, mypic[[i]])}
> newx <- new[,1:784] # 得到50*784的X二维矩阵
> newy <- size$num    # 得到每个图像的实际数字

最后,再次使用plot()函数查看经过处理后的数字图像。

> # 绘制处理后的数字图像
> par(mfrow=c(5,10))
> for(i in 1:50) plot(as.raster(array_reshape(newx[i,],c(28,28))))
> par(mfrow=c(1,1))

在这里插入图片描述
以下是MNIST数据预处理代码。

> # 加载MNIST数据集
> mnist <- dataset_mnist()
> trainx <- mnist$train$x
> trainy <- mnist$train$y
> testx <- mnist$test$x
> testy <- mnist$test$y
> # 改变数据形状和大小
> trainx <- array_reshape(trainx, c(nrow(trainx), 784))
> testx <- array_reshape(testx, c(nrow(testx), 784))
> trainx <- trainx / 255
> testx <- testx /255
> # 独热编码
> trainy <- to_categorical(trainy, 10)
> testy <- to_categorical(testy, 10)

以下是深度学习建模代码。

> # 构建MLP模型函数
> build_model <- function() {
+   model <- keras_model_sequential() %>%
+     layer_dense(units = 512, activation = 'relu', input_shape = c(784)) %>% 
+     layer_dropout(rate = 0.4) %>% 
+     layer_dense(units= 256, activation = 'relu') %>% 
+     layer_dropout(rate = 0.3) %>% 
+     layer_dense(units = 10, activation = 'softmax')
+   # 编译
+   model %>% compile(
+     loss = 'categorical_crossentropy',
+     optimizer = optimizer_rmsprop(),
+     metrics = 'accuracy')
+   model
+ }

以下是训练模型代码。

> model <- build_model()
> history <- model %>% fit(
+  trainx,
+  trainy,
+  epochs = 30,
+  batch_size = 32,
+  validation_split = 0.2)
> plot(history)

在这里插入图片描述
以下是对彩色数据进行预测。

> # 模型预测
> pred <- model %>% predict_classes(newx)
> t <- table(Actual = newy,Predicted = pred)
> t
Actual 0 1 2 3 4 5 6 7 8 9
     0 4 0 1 0 0 0 0 0 0 0
     1 0 5 0 0 0 0 0 0 0 0
     2 0 0 5 0 0 0 0 0 0 0
     3 0 0 1 4 0 0 0 0 0 0
     4 0 1 1 0 2 0 0 0 0 1
     5 0 0 0 0 0 4 0 0 1 0
     6 0 0 0 0 0 4 1 0 0 0
     7 0 0 1 1 0 0 0 2 1 0
     8 0 0 3 1 0 0 0 0 0 1
     9 0 0 0 1 1 1 2 0 0 0

从混淆矩阵可知,除了1、2这两种数字图像全部预测正确外,其他数字图像均有预测结果与实际值不一致情况。
通过以下程序代码绘制预测与实际不一致的数字图像。

> ind <- which(newy!=pred) # 提取预测与实际不一致的下标集
> par(mfrow=c(4,6))
> for(i in ind){
+   plot(as.raster(array_reshape(newx[i,],c(28,28))))
+   title(paste('Actual=',newy[i],'Predicted=',pred[i]))
+ }
> par(mfrow=c(1,1))

在这里插入图片描述
从可知,数字8、9全部预测错误,数字6有4个预测错误,数据4、7各有3个预测错误,数字0、3、6分别有1个预测错误。
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 手写数字识别深度学习在计算机视觉领域的一项经典任务,可以使用PyQt5和TensorFlow Keras框架来实现。这种任务可以通过卷积神经网络(CNN)来完成。 首先,需要下载一个手写数字图像数据集,例如MNIST数据集。然后,可以使用TensorFlow Keras框架来搭建一个简单的CNN模型,来对图像进行分类。这个CNN模型可以包含一些卷积层、池化层、扁平层和全连接层来实现手写数字图像的分类。 接下来,使用PyQt5编写一个简单的GUI界面,提供用户手动输入数字图像的功能。GUI界面可以提供一个画布来让用户手动在上面绘制数字,然后对这个数字图像进行预测和分类。 具体实现时,可以结合PyQt5的信号和槽机制,将用户手动绘制的数字图像与CNN模型进行关联。当用户完成数字图像的绘制后,程序可以自动进行图像分类,并输出数字识别结果。 总之,PyQt5和TensorFlow Keras框架提供了一个完整的工具链,用于实现手写数字识别的任务。开发者可以使用这些工具和技术来实现更加复杂的图像识别和分析任务。 ### 回答2: 手写数字识别深度学习中的一个常见问题,而PyQt5则是一个流行的Python图形界面开发框架,可以将模型的结果以可视化的方式展示给用户。因此,使用PyQt5和TensorFlow-Keras搭建一个手写数字识别的应用程序是很有实际应用价值的。下面简单介绍一下实现步骤。 首先,我们需要一个手写数字数据集,可以使用MNIST数据集。通过使用TensorFlow-Keras的API,我们可以快速地构建一个CNN模型,并在训练数据上进行训练。 接下来,我们需要使用PyQt5构建GUI界面,这里可以使用QWidget框架。我们需要构建一个画布,允许用户手写数字,然后将用户手写图像输入到CNN模型中进行预测。 在这里,我们可以使用QPainter来绘图,它可以使用户绘制完整的数字。在预测数字时,我们需要对图像进行一些预处理,例如将其大小调整为网络需要的输入尺寸,并将其转换为灰度图像。 在模型训练完毕之后,我们可以将模型保存下来,然后在PyQt5应用程序中加载模型,并使用它进行手写数字识别。当用户在画布上完成手写数字绘制后,我们可以将其送入已经训练好的CNN模型,然后让程序显示识别结果。 通过这样的方式,我们可以使用PyQt5和TensorFlow-Keras开发手写数字识别应用程序,为用户提供更加便捷的数字识别方式。 ### 回答3: 手写数字识别深度学习中的一个经典问题,利用人工神经网络或深度卷积神经网络可以达到很高的准确率。PyQt5是一个Python编写的GUI库,可以将深度学习算法应用到用户友好的界面中,同时TensorFlow-Keras是一个强大的深度学习框架,利用它可以快速搭建一个卷积神经网络。 首先,我们需要准备手写数字数据集,比如MNIST数据集。我们可以使用Keras自带的数据集接口进行加载。然后,通过PyQt5绘制一个界面,使得用户可以在界面上进行手写数字输入。手写数字数据可以通过鼠标或触控板进行输入,我们可以将手写数字截图并进行处理,可以使用 PIL 库或 OpenCV 进行图片处理,将图片大小调整为合适的大小。接着,我们需要将图片输入到卷积神经网络中进行预测。我们可以使用TensorFlow-Keras搭建一个卷积神经网络模型,并把刚刚处理好的图片输入到模型中,进行预测。最后,我们可以在界面上输出预测结果,告诉用户识别数字是什么。 总之,借助PyQt5和TensorFlow-Keras的强大功能,我们可以轻松地设计一个手写数字识别的应用程序。但是需要注意的是,要精度高的数字识别需要使用比较深的卷积神经网络模型,并花费更多的时间来训练和调优模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiabiao1602

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值