社会服务赛道 · 柑橘病虫害智能识别小程序

1. 团队介绍

队伍名称: 橘农守护队
一句话定位: 一个实习生的 Vibe Coding 作品,加上一位 10 年经验架构师的指导建议,从 0 到 1 两周跑通全流程


饶良 — 技术指导 / 架构建议

  • 天工智序资深架构师,10 年全栈开发经验
  • 负责架构评审、关键技术决策建议、代码 Review
  • 关键时刻点醒过:“模型选分类不选检测,农民不需要知道病斑在哪,知道是什么病怎么治就行”

伍娇 — 独立开发 / 产品 / 设计 / 数据(全链路)

  • 天工智序 Agent 实习生,计算机科学与技术专业大三
  • 一个人完成:数据清洗、YOLOv8 模型训练、ONNX 导出、FastAPI 服务搭建、Render 部署、知识库编写、Taro 小程序搭建、本地语音生成、构建上线
  • 从想法到上线耗时 14 天,全程 Vibe Coding,TRAE 主力开发伙伴
  • 擅长把复杂技术用大白话讲清楚,坚信 AI 不只是炫技工具而是能真正帮到人的东西

苏欧涵 — 场景顾问 / 本地数据支持

  • 四川省南充市南部县驻村干部
  • 提供南部县柑橘病虫害本地数据、农户访谈渠道、知识库农技内容审核
  • 帮着把专业术语翻译成农民听得懂的大白话

团队独特优势: 伍娇一个人扛了全部开发,饶良老师把关方向不跑偏,苏欧涵提供了真实的农业场景和本地资源。实习生 + 资深架构师 + 驻村干部,三方互补,既有技术深度也有落地温度。


2. 产品简介(复赛版)

是什么: 面向柑橘种植户的 AI 病虫害识别微信小程序。农民拍一张叶子/果实的照片,AI 立刻告诉他这是什么虫/病、怎么治、用什么药、注意什么。一句话——让不懂植保的农民也能精准防病治虫

面向谁: 四川省南部县及周边的柑橘种植户,年龄 40-65 岁为主,智能手机基本操作没问题,但对专业病虫害分类一窍不通。

完整功能清单:

模块 功能
:microscope: 智能识别 拍照/选图 → 小程序上传到 Render FastAPI 服务 → ONNX Runtime 推理 → 27 类病虫害分类
:books: 知识库 15 类虫害 + 11 类病害 + 1 类健康,每类含:识别依据、推荐农药、用药时机、安全间隔期、安全警示
:speaker_high_volume: 语音播报 防治建议一键朗读(本地 30 个 MP3 音频,离线可用)
:memo: 历史记录 本地存储所有扫描,方便追溯对比
:herb: 季节性提醒 基于南部县气候数据,推送当月高发病害预警

完整用户使用路径:

打开首页 → 点"拍照认病害" → 拍照/从相册选图
    ↓
图片上传到 Render FastAPI 服务 → ONNX Runtime 推理
    ↓
返回类别 + 置信度 → 结果页展示
    ↓
"柑橘溃疡病 · 置信度 89%"
    ↓
一键语音播报 / 查看完整防治建议
    ↓
返回首页 → 历史记录自动保存

相比初赛 Demo 的升级:

维度 初赛 复赛
识别类别 8 类病害 27 类(15 虫害 + 11 病害 + 1 健康)
识别方式 Mock 模拟数据 真实 YOLOv8n-cls ONNX 模型 + Render FastAPI 推理服务
置信度展示 :cross_mark: :white_check_mark: Top-1 置信度 + 备选类别提示
语音播报 :cross_mark: :white_check_mark: 30 条本地 MP3 音频
地理位置 :cross_mark: :white_check_mark: 自动记录乡镇信息
季节性提醒 :cross_mark: :white_check_mark: 南部县高发病害月度预警
知识库 简略 8 类 完整 27 类,含农药/时机/安全警示

3. 产品演示视频


4. 产品创作历程

:light_bulb: 想法诞生:
伍娇在天工智序实习期间接触到农业 AI 应用,加上苏欧涵(南部县驻村干部)提到的真实困境——当地农民"见虫就打药、见病就慌神",认错病喷错药的情况每年都有。一个想法冒出来:AI 能不能帮农民伯伯少踩这样的坑? 于是拉上饶良老师把关方向,苏欧涵提供本地资源,三人小团队就开工了。

:fire: 第一个大坑——数据集不干净:
网上搜到的虫害数据集混了斜纹夜蛾、枯叶夜蛾、茶蚜、绣线菊蚜这些根本不是柑橘上的虫!手动清理后剩 15 类虫害,再从公开数据集和百度图片补充病害数据,最终凑成 27 类共 9068 张(训练集 7369 张 / 验证集 1699 张)。

  • 解决思路: Python 脚本批量预览目录 + 百度图片反查确认 + 手动清理。

:fire: 第二个大坑——训练精度上不去:
第一次训 Top-1 只有 62%,一看混淆矩阵——黑点介壳虫只有 44 张、堆蜡粉蚧只有 2 张,类别数据量差异悬殊。

  • 解决思路: 稀少数类用数据增强(随机裁剪/旋转/亮度变化)+ 采样加权。最终训练 50 epochs(CPU 训练耗时约 3 小时),验证集 Top-1 达到 87.9%(最佳轮约 88.2%),Top-5 达到 98.6%

:fire: 第三个大坑——模型怎么部署:
直接塞 YOLOv8.pt 有 3MB,小程序主包限制 2MB 加上 ONNX Runtime 依赖太大。

  • 饶良老师的建议: 导出 ONNX 格式,用 FastAPI + ONNX Runtime 在 Render 上部署推理服务,小程序通过 HTTP 请求调用。
  • 解决思路: model.export(format="onnx", imgsz=224) 导出 best.onnx 约 5.91 MB,FastAPI 封装 /predict 接口部署到 Render,小程序上传图片获取推理结果。
  • 注意点: Render 免费服务存在冷启动,首次请求可能需要数十秒,后续迭代考虑迁移到 Vercel/腾讯云函数。

:fire: 第四个大坑——语音播报:
微信同声传译插件需要企业主体,个人开发者用不了;在线 TTS 接口在小程序游客模式下会被拦。

  • 解决思路: 用 Windows 系统中文语音引擎(SAPI)生成 WAV 音频,再用 FFmpeg 转码为 MP3,共生成 30 个本地音频文件(4 条引导语 + 26 条病虫害播报),全部打包进小程序,零费用 + 完全离线可用

:flexed_biceps: 最重要的设计决策(饶良老师点醒的):

“模型选分类不选检测,农民不需要知道病斑在图片哪个位置,知道是什么病、用什么药、什么时候喷就行。”

放弃了 YOLOv8-det 目标检测方案,改用 YOLOv8n-cls 分类方案,标注成本大幅降低,输出直接对齐农民需求。


5. TRAE 实践过程

完整开发流程:

需求分析 → 数据集清洗 → 模型训练(CPU 50 epochs)→ ONNX 导出 → FastAPI 服务搭建 → Render 部署 → 知识库编写 → 小程序搭建 → 功能联调 → 音频生成 → 构建上线

TRAE 承担的关键工作:

阶段 TRAE 做了什么
数据 Python 批量预览脚本、非柑橘类自动检测建议、数据增强代码、训练/验证集划分
模型 YOLOv8 训练脚本、混淆矩阵分析、ONNX 导出脚本、FastAPI 推理封装
部署 Render 服务配置、启动脚本编写
前端 Taro 项目搭建、6 个页面完整实现、27 类知识库 TS 定义、Zustand store、FastAPI 接口对接
构建 npm/pnpm 依赖冲突解决、webpack missing 修复、Windows symlink 问题绕过
音频 Windows SAPI + FFmpeg 批量生成脚本
文档 复赛帖子撰写、技术方案整理

关键步骤截图(建议准备):

1.小程序框架搭建

1782740125503340:ad1a99801383bd159ed8baa38b18455a_6a48a14233cd3b92676add96.6a619d8076773dbfee7adb4d.6a619d804a7cee5c78d57abf:TraeWork CN.0.1.45.no_sid.no_ppe.T(2026/7/23 13:08:58)

2.训练数据集

1782740125503340:9d3ea3eb5de514645467a46ce26c4ef5_6a48a14233cd3b92676add96.6a74ba090470c137c26cad32.6a74ba08a6eabcfc1fa488f4:TraeWork CN.0.1.45.no_sid.no_ppe.T(2026/8/7 00:45:12)

3.删掉 4 个脏类

1782740125503340:c217b8b52e5b636385041a5c542e4222_6a48a14233cd3b92676add96.6a74c2440470c137c26cad80.6a74c244959235222b036a88:TraeWork CN.0.1.45.no_sid.no_ppe.T(2026/8/7 01:21:19)

4.页面全跑通

1782740125503340:48aa6daaaa7c00abc7a06c305060831f_6a48a14233cd3b92676add96.6a757e18e8e288948e8d94c6.6a757e1750a1f94471489016:TraeWork CN.0.1.45.no_sid.no_ppe.T(2026/8/7 14:41:45)

5.做本地音频方案

1782740125503340:2eef77ba5a9b2ed121f2e23d0faf1b22_6a48a14233cd3b92676add96.6a758108e8e288948e8d94f9.6a7581074195706aed748543:TraeWork CN.0.1.45.no_sid.no_ppe.T(2026/8/7 14:58:37)

6.小程序上线

1782740125503340:561aad6eadb092c85621ad1028af2c8c_6a48a14233cd3b92676add96.6a759f5821b0530cb63b3315.6a759f542f1cbd6efeb9ff1e:TraeWork CN.0.1.45.no_sid.no_ppe.T(2026/8/7 17:03:43)


6. 技术方案分享(加分项)

技术栈总览:

前端:Taro + React + TypeScript + Zustand
AI 模型:YOLOv8n-cls 分类模型
输入尺寸:224×224
分类数量:27 类
训练数据:9068 张(训练集 7369 张,验证集 1699 张)
模型格式:best.pt 约 3.04 MB,best.onnx 约 5.91 MB
验证集 Top-1:约 87.9%(最佳轮约 88.2%)
验证集 Top-5:约 98.6%
训练轮数:50 epochs
训练硬件:CPU(耗时约 3 小时)
推理服务:Render 部署 FastAPI + ONNX Runtime
语音:Windows SAPI + FFmpeg 生成,本地 30 个 MP3 音频

识别架构:

小程序(Taro)
    │  POST /predict(multipart/form-data 上传图片)
    ▼
Render 免费服务
    │  FastAPI + ONNX Runtime
    │  加载 best.onnx
    │  224×224 推理
    ▼
返回 { class_id, confidence, top5 }
    │
    ▼
小程序展示结果 + 查知识库

模型架构选型——为什么选分类不选检测?

方案 优势 劣势
目标检测(YOLOv8-det) 能框出病虫害位置 需要框级标注,标注成本高;小目标易漏检;输出需二次解析
分类(YOLOv8n-cls) :white_check_mark: 只需要图级别标签;输出直接是类别+置信度 不能定位病虫害位置

选分类的核心理由: 农民更关心"这是什么病怎么治",不需要知道病斑在图片哪个位置。分类方案标注成本大幅降低,输出直接对齐用户需求,推理服务实现简单。

数据处理流水线:

原始数据集 27 类
    ↓ 清洗:删除非柑橘病虫害 4 类(斜纹夜蛾、枯叶夜蛾、茶蚜、绣线菊蚜)
    ↓ 补数据:百度图片补充稀少数类
最终 27 类 9068 张
    ↓ 划分:train 7369 / val 1699
训练集 + 验证集
    ↓ 增强:稀少数类随机裁剪/旋转/亮度变化 + 采样加权
YOLOv8 训练 50 epochs(CPU ~3h)
    ↓
best.pt 3.04 MB → best.onnx 5.91 MB
验证集 Top-1 87.9% / Top-5 98.6%

当前版本说明:

  • 小程序已接入真实 ONNX 模型,通过 Render 部署的 FastAPI 接口(https://nanbu-citrus-ai.onrender.com/predict)进行推理
  • Render 免费服务存在冷启动现象,首次请求可能需要数十秒,后续迭代考虑迁移到稳定的云服务
  • 模型为分类模型,只能判断整张图片的主要类别,不具备病斑或害虫定位能力

7. 迭代规划

阶段 目标 状态
v1.0(当前) 27 类模型 + Render FastAPI + 6 页面完整跑通 :white_check_mark: 已完成
v1.1 Render 冷启动优化(实例保活)+ 迁移到稳定云服务 :counterclockwise_arrows_button: 进行中
v1.2 增加地理位置记录 + 病虫害热力图后台 :clipboard: 规划中
v1.3 南部县 3 个乡镇试点推广,收集真实识别数据 :clipboard: 规划中
v2.0 用试点数据重新训练模型,增加南部县特有病虫害 :clipboard: 规划中
v2.1 尝试 YOLOv8-seg 分割方案,同时实现识别 + 定位 :clipboard: 规划中

社会价值: 当前方案解决了"农民认不出病"的核心痛点,能显著减少误用药导致的减产和农药浪费问题。后续通过试点推广和数据回流,模型精度和覆盖范围还能持续提升。


最后想说的话

这个项目从想法到上线,前前后后花了大概 14 天。一个实习生 + 一个 10 年经验架构师 + 一个驻村干部,三个人用 Vibe Coding + TRAE 把想法变成了能跑的小程序。

做的过程中最深的感受是——AI 不是只能用来炫技的大玩具,它真的可以落地帮到人。 南部县的王叔李婶们不懂 AI,但他们懂橘子好不好吃。我们要做的,就是把 AI 翻译成他们能听懂、会用的东西。

比赛不是终点,上线让农民真的用起来才是。

谢谢评委! :folded_hands:


1 个赞