苹果树病虫智能识别的web部署,基于django框架

本WebApp是基于django框架来实现对苹果树病虫智能识别App的web部署

苹果树病虫智能识别App请参考人工智能 机器学习中的相关文章

用到的工具

编辑器:pycharm,vscode(前端)

python版本:python 3.9 (带TensorFlow框架)

django版本:3.2.9

MySQL版本:MySQL80

数据库可视化工具:NaviCat

1.数据库设计

数据库我使用的是MySQL,如果不会创建MySQL数据库,请先自行学习

数据库配置如下


字段设置如下

数据库名为user

2.数据库配置

在创建完django项目后,在settings.py中修改我们的数据库配置

DATABASES = {'default': {# 配置使用mysql'ENGINE': 'django.db.backends.mysql',     # 数据库产品'HOST': "localhost",           # 数据库ip'PORT': 3306,                  # 数据库端口'USER': "root",                # 你的数据库用户名'PASSWORD': "mysql",           # 你的数据库密码'NAME': "densenet_db",         # 数据库名}}import pymysql
pymysql.install_as_MySQLdb()

没有pymysql就安装一下

pip3 install pymysql

在后面创建完model后,我们会对数据库进行测试

3.创建WebApp

新建Django项目,在pycharm中选择Django并进行创建

新建Django项目后,我需要添加第一个APP,命令如下(在pycharm的cmd终端中运行)

python manage.py startapp DenseNetApp

应用创建完成后,我们还需要在 settings.py 配置文件中对其进行添加,把我们创建的应用添加到这个列表,如下所示:

# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','DenseNetApp'  //创建的App
]

在DenseNetApp目录下创建urls.py文件,作为App内部的路由,同时我们要将DenseNetApp的内部路由导入到总路由文件中,也就是下图所示的urls.py中

导入后的urls.py

from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('DenseNetApp/',include('DenseNetApp.urls')),
]

在视图函数中,我们创建我们的方法

打开views.py,写入我们的测试方法hello

from django.http import HttpResponse# 定义一个测试用例
def hello(request):return HttpResponse("Hello world ! ")

通过HttpResponse直接返回一个页面,页面内容为 "Hello world ! "

定义好方法后,在app内的路由文件中,设置一下hello方法的路由,以便从前端能正确访问到

打开DenseNetApp的路由文件urls.py,设置方法路由

# 定义DenseNetApp的url模式
from django.urls import path
from . import viewsapp_name = 'DenseNetApp'
urlpatterns = [# 主页path('hello/',views.hello,name='hello'),#URL后缀为hello,#执行的是views.py中的hello方法]

在path方法中

‘hello/’ 的含义是在浏览器中的地址的URL后缀为hello

views.hello的含义是执行的是views.py中的hello方法

到此为止,我们创建好了我们的第一个App,并为这个App写了一个简单的方法,下面我们来测试一下这个方法

首先点击pycharm右上角的绿三角,启动django服务器

服务器启动成功后会得到入口地址

默认的是本地地址http://127.0.0.1:8000/,这个地址可以修改,后面在说

点击地址或者复制到浏览器中打开,发现出错了,提示我们Page not found即404错误,这是因为我们没有设置默认地址的路由,所以访问默认地址会找不到页面,这个我们也在后面会解决,先测试我们的方法

还记得我们在主路由设置的地址吗?

from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('DenseNetApp/',include('DenseNetApp.urls')),
]

我们要访问hello方法,就想要访问hello所在的App,再从App的路由文件中寻找这个方法

比如我们直接访问hello方法的内路由地址 http://127.0.0.1:8000/hello

同样找不到页面,因为从主路由找不到app内路由的方法地址,所以,我们加上app路由文件的地址再访问

http://127.0.0.1:8000/DenseNetApp/hello/

成功得到了hello方法执行后的页面

4苹果树病虫智能识别App部署

随后我们进行项目的部署

导入我们训练好的模型

将它放在pycharm中的新建目录下

新建一个空python文件 predict.py

此文件主要负责训练模型的导入和图像的预处理,包括图像的归一化,RGB格式转换等等,代码如下

import io
import base64
import numpy as np
from PIL import Image
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import img_to_array
model = load_model('./algorithm/models/densenet121.h5') #导入训练好的数据模型#图像预处理
def preprocess_image(image,target_size):  # 图像预处理if image.mode != 'RGB':image = image.convert('RGB')image = image.resize(target_size)image = img_to_array(image)image = image/255.image = np.expand_dims(image,axis=0)return image

写完后,我们需要在views.py中调用我们的神经网络模型

但在调用之前,我需要测试的图片数据需要从前端获得,于是,我们先写一下我们的App前端页面

5前端页面绘制

前端我用的是一个Bootstrap的框架,设置了POST方法,用于向后台发送图片数据,我取名为densenet.html,保存在templates文件夹内

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Quixlab - Bootstrap Admin Dashboard Template by Themefisher.com</title><!-- Favicon icon --><link rel="icon" type="../../static/image/png" sizes="16x16" href="../static/images/favicon.png"><!-- Custom Stylesheet --><link href="../static/css/style.css" rel="stylesheet"></head><body><!--*******************Preloader start********************--><div id="preloader"><div class="loader"><svg class="circular" viewBox="25 25 50 50"><circle class="path" cx="50" cy="50" r="20" fill="none" stroke-width="3" stroke-miterlimit="10" /></svg></div></div><!--*******************Preloader end********************--><!--**********************************Main wrapper start***********************************--><div id="main-wrapper"><!--**********************************Nav header start***********************************--><div class="nav-header"><div class="brand-logo"><a href="index1.html"><h3>识别系统</h3></a></div></div><!--**********************************Nav header end***********************************--><!--**********************************Header start***********************************--><div class="header">    <div class="header-content clearfix"><div class="nav-control"><div class="hamburger"><span class="toggle-icon"><i class="icon-menu"></i></span></div></div><div class="header-left"><div class="input-group icons"><div class="drop-down   d-md-none"><form action="#"><input type="text" class="form-control" placeholder="Search"></form></div></div></div><div class="header-right"><ul class="clearfix"><li class="icons dropdown"><div class="user-img c-pointer position-relative"   data-toggle="dropdown"><span class="activity active"></span><img src="../static/images/user/1.png" height="40" width="40" alt=""></div><div class="drop-down dropdown-profile   dropdown-menu"><div class="dropdown-content-body"><ul><li><a href="app-profile.html"><i class="icon-user"></i> <span>Profile</span></a></li><li><a href="email-inbox.html"><i class="icon-envelope-open"></i> <span>Inbox</span> <div class="badge gradient-3 badge-pill badge-primary">3</div></a></li><hr class="my-2"><li><a href="page-lock.html"><i class="icon-lock"></i> <span>Lock Screen</span></a></li><li><a href="page-login.html"><i class="icon-key"></i> <span>Logout</span></a></li></ul></div></div></li></ul></div></div></div><!--**********************************Header end ti-comment-alt***********************************--><!--**********************************Sidebar start***********************************--><div class="nk-sidebar">           <div class="nk-nav-scroll"><ul class="metismenu" id="menu"><li class="nav-label">设备管理</li></ul></div></div><!--**********************************Sidebar end***********************************--><!--**********************************Content body start***********************************--><div class="content-body"><div class="row page-titles mx-0"><div class="col p-md-0"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="javascript:void(0)">Dashboard</a></li><li class="breadcrumb-item active"><a href="javascript:void(0)">Home</a></li></ol></div></div><!-- row --><div class="container-fluid"><div class="row"><div class="col-12"><div class="card"><div class="card-body"><h5 class="card-title">上传文件</h5><div class="basic-form"><form enctype="multipart/form-data" action="/uploadfile" method="post">{% csrf_token %} <div class="form-group"><input type="file" name="myfile" /> </div><div class="form-group"><button type="submit" class="btn btn-dark mb-2" >进行预测</button></div></form><hr><h5 class="m-b-15">识别信息</h5><p><strong>healthy:</strong>{{ healthy }}</p><p><strong>multiple_diseases:</strong>{{ multiple_diseases }}</p><p><strong>rust:</strong>{{ rust }}</p><p><strong>scab:</strong>{{ scab }}</p><h5 class="m-b-5 p-t-15"></h5><p></p><hr></div></div></div></div></div></div><!-- #/ container --></div><!--**********************************Content body end***********************************--><!--**********************************Footer start***********************************--><div class="footer"><div class="copyright"></div></div><!--**********************************Footer end***********************************--></div><!--**********************************Main wrapper end***********************************--><!--**********************************Scripts***********************************--><script src="../static/plugins/common/common.min.js"></script><script src="../static/js/custom.min.js"></script><script src="../static/js/settings.js"></script><script src="../static/js/gleek.js"></script><script src="../static/js/styleSwitcher.js"></script><script src="../static/plugins/tables/js/jquery.dataTables.min.js"></script><script src="../static/plugins/tables/js/datatable/dataTables.bootstrap4.min.js"></script><script src="../static/plugins/tables/js/datatable-init/datatable-basic.min.js"></script></body></html>

框架中的静态资源(CSS,JavaScript,img等页面静态资源)是需要我们和HTML文件分开存放,放在static文件夹中

这时,我们就能成功的访问静态页面

还记得在前面运行服务器时默认访问http://127.0.0.1:8000/会报404吗?现在我们就为默认地址加上页面,就是我们的densenet.html,首先,我们要在主路由中设置一个空地址来代表默认地址

是不是觉得眼熟,没错,就是把前面的path(‘DenseNetApp/’,include(‘DenseNetApp.urls’))中的DenseNetApp/删掉,变成上图所示,这样,一启动服务器,就会直接跳转到DenseNetApp的内路由文件,我们在用同样的方法来设置内路由

将index方法作为默认启动方法

所以我们要在views中写一个index方法,来完成服务器页面初始化

def index(request):return render(request, 'E:\\第五章_智能Webapp_django\\templates\\densenet.html')

图省事用的绝对路径,尽量不要学我⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

再启动服务器,发现这次就不报错了,而是直接运行出我们的densenet.html

有了页面,我们还需要接口来接受我们前端上传的图片,于是需要在views中写入我们的接口,接口代码如下

@csrf_exempt
def uploadfile(request):if request.method == "POST":  # 请求方法为POST时,进行处理myFile = request.FILES.get("myfile", None)  # 获取上传的文件,如果没有文件,则默认为Noneif not myFile:return HttpResponse("no files for upload!")destination = open(os.path.join("E:\\djangoProject_file", myFile.name), 'wb+')  # 打开特定的文件进行二进制的写操作for chunk in myFile.chunks():  # 分块写入文件destination.write(chunk)destination.close()address = "E:\\djangoProject_file\\" + myFile.name

保存图片时我们需要在本地创建好存储图片的文件夹,我的文件夹叫djangoProject_file

然后为uploadfile方法写一下端口路由

path('uploadfile',views.uploadfile,name='uploadfile'),

注意,路由的地址要与前端表单提交的方法相对应

6识别算法的应用

为了使模型的准确率尽量高,我们需要对图像进行预处理,这里我们进行灰度处理,需要的库有

from PIL import Image

灰度处理代码如下

image = Image.open(address)processed_image = preprocess_image(image, target_size=(512, 512))

将所保存的图片路径(address)传入灰度处理方法让图片被处理

再调用模型进行识别,并返回四个识别结果的参数

processed_image = preprocess_image(image, target_size=(512, 512))prediction = model.predict(processed_image)[0].tolist()  # 预测response = {'prediction': {'healthy': prediction[0],'multiple_diseases': prediction[1],'rust': prediction[2],'scab': prediction[3]}}

并将结果返回给前端页面

 return render(request, 'E:\\第五章_智能Webapp_django\\templates\\densenet.html',{'healthy': response['prediction']['healthy'], 'multiple_diseases': response['prediction']['multiple_diseases'], 'rust': response['prediction']['rust'],'scab': response['prediction']['scab']})

最后我们把这些方法整合到uploadfile方法里,表示一上传图片就进行识别检测

完整uploadfile方法代码

@csrf_exempt
def uploadfile(request):if request.method == "POST":  # 请求方法为POST时,进行处理myFile = request.FILES.get("myfile", None)  # 获取上传的文件,如果没有文件,则默认为Noneif not myFile:return HttpResponse("no files for upload!")destination = open(os.path.join("E:\\djangoProject_file", myFile.name), 'wb+')  # 打开特定的文件进行二进制的写操作for chunk in myFile.chunks():  # 分块写入文件destination.write(chunk)destination.close()address = "E:\\djangoProject_file\\" + myFile.nameimage = Image.open(address)processed_image = preprocess_image(image, target_size=(512, 512))prediction = model.predict(processed_image)[0].tolist()  # 预测response = {'prediction': {'healthy': prediction[0],'multiple_diseases': prediction[1],'rust': prediction[2],'scab': prediction[3]}}print(response['prediction']['healthy'])return render(request, 'E:\\第五章_智能Webapp_django\\templates\\densenet.html',{'healthy': response['prediction']['healthy'], 'multiple_diseases': response['prediction']['multiple_diseases'], 'rust': response['prediction']['rust'],'scab': response['prediction']['scab']})

至此,我们已经完成了苹果树病虫智能识别的初步部署,下面我们来测试一下

运行服务器,进入页面后我们选择一张树叶图片

点击进行检测

于是我们得到了识别结果

测试成功,苹果树病虫智能识别的App能成功运行在我们的django服务器上

等等,我们是不是忘了什么,没错,我们开头使用的数据库没有用上,在后面的文章中,我会对App进行改进,让它能搭配数据库进行使用以及考虑到服务器性能问题,我还会设计分布式服务器以满足不同模块对于性能需求不同

源码链接
链接:https://pan.baidu.com/s/1EBR9TgrHRfdYdz9KoiwphQ
提取码:ybbb

参考资料(打个小广告)

本文所使用的识别算法就来自此书,书中对python网络编程讲的十分详细,有兴趣的同学可以学习一下

see you next time!

苹果树病虫智能识别的web部署,基于django框架相关推荐

  1. 网站框架搭建——基于Django框架的天天生鲜电商网站项目系列博客(二)

    系列文章目录 需求分析--基于Django框架的天天生鲜电商网站项目系列博客(一) 网站框架搭建--基于Django框架的天天生鲜电商网站项目系列博客(二) 用户注册模块--基于Django框架的天天 ...

  2. 订单支付和评论——基于Django框架的天天生鲜电商网站项目系列博客(十五)

    系列文章目录 需求分析--基于Django框架的天天生鲜电商网站项目系列博客(一) 网站框架搭建--基于Django框架的天天生鲜电商网站项目系列博客(二) 用户注册模块--基于Django框架的天天 ...

  3. Java Web 程序设计----基于SSM框架(正在更新中)

    Java Web 程序设计----基于SSM框架 提示:主要用于个人学习.复习.查阅等. 文章目录 Java Web 程序设计----基于SSM框架 一.网页前端开发基础 HTML文档结构 提示:以下 ...

  4. 4款基于Django框架的开源软件推荐

    Django是一款高性能的Python web框架,鼓励快速开发和干净.务实的设计.Django项目是一个定制框架,它源自一个在线新闻Web站点,于2005年以开源的形式被释放出来.Django的重点 ...

  5. 基于Django框架的视频播放器设计

    基于Django框架的视频播放器设计 前言 一.简介 二.详细实现步骤 1.路由配置 2.后台代码设计(对云盘接口的访问) 3.后台代码设计(流式视频传输) 4.前端功能设计(视频播放列表) 5.前端 ...

  6. 基于Django框架的网络云盘设计

    基于Django框架的网络云盘设计 网络云盘设计流程(第一篇) 前言 前期准备与环境搭建 创建一个Django工程,跑一个HelloWorld 网盘设计简介及成果展示 功能1,"登录&quo ...

  7. 在IIS上部署基于django WEB框架的python网站应用

    django是一款基于python语言的WEB开源框架,本文给出了如何将基于django写的python网站部署到window的IIS上. 笔者的运行环境: Window xp sp3 IIS 5.1 ...

  8. Web系统版本更新与迭代方式——持续集成与持续部署(Python Django框架)

    一.持续集成与持续部署 在软件工程中,CI/CD是指持续集成和持续交付或者持续部署的组合. CI/CD通过构建应用程序.在测试和部署中实施自动化,从而在开发团队和运维团队之间架起一座桥梁,让项目能够更 ...

  9. 基于Django构建在线文本分类预测系统:SVM模型在线预测与部署 基于 Django 3.2 框架

    文章大纲 算法端与后端环境搭建 前端构建 Ajax XHR 创建网页与 Django项目 创建网页 前端 -- django 项目创建与启动 前端 -- 创建 django app 应用 postma ...

最新文章

  1. 科大星云诗社动态20211102
  2. 服务容错设计:流量控制、服务熔断、服务降级
  3. 【ubuntu-qt-dlib】 配置问题 (一) undefined reference to `XPending'
  4. python如何生成列表和元组数据_Python数据类型(列表和元组)
  5. mysql --max_allowed_packet=32m,如何修改MySQL-max_allowed_packet
  6. Go 语言设计与实现纸质书出版,为信仰补票
  7. Kafka是什么、主要应用在什么场景?
  8. Mock(模拟后端接口数据)配合Vuex的使用
  9. C++继承机制(二)——继承中的构造和析构顺序、继承同名成员的处理方式
  10. 诗歌的创作、诗词总结与应用
  11. 网页测试网速软件,网页测网速在线测试(speedtest软件测速原理)
  12. Photoshop - 教您怎样对扫描文件去除底色?
  13. 四元数在旋转的运用-圆形烟火弹道轨迹
  14. 如何让IE窗口保持最大化
  15. 设计模式-创建者模式篇
  16. tensorflow RNN实例
  17. Oracle alter table
  18. 解决git上传文件出错[rejected] master -> master (fetch first) error: failed to push some refs to ‘
  19. Zoom Cloud Mettings - Zoom 云视频会议
  20. EXCEL随机函数实例

热门文章

  1. 模块化通信原理实验箱QY-JXSY32
  2. 京林生态花园2021年(第三届)春节花展即将盛大开幕
  3. 云存储架构的技术特点与三个发展方向
  4. 互换性与测量技术基础复习题及答案
  5. 全志T7/T507 Qt5.12.5移植记录
  6. 论算法的重要性与乐趣
  7. Jmeter接口压力测试(先登录再测接口)
  8. 十道必问的软件测试面试题(含答案解析)
  9. Spring MVC的核心控制器DispatcherServlet的作用
  10. 永恒之蓝漏洞复现-CVE-2017-0144