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

news2024/12/23 0:04:18

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AAjyooC1-1686113308410)(wps8.jpg)]

一、系统架构

本系统使用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)硬件环境主要支撑软件的正常运行。下表为该系统的硬件开发环境。

硬件配置
CPUIntel 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为注册界面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-11bTaCwd-1686113308418)(wps1.jpg)]

图4-1 注册界面

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VtJ0t2bG-1686113308419)(wps2.jpg)]

图4-2 数据库表

4.2账号登录

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYfxyIGp-1686113308420)(wps3.jpg)]

图4-3 登录界面

4.3个人信息修改

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTRYXY12-1686113308428)(wps4.jpg)]

图4-4 用户信息导航栏

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUiTSCKR-1686113308429)(wps5.jpg)]

图4-5 用户个人中心

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

在这里插入图片描述

图4-6 成功修改界面

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wgxy8qcx-1686113308433)(wps7.jpg)]

图4-7 修改密码

4.4 主页面

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFS99MPb-1686113308434)(wps8.jpg)]

图4-8 主页面

4.5病害识别

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLdxCMkd-1686113308435)(wps9.jpg)]

图4-9 识别界面

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oOh26Oq4-1686113308438)(wps10.jpg)]

图4-10 结果界面

4.6记录查看

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nuyJiIKC-1686113308441)(wps11.jpg)]

图4-11 记录查看界面

4.7论坛功能

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cp1nJYG3-1686113308442)(wps12.jpg)]

图4-12 论坛界面

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z4692s9H-1686113308444)(wps13.jpg)]

图4-13 发布论坛界面

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afGy91Jp-1686113308446)(wps14.jpg)]

图4-14 帖子详情界面

五 部分代码展示:

代码目录结构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7SwQzaU-1686113308448)(image-20230607124318504.png)]

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开发实战》

《图像处理与计算机视觉》

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试之找终点

找终点 题目描述 给定一个正整数数组&#xff0c;设为nums&#xff0c;最大为100个成员&#xff0c;求从第一个成员开始&#xff0c;正好走到数组最后一个成员&#xff0c;所使用的最少步骤数。 要求&#xff1a; 第一步必须从第一元素开始&#xff0c;且1<第一步的步长<…

100天精通Golang(基础入门篇)——第3天:Go语言的执行原理及常用命令、编码规范和常用工具

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

java进阶—线程间通信(通俗易懂等待唤醒机制)

今天我们来看一看&#xff0c;线程之间的通信&#xff0c;也就是我们所说的等待唤醒机制 先来看三个关键方法: wait(); 当线程执行这个方法&#xff0c;它就会进入阻塞状态&#xff0c;并且释放同步监视器 notify(); 英文翻译 唤醒&#xff0c;就是说会唤醒wait的线程&…

【 图像分割 2022 ECCV】CP2

【 图像分割 2022 ECCV】CP2 论文题目&#xff1a;CP2: Copy-Paste Contrastive Pretraining for Semantic Segmentation 中文题目&#xff1a;CP2:语义分割的复制粘贴对比预训练 论文链接&#xff1a;https://arxiv.org/abs/2203.11709 论文代码&#xff1a;https://github.co…

Python3+Selenium框架搭建

Webdriver概述 Webdriver (Selenium2&#xff09;是一种用于Web应用程序的自动测试工具&#xff0c; Thoughtworks公司一个强大的基于浏览器的开源自动化测试工具&#xff0c;通常用来编写web应用的自动化测试。 Selenium 是一个用于Web应用程序测试的工具。 Selenium测试直…

异常数据检测 | Python实现支持向量机(SVM)的异常数据检测

文章目录 文章概述模型描述源码分享学习小结参考资料文章概述 SVM通常应用于监督式学习,但OneClassSVM算法可用于将异常检测这样的无监督式学习,它学习一个用于异常检测的决策函数其主要功能将新数据分类为与训练集相似的正常值或不相似的异常值。 模型描述 OneClassSVM的思…

Flink 1.17.0集群搭建

集群角色分配 HostnameIPRolehadoop01192.168.126.132 JobManager TaskManager hadoop02192.168.126.133TaskManagerhadoop03192.168.126.134TaskManager 下载flink安装包 https://archive.apache.org/dist/flink/flink-1.17.0/ 上传至hadoop01并解压&#xff1a; 修改conf/…

微软MFC技术简明介绍

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来看一下微软MFC技术简明介绍 Visual C 与 MFC 微软公司于1992年上半年推出了C/C 7.0 产品时初次向世人介绍了MFC 1.0&#xff0c;这个产品包含了20,000行C原始代码&#xff0c;60个以上的Windows相关类…

【Leetcode】贪心问题合集 | 摆动序列、K次取反最大和、加油站、分发糖果、柠檬水找零、根据身高重建队列、单调递增的数字

贪心问题感觉还是挺不好想的&#xff0c;因为每一题有每一题的策略&#xff0c;感觉只能尽量做过的记住了。 376 摆动序列 注意&#xff1a;是序列&#xff0c;而不是数组。 求最大摆动序列的长度&#xff0c;即求谷 / 峰的个数。 若走势不为一条直线。 起始count 2&…

LED显示屏静电防护指南

LED显示屏是一种电子设备&#xff0c;对静电敏感。静电放电可能会对LED显示屏的电子元件造成损坏&#xff0c;因此需要采取静电防护措施。以下是LED显示屏静电防护的一些建议和指南&#xff1a; 环境控制&#xff1a;在LED显示屏周围创建适宜的环境条件。控制湿度和温度&#x…

Yolov5(tag v7.0)网络结构解读,以yolov5s为例

最近yolov5用的多&#xff0c;发现确实好用&#xff0c;于是较深入学了一下。下面按照训练的流程梳理一下网络的结构&#xff0c;同时也是自己记一下便于后面查阅。 同时&#xff0c;我也查了一些关于yolov5网络结构介绍的资料&#xff0c;发现大多是v5.0&#xff0c;少数v6.0的…

Linux驱动IO篇——阻塞/非阻塞IO

文章目录 非阻塞IO阻塞IO等待队列等待队列变体 非阻塞IO 在应用程序中&#xff0c;使用open函数打开一个/dev目录下的一个设备文件时&#xff0c;默认是以阻塞的方式打开。 所谓阻塞&#xff0c;就是当我们请求的资源不可用时&#xff08;资源被占用&#xff0c;没有数据到达等…

让车载系统与外部系统无缝对接——掌握SOA跨系统通信技术

车载SOA架构原理 车载 SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;是一种基于服务的体系结构&#xff0c;旨在提高车载电子系统的可维护性、可扩展性和互操作性。它将车载电子系统划分为独立的、可复用的服务单元&#xff0c;这些服…

NodeJS MongoDB⑦

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言Node&MongoDB 第一步 连接数据库 第二步 创建User Mongodb模型 第三步 简单使用 Mongodb命令 第四步 规范使用 Mongodb命令 &#xff08…

爆款视频批量剪辑生成系统源码部署

创建视频 该接口用于创建抖音视频&#xff08;支持话题, 小程序等功能&#xff09;。该接口适用于抖音。 使用限制 抖音的 OAuth API 以https://open.douyin.com/ 开头。挂载小程序请先完成注册开发者平台账号。创建抖音视频后, 会有一个审核过程, 期间只有自己可见。如果发…

docker数据管理与网络通信

一、管理docker容器中数据 管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Containers) 。 1、 数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻…

leetcode11. 盛最多水的容器(java)

盛最多水的容器 leetcode11. 盛最多水的容器题目描述 解题思路代码演示二叉树专题 leetcode11. 盛最多水的容器 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/container-with-most-water 题目描述 给定一个长度为 n 的…

物联网Lora模块从入门到精通(二) LED灯泡闪烁与呼吸灯

目录 一、前言 二、实践与代码 1.电亮LED1 2.熄灭LED1 3.翻转LED电平 4.LED1与LED2交替闪烁 5.LED1呼吸灯 三、程序代码 一、前言 本篇内容属于新大陆物联网Lora模块开发&#xff0c;使用给定的Lora基础例程&#xff0c;并在其基础上开发完成&#xff0c;并可为其他版本的Lo…

Atcoder Beginner Contest 294

A - Filter AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> using namespace std; int main() {int n;cin>>n;for(int i0;i<n;i){int x;cin>>x;if(x%20)cout<<x<<" ";}return 0; } …

​​INNODB和MyISAM区别

1 存储引擎是MyISAM 如下&#xff1a; CREATE table test_myisam (cli int ) ENGINEMyISAM 存储目录里会有三个文件 test_myisam.frm为“表定义”&#xff0c;是描述数据表结构的文件 test_myisam.MYI文件是表的索引 test_myisam.MYD文件是表的数据 2 存储引擎是INNODB…