Technical Specification

技术原理与系统设计

草地过度放牧 AI 监测系统 — 完整技术架构、算法流程与参数配置说明。

📋 算法流程图

开始用户上传无人机航拍图像(JPG/PNG/TIFF,最大 50MB)
  ↓
EXIF GPS 元数据解析(自动提取经纬度、海拔、拍摄时间)
  ↓
SAHI 切片推理:大图 → 640×640 切片(20% 重叠)
  ↓
YOLO 双模型并行检测
  ├── cow_weight_v1.pt  → 牛检测(ICAERUS 无人机专用模型)
  └── yolov8m_sheep.pt  → 羊检测(YOLOv8m 预训练)
  ↓
VARI 植被指数计算
  VARI = (Green - Red) / (Green + Red - Blue)
  阈值 > -0.05 判定为植被覆盖区
  ↓
按 GeoJSON 分区统计(每个管理区域独立计算)
  ├── 牲畜数量(牛 × 5 + 羊)
  ├── 植被覆盖面积(m²)
  └── 载畜量 = 牲畜数 / (植被面积 × 牧草利用率)
  ↓
载畜量超标判定(标准:NY/T 635-2015)
  载畜量 > 超载阈值(默认 1.2 羊单位/亩/天)→ 触发告警
  ↓
生成分析报告 + 标注图 + 牧草热力图 + 微信通知结束

📦 软件基础设置信息

字段说明
功能名称草地过度放牧 AI 监测系统 — Grassland Overgrazing Detection
适用场景草原牧场无人机巡检,自动识别牛羊数量、评估植被覆盖、计算载畜量、判定是否过度放牧
开发语言Python 3.12+(后端 Flask)+ HTML5/CSS3/JavaScript(前端)
核心依赖flask ultralytics opencv-python-headless Pillow shapely exifread numpy
AI 模型YOLO 双模型:cow_weight_v1.pt(ICAERUS 牛专用)+ yolov8m_sheep.pt(羊检测),配合 SAHI 切片推理
GIS 引擎Leaflet.js + Leaflet Draw + GeoJSON,支持在线/离线底图、多边形分区绘制与编辑
数据存储SQLite(grassland.db),分区 GeoJSON + 分析历史记录持久化
通知方式企业微信 Webhook 推送超载告警
载畜量标准NY/T 635-2015 天然草地载畜量计算标准

⚙️ 软件系统设计

1. 项目目录结构

grassland/
  ├── backend/
  │   ├── app.py              ← Flask 应用工厂(create_app 模式)
  │   ├── config.py           ← 全局配置(模型路径、阈值、载畜量参数)
  │   ├── routes/
  │   │   ├── upload.py       ← POST /api/upload(上传 + EXIF 解析)
  │   │   ├── analysis.py     ← POST /api/analyze(YOLO + SAHI + 载畜量)
  │   │   ├── zones.py        ← CRUD /api/zones(GeoJSON 分区管理)
  │   │   └── history.py       ← GET /api/history(分析历史)
  │   ├── services/
  │   │   ├── zone_manager.py  ← SQLite 分区 CRUD + 初始化
  │   │   └── exif_parser.py   ← EXIF GPS 元数据提取
  │   ├── models/
  │   │   └── detector.py      ← LivestockDetector(SAHI + YOLO 双模型)
  │   ├── templates/
  │   │   ├── index.html       ← 主监测页面
  │   │   └── report.html      ← 分析报告页
  │   ├── static/weights/
  │   │   ├── cow_weight_v1.pt ← ICAERUS 牛检测模型
  │   │   └── yolov8m_sheep.pt ← 羊检测模型
  │   └── data/
  │       ├── grassland.db     ← SQLite 数据库
  │       ├── uploads/          ← 上传航拍图
  │       └── results/          ← 分析结果(标注图 + 热力图)
  └── frontend/
      ├── index.html           ← 前端备用
      └── static/
          ├── css/app.css      ← 主样式
          └── js/              ← upload.js / map.js / results.js / history.js

2. SAHI 切片推理引擎

针对无人机高分辨率航拍图(4000×3000px 以上),直接送入 YOLO 会导致小目标漏检。系统采用 SAHI(Slicing Aided Hyper Inference) 切片策略:大图切分为 640×640 切片(20% 重叠),每片独立推理后 NMS 合并。参数:SAHI_SLICE_SIZE=640SAHI_OVERLAP_RATIO=0.2

3. YOLO 双模型协同检测(LivestockDetector)

牛检测cow_weight_v1.pt(ICAERUS 无人机专用模型),针对高空俯拍视角优化。
羊检测yolov8m_sheep.pt(YOLOv8m 预训练 + 羊类微调),m 系列平衡精度与速度。
推理参数:conf=0.50, iou=0.45,双模型独立推理后合并检测结果。
Lazy Load:首次 detect() 调用时才加载模型,减少启动时间。

4. VARI 植被指数计算

使用 VARI(Visible Atmospheric Resistant Index) 评估植被覆盖:VARI = (G - R) / (G + R - B)。阈值 > VARI_VEGETATION_THRESHOLD(默认 -0.05)判定为植被区。相比 NDVI,VARI 仅需 RGB 三通道,无需近红外波段,适配消费级无人机 RGB 相机。

5. 载畜量计算与超载判定

基于 NY/T 635-2015 标准:
羊单位换算:1 头牛 = 5 个羊单位
日食量:1 羊单位 = 1.8 kg/天(干草)
载畜量 = 总羊单位 / (植被面积 × 牧草利用率 × 生物量系数 / 日食量 / 放牧天数)
超载判定:载畜量 > OVERLOAD_THRESHOLD(默认 1.2 倍)→ 触发告警 + 微信通知

6. GeoJSON 分区管理(SQLite 持久化)

前端 Leaflet Draw 绘制多边形 → GeoJSON → POST /api/zones → SQLite 存储。支持 CRUD 操作、JSON 导入/导出。每个分区独立统计牲畜数量和载畜量,支持按分区生成逐区分析报告。

🔧 参数配置

YOLO_CONFIDENCE
0.50
YOLO 检测置信度阈值(ICAERUS 无人机模型推荐值)
YOLO_IOU
0.45
NMS 合并 IoU 阈值
SAHI_SLICE_SIZE
640 px
SAHI 切片尺寸
SAHI_OVERLAP_RATIO
0.2
切片重叠比例(提升边缘目标检测)
GRASS_UTILIZATION_RATE
0.50
牧草利用率(NY/T 635-2015 推荐值)
DAILY_INTAKE_SHEEP_UNIT
1.8 kg/天
1 羊单位日食量(干草)
CATTLE_TO_SHEEP_RATIO
5.0
牛 → 羊单位换算系数
OVERLOAD_THRESHOLD
1.2
超载倍数阈值(>1.2 倍 = 过度放牧)
VARI_VEGETATION_THRESHOLD
-0.05
VARI 植被判定阈值
MAX_CONTENT_LENGTH
50 MB
上传文件大小限制

🔗 模块依赖关系

app.py (Flask 应用工厂)
  ├── config.py ──────────────────── 全局参数(模型路径、阈值、载畜量标准)
  ├── routes/upload.py (Blueprint)
  │     └── services/exif_parser.py ── EXIF GPS 元数据提取
  ├── routes/analysis.py (Blueprint)
  │     ├── models/detector.py ─────── LivestockDetector(SAHI + YOLO 双模型)
  │     ├── VARI 计算 ──────────────── 植被指数分析
  │     └── 载畜量公式 ──────────────── NY/T 635-2015 标准
  ├── routes/zones.py (Blueprint)
  │     └── services/zone_manager.py ── SQLite CRUD + GeoJSON 序列化
  ├── routes/history.py (Blueprint)
  │     └── grassland.db ────────────── 分析历史记录查询
  ├── static/weights/
  │     ├── cow_weight_v1.pt ───────── ICAERUS 牛检测模型
  │     └── yolov8m_sheep.pt ───────── 羊检测模型
  └── data/ ───────────────────────── uploads/ + results/ + grassland.db

📡 API 接口一览

方法路径说明
POST/api/upload上传航拍图像 + EXIF GPS 解析
POST/api/analyze执行分析:YOLO 检测 + VARI + 载畜量计算
GET/api/zones获取所有管理分区(GeoJSON)
POST/api/zones创建新分区
PUT/api/zones/<id>更新分区名称/GeoJSON/颜色
DELETE/api/zones/<id>删除分区
GET/api/history查询分析历史记录
GET/api/health健康检查
GET/static/results/<file>查看分析结果图片

📚 学术支撑

本文系统引用以下学术成果与技术标准。

[1] Akyon et al. (2022)

SAHI: Slicing Aided Hyper Inference for Small Object Detection. IEEE ICIP 2022. 本项目大图切片推理的方法论基础。

[2] Jocher et al. (2024)

Ultralytics YOLOv8: State-of-the-Art Object Detection. 牛羊检测核心框架,YOLOv8m 羊模型。

[3] ICAERUS (2024)

EU Horizon ICAERUS Project: UAV-based Livestock Detection. 无人机专用牛检测模型来源。

[4] Gitelson et al. (2002)

VARI: Visible Atmospherically Resistant Index. Geophysical Research Letters. RGB 植被指数算法。

[5] NY/T 635-2015

天然草地载畜量计算标准。中华人民共和国农业行业标准。载畜量公式与参数依据。

[6] Leaflet.js (2024)

Open-Source JavaScript Library for Interactive Maps. 前端地图引擎与 GeoJSON 交互。