当前位置: 首页 > news >正文

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

图像分类模型嵌入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 osimport 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_imgdef pred(img_path):device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")print(f"using {device} device.")num_classes = 4img_size = 224data_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 dimensionimg = torch.unsqueeze(img, dim=0)# read class_indictjson_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 modelmodel = create_model(num_classes=num_classes).to(device)# load model weightsmodel_weight_path = "model/bestmodel.pth"model.load_state_dict(torch.load(model_weight_path, map_location=device))model.eval()with torch.no_grad():# predict classoutput = 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_nameif __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开发实战》

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

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

相关文章:

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

图像分类模型嵌入flask中开发PythonWeb项目 图像分类是一种常见的计算机视觉任务,它的目的是将输入的图像分配到预定义的类别中,如猫、狗、花等。图像分类模型是一种基于深度学习的模型,它可以利用大量的图像数据来学习图像的特征和类别之间…...

GIT安装教程(入门)

目录 前言 Git作者 官网 GIT优点 GIT缺点 为什么要使用 Git 下载以及安装步骤 一、官网下载 二、GIT安装步骤 1、安装get程序 2、许可声明 3、选择安装路径 4、选择git组件 5、创建菜单名称 6、 git文件默认编辑器 7、设置新存储库中初始分支的名称 8、调整Pa…...

全志V3S嵌入式驱动开发(触摸屏驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所谓的触摸屏,其实就是在普通的lcd屏幕之上,再加一层屏而已。这个屏是透明的,这样客户就可以看到下面lcd屏幕的…...

死信队列详解

什么是死信队列? 在消息队列中,执行异步任务时,通常是将消息生产者发布的消息存储在队列中,由消费者从队列中获取并处理这些消息。但是,在某些情况下,消息可能无法正常地被处理和消耗,例如&…...

我用ChatGPT写2023高考语文作文(五):北京卷I

2023年 北京卷 I 适用地区:北京 “续航”一词,原指连续航行,今天在使用中被赋予了新的含义,如为青春续航、科技为经济发展续航等。 请以“续航”为题目,写一篇议论文。 要求:论点明确,论据充实&…...

《微服务实战》 第二十八章 分布式锁框架-Redisson

前言 Redisson 在基于 NIO 的 Netty 框架上,充分的利⽤了 Redis 键值数据库提供的⼀系列优势,在Java 实⽤⼯具包中常⽤接⼝的基础上,为使⽤者提供了⼀系列具有分布式特性的常⽤⼯具类。使得原本作为协调单机多线程并发程序的⼯具包获得了协调…...

局部搜索,变邻域搜索算法

目录 局部搜索 02 变邻域搜索算法 局部搜索 1.1 局部搜索是什么玩意儿? 官方一点:局部搜索是解决优化问题的一种启发式算法。对于某些计算起来非常复杂的优化问题,比如各种NP-难问题,要找到最优解需要的时间随问题规模呈指数增长,因此诞生了各种启发式算法来退而求其次…...

软件工程实训——第一天

第一天 前后分离 前端:android 后端:springbootmbatis-plus 高心星 软件工程的思维来开发项目 问题定义 可行性研究 需求分析 概要设计 详细设计 编码 测试 维护 需求分析 1.用户的信息管理 2.新增支出 3.新增收入 4.支出统计 5.收入…...

嵌入式C语言中if/else如何优化详解

观点一(灵剑): 前期迭代懒得优化,来一个需求,加一个if,久而久之,就串成了一座金字塔。 当代码已经复杂到难以维护的程度之后,只能狠下心重构优化。那,有什么方案可以优雅…...

【LSTM】读取时间序列数据 | 时间序列数据的小批量划分方法

由于序列数据本质上是连续的,因此我们在处理数据时需要解决这个问题。当序列过长而不能被模型一次性全部处理时,我们希望能拆分这样的序列以便模型方便读取。 Q:怎样随机生成一个具有n个时间步的mini batch的特征和标签? A&…...

K8s in Action 阅读笔记——【12】Securing the Kubernetes API server

K8s in Action 阅读笔记——【12】Securing the Kubernetes API server 12.1 Understanding authentication 在上一章中,我们提到API服务器可以配置一个或多个认证插件(授权插件也是同样的情况)。当API服务器接收到一个请求时,它…...

爆肝整理,3个月从功能进阶自动化测试,一跃成测试卷王...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 首先先了解自动化…...

人生这场概率游戏,怎么玩

只会标准答案,是不可救药的愚蠢 那么为了便于理解,我用一些典型的案例来讲解,什么是概率游戏,以及这个游戏,应该怎么玩。 比如典型的相亲,婚恋。人生大事,用标准答案来说,你的意中人…...

Redis笔记

缓存过期时间很重要!redis是单线程的 对于内存过多的3中方案: 惰性删除: 在定时删除的基础上,对于已经过期了的数据,redis的随机选择算法一直没有选中这个数据,所以导致它就一直没被删除,但是…...

centos 安装supervisor并运行网站

前言 之前一直用宝塔的**进程守护管理器【Supervisor】**来启动一些项目,如ThinkPHP、Hyperf的项目,或laravel的一些命令。如果不用宝塔怎么办呢? 一、简介[supervisor] [Supervisor] 是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支…...

Hadoop面试题十道

问题 1:Hadoop是什么? 答案:Hadoop是一个开源的分布式计算框架,用于处理大规模数据集的存储和处理。它基于Google的MapReduce和Google文件系统(GFS)的思想,旨在解决大数据量的处理和分析问题。…...

使用Docker-Compose对Docker容器集群快速编排

目录 一、Docker-Compose1、Docker-Compose使用场景2、Docker-Compose简介3、Docker-Compose安装部署4、YAML 文件格式及编写注意事项5、Docker Compose配置常用字段6、Docker Compose 常用命令7、Docker Compose 文件结构8、docker Compose撰写nginx 镜像9、docker Compose撰写…...

React-Redux 对Todolist修改

在单独使用redux的时候 需要手动订阅store里面 感觉特别麻烦 不错的是react有一个组件可以帮我们解决这个问题, 那就是react-redux。 react-redux提供了Provider 和 connent给我们使用。 先说一下几个重点知道的知识 Provider 就是用来提供store里面的状态 自动getState()co…...

初识微信小程序

新建小程序 创建一个新的微信小程序项目: 打开微信开发者工具,点击“新建项目”。 在弹出的窗口中,填写小程序的 AppID、项目名称和项目目录等信息。 点击“确定”按钮,等待微信开发者工具自动下载并安装所需的依赖库和框架。 …...

我们该如何入门编程呢

提醒:以下内容仅做参考,可自行发散。在发布作品前,请把不需要的内容删掉。 随着信息技术的快速发展,编程已经成为一个越来越重要的技能。那么,我们该如何入门编程呢?选择编程语言:选择一种编程…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...