十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于Django的农作物病虫害识别系统开发全流程解析

基于Django的农作物病虫害识别系统开发全流程解析 如果你最近在为 Python 方向的毕业设计找选题有一个方向值得认真考虑用 Django 写一套“农作物病虫害识别系统”。它不是一个简单的单页面展示而是把病虫害信息展示、图片识别结果、用户交流咨询、后台数据管理放在一个项目里用户端和管理端都完整。对毕设来说这种项目“功能密度”高、技术栈常见、演示效果好无论是写成论文还是现场演示内容都足够撑起来。这套系统的核心价值在于它虽然是典型的 Web 系统但又不只是增删改查。它要处理图片上传、识别结果展示、咨询回复、后台统计等真实业务逻辑。用户端要能浏览病虫害信息、提交图片识别、查看历史记录、发起咨询管理端要能维护病虫害数据、查看识别记录、回复用户咨询、管理系统配置。把一个完整业务闭环做出来才叫毕业设计而不是“待办事项管理”那种练手项目。这篇文章会从技术拆解、环境准备、项目初始化、数据库设计、识别功能落地、本地启动、生产部署、常见问题排查和答辩扩展方向完整梳理这套 Django 农作物病虫害识别系统的开发流程。你不需要一上来就写完整代码先把每个模块的功能边界和实现路径理清楚后面写起来就顺很多。1. 系统定位与核心价值1.1 这个系统解决了什么问题传统的农作物病虫害诊断主要靠人工观察和经验判断效率低而且基层技术人员的专业水平参差不齐。一个信息化的病虫害识别系统就是要让用户把农作物叶片或病虫害部位的照片上传到系统里系统返回可能的病虫害类别和防治建议同时提供一个可以浏览病虫害百科、进行提问交流的平台。从课题角度看这个项目有三个明确的价值点业务角色清晰用户和管理员各有一套完整操作流程。技术覆盖全面Django 配置、ORM 模型设计、文件上传、图片处理、API 接口、后台管理都会用到。成果可量化识别准确率、功能模块数量、系统响应时间等都可以写进论文。1.2 适合谁来用如果你是计算机、软件工程、农业信息化、人工智能相关专业的本科生这个题目的完成周期比较合适。已经学过 Python 基础或者熟悉 Django 入门但没做过一个完整系统的人也可以拿这个项目当成综合实战来练。另外这套系统的设计思路也可以直接改造成其他方向比如“植物种类识别系统”“农产品质量检测系统”。核心就是把“信息展示 图片识别 用户交互 后台管理”这四个模块换成不同业务对象。2. 核心功能模块拆解整个系统按照角色可以拆成用户端和管理端两大部分。端功能模块说明用户端注册登录用户注册、登录、退出修改个人信息用户端病虫害信息展示按农作物类型或病虫害类别展示百科信息支持关键词搜索、详情页用户端病虫害识别上传图片返回识别结果、置信度和防治建议保存识别记录用户端识别记录用户查看自己历史识别记录可按时间排序用户端交流咨询用户发起问题、浏览问题列表、查看专家或管理员的回复管理端用户管理管理员查看用户列表、启用或禁用账号管理端病虫害信息管理管理员对病虫害百科信息进行增删改查管理端识别记录管理查看所有用户的识别记录掌握系统使用情况管理端咨询回复管理对用户提问进行回复、删除违规问题管理端系统配置轮播图、公告、栏目分类等基础配置2.1 用户端设计要点用户端最关键的是“识别”这个动作。用户进入识别页面后上传一张图片系统需要给出几类信息识别出的病虫害名称例如“稻瘟病”“玉米螟”置信度或匹配度数值详细的防治建议相关的病虫害百科链接识别记录功能要单独设计不能只把结果返回给前端因为论文里需要展示“用户历史记录”这样的功能而且用户再次查看时不需要重复识别。2.2 管理端设计要点管理端不需要从头写一套复杂的权限系统直接使用 Django 自带的 Admin 后台作为基础管理端即可。Django Admin 自带用户管理、权限管理、数据表管理开发效率很高。你只需要把自定义的模型注册进 Admin配置好列表显示字段、搜索字段和过滤器。如果需要更贴近业务的自定义后台首页可以用 Django 模板写一套管理界面然后通过路由和视图实现。毕业设计建议优先用 Admin 快速完成基础管理功能把时间留给识别模块和业务逻辑。3. 技术栈与选型分析这套系统的技术选型有一条主线Python Django。技术项推荐方案理由开发语言Python 3.10 及以上生态成熟写 Web 和算法都方便Web 框架Django 4.x 或 5.x自带 ORM、Admin、认证、表单、模板适合中大型信息系统数据库开发用 SQLite生产用 MySQLSQLite 零配置适合本地演示MySQL 适合论文中的“生产部署”章节前端Django 模板 Bootstrap 5不需要前后端分离开发效率高演示直观图片识别可根据课题选择深度学习模型或第三方接口独立成服务的话不影响 Web 主流程文件存储Django 本地 media 目录图片上传使用 MEDIA_ROOT 和 MEDIA_URL 配置部署Nginx Gunicorn MySQL生产环境的经典组合也可以直接在宝塔面板里操作如果做前后端分离可以用 Vue Django REST Framework但这样工作量会大不少。毕业设计除非题目明确要求否则优先用 Django 模板渲染页面核心精力放在功能完整性和识别算法上。4. 本地开发环境准备4.1 安装 Python 并检查版本很多同学卡在第一步不是代码问题而是 Python 环境没配置好。Windows 下安装 Python 时安装界面一定要勾选 “Add Python to PATH”否则后面命令行执行python会提示不是内部或外部命令。安装完成后打开命令行执行python --version pip --version如果python被 Microsoft Store 的快捷方式干扰可以试py --version。确认 Python 能正常调用后再进行下一步。4.2 创建项目目录和虚拟环境每个 Django 项目都应该使用独立虚拟环境避免不同项目的依赖互相冲突。在项目根目录执行mkdir django_crop_disease cd django_crop_disease python -m venv venvWindows 激活虚拟环境venv\Scripts\activateLinux 或 macOS 激活虚拟环境source venv/bin/activate激活成功后命令行前面会出现(venv)标识。这时安装依赖会安装到这个环境里不会污染全局 Python。4.3 安装 Django 和基础依赖在虚拟环境中执行pip install django pip install pillowPillow 是 Django 处理图片上传字段时必须安装的依赖如果缺失使用ImageField时会报错。这一步也可以直接维护一个requirements.txt文件Django4.2,6.0 Pillow10.0 mysqlclient2.2 requests2.31然后执行pip install -r requirements.txt如果安装速度慢可以使用国内镜像源pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple5. 项目初始化与模块创建5.1 初始化 Django 项目在虚拟环境激活状态下在项目根目录执行django-admin startproject config .这里的项目名建议叫config而不是disease_system因为disease可能会和后面创建的 app 名冲突。执行后目录结构大致如下config/ __init__.py settings.py urls.py asgi.py wsgi.py manage.py venv/5.2 创建自定义应用这个系统建议拆成 3 到 4 个应用每个应用负责一个业务模块python manage.py startapp user python manage.py startapp disease python manage.py startapp identification python manage.py startapp consultation各应用职责如下应用名职责user用户注册登录、个人信息管理disease病虫害百科信息、分类管理identification病虫害图片识别、识别记录consultation咨询问题、回复管理5.3 配置 settings.py在config/settings.py中把新应用加入INSTALLED_APPS同时配置静态文件、媒体文件、登录跳转等内容。INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, user, disease, identification, consultation, ] # 媒体文件配置用户上传的图片统一保存在 media 目录 MEDIA_URL /media/ MEDIA_ROOT BASE_DIR / media # 登录相关配置 LOGIN_URL /user/login/ LOGIN_REDIRECT_URL / LOGOUT_REDIRECT_URL /BASE_DIR是 Django 默认生成的路径对象直接用BASE_DIR / media拼接路径即可不需要额外引入os.path。5.4 配置根路由在config/urls.py中挂载各应用的 URL同时让开发环境能访问媒体文件from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns [ path(admin/, admin.site.urls), path(user/, include(user.urls)), path(disease/, include(disease.urls)), path(identification/, include(identification.urls)), path(consultation/, include(consultation.urls)), ] if settings.DEBUG: urlpatterns static(settings.MEDIA_URL, document_rootsettings.MEDIA_ROOT)这样后续开发时用户上传的图片就可以通过/media/xxx.jpg直接访问。6. 数据库模型设计数据库模型是整个系统的核心模型设计决定了后续所有功能的开发顺序。以下给出核心模型的设计思路。6.1 病虫害信息表from django.db import models class DiseaseCategory(models.Model): 病虫害分类例如水稻病害、玉米虫害 name models.CharField(max_length50, verbose_name分类名称) class Meta: verbose_name 病虫害分类 verbose_name_plural verbose_name def __str__(self): return self.name class CropDisease(models.Model): 病虫害百科信息 category models.ForeignKey( DiseaseCategory, on_deletemodels.CASCADE, verbose_name所属分类 ) name models.CharField(max_length100, verbose_name病虫害名称) crop_name models.CharField(max_length100, verbose_name寄主作物) symptom models.TextField(verbose_name症状描述) cause models.TextField(verbose_name发病原因, blankTrue) prevention models.TextField(verbose_name防治方法) image models.ImageField(upload_todisease/%Y/%m/, verbose_name展示图片, blankTrue) created_at models.DateTimeField(auto_now_addTrue, verbose_name创建时间) class Meta: verbose_name 病虫害信息 verbose_name_plural verbose_name def __str__(self): return self.name6.2 识别记录表识别记录需要保存用户、上传图片、识别结果、置信度和防治建议。如果是使用模型推理最好还保存模型返回的原始标签方便后续统计。from django.contrib.auth.models import User class IdentifyRecord(models.Model): user models.ForeignKey(User, on_deletemodels.CASCADE, verbose_name用户) image models.ImageField(upload_toidentify/%Y/%m/%d/, verbose_name上传图片) result_name models.CharField(max_length100, verbose_name识别结果) confidence models.FloatField(verbose_name置信度, nullTrue, blankTrue) suggestion models.TextField(verbose_name防治建议, blankTrue) created_at models.DateTimeField(auto_now_addTrue, verbose_name识别时间) class Meta: verbose_name 识别记录 verbose_name_plural verbose_name ordering [-created_at] def __str__(self): return f{self.user.username} - {self.result_name}6.3 交流咨询表交流咨询模块至少需要两张表问题表和回复表。如果想去掉复杂度也可以在问题表里直接保存管理员回复内容只在页面上显示最后一次回复。class ConsultationQuestion(models.Model): user models.ForeignKey(User, on_deletemodels.CASCADE, verbose_name提问用户) title models.CharField(max_length200, verbose_name咨询标题) content models.TextField(verbose_name咨询内容) image models.ImageField(upload_toconsultation/%Y/%m/, verbose_name咨询图片, blankTrue) reply_content models.TextField(verbose_name管理员回复, blankTrue) reply_time models.DateTimeField(nullTrue, blankTrue, verbose_name回复时间) created_at models.DateTimeField(auto_now_addTrue, verbose_name提问时间) class Meta: verbose_name 咨询问题 verbose_name_plural verbose_name ordering [-created_at] def __str__(self): return self.title6.4 生成并执行数据库迁移写好模型文件后依次执行python manage.py makemigrations python manage.py migrate然后创建超级管理员用于登录后台python manage.py createsuperuser按照提示输入用户名、邮箱和密码即可。7. 病虫害识别功能落地思路识别功能是这套系统的技术亮点也是论文里最值得展开写的部分。识别模块的实现方式可以根据你的算法基础来选择不要一开始就追求最先进的模型。7.1 识别流程设计完整的识别流程如下用户上传图片 - Django 表单接收图片并保存到 media/identify 目录 - 调用识别服务本地模型推理或第三方 API - 返回病虫害名称、置信度、防治建议 - 写入 IdentifyRecord 表 - 跳转到结果页展示关键点在于不要把模型推理直接写在 Django 视图函数里做成阻塞任务尤其是图片分辨率高、模型体积大的时候网页会卡住。更合理的做法是把识别能力抽成一个独立接口。7.2 识别方案怎么选方案一使用预训练图像分类模型如果你已经学过深度学习可以基于 ResNet、MobileNet 等图像分类模型用自己的病虫害数据集做迁移学习。训练完成后把模型文件放到项目里在 Django 视图中加载模型对上传图片做预处理和推理。方案二调用第三方图像识别接口第三方 API 的好处是准确率高、部署方便但要处理网络请求、接口鉴权和图片脱敏问题。毕业论文中调用第三方接口并不是不行但最好把接口封装成独立服务并说明接口的调用逻辑和异常处理不能只写一句“调用外部 API”。方案三传统特征匹配如果算法基础薄弱可以用颜色特征、纹理特征、轮廓特征做简单分类。虽然准确率可能不如深度学习方法但胜在好解释论文里容易写清楚特征提取和匹配过程。7.3 Django 视图与识别接口示例这里给出一个通用示例假设识别函数抽成了recognize_image(image_path)它返回一个字典包含name、confidence、suggestion。视图核心代码如下from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from .models import IdentifyRecord from .forms import IdentifyForm from .recognizer import recognize_image login_required def identify_view(request): if request.method POST: form IdentifyForm(request.POST, request.FILES) if form.is_valid(): image form.cleaned_data[image] # 这里可以先用 Django 自带的文件处理做大小限制 result recognize_image(image) record IdentifyRecord.objects.create( userrequest.user, imageimage, result_nameresult[name], confidenceresult[confidence], suggestionresult[suggestion] ) return redirect(identification:result, record_idrecord.id) else: form IdentifyForm() return render(request, identification/identify.html, {form: form})recognize_image函数的实现根据方案不同而不同。如果使用深度学习模型大概结构是from PIL import Image import torch from torchvision import transforms model load_model() def recognize_image(image_file): image Image.open(image_file).convert(RGB) transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) input_tensor transform(image).unsqueeze(0) with torch.no_grad(): outputs model(input_tensor) predicted_index outputs.argmax(dim1).item() class_names [稻瘟病, 玉米螟, 小麦锈病] return { name: class_names[predicted_index], confidence: 0.85, suggestion: 这里放防治建议 }这个示例只是一个模板具体模型类别和类别名称需要根据你自己的训练数据来改。7.4 批量识别建议如果题目要求支持批量图片识别可以对上传逻辑做两个调整允许用户一次选择多张图片Django 端用request.FILES.getlist(images)接收。不要把批次内的所有图片同步处理使用 Celery 任务队列做异步处理进度通过 Redis 状态或数据库字段展示。普通毕业设计不需要完整实现 Celery你可以在论文中说明“异步任务扩展方案”只先实现单张识别和批量顺序循环。from django.shortcuts import render login_required def batch_identify_view(request): if request.method POST: images request.FILES.getlist(images) results [] for image in images: result recognize_image(image) record IdentifyRecord.objects.create( userrequest.user, imageimage, result_nameresult[name], confidenceresult[confidence], suggestionresult[suggestion] ) results.append(record) return render(request, identification/batch_result.html, {records: results})注意同步循环处理多张图片时如果模型推理速度慢页面等待时间会很长。生产环境必须改成异步。8. 启动服务与功能验证8.1 本地启动命令在项目根目录执行python manage.py runserver默认访问地址是http://127.0.0.1:8000/。如果 8000 端口被占用可以指定端口python manage.py runserver 8001启动后命令行会输出 Django 版本和当前端口。如果看到“Starting development server at http://127.0.0.1:8000/”说明服务启动成功。8.2 后台功能验证打开/admin/使用createsuperuser创建的账号登录。进入后台后检查以下几点用户管理列表能显示普通注册用户。病虫害分类和病虫害信息能新增、编辑、删除。识别记录管理能看到用户的识别记录。咨询回复管理可以回填回复内容。这些功能验证通过说明模型设计和注册配置没有问题。8.3 用户端功能验证前台功能建议按以下流程验证注册一个新账号。登录系统。浏览病虫害信息列表查看详情页。进入识别页面上传一张带有明显病虫害特征的照片。等待识别结果返回检查结果页是否显示病虫害名称、置信度和防治建议。进入“我的识别记录”确认历史记录已生成。发起一条咨询问题在后台用管理员账号回复回前台查看回复结果。验证时建议把每个步骤的截图都保留下来后面写论文和答辩 PPT 都直接能用。8.4 接口验证如果你的识别模块或查询模块提供了 JSON 接口可以通过 curl 简单验证curl -X POST http://127.0.0.1:8000/api/identify/ \ -H Authorization: Token 用户凭证 \ -F imagetest.jpg同样也可以用 Python requests 测试import requests url http://127.0.0.1:8000/identification/result/ files {image: open(test.jpg, rb)} response requests.post(url, filesfiles, timeout30) print(response.status_code) print(response.text)如果接口返回 200并且能看到识别结果文本说明接口链路通。9. 生产部署建议毕业设计最后通常需要部署到服务器方便演示和答辩。9.1 Linux 环境通用流程在 Ubuntu 或 CentOS 服务器上先安装 Python、MySQL 等基础环境然后按顺序执行python3 -m venv venv source venv/bin/activate pip install -r requirements.txt收集静态文件python manage.py collectstatic --noinput执行数据库迁移python manage.py migrate创建生产环境的超级管理员python manage.py createsuperuser用 Gunicorn 启动 Django 服务gunicorn config.wsgi:application --bind 0.0.0.0:8000注意这里只是最简启动方式真实部署还需要把settings.py里的DEBUG设置为False并配置ALLOWED_HOSTS为服务器 IP 或域名。9.2 使用宝塔面板部署 Django宝塔面板是很多学生使用的服务器管理工具操作路径比较直观。部署 Django 应用时大致步骤是在宝塔中创建 Python 项目。选择 Python 版本和项目目录。安装依赖包。设置 Gunicorn 启动命令。配置 Nginx 反向代理到 Gunicorn 端口。配置静态文件和上传目录的访问映射。这里不展开界面点击路径因为宝塔版本更新较快菜单位置可能变化。核心思路就是把 Nginx 和 Gunicorn 的通信关系配置好。9.3 Nginx 反向代理示例server { listen 80; server_name your_domain_or_ip; client_max_body_size 20m; location /static/ { alias /www/wwwroot/django_crop_disease/static/; } location /media/ { alias /www/wwwroot/django_crop_disease/media/; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }把server_name换成你的域名或服务器 IP把alias路径换成你的项目实际路径即可。10. 常见问题与排查方法毕业设计开发过程中下面这些问题出现的频率最高。问题现象可能原因排查方式解决方案python不是内部或外部命令Python 没有加入 PATH命令行执行py --version或检查安装目录重新安装 Python 并勾选 Add to PATH虚拟环境激活失败当前终端不支持 activate 命令检查执行命令的路径Windows 使用venv\Scripts\activateLinux 使用source venv/bin/activateModuleNotFoundError: No module named django没有在虚拟环境内安装 Django执行pip list查看已安装包pip install djangoPillow相关报错缺少 Pillow查看报错是否指向 ImageFieldpip install pillowpython manage.py runserver后页面打不开端口被占用或访问地址不对查看命令行提示检查防火墙换端口python manage.py runserver 8001服务器开放 8000 端口No changes detectedmakemigrations 没有检测到模型变化检查应用是否加入 INSTALLED_APPS在 settings.py 中加入应用名上传图片后无法显示媒体文件路由未配置访问/media/看是否提示 404在 urls.py 中配置static(settings.MEDIA_URL, document_rootsettings.MEDIA_ROOT)后台中文乱码数据库表字符集不是 UTF-8查看 MySQL 表结构和数据库默认字符集创建数据库时指定utf8mb4字符集Admin 后台样式丢失静态文件未正确收集查看页面网络请求生产环境执行collectstatic开发环境检查DEBUG为 True识别接口请求超时图片过大或模型推理过慢查看服务日志检查图片大小限制图片尺寸异步处理识别任务10.1 依赖安装类问题如果pip install速度很慢或者安装 curl 等依赖时频繁超时建议把 pip 镜像源固定到国内源。在项目根目录创建一个pip.ini或pip.conf或者在命令行使用-i参数。最省事的方法是在虚拟环境激活状态下执行pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple之后再执行pip install就不会卡很长时间了。10.2 数据库迁移类问题如果在执行migrate时提示外键关联错误通常是模型之间的引用顺序有问题。可以先把所有模型文件写完统一执行一次makemigrations不要写一个模型就迁移一次。如果迁移状态混乱可以删除应用下的migrations目录中除了__init__.py之外的文件再重新执行。10.3 模型推理类问题识别服务如果出现Out of Memory错误可能是显存不足也可能是图片尺寸设置得过大。建议先把图片压缩到 224x224 或 256x256 再进入模型推理能明显降低显存开销。10.4 部署类问题部署到服务器后如果前端页面能打开但图片不显示优先检查 Nginx 的/media/路径是否指向正确目录。Django 开发服务器能访问不代表 Nginx 的 alias 路径正确。如果页面能打开但登录状态丢失检查SESSION_COOKIE_SECURE和CSRF_COOKIE_SECURE的配置。在 HTTPS 和 HTTP 之间切换时Cookie 作用域会发生变化。11. 毕业设计答辩要点与扩展方向11.1 答辩时重点展示什么答辩时不要从一开始就讲代码要用业务场景带入。建议按这个顺序讲说清楚课题背景农业生产中病虫害诊断依赖人工经验信息化系统能提高诊断效率。展示系统架构Django 后端 模板前端 MySQL 数据库识别功能独立成模块。演示核心流程用户上传图片、系统识别、展示结果、用户咨询、管理员回复。展示后台管理强调用户可以管理病虫害百科、查看识别记录、回复咨询。展示设计要求中提到的非功能需求比如图片大小限制、访问权限控制、数据分页、搜索功能。11.2 可以继续扩展的方向这套系统做完基础版本后可以继续加下面这些内容作为论文里的“系统扩展与展望”接入微信小程序或移动 H5让用户可以直接在手机上拍照识别。使用更先进的目标检测模型例如 YOLO 系列的轻量化版本把“整图分类”升级为“病虫害目标检测”。增加用户识别记录的可视化统计按病虫害类型展示柱状图、饼图。引入咨询消息通知用户提问后通过短信或站内信通知管理员。增加多级角色比如普通用户、农业技术员、系统管理员不同角色有不同的操作权限。构建病虫害知识图谱让用户在识别结果页直接查看同类病虫害的关系与防治方案。扩展方向不需要全部实现能落地一到两个论文深度就会明显加强。如果目前还在选题阶段这套 Django 农作物病虫害识别系统最值得你优先考虑的地方是它的功能边界非常清晰用户端有“信息展示 识别 咨询”三个核心动作管理端有“数据维护 记录查看 回复管理”三个管理闭环。你只要按模块逐个实现进度可控论文素材也充足。部署到服务器后再配合 Nginx 和 MySQL 写一章“系统部署与应用”整套毕设的完成度就很高了。
返回列表