# wheat-count **Repository Path**: zihao0916/wheat-count ## Basic Information - **Project Name**: wheat-count - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-26 - **Last Updated**: 2026-04-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 小麦穗检测项目 这是一个基于 `Faster R-CNN` 的小麦穗目标检测项目,当前保留的核心流程只有三部分: - `src/train.py`:训练 - `src/predict.py`:单图/批量预测 - `test_project.py`:项目自检 详细的数据格式、目录放置方式和训练准备说明见: - [训练数据准备与目录说明](./docs/训练数据准备与目录说明.md) 当前代码已经支持两种标注输入: - 每图一个 `JSON` - 标准 `YOLO txt` 现在也支持本地 GUI 运行: - `app_gui.py`:本地 Flask 浏览器界面,支持单图预测和批量预测 ## 当前项目结构 ```text xiaomaosui-python/ ├── app_gui.py ├── config.yaml ├── requirements.txt ├── README.md ├── batch_split_input/ ├── batch_split_output/ ├── data/ │ ├── train/ │ │ ├── *.jpg|png │ │ └── annotations/*.json │ ├── val/ │ │ ├── *.jpg|png │ │ └── annotations/*.json │ └── test/ │ ├── *.jpg|png │ └── annotations/*.json ├── docs/ │ ├── 训练数据准备与目录说明.md │ └── 项目结构与文件说明.md ├── outputs/ │ ├── checkpoints/ │ ├── logs/ │ └── results/ ├── pic/ ├── src/ │ ├── data_loader.py │ ├── calculate_density.py # 兼容入口 │ ├── gui/ │ │ └── web_app.py │ ├── model.py │ ├── predict.py │ ├── split_folder.py # 兼容入口 │ ├── split_image.py # 兼容入口 │ └── train.py ├── tools/ │ ├── calculate_density.py │ ├── split_folder.py │ └── split_image.py └── test_project.py ``` ## 环境安装 ```bash cd /Users/wzh/Desktop/xiaomaosui-python python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` 如果你已经使用我配置好的环境,直接执行: ```bash cd /Users/wzh/Desktop/xiaomaosui-python source .venv/bin/activate ``` ## 自检 ```bash python test_project.py ``` ## 训练 ```bash python src/train.py ``` 如果需要指定配置文件: ```bash python src/train.py --config config.yaml ``` ## 预测 单张图像: ```bash python src/predict.py data/test/example.jpg outputs/checkpoints/best_model.pth ``` 如果想在 Python 里批量预测: ```python from src.predict import predict_batch results = predict_batch( image_dir="data/test", model_path="outputs/checkpoints/best_model.pth", output_dir="outputs/results", ) ``` ## 切图工具 如果你想把一张大图切成 `8` 张小图,方便后续逐张标注,可以直接运行: ```bash python src/split_image.py \ --image pic/DJI_20260412175301_0004_V.JPG \ --output-dir outputs/split_images ``` 默认是 `2 行 × 4 列 = 8 张`,并且会额外生成一份切片清单 CSV。 如果想保留原始扩展名: ```bash python src/split_image.py \ --image pic/DJI_20260412175301_0004_V.JPG \ --output-dir outputs/split_images \ --keep-original-format ``` ## 批量切图工具 如果你想固定裁剪一个文件夹里的所有图片,可以直接使用: ```bash python src/split_folder.py ``` 默认规则: - 输入文件夹:`batch_split_input/` - 输出文件夹:`batch_split_output/` - 默认每张图切成 `2 × 4 = 8` 张 使用步骤: 1. 把待裁剪原图放进 `batch_split_input/` 2. 运行 `python src/split_folder.py` 3. 去 `batch_split_output/` 查看结果 每张原图都会生成一个单独子文件夹,里面包含: - 8 张切片小图 - 1 个该图的切片坐标清单 CSV 批量执行后,`batch_split_output/` 根目录还会额外生成: - `batch_split_summary.csv` ## 穗密度换算工具 如果你想把“当前图片里的穗数”进一步换算成 `ears/m²`,可以直接使用: ```bash python src/calculate_density.py \ --image pic/DJI_20260412175301_0004_V.JPG \ --count 120 ``` 如果你已经训练好了模型,也可以让脚本自动先预测穗数,再换算密度: ```bash python src/calculate_density.py \ --image pic/DJI_20260412175301_0004_V.JPG \ --model-path outputs/checkpoints/best_model.pth ``` 批量处理整个文件夹: ```bash python src/calculate_density.py \ --folder pic \ --model-path outputs/checkpoints/best_model.pth ``` 如果你已经知道这张图对应的小区面积,也可以直接按面积换算: ```bash python src/calculate_density.py \ --image pic/DJI_20260412175301_0004_V.JPG \ --count 120 \ --plot-area-m2 0.50 ``` 这个工具会: - 读取图片尺寸 - 优先读取图片 EXIF 里的高度和焦距 - 自动估算图像覆盖地面面积 - 输出每张图的 `穗数 / 地面面积 = ears/m²` - 结果保存到 `outputs/results/ear_density_results.csv` 如果你觉得 EXIF 高度不是相对冠层高度,也可以手动覆盖: ```bash python src/calculate_density.py \ --image pic/DJI_20260412175301_0004_V.JPG \ --count 120 \ --height-m 17.0 ``` 如果你想完全按公式手动指定参数,也支持直接传: - `H`:`--height-m` - `S_w`:`--sensor-width-mm` - `f`:`--focal-mm` - `I_w`:默认自动读取,也可以用 `--image-width-px` 手动覆盖 示例: ```bash python src/calculate_density.py \ --image pic/DJI_20260412175301_0004_V.JPG \ --count 120 \ --height-m 17.0 \ --sensor-width-mm 6.4 \ --focal-mm 29.85 ``` 如果你还想把图像像素宽高也完全手动指定: ```bash python src/calculate_density.py \ --image pic/DJI_20260412175301_0004_V.JPG \ --count 120 \ --height-m 17.0 \ --sensor-width-mm 6.4 \ --sensor-height-mm 4.8 \ --focal-mm 29.85 \ --image-width-px 4000 \ --image-height-px 3000 ``` ## GUI 运行 启动本地图形界面: ```bash python app_gui.py ``` GUI 支持: - 选择模型文件和配置文件 - 选择单张图片进行预测并显示结果图 - 上传多张图片或填写本地文件夹做批量预测 - 在页面中直接显示穗数、估算地面面积和 `ears/m²` - 支持手动输入 `H / S_w / f / I_w / I_h` 覆盖默认换算参数 - 也支持直接输入“小区面积 (m²)”,按面积直接换算穗密度 - 自动导出带框图片、`batch_results.csv` 和 `batch_density_results.csv` 运行后会自动在浏览器打开本地页面,默认地址是: ```text http://127.0.0.1:7860 ``` ## 保留和删除说明 本次已经删除这些明显过时或无实际用途的文件: - `write_loader.py` - `test_with_real_images.py` - `output.txt` - `DEPENDENCY_FIX_COMPLETED.md` 这些文件要么是空文件,要么和当前训练/预测接口不兼容,继续保留只会增加混乱。