无人机航拍+深度学习落地智慧农业:作物出苗率目标检测开源数据集工程详解|YOLO作物计数、田间苗期AI监测、农情数字化训练资源

无人机航拍作物苗期目标检测工程落地|YOLO出苗计数数据集、农业CV模型训练与出苗率算法开发定制

标签:#农业计算机视觉 #无人机遥感 #YOLO目标检测 #智慧农业数据集 #深度学习工程化 #大田作物表型识别 #作物出苗率测算

国内规模化大田种植逐年扩张,依靠人工实地清点秧苗核算出苗成本居高不下,规模化基地单地块人工普查成本可达百元/亩,抽样统计误差普遍高于13%;无人机遥感+深度学习自动株数统计已成行业落地刚需,但高质量田间实景标注数据集稀缺、田间复杂环境样本缺失,长期制约农业AI项目落地迭代。本文以开源航拍作物苗期数据集为核心,遵循GitHub开源仓库README规范撰写全文档,补齐数据集明细台账、数据统计表格、全链路预处理+训练+推理源码,代码附带农业落地场景经验注释,完整覆盖数据盘点、格式转换、数据集拆分、模型训练、出苗率量化全工程链路,可直接用于科研实验与田间商业化部署。10232

项目概述→数据集详情台账→软硬件环境→全模块源码→模型落地指标→落地场景→迭代优化方向

一、Project Overview 项目概述

本项目依托大田无人机可见光航拍开源标注数据集,面向玉米、向日葵、甜菜三类经济作物苗期单株检测与出苗率自动测算,依托YOLO深度学习框架完成从原始标注数据到落地推理全流程工程化落地。数据集原生带精细化边界框标注,包含杂草遮挡、逆光、泥土裸露、作物疏密失衡等大田真实干扰场景,无预设训练/验证/测试划分,适配FasterRCNN、YOLOv5/v8/v11、RT-DETR全系列检测算法,既可用于学术小样本算法研究,也能直接落地无人机田间巡测、播种验收、育种试验统计等商用场景。

二、Dataset Information 数据集完整信息(新增数据集明细板块)

2.1 数据集基础参数表

项目参数 详细数据说明
采集设备 消费级低空航拍无人机,RGB可见光相机
采集环境 露天大田原生田间环境,晴天/侧逆光/轻度阴天多光照混合场景
作物品类 玉米(maize)、向日葵(sunflower)、甜菜(sugarbeet)3类苗期幼苗
原始标注格式 Pascal VOC XML(xyxy像素坐标标注)
图像格式 JPG/JPEG,单张分辨率区间1920×1080 ~ 3840×2160
存储结构 images原图文件夹 + annotations标注XML文件夹,无分类子目录
标注目标 单株出苗幼苗,杂草、石块、土块不做标注
适用任务 目标检测、实例计数、出苗率量化、缺苗区域识别
格式兼容 支持一键转为YOLO-TXT、COCO-JSON、MS-COCO通用训练格式

2.2 数据集量化统计明细

  1. 全数据集原图总量:4287张田间航拍实拍图,全部图片完成人工精细标注,无空白无标注废图;
  2. 全量标注目标总数量:365291株幼苗边框标注,单张图片平均标注85.21株作物;
  3. 品类分布统计:玉米标注152103个、向日葵130577个、甜菜82611个;
  4. 困难样本占比:遮挡/密集重叠幼苗困难样本共计945张,占总图片22.04%,提升模型田间泛化能力;
  5. 场景分布:晴天光照图3126张、逆光阴影图892张、阴雨弱光样本269张,覆盖大田绝大多数实拍工况。

2.3 数据集优缺点梳理

✅ 优势

  1. 实景田间采集,无实验室仿真图片,数据分布贴合落地部署真实数据;
  2. 三类作物统一数据集,一套数据实现多品类作物联合检测训练;
  3. 困难样本充足,密集苗、被杂草半遮挡样本完备,训练后模型抗干扰能力强;
    ❌ 现存短板
  4. 无极端暴雨、霜冻病害等极端灾害场景样本,后续可自行增补扩充;
  5. 原图尺寸跨度大,工程使用前必须统一尺寸预处理;

三、Environment Requirement 软硬件依赖

txt 复制代码
# requirements.txt
python==3.10
torch==2.3.1
ultralytics==8.3.0
opencv-python==4.9.0.80
numpy==1.26.4
albumentations==1.4.10
scikit-learn==1.5.0
pycocotools==2.0.8
matplotlib==3.9.0
bash 复制代码
# 一键安装命令
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

四、Full Source Code 全链路工程代码(带场景经验注释)

4.1 dataset_stat.py|数据集数据统计脚本

场景注释:农业数据集上线前必备盘点代码,自动统计图片数、各类别标注数量、困难样本占比,替代人工逐个清点,便于数据集版本归档、数据集采购/标注成本核算,适配数据集入库台账管理

python 复制代码
import os
import xml.etree.ElementTree as ET

# 配置路径
XML_PATH = "./dataset/annotations"
CLASS_DICT = {"maize":0,"sunflower":1,"sugarbeet":2}
cls_count = {k:0 for k in CLASS_DICT.keys()}
total_box = 0
hard_sample = 0
all_xml = os.listdir(XML_PATH)

for xml_name in all_xml:
    tree = ET.parse(os.path.join(XML_PATH,xml_name))
    root = tree.getroot()
    box_num = 0
    for obj in root.findall("object"):
        name = obj.find("name").text
        if name in cls_count:
            cls_count[name] += 1
            box_num +=1
            total_box +=1
    # 单图>150株判定为密集困难样本
    if box_num>150:
        hard_sample +=1

print(f"数据集总图片:{len(all_xml)}张")
print(f"各类标注统计:{cls_count}")
print(f"全部幼苗标注总数:{total_box}")
print(f"密集困难样本数量:{hard_sample},占比:{round(hard_sample/len(all_xml)*100,2)}%")

4.2 voc2yolo.py VOC转YOLO格式

场景注释:原始VOC标注无法直接送入YOLO训练,大田航拍图像分辨率参差不齐,代码自动归一化坐标,是农业CV数据集工业化预处理固定流程

python 复制代码
import os,xml.etree.ElementTree as ET
IN_XML = "./dataset/annotations"
OUT_TXT = "./dataset/labels"
os.makedirs(OUT_TXT,exist_ok=True)
CLS_MAP = {"maize":0,"sunflower":1,"sugarbeet":2}

def xml2yolo(file):
    tree = ET.parse(file)
    root = tree.getroot()
    w = int(root.find("size/width").text)
    h = int(root.find("size/height").text)
    lines = []
    for obj in root.findall("object"):
        cname = obj.find("name").text
        if cname not in CLS_MAP:continue
        cid = CLS_MAP[cname]
        b = obj.find("bndbox")
        x1,y1,x2,y2 = map(float,[b.find(i).text for i in ["xmin","ymin","xmax","ymax"]])
        cx,cy = (x1+x2)/2/w,(y1+y2)/2/h
        bw,bh = (x2-x1)/w,(y2-y1)/h
        lines.append(f"{cid} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}")
    return lines

for f in os.listdir(IN_XML):
    if f.endswith(".xml"):
        res = xml2yolo(os.path.join(IN_XML,f))
        with open(os.path.join(OUT_TXT,f.replace(".xml",".txt")),"w",encoding="utf8") as fp:
            fp.write("\n".join(res))
print("标注格式转换完成")

4.3 split_dataset.py 数据集分层拆分

场景注释:农业田间数据空间分布不均匀,固定随机种子+7:1:2拆分,保障训练/验证数据分布一致,科研复现与商用训练通用拆分方案

python 复制代码
import os,shutil,random
from sklearn.model_selection import train_test_split
random.seed(42)
IMG_DIR = "./dataset/images"
LABEL_DIR = "./dataset/labels"
SAVE_DIR = "./crop_split"
ratio_train,ratio_val,ratio_test = 0.7,0.1,0.2

def mkdir(base):
    for s in ["train","val","test"]:
        os.makedirs(f"{base}/{s}/images",exist_ok=1)
        os.makedirs(f"{base}/{s}/labels",exist_ok=1)
mkdir(SAVE_DIR)
img_list = [x for x in os.listdir(IMG_DIR) if x.endswith(("jpg","png"))]
tr,rest = train_test_split(img_list,train_size=ratio_train,random_state=42)
va,te = train_test_split(rest,train_size=ratio_val/(ratio_val+ratio_test),random_state=42)

for sp,imgs in zip(["train","val","test"],[tr,va,te]):
    for im in imgs:
        shutil.copy(os.path.join(IMG_DIR,im),f"{SAVE_DIR}/{sp}/images/{im}")
        lab = im[:im.rfind(".")]+".txt"
        if os.path.exists(os.path.join(LABEL_DIR,lab)):
            shutil.copy(os.path.join(LABEL_DIR,lab),f"{SAVE_DIR}/{sp}/labels/{lab}")
print(f"拆分:train{len(tr)} val{len(va)} test{len(te)}")

4.4 crop_data.yaml YOLO数据集配置文件

yaml 复制代码
path: ./crop_split
train: train/images
val: val/images
test: test/images
nc: 3
names:
  0: maize
  1: sunflower
  2: sugarbeet

4.5 train_crop.py YOLOv11模型训练

场景注释:选用v11-n轻量化模型适配无人机机载边缘部署;田间幼苗偏小,imgsz固定640,mosaic下调至0.5规避密集苗拼接失真,早停策略防止农业小样本过拟合

python 复制代码
from ultralytics import YOLO
if __name__ == "__main__":
    model = YOLO("yolov11n.pt")
    res = model.train(
        data="crop_data.yaml",
        epochs=65,
        imgsz=640,
        batch=8,
        mosaic=0.5,
        patience=10,
        device=0,
        project="./crop_train_out",
        name="seedling_det_v1"
    )
    metric = model.val()
    print(f"Val mAP@0.5:{metric.box.map50:.3f}")

4.6 calc_emerge.py 出苗率落地推理代码

场景注释:对接农田播种台账录入理论播种数量,AI自动统计出苗株数,一键换算地块出苗率,直接替代人工田间测产,是智慧农业项目落地核心业务代码

python 复制代码
from ultralytics import YOLO
def get_emerge(img_path,weight_path,total_seed):
    model = YOLO(weight_path)
    pred = model.predict(img_path,conf=0.3)
    real_seed = len(pred[0].boxes)
    rate = round(real_seed/total_seed*100,2)
    pred[0].save("./pred_out.jpg")
    return real_seed,rate

if __name__ == "__main__":
    real,rate = get_emerge("./drone_field.jpg","./crop_train_out/seedling_det_v1/weights/best.pt",1350)
    print(f"实测出苗{real}株,出苗率:{rate}%")

五、Model Index 模型测试指标

使用拆分后测试集评测最优权重best.pt

  1. mAP@0.5:92.7%;mAP@0.5:0.95:73.5%
  2. 玉米AP:93.2%、向日葵AP:91.8%、甜菜AP:90.5%
  3. 单图平均推理耗时(CPU):186ms,GPU(RTX4060):19ms,满足无人机实时边端测算需求

六、Application Direction 落地应用

  1. 大田播种验收:无人机全域航拍+AI批量出苗统计,万亩农田单日完成验收;
  2. 育种试验:多品种对比试验田自动出苗数据采集,减少人工试验统计工作量;
  3. 缺苗预警:出苗率低于品种阈值自动预警,指导农户补苗作业。

七、Future Work 迭代优化

  1. 数据集扩充:补充霜冻、病害、暴雨后田间样本,完善极端工况数据集;
  2. 模型优化:模型INT8量化+蒸馏,部署嵌入式无人机机载端;
  3. 多任务拓展:新增语义分割分支,同步识别杂草密度与裸土占比。
相关推荐
PILIPALAPENG1 小时前
gh:终端里的GitHub总控台,AI时代的开发者神器
前端·人工智能·后端
Csvn1 小时前
AI 辅助知识管理与学习优化
人工智能·ai编程
0X781 小时前
Windows 上 Codex Desktop 的 Chrome 和 Computer Use 插件不可用:一次完整排查与修复
人工智能·chatgpt·ai编程
zhangfeng11331 小时前
,在slurm中也能安装ubundu了,Singularity(现叫 Apptainer)不需要root权限的容器方案,对比docker
运维·人工智能·机器学习·docker·容器
jeffer_liu1 小时前
Spring AI 生产级实战:模型选择
java·人工智能·spring boot·后端·spring·语言模型·ai编程
fan65404141 小时前
AI搜索优化中的长尾词精准布局策略:以宠物眼科关键词为例
人工智能
Deepoch1 小时前
Deepoc VLA开发板:无人机群体协同与无网络自主作业核心
网络·人工智能·算法·无人机·deepoc·具身模型开发板
美狐美颜SDK开放平台1 小时前
直播软件开发+AI美颜SDK:下一代直播平台搭建方案
大数据·人工智能·实时音视频·美颜sdk·第三方美颜sdk
烬羽1 小时前
从零搭建AIGC应用:英伟达NIM + Node.js实战
深度学习