【图像识别小项目】Pytorch+Flask识别手写数字

前言

本项目基于pytorch进行深度学习神经网络搭建、flask框架作为web应用开发,搭建了一个简单的手写数字识别项目,用户可通过在网页上通过拖动鼠标手写数字,通过点击预测进行模型推理,最后显示结果。本文项目链接为:https://github.com/Windxy/torch_mnist_flask在这里插入图片描述


一、环境配置

  • Flask == 1.1.2
  • torch == 1.2.0
  • torchvision == 0.4.0
  • tqdm == 4.42.1

二、使用步骤

1.项目克隆

打开cmd,cd到你需要的目录下,然后输入
git clone https://github.com/Windxy/torch_mnist_flask
在这里插入图片描述
或直接打开网页进行下载
在这里插入图片描述

2.下载数据集

相关MNIST数据集在百度网盘链接,提取码:vnyc,然后将其解压在DataSet目录下
在这里插入图片描述


3.模型训练

运行train.py训练MNIST数据,使用的SGD,学习率0.0001,100次迭代,loss为交叉熵损失函数,根据自己的要求,可以改变网络结构、优化器、自适应学习率、预处理方式等等。

from model.model import Model
import numpy as np
import torch
from torchvision.datasets import mnist
from torch.nn import CrossEntropyLoss
from torch.optim import SGD
from torch.utils.data import DataLoader
from torchvision.transforms import ToTensor

if __name__ == '__main__':
    batch_size = 256
    train_dataset = mnist.MNIST(root='./DataSet', train=True, transform=ToTensor())
    test_dataset = mnist.MNIST(root='./DataSet', train=False, transform=ToTensor())
    train_loader = DataLoader(train_dataset, batch_size=batch_size)
    test_loader = DataLoader(test_dataset, batch_size=batch_size)

    model = Model()
    model.load_state_dict(torch.load('model/mnist.pth'))

    optimizer = SGD(model.parameters(), lr=1e-4)
    cross_error = CrossEntropyLoss()
    epoch = 100

    for _epoch in range(epoch):
        for idx, (train_x, train_label) in enumerate(train_loader):
            label_np = np.zeros((train_label.shape[0], 10))
            optimizer.zero_grad()
            out_of_predict = model(train_x.float())
            loss = cross_error(out_of_predict, train_label.long())
            if idx % 10 == 0:
                print('idx: {}, _error: {}'.format(idx, loss))
            loss.backward()
            optimizer.step()

        correct = 0
        _sum = 0

        for idx, (test_x, test_label) in enumerate(test_loader):
            predict_y = model(test_x.float()).detach()
            predict_ys = np.argmax(predict_y, axis=-1)
            label_np = test_label.numpy()
            _ = predict_ys == test_label
            correct += np.sum(_.numpy(), axis=-1)
            _sum += _.shape[0]

        print('accuracy: {:.2f}'.format(correct / _sum))
        torch.save(model.state_dict(), 'model/mnist.pth')


4.模型测试

from model.model import Model
import numpy as np
import torch
from torchvision.datasets import mnist
from tqdm import tqdm,trange
from torch.utils.data import DataLoader
from torchvision.transforms import ToTensor
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve,roc_curve,f1_score,precision_recall_fscore_support

def normalization(data):
    _range = np.max(data) - np.min(data)
    return (data - np.min(data)) / _range

if __name__ == '__main__':
    batch_size = 1  # 一个一个测
    test_dataset = mnist.MNIST(root='./DataSet', train=False, transform=ToTensor())
    test_loader = DataLoader(test_dataset, batch_size=batch_size)

    model = Model()
    model.load_state_dict(torch.load('model/mnist.pth'))
    threshold = 0.00001

    # 初始化
    # 1w个数据,980个0
    accurance = 0   #准确率
    correct = 0     #正确的数量
    nums = 0        #0的个数
    y_scores = []
    y_true = []
    y_pred = []
    for (test_x, test_label) in tqdm(test_loader):
        '''在这里,取用0作为我们的正例,1—9作为我们的反例'''
        predict_y = model(test_x.float()).detach()
        predict_ys = predict_y.numpy().squeeze()
        predict_ys = normalization(predict_ys)[0]  # 是0的概率
        y_scores.append(predict_ys)
        if test_label.numpy()==0:
            nums+=1
            correct += 1 if np.argmax(predict_y, axis=-1).item() == 0 else 0

        y_true.append(1 if test_label.numpy()[0]==0 else 0)    #还是用0来进行PR评估,1 表示为 0,0 表示为非 0
        y_pred.append(1 if np.argmax(predict_y, axis=-1).item()==0 else 0)

    accurance = correct*1.0/nums     #980个0
    print("Accuracy:",accurance)

    precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
    fpr, tpr, tresholds = roc_curve(y_true, y_scores)
    F1= f1_score(y_true, y_pred)
    print("F1-Score:",F1)

    plt.figure(figsize=(50,100))
    plt.subplot(1,2,1)
    plt.plot(precision, recall)
    plt.xlabel(r'Recall')  # 坐标
    plt.ylabel(r'Precision')
    plt.title("figure of PR-Curve")
    plt.subplot(1,2,2)
    plt.plot(fpr, tpr)
    plt.title("figure of ROC")
    plt.xlabel(r'False Positive Rate')  # 坐标
    plt.ylabel(r'True Positive Rate')
    plt.show()

Accuracy: 0.9959183673469387
F1-Score: 0.9928789420142421在这里插入图片描述


5.flask部署

运行app.py即可,打开出现的链接,flask网页设置参考的是:
https://blog.csdn.net/qq_38534107/article/details/103565899
在这里插入图片描述

总结

1.根据自己的需求,可以在model.py、train.py更改自己想要的网络、数据、训练参数等
2.根据自己的需求,可以在html和js部分更改需要的网页布局和操作
3.本文演示了如何基于pytorch和flask进行模型的训练、评估和网页端手写数字的识别

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 表情识别代码是在PyTorch框架下实现的一种图像处理技术。通过使用UI(用户界面),我们可以使这个代码更加友好和易于使用PyTorch是一种流行的深度学习框架,它提供了丰富的工具和函数来构建和训练神经网络模型。在表情识别中,我们可以使用PyTorch来构建一个卷积神经网络(CNN)模型,以识别输入图片中的表情。 UI是指用户界面,它是让用户与计算机程序进行交互的一种方式。通过使用UI,我们可以将表情识别代码制作成一个交互式的应用程序,以便用户可以直观地使用这个功能。 在UI中,我们可以添加一个文件选择按钮,让用户选择要识别的表情图片。然后,我们可以添加一个“识别”按钮,当用户点击它时,代码会调用PyTorch模型来对选择的图片进行表情识别识别结果可以通过界面上的文本框或图像显示出来。 此外,我们还可以添加一些其他的功能,如显示当前选择的图片、预处理图片、调整模型参数等。这些功能可以使用户更方便地使用和了解表情识别代码。 总之,通过将表情识别代码与PyTorch和UI结合起来,我们可以实现一个功能强大、易于使用的表情识别应用程序。用户可以通过界面直观地选择和识别表情,这大大提高了代码的可用性和用户体验。 ### 回答2: 表情识别代码是指使用pytorch框架开发的一种图像处理代码,用于识别人脸表情。这种代码通常使用了深度学习的方法,通过对输入图像进行分类来识别出人脸的表情。 在pytorch框架中,可以使用torchvision库提供的一些预训练的模型来进行表情识别。常见的预训练模型有VGGNet、ResNet等,它们能够提取图像的特征信息。我们可以利用这些预训练模型,将图像输入网络中,经过前向传播得到输出结果。 代码中首先需要导入相关的库和模块,例如torch、torchvision以及相关的数据集等。然后,可以定义一个网络模型,可以选择使用预训练模型或自己设计模型。接着,需要设置模型的超参数,如学习率、优化器等。然后定义训练和测试的过程,包括数据加载、前向传播、计算损失、反向传播以及更新参数等。最后,可以对模型进行训练和测试,分别输出模型在训练集和测试集上的准确率。 在实际运行时,可以使用pytorch的图形用户界面(UI)库,如PyQt或Tkinter等,来设计一个用户友好的界面。通过该界面,用户可以选择图片或视频作为输入,然后点击按钮进行表情识别,最后显示结果在界面上。这样,用户就可以直观地看到图像的表情识别结果。 总之,表情识别代码pytorch ui是指使用pytorch框架开发的一个具有图形界面的表情识别代码,能够通过图像输入进行表情的分类识别,并将结果可视化展示给用户。 ### 回答3: 表情识别是一种利用计算机视觉技术和机器学习算法来识别人脸表情的应用。PyTorch是一个基于Python的机器学习框架,提供了丰富的工具和库来构建和训练深度学习模型。 对于表情识别代码的编写,我们可以使用PyTorch来实现。首先,需要收集带有不同表情的人脸图像数据集。这些图像应包含各种表情,如开心、悲伤、惊讶等。然后,可以使用PyTorch提供的图像处理库来对这些图像进行预处理,例如裁剪、缩放和归一化。 接下来,我们可以使用PyTorch来构建卷积神经网络(CNN)模型。CNN是一种用于图像识别的深度学习模型,在图像分类任务中表现出色。我们可以使用PyTorch提供的函数和类来构建网络结构,例如卷积层、池化层和全连接层。同时,我们还可以使用PyTorch的自动求导功能来计算和优化模型参数。 在模型构建完成后,我们需要将数据集分为训练集和测试集。训练集用于训练模型参数,测试集用于评估模型性能。可以使用PyTorch提供的数据加载器和数据拆分函数来实现这一过程。 然后,我们可以使用PyTorch的优化器和损失函数来进行模型训练和优化。通过迭代训练和调整模型参数,我们可以使模型逐渐提高表情识别的准确度。 最后,我们可以使用PyTorch搭建一个简单的用户界面(UI)来进行表情识别。可以使用PyTorch的图像处理库来处理用户提供的图像输入,并应用训练好的模型来识别表情。通过将识别结果显示在UI上,用户即可得到相应的表情识别结果。 综上所述,通过PyTorch构建表情识别代码和用户界面,我们可以实现对人脸表情进行自动识别和分类的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小风_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值