图像分类模型嵌入flask中开发PythonWeb项目

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 图像分类模型嵌入flask中开发PythonWeb项目

图像分类模型嵌入flask中开发PythonWeb项目


图像分类是一种常见的计算机视觉任务,它的目的是将输入的图像分配到预定义的类别中,如猫、狗、花等。图像分类模型是一种基于深度学习的模型,它可以利用大量的图像数据来学习图像的特征和类别之间的关系,并且能够对新的图像进行分类。在本博客中,我将介绍如何将深度学习模型嵌入到PythonWeb中,实现图像分类模型的web端实现。具体以西红柿病害识别交流平台的开发为例进行描述。


视频演示地址:https://www.bilibili.com/video/BV11X4y1d7Cj/?spm_id_from=333.999.0.0


0d39eeef872c429db504f2a94f2a4716.png



一、系统架构

本系统使用flask+mysql+layui+ajax开发,深度学习环境为pytorch+anaconda,数据库存储使用mysql,开发工具为pycharm,前后端不分离项目,但可以实现前后端的动态交互。


前端:使用layui框架搭建一个简洁美观的界面,使用ajax技术实现与后端的同步通信,实现上传图片、显示结果等功能。

后端:使用flask框架搭建一个轻量级的web服务器,使用flask_mysqldb模块连接mysql数据库,使用pytorch框架加载预训练好的图像分类模型,实现接收图片、处理图片、返回结果等功能。

数据库:使用mysql数据库存储用户信息、图片信息、分类结果等数据,方便后期的数据分析和管理。




二、系统功能


本系统主要实现了以下功能:


(1)账号注册

用户首次进入平台需要进行注册。


(2)账号登录

当用户进入平台后,需进入登录界面,用户登录后,方可正常使用其它功能。


(3)信息修改

用户进入个人中心后,可以修改包括头像,用户名,用户密码等个人信息。


(4)账号退出

用户点击退出按钮之后,退出当前登录状态。


(5)图片上传

用户在点击检测之后,可以上传西红柿叶片的图片。


(6)病害识别

用户成功上传西红柿叶片的图片后,可在进行病害的识别及分析,稍作等待可查看结果。


(7)记录查看

用户可随时在平台看到历史上传的西红柿叶片,以及识别结果。


(8)发布论坛

用户点击论坛进入论坛界面,可点击发布论坛。


(9)评论帖子

用户点击论坛进入帖子的详情页面后,可点击发表帖子评论。



三 软件概述


3.1需求分析

西红柿病害识别交流平台是一个专注于西红柿病害识别和交流的网站,用户可以通过该平台上传西红柿照片,进行病害识别和分类,并且可以在论坛中与其他用户交流和分享经验。下面是该平台的需求分析:


用户端需求:

(1)用户可以注册和登录账号。

(2)用户可以上传西红柿照片进行病害识别和分类。

(3)系统可以对上传的照片进行自动识别和分类。

(4)用户可以在识别结果页面查看病害的名称和描述信息。

(5)用户可以在社区中发布病害相关的问题或心得,也可以对其他用户发布的内容进行回复。


技术需求:

(1)需要使用深度学习框架(如PyTorch)对西红柿照片进行训练和分类。

(2)需要使用Web框架(如Flask)搭建用户端和管理端。

(3)需要使用数据库(如MySQL)存储用户信息、照片和社区内容等数据。

(4)需要使用HTML、CSS和JavaScript等技术实现网站的前端交互和设计。



3.2 系统开发环境

(1)硬件环境主要支撑软件的正常运行。下表为该系统的硬件开发环境。


硬件配置
CPU Intel Core i5-7300HQ
显卡 4G NVIDIA GTX 1050
内存 16 GB DDR4 2400Mhz




(2) 软件环境主要进行系统源代码的开发以及调试。下表为该系统的软件开发环境。

软件环境
操作系统 Window10 64bit
后端开发语言 Python3.7
开发工具 PyCharm 2022.3.3
后端开发框架 Flask 2.2.3
数据库 MySQL 5.7
数据库可视化 Navicat Premium 16




四 系统操作说明


4.1账号注册

用户进入西红柿病害识别交流平台后需要进行注册才能得到登录的许可,用户需要根据提示信息首先输入注册的邮箱,然后点击发送验证码按钮并进入邮箱查看验证码信息,填写正确的邮箱验证码。接下来进行用户名、密码以及性别的输入,密码需要二次确认,成功注册后会自动跳转进入登录界面。图4-1为注册界面。


46e201587ae84369a860e3dae956eba5.png


图4-1 注册界面

用户成功注册后会将用户信息添加进MySQL数据库的user表中,如图4-2,用户名为“一个人走”,性别为“男”,邮箱为“gzy_personal@163.com”的用户成功被添加进user表中。

631332d0559f42fba12858d2fbd90c9e.png


图4-2 数据库表



4.2账号登录

用户可在右上角进行登录操作,用户通过输入正确的邮箱、密码以及验证码才可以成功登入系统,其中邮箱必须是正确格式,密码必须大于等于6位数。成功登录后页面自动跳转到首页。图4-3为登录界面。


458548d4889342d7b768653b4bd545cf.png

图4-3 登录界面



4.3个人信息修改

用户登录系统后,右上角由“登录”,“注册”按钮切换为头像以及用户名,系统会根据用户性别生成默认头像,用户名也是一个二级导航栏,可点击用户个人中心、密码修改以及退出登录。图4-4为登录成功后右上角出现的用户信息。



图4-4 用户信息导航栏

通过点击个人中心可进行头像的上传以及用户名的修改,其中邮箱和性别是不可修改的,用户点击上传头像可进入资源管理器进行个人头像的上传,也可以修改用户名。图4-5为用户个人中心界面。



图4-5 用户个人中心

如图4-6所示,用户的默认头像被更改,用户名由“一个人走”修改为“小小志”。



图4-6 成功修改界面


通过点击修改密码可进行用户密码的修改,用户需要输入原始的登录密码、新密码以及图片验证码,其中原始密码必须是正确的登录密码,新密码需要二次确认,图片验证码必须与图片中的验证码一致才可以成功修改密码。图4-7为用户修改密码页面。

79cb3758882b458ba1887a2f27531227.png

图4-7 修改密码



4.4 主页面

用户进入页面或者成功登录即可跳转到严重度分级平台的主页面,主页显示了自动轮播的4个轮播图和平台提供的一些西红柿病害资料。图4-8为主页面。


图4-8 主页面



4.5病害识别

用户可以在上传页面进行西红柿叶片的图片上传,点击选择文件选择本地图片资源,然后点击识别按钮即可进行西红柿病害的识别,图4-9为识别界面。



图4-9 识别界面

用户只需稍等即可看到西红柿叶片病害识结果。图4-10为结果界面,其中根据上传的图片可以看到上传的原图,也可以得到识别出的病害分类、识别准确率、识别时间和对应的建议。


图4-10 结果界面

4.6记录查看

用户点击导航栏处的记录即可查看该用户曾经识别的病害图像记录。其中,西红柿病害识别交流平台能够根据用户上传的图片信息进行筛选,如图像一致可避免记录中的重复显示。图4-11为记录查看界面。


图4-11 记录查看界面

4.7论坛功能

用户点击导航栏上的论坛可以进入论坛界面,图4-12为论坛界面。


图4-12 论坛界面


在论坛界面中可以看到其他用户发表的论坛记录及其内容,点击“+”按钮按钮即可进入论坛发布的界面,图4-13为发布论坛界面,用户需要输入标题以及内容,然后点击发布按钮即可成功发布论坛。其中,西红柿病害识别交流平台会检测用户输入的情况,标题必须大于5个字符,内容必须大于10个字符,否则将不能成功发布论坛。

dc09966f69374304b2035cf8419a860a.png


图4-13 发布论坛界面

用户在论坛界面中可以看到其他用户发表的论坛记录及其内容,点击帖子的标题即可进入该帖子的详情界面。用户可在详情页面看到该帖子的主要内容,发布者信息、发布时间以及其他用户的评论,用户自己也可以填写并发表自己的评论,输入内容后点击评论按钮即可成功发布评论。图4-14为帖子详情界面。

a22fcd6f58024fb992b3e5a1c6fbd0ee.png



图4-14 帖子详情界面



五 部分代码展示:


代码目录结构:




model.py数据库表模型文件代码

from exts import db
from datetime import datetime
# 用户表,记录用户账号信息
class UserModel(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(200), nullable=False)
    email = db.Column(db.String(100), nullable=False, unique=True)  # 邮箱唯一
    join_time = db.Column(db.DateTime, default=datetime.now())
# 用户注册表,记录用户注册时的信息
class EmailCaptchaModel(db.Model):
    __tablename__ = 'email_captcha'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(100), nullable=False)
    captcha = db.Column(db.String(100), nullable=False)
# 用户上传表,记录用户在网页中上传的图片
class ImageUploadModel(db.Model):
    __tablename__ = 'image_upload'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    img_name = db.Column(db.String(100), nullable=False)
    img_format = db.Column(db.String(100), nullable=False)
    upload_time = db.Column(db.DateTime, default=datetime.now())
# 结果记录表,记录用户在网页中上传图片的结果
class ImageRecordModel(db.Model):
    __tablename__ = 'image_record'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    img_id = db.Column(db.Integer, db.ForeignKey('image_upload.id'), nullable=False)
    img_acc = db.Column(db.String(50), nullable=False)
    img_class = db.Column(db.String(50), nullable=False)
    ident_time = db.Column(db.DateTime, default=datetime.now())
    record=db.relationship('UserModel', backref='user_record', uselist=False)


predict_pth.py预测单张图片的分类并返回结果

import json
import os
import numpy as np
import torch
from matplotlib import pyplot as plt
from torchvision import transforms
from PIL import Image
from model.mobilenetv2 import MobileNetV2 as create_model
from model.utils import GradCAM, show_cam_on_image, center_crop_img
def pred(img_path):
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    print(f"using {device} device.")
    num_classes = 4
    img_size = 224
    data_transform = transforms.Compose(
        [transforms.Resize(int(img_size * 1.14)),
         transforms.CenterCrop(img_size),
         transforms.ToTensor(),
         transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
    img = Image.open(img_path)
    # [N, C, H, W]
    img = data_transform(img)
    # expand batch dimension
    img = torch.unsqueeze(img, dim=0)
    # read class_indict
    json_path = 'model/class_indices.json'
    assert os.path.exists(json_path), "file: '{}' dose not exist.".format(json_path)
    json_file = open(json_path, "r", encoding='utf-8')
    class_indict = json.load(json_file)
    # create model
    model = create_model(num_classes=num_classes).to(device)
    # load model weights
    model_weight_path = "model/bestmodel.pth"
    model.load_state_dict(torch.load(model_weight_path, map_location=device))
    model.eval()
    with torch.no_grad():
        # predict class
        output = torch.squeeze(model(img.to(device))).cpu()
        predict = torch.softmax(output, dim=0)
        predict_cla = torch.argmax(predict).numpy()
    # print_res = "class: {}   prob: {:.3}".format(class_indict[str(predict_cla)],
    #                                              predict[predict_cla].numpy())
    class_prob=predict[predict_cla].numpy()
    class_name=class_indict[str(predict_cla)]
    return class_prob,class_name
if __name__=="__main__":
    img_path = "static/img/1.jpg"
    class_prob,class_name= pred(img_path)
    print(class_name,class_prob)


参考资料

《Python编程从入门到实践》

《PyTorch 官方文档》

《PyTorch 图像分类教程》

《Flask官方文档》

《Flask Web开发实战》

《图像处理与计算机视觉

具体代码及实现教程可私信。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
缓存 前端开发 JavaScript
flask各种版本的项目,终端命令运行方式的实现
flask各种版本的项目,终端命令运行方式的实现
332 4
|
3月前
|
数据库 Python
如何使用Flask进行开发?
【9月更文挑战第1天】如何使用Flask进行开发?
55 3
|
4月前
|
SQL 缓存 数据库
神秘编程领域惊现宝藏!Flask 扩展生态究竟隐藏着怎样的神奇力量?快来揭开提升开发效率的秘密!
【8月更文挑战第31天】在 Flask 的世界里,其简洁而强大的核心框架搭配丰富多彩的扩展生态,为开发者带来了无尽可能性。从数据库集成到用户认证,从表单验证到缓存管理,Flask 提供了众多高质量插件,如 Flask-SQLAlchemy、Flask-WTF 和 Flask-Login,大幅提升了开发效率和代码质量。这些扩展如同宝库中的珍宝,等待着我们去探索和利用,但需谨慎选择以避免不必要的复杂性和性能问题。总之,Flask 的扩展生态助力我们更高效地开发 Web 应用,创造更多优秀作品。
38 0
|
4月前
|
Linux Python
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
|
5月前
|
安全 前端开发 API
震惊!掌握Django/Flask后,我竟然轻松征服了所有Web项目难题!
【7月更文挑战第15天】Python Web开发中,Django以其全面功能见长,如ORM、模板引擎,助你驾驭复杂需求;Flask则以轻量灵活取胜,适合快速迭代。两者结合使用,无论是数据库操作、用户认证还是API开发,都能让你应对Web挑战游刃有余。掌握这两者,Web项目难题变得易如反掌!
80 10
|
5月前
|
JSON 数据格式 Python
Flask实现内部接口----pycharm安装及新建,location代表着文件路径,下面是Python的环境,Flask是由Python开发的框架,Python文件接口ython通过GET发送
Flask实现内部接口----pycharm安装及新建,location代表着文件路径,下面是Python的环境,Flask是由Python开发的框架,Python文件接口ython通过GET发送
|
4月前
|
关系型数据库 MySQL 数据库连接
使用 Flask 3 搭建问答平台(二):User 模型搭建
使用 Flask 3 搭建问答平台(二):User 模型搭建
|
5月前
|
API 数据库 开发者
逆袭之路!Django/Flask助你成为Web开发界的璀璨新星!
【7月更文挑战第13天】在Python Web开发中,Django和Flask各具优势。Django适合快速构建大型项目,如在线书店,其ORM和内置功能让复杂应用轻松上手。Flask则以其轻量和灵活性见长,适用于个人博客等小型应用。选择框架应根据项目需求和个人偏好,两者都能助开发者在Web开发领域大放异彩。
57 2
|
5月前
|
数据库 开发者 Python
从菜鸟到大神,Django/Flask 让你秒变 Web 开发界的‘头号玩家’!
【7月更文挑战第12天】在Python Web开发中,Django和Flask框架各具特色。Flask轻量灵活,适合快速搭建简单应用,如博客,基本代码仅需几行。Django则功能全面,适用于复杂项目,如电商网站,内置ORM和管理后台。两者都助力开发者从新手进阶。选择取决于项目需求和个人偏好。学习和实践这两个框架,能助你成为Web开发专家。
61 2
|
5月前
|
JSON 文字识别 数据格式
文本,文字识别,Flask实现内部接口开发,OCR外部接口的开发,如何开发一个识别接口,通过post调用,参数是图片的路径,内部调用,直接传图片路径就行
文本,文字识别,Flask实现内部接口开发,OCR外部接口的开发,如何开发一个识别接口,通过post调用,参数是图片的路径,内部调用,直接传图片路径就行