别再只用公开数据集了!我是如何用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.calcHistdef 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常见清洗问题解决方案模糊图像使用超分辨率模型ESRGAN提升画质遮挡问题通过CutMix数据增强生成部分遮挡样本类间差异小添加HSV色彩空间增强突显植物纹理特征3. 智能标注提升效率的关键技巧传统人工标注1176张图像需要约80工时。通过半自动流程我们将时间缩短到20小时标注工具对比工具优点缺点适用场景LabelImg界面简单支持VOC格式无自动预标注功能小规模精确标注CVAT支持视频标注部署复杂连续帧标注任务Prodigy主动学习降低标注量商业软件价格高迭代式标注流程我们的半自动标注流程使用预训练YOLOv5模型生成初始标注人工修正明显错误标注约30%需要修改对争议样本进行多人交叉验证最后用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_radius100), A.RandomRain(drop_length20) ]) augmented transform(imageimg)[image]增强效果评估 在YOLOv5m模型上测试表明合理的数据增强可以使mAP0.5提升17.2%特别是对少样本类别效果显著类别原始数据mAP增强后mAP提升幅度稗草0.580.7325.8%狗尾草0.620.7520.9%水稻0.810.843.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]版本控制策略每次数据更新生成新的版本号如v1.2.3使用DVC管理大文件版本为每个版本保存数据分布统计报告6. 实战中的避坑经验在三个月的数据集构建过程中我们积累了这些关键经验设备选择小米12S Ultra的2亿像素模式反而导致细节过度锐化iPhone 14 Pro的4800万像素RAW格式效果最佳标注争议处理建立三级仲裁机制普通标注员→项目经理→农学专家数据泄露预防对田间拍摄图片进行地理信息擦除长期维护每月添加5%的新样本保持数据新鲜度最后要提醒的是数据集构建不是一次性工作。我们持续维护的这套数据在过去一年已经迭代了7个版本模型性能也随之提升了41%。真正的智能农业需要活的数据生态系统支撑。