- 本仓库暂不附带完整数据集,原因:体量较大(数十万张图片,多模态标注)。
- 我们将于近期在 Hugging Face Hub 发布公开版本的数据集(含 JSONL 索引与示例)。
- 发布后会在本 README 置顶更新下载链接与获取方式:
https://huggingface.co/datasets/<org>/<dataset_name>(占位)。 - 目前可使用
data.sample.jsonl与配套脚本复现流程或自建数据;完整结构与规范见docs/documentation.md。
从单一的图像分类到丰富的多模态理解
传统农业数据集仅提供 图像 + 标签,而本项目构建的是一个完整的知识库:
传统数据集: 🖼️ Image → 🏷️ Label
本项目: 🖼️ Image → 📝 Caption → 💬 VQA → 🏷️ Structured Labels → 🔍 Traceability
|
|
|
|
| 🏗️ 统一本体 | 🔍 质量控制 | 🚀 自动化 | 📊 可视化 |
|---|---|---|---|
| 跨数据源 标准化体系 |
感知哈希 模糊检测 |
一键式 处理流程 |
Web界面 人工审核 |
| 中英双语 学名映射 |
尺寸过滤 LLM验证 |
并发处理 高效能 |
实时统计 进度追踪 |
🌱 作物 (Crops) 📊 140+ 类别 🖼️ 80,000+ 张
🐛 害虫 (Pests) 📊 30+ 类别 🖼️ 15,000+ 张
🍂 病害 (Diseases) 📊 50+ 类别 🖼️ 120,000+ 张
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📦 总计 📊 220+ 类别 🖼️ 215,000+ 张
| 数据源 | 类型 | 特点 | 标识 |
|---|---|---|---|
| 🏛️ PlantDoc | 专业数据集 | 植物病害,高质量标注 | pd |
| 🏆 Kaggle | 竞赛数据集 | 多源聚合,品类丰富 | kaggle |
| 🌍 GBIF/iNaturalist | 生物学数据库 | 学名准确,专业级 | web |
| 📷 Unsplash | 高质量图片 | 美学优秀,通用场景 | web |
📦 1. 安装依赖
# 克隆项目
git clone https://github.com/your-repo/dataset_web.git
cd dataset_web
# 安装依赖
pip install -r requirements.txt⚙️ 2. 配置环境(可选)
# 创建配置文件(用于LLM增强功能)
cat > .env << EOF
VLM_API_KEY=sk-your-api-key-here
VLM_API_BASE=https://xmdbd.online/v1
VLM_MODEL=gemini-2.5-flash
VLM_WORKERS=8
EOF
# 载入环境变量
export $(grep -v '^#' .env | xargs)🎬 3. 运行演示
# 统计当前数据集
python3 scripts/03_cleaning/count_images_by_class.py \
--roots datasets/diseases datasets/crops datasets/pests
# 查看示例数据
head -n 5 data.sample.jsonl | jqgraph LR
A[📥 数据采集] --> B[🏷️ 标准化]
B --> C[🔍 质量控制]
C --> D[🤖 LLM增强]
D --> E[✅ 人工审核]
E --> F[📊 生成索引]
style A fill:#e1f5ff
style B fill:#fff4e1
style C fill:#ffe1e1
style D fill:#f0e1ff
style E fill:#e1ffe1
style F fill:#ffe1f0
# 合并已有数据集
python3 scripts/02_ingest_and_merge/merge_crop_diseases.py
python3 scripts/02_ingest_and_merge/merge_140_crops.py
python3 scripts/02_ingest_and_merge/merge_kaggle_disease.py |
# GBIF/iNaturalist 爬虫
cd web_scraper
scrapy crawl agri_sites \
-a keywords_file=keywords.txt \
-a max_api_results=150 |
📝 文件名标准化
python3 scripts/03_cleaning/bulk_rename_by_class.py \
--root datasets/diseases \
--tag pd命名规范: <类别>__<来源>__<uuid>.<ext>
示例: corn_rust_leaf__pd__a3f2e1b9.jpg
🔍 智能去重与过滤
python3 scripts/03_cleaning/deduplicate_images.py \
--roots datasets/diseases datasets/crops datasets/pests \
--min-width 224 --min-height 224 \
--blur-method both \
--blur-threshold 60 \
--tenengrad-threshold 700 \
--ham-threshold 3 \
--near-scope class \
--action move| 检测算法 | 阈值 | 说明 |
|---|---|---|
| 🖼️ 感知哈希 | ≤3 | 基于视觉相似度的去重 |
| 📐 平均哈希 | ≤3 | 快速粗粒度去重 |
| 🌫️ Laplacian | <60 | 检测模糊图像 |
| 🔬 Tenengrad | <700 | 梯度方差模糊检测 |
| 📏 尺寸过滤 | 224×224 | 最小分辨率要求 |
👁️ 人工审核界面
# 启动Web审核服务器
python3 scripts/03_cleaning/pest_review_server.py \
--root web_scraper/scraped_images
# 浏览器打开审核页面
open docs/pest_manual_review.html特性:
- ✅ 可视化批量审核
- ✅ 按类别分组查看
- ✅ 快速标记通过/剔除
- ✅ 导出审核结果JSON
🤖 语义验证与描述增强
# 干跑模式(仅日志,不修改文件)
python3 llm_tools/verify_and_describe.py \
--root datasets/diseases \
--action dry-run \
--workers 8
# 实际运行
python3 llm_tools/verify_and_describe.py \
--root datasets/diseases \
--model gemini-2.5-flash \
--workers 8 \
--insecure工作流程:
graph TD
A[📁 输入图片] --> B{🤖 LLM验证}
B -->|✅ 匹配| C[生成描述.json]
B -->|❌ 不匹配| D[移至.rejected_by_llm/]
C --> E[📊 用于build_jsonl]
D --> F[👁️ 人工复审]
📊 生成JSONL数据索引
python3 scripts/05_index_and_stats/build_jsonl.py \
--roots datasets/diseases datasets/crops datasets/pests \
--out data.jsonl \
--train 0.8 --val 0.1 --test 0.1 \
--seed 42输出格式:
{
"image": "datasets/diseases/corn_rust_leaf__pd__a3f2e1b9.jpg",
"task": "caption",
"text": "这是一张玉米锈病叶片的照片。This is a photo of corn rust leaf.",
"split": "train",
"labels": {
"category": "diseases",
"crop": "corn",
"disease": "rust",
"source": "pd",
"class": "corn rust leaf"
}
}| 类别 | 脚本 | 功能 | 关键参数 |
|---|---|---|---|
| 📦 数据合并 | merge_crop_diseases.py |
合并Crop Diseases数据集 | - |
merge_140_crops.py |
合并140 Crops数据集 | - | |
merge_kaggle_disease.py |
合并Kaggle病害数据集 | - | |
| 🔧 数据处理 | bulk_rename_by_class.py |
批量规范化文件名 | --root --tag |
deduplicate_images.py |
智能去重与质量过滤 | --roots --action |
|
count_images_by_class.py |
统计各类别数量 | --roots |
|
| 👁️ 审核工具 | pest_review_server.py |
启动Web审核服务器 | --root --port |
generate_pest_review_manifest.py |
生成审核清单 | --root --out |
|
import_reviewed_pests.py |
导入审核通过的数据 | --review-json --tag |
|
| 🤖 AI增强 | verify_and_describe.py |
LLM语义验证与描述增强 | --root --workers |
build_jsonl.py |
生成JSONL索引 | --roots --out |
💡 提示: 所有脚本均支持
--help查看详细用法
dataset_web/
├── 📦 datasets/ # 数据集主目录
│ ├── 🌱 crops/ # 作物图像 (140+ 类别)
│ ├── 🐛 pests/ # 害虫图像 (30+ 类别)
│ └── 🍂 diseases/ # 病害图像 (50+ 类别)
│
├── 🛠️ scripts/ # 数据处理与流水线脚本(分阶段)
│ ├── 01_scraping/ # 图片抓取与爬虫编排
│ ├── 02_ingest_and_merge/ # 外部数据集下载与合并
│ ├── 03_cleaning/ # 命名标准化、去重与质量清洗
│ ├── 04_llm_enhancement/ # LLM 任务监控与队列管理
│ └── 05_index_and_stats/ # JSONL 索引生成与统计报告
│
├── 🤖 llm_tools/ # LLM增强工具
│ ├── verify_and_describe.py # 语义验证
│ └── README.md # 详细文档
│
├── 🕷️ web_scraper/ # 网络爬虫
│ ├── spiders/ # Scrapy爬虫集合
│ │ ├── agri_sites.py # GBIF/iNaturalist
│ │ └── unsplash_api.py # Unsplash API
│ └── scraped_images/ # 爬取图片暂存
│
├── 📚 docs/ # 项目文档
│ ├── documentation.md # 核心知识库
│ └── pest_manual_review.html # 审核界面
│
├── 🗺️ mappings/ # 类别映射表
│ ├── crop_mappings.json # 作物映射
│ ├── disease_mappings.json # 病害映射
│ └── pest_mappings.json # 害虫映射
│
├── 📊 data.jsonl # 完整数据索引 (215K+ 条)
├── 📋 data.sample.jsonl # 示例数据
└── 📄 requirements.txt # Python依赖
Q1: 如何添加新的数据源?
- 将数据复制到临时目录
- 使用
bulk_rename_by_class.py规范化(指定新--tag) - 运行
deduplicate_images.py去重 - 可选:运行 LLM 语义验证
- 运行
build_jsonl.py更新索引
Q2: LLM拒绝的图片如何处理?
被拒绝的图片会移至 .rejected_by_llm/ 目录:
- 人工复审: 检查是否误判
- 恢复误判: 将误判图片移回原位
- 删除确认: 确认正确拒绝的可删除
Q3: 如何自定义Caption模板?
编辑 scripts/05_index_and_stats/build_jsonl.py:
make_caption_samples()- Caption生成逻辑make_vqa_samples()- VQA生成逻辑
如存在 .json 元数据(LLM生成),会优先使用。
Q4: 如何保证爬虫数据质量?
推荐流程:
- ✅ 使用专业数据源(GBIF优于通用搜索)
- ✅ 运行
deduplicate_images.py质量过滤 - ✅ Web界面人工抽查审核
- ✅ 可选LLM语义验证
Q5: 如何调整并发和超时?
通过环境变量配置:
export VLM_WORKERS=8 # 并发线程数
export VLM_TIMEOUT=120 # API超时(秒)
export VLM_VERIFY_SSL=false # 禁用SSL验证或命令行参数:--workers 8 --timeout 120 --insecure
我们欢迎任何形式的贡献!
|
发现bug?请提交 Issue |
有好想法?欢迎讨论 Discussions |
Fork → 修改 → 提交 Pull Request |
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本项目采用 MIT License 开源。
- 请遵守各数据源的原始许可证条款
- 本项目仅用于学术研究目的
- 商业使用前请确认合规性
|
|