当前位置: 首页 > news >正文

别再只用公开数据集了!我是如何用Python爬虫+手机拍摄,攒出1176张农作物杂草图的

从零构建农作物杂草检测数据集:爬虫、拍摄与标注实战指南

1. 数据采集:突破公开数据集的局限

公开数据集往往难以满足特定场景需求。去年我在开发一个水稻田杂草识别系统时,发现现有公开数据集中杂草种类与本地农田差异巨大。于是决定自己动手构建数据集——最终整合了1176张高质量图像,涵盖8种常见杂草和3种主粮作物。

多源数据采集策略

  • 定向爬虫抓取:使用selenium模拟人类浏览行为,从农业科研图库中获取专业图像

    from selenium import webdriver from bs4 import BeautifulSoup driver = webdriver.Chrome() driver.get("https://example-agri-database.org") soup = BeautifulSoup(driver.page_source, 'html.parser') img_tags = soup.find_all('img', class_='crop-weed')
  • 移动端拍摄技巧

    • 选择上午9-11点光线柔和时段拍摄
    • 手机开启专业模式,固定ISO在100-200
    • 对焦时点击屏幕上的杂草主体
    • 每株植物从顶部、侧面各拍3张不同角度
  • 开源数据筛选:从PlantVillage等开源库中筛选符合要求的图像,注意检查授权协议

关键提示:建立采集日志记录每张图片的GPS坐标、拍摄时间和设备型号,这些元数据在后期的数据增强阶段非常有用

2. 数据清洗:打造高质量图像库

原始图像中存在30%的无效数据需要清理。我们开发了一套自动化清洗流程:

质量评估指标

指标阈值要求检测方法
清晰度>0.8 (Laplacian)OpenCV方差滤波
分辨率≥1024x768PIL.Image.size
目标占比≥15%画面面积标注后计算bounding box
光照均匀度直方图标准差<50cv2.calcHist
def check_image_quality(img_path): img = cv2.imread(img_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算清晰度 fm = cv2.Laplacian(gray, cv2.CV_64F).var() # 计算光照均匀度 hist = cv2.calcHist([gray],[0],None,[256],[0,256]) std_dev = np.std(hist) return fm > 0.8 and std_dev < 50

常见清洗问题解决方案

  1. 模糊图像:使用超分辨率模型ESRGAN提升画质
  2. 遮挡问题:通过CutMix数据增强生成部分遮挡样本
  3. 类间差异小:添加HSV色彩空间增强突显植物纹理特征

3. 智能标注:提升效率的关键技巧

传统人工标注1176张图像需要约80工时。通过半自动流程,我们将时间缩短到20小时:

标注工具对比

工具优点缺点适用场景
LabelImg界面简单,支持VOC格式无自动预标注功能小规模精确标注
CVAT支持视频标注部署复杂连续帧标注任务
Prodigy主动学习降低标注量商业软件价格高迭代式标注流程

我们的半自动标注流程

  1. 使用预训练YOLOv5模型生成初始标注
  2. 人工修正明显错误标注(约30%需要修改)
  3. 对争议样本进行多人交叉验证
  4. 最后用LabelStudio进行质量审查
# 使用YOLOv5生成预标注 python detect.py --weights yolov5s.pt --source ./raw_images/ --save-txt

经验分享:杂草与作物幼苗最难区分时,我们邀请农学专家参与制定了21条视觉判别规则,将标注一致率从68%提升到93%

4. 数据增强:小样本的逆袭策略

初始数据集仅1176张图像,通过智能增强扩展到9408张训练样本:

物理仿真增强方法

  • 光照模拟:根据拍摄时间生成不同色温版本
  • 土壤背景合成:使用GAN生成不同质地农田背景
  • 天气效果:添加雨滴、雾化等特效

代码实现示例

from albumentations import ( RandomRain, RandomShadow, RandomSunFlare ) transform = A.Compose([ A.RandomRotate90(), A.RandomShadow(shadow_roi=(0, 0.5, 1, 1)), A.RandomSunFlare(src_radius=100), A.RandomRain(drop_length=20) ]) augmented = transform(image=img)['image']

增强效果评估: 在YOLOv5m模型上测试表明,合理的数据增强可以使mAP@0.5提升17.2%,特别是对少样本类别效果显著:

类别原始数据mAP增强后mAP提升幅度
稗草0.580.73+25.8%
狗尾草0.620.75+20.9%
水稻0.810.84+3.7%

5. 格式转换与版本管理

实际项目中需要同时支持YOLO和Pascal VOC格式。我们开发了自动化转换工具:

目录结构设计

dataset/ ├── raw/ # 原始图像 ├── annotations/ # 统一标注存储 │ ├── yolo/ # YOLO格式 │ └── voc/ # VOC格式 ├── augmented/ # 增强后数据 └── dataset_version.json # 版本元数据

格式转换代码

def yolo_to_voc(yolo_bbox, img_w, img_h): x_center, y_center, w, h = yolo_bbox xmin = int((x_center - w/2) * img_w) xmax = int((x_center + w/2) * img_w) ymin = int((y_center - h/2) * img_h) ymax = int((y_center + h/2) * img_h) return [xmin, ymin, xmax, ymax]

版本控制策略

  1. 每次数据更新生成新的版本号(如v1.2.3)
  2. 使用DVC管理大文件版本
  3. 为每个版本保存数据分布统计报告

6. 实战中的避坑经验

在三个月的数据集构建过程中,我们积累了这些关键经验:

  • 设备选择:小米12S Ultra的2亿像素模式反而导致细节过度锐化,iPhone 14 Pro的4800万像素RAW格式效果最佳
  • 标注争议处理:建立三级仲裁机制,普通标注员→项目经理→农学专家
  • 数据泄露预防:对田间拍摄图片进行地理信息擦除
  • 长期维护:每月添加5%的新样本保持数据新鲜度

最后要提醒的是,数据集构建不是一次性工作。我们持续维护的这套数据在过去一年已经迭代了7个版本,模型性能也随之提升了41%。真正的智能农业需要活的数据生态系统支撑。

http://www.jsqmd.com/news/671304/

相关文章:

  • 别再只记命令了!Postfix+Dovecot邮件服务搭建背后的原理与排错思路(以麒麟系统为例)
  • 3分钟掌握WindowResizer:终极免费窗口尺寸强制调整工具,轻松突破任何应用程序限制
  • 魔兽世界GSE插件终极指南:告别复杂宏命令,实现智能一键输出
  • StructBERT零样本模型:AI万能分类器在新闻分类中的应用
  • Jetson Nano上jtop服务异常排查与修复实录
  • 别再手动合并乡镇边界了!用Mapshaper的dissolve命令5分钟搞定GeoJSON数据
  • 5分钟搞定视频字幕:VideoSrt开源字幕生成工具终极指南
  • SAC算法里的‘熵’到底在干嘛?深入聊聊Soft Actor-Critic中的探索与利用平衡艺术
  • 性价比高的减震器镀硬铬品牌盘点,全流程加工服务价格合理 - 工业品网
  • Move Mouse:Windows防休眠软件的终极解决方案,让电脑永远保持唤醒状态!
  • 从‘能用’到‘专业’:用Axure做原型,如何让你的设计稿看起来更值钱?
  • SystemVerilog覆盖率采样避坑指南:从sample()到@event,实战中到底怎么选?
  • Mendix实战:用Microflow搞定报名人数统计与自动计算结束日期(附完整微流配置)
  • Qt项目CMake配置避坑指南:手把手教你解决CLion中‘找不到Qt’、链接失败等常见错误
  • 终极指南:如何在foobar2000中配置开源歌词插件OpenLyrics
  • tao-8k快速上手:Xinference镜像5分钟部署教程,轻松处理长文档向量化
  • 在Ubuntu 22.04上从零安装FreeSurfer 7.2.0:一份给神经影像新手的保姆级避坑指南
  • 别再只配密码了!深入聊聊华为无线网络中802.1X认证的三大优势与部署考量
  • 5G NR DCI格式0_0/0_1详解:手把手教你读懂PUSCH调度指令(附38.212字段对照表)
  • 5分钟掌握魔兽世界智能宏:GSE宏编辑器让你告别手忙脚乱
  • 2026年有实力的行政纠纷律师团队推荐,聊聊北京万典律所靠谱吗 - 工业推荐榜
  • DeepSeek-R1-Distill-Qwen-1.5B量化方案对比:Q4_K_M vs Q3_K_S哪个更适合你?
  • 如何解决B站缓存视频无法播放问题:BilibiliCacheVideoMerge完整指南
  • 别再只盯着内存修改了:从《和平精英》《王者荣耀》看手游反外挂的‘诱饵’策略实战
  • Qwen3-ASR-1.7B部署教程:开箱即用Web界面+自动语言检测零代码调用
  • 保姆级教程:用‘外网预配,内网迁移’大法,搞定Jenkins插件离线安装与版本升级
  • 高通平台Android稳定性调试笔记:手把手教你用T32、Crash Utility分析Kernel Panic与RAM Dump
  • 避坑指南:K210与STM32串口通信,为什么你的数据总收不全?(解决\r\n和中断标志位问题)
  • 别再直接用欧氏距离了!用Python手把手教你实现标准化欧氏距离(附代码避坑)
  • PVZ Toolkit终极指南:如何轻松修改植物大战僵尸游戏体验