update:更新readme

This commit is contained in:
2026-04-14 08:57:29 +08:00
parent 10fd2b00d4
commit 987be5ad9b
4 changed files with 718 additions and 119 deletions

311
README.md
View File

@ -1,31 +1,36 @@
# 高光谱塑料分类工具
![CC BY-NC](https://i.creativecommons.org/l/by-nc/4.0/88x31.png)
[![Python Version](https://img.shields.io/badge/python-3.12%252B-blue)](https://www.python.org/)
[![Python Version](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org/)
## 基于高光谱成像和深度学习的微塑料材料分类与识别工具
### 功能特性
- 支持BIL格式高光谱数据读取和处理
- 使用UNet模型进行图像分割和掩膜生成
- 种塑料材料分类识别
- 使用Cellpose/UNet模型进行图像分割和掩膜生成
- 支持9种塑料材料分类识别ABS、HDPE、LDPE、PA6、PET、PP、PS、PTFE、PVC
- 二次分类支持HDPE/LDPE精细区分
- 背景校正和光谱特征提取
- 自动波长重采样(支持不同波段数的高光谱相机)
- 智能滤纸区域检测
- 输出ENVI标准格式分类结果
- 波段选择工具基于ANOVA F-score和LDA准则
- 滤纸背景样本光谱提取工具
### 安装
#### 前置要求
- Python 3.12
- Python 3.12+
- CUDA (可选用于GPU加速)
- 足够的内存处理高光谱数据
- 固态硬盘
- 足够的内存处理高光谱数据建议16GB+
- 固态硬盘(推荐,处理大文件时更高效)
#### 安装步骤
1. 克隆仓库:
```bash
git clone
cd hyperspec-plastic-classification
git clone <repository_url>
cd micro_plastic
```
2. 安装依赖:
@ -36,111 +41,214 @@
### 使用方法
#### 基本用法
#### 主程序:高光谱塑料分类
**基本用法**
```bash
python main.py --bil_path /path/to/input.bil --output_path /path/to/output --model_path /path/to/model.m
python main.py --bil_path /path/to/input.bil --output_path /path/to/output.dat --model_path /path/to/model.m
```
#### 参数说明
**参数说明**
| 参数 | 必需 | 默认值 | 描述 |
|-----------------|------|-----------------------------------------------------|--------------------------------|
| --bil_path | 是 | 无 | 输入BIL文件路径 |
| --output_path | 是 | 无 | 输出目录路径 |
| --model_path | 是 | 无 | 分类模型路径 |
| --unet_path | 否 | ./unet_pytorch/logs/best_epoch_weights.pth | UNet模型权重路径 |
| `--bil_path` | 是 | 无 | 输入BIL文件路径 |
| `--output_path` | 是 | 无 | 输出文件路径(.dat格式 |
| `--model_path` | 是 | 无 | 分类模型路径.m文件 |
#### 示例
**示例**
```bash
# 使用默认UNet权重
python main.py --bil_path ./data/input.bil --output_path ./results --model_path ./models/svm.m
# 指定所有参数
python main.py --bil_path ./data/input.bil --output_path ./results --model_path ./models/svm.m --unet_path ./custom_unet_weights.pth
# 基础用法
python main.py --bil_path ./data/input.bil --output_path ./results/output.dat --model_path ./models/svm.m
# Windows系统示例
python main.py --bil_path "C:\Users\HyperSpec\test\MPData2.bil" --output_path "C:\Users\HyperSpec\test" --model_path ".\classification_model\modelsave\svm.m" --unet_path ".\unet_pytorch\logs\best_epoch_weights.pth"
python main.py --bil_path "C:\Data\test.bil" --output_path "C:\Results\output.dat" --model_path ".\models\svm.m"
```
#### 波段选择工具
基于ANOVA F-score和LDA准则选择最优波段组合用于假彩色合成
```bash
python chose_bands.py --csv /path/to/spectral_data.csv --top_k 30 --top_triplets 10
```
**参数说明**
| 参数 | 必需 | 默认值 | 描述 |
|-------------------|------|--------|-----------------------------------------------|
| `--csv` | 是 | 无 | 输入CSV文件首列为类别其余为光谱列 |
| `--top_k` | 否 | 30 | 预筛选的最佳单波段数量 |
| `--top_triplets` | 否 | 10 | 输出的最佳三波段组合数量 |
| `--map_order` | 否 | auto | RGB映射顺序auto或wavelength_bgr |
#### 滤纸背景样本提取工具
从滤纸区域提取背景样本光谱(用于构建背景训练数据集):
```bash
python fliter_sample_spectral.py
```
该脚本需要修改内部路径配置:
- `bil_path_or_folder`: 输入BIL文件或目录路径
- `output_csv_path`: 输出CSV文件路径
- `num_masks`: 每个图像生成的背景样本数量默认50
- `rng_seed`: 随机种子,保证可复现性
### 项目结构
```
hyperspec-plastic-classification/
├── main.py # 主程序入口
micro_plastic/
├── main.py # 主程序入口(高光谱分类流程)
├── main_batch_nosample.py # 批量处理版本(无样本生成)
├── mainv1.py # 主程序历史版本
├── maintest.py # 测试版本
├── chose_bands.py # 波段选择工具
├── fliter_sample_spectral.py # 滤纸背景样本提取工具
├── bil2rgb.py # BIL转RGB模块
├── unet_pytorch/ # UNet模型相关
│ ├── predict_rgb.py
│ └── logs/
│ └── best_epoch_weights.pth # 预训练UNet权重
├── classification_model/ # 分类模型
│ └── Parallel/
│ └── predict_plastic.py
├── modelsave/
└── svm.m # 预训练分类模型
├── shape_spectral.py # 光谱特征提取
├── shape_spectral_background.py # 背景校正
├── shape_spectral.py # 光谱与形状特征提取
├── shape_spectral_background.py # 背景光谱计算
├── extact_shape.py # 形状特征提取与背景校正
├── mask.py # 图像分割与掩膜生成Cellpose
├── onlyspectral_background.py # 纯光谱背景处理
├── only_mask.py # 掩膜处理工具
├── get_glcm.py # GLCM纹理特征提取
├── outputs2dataframe.py # 结果转换为DataFrame
├── 多模型.py # 多模型集成工具
├── spectral_shape_class.py # 光谱形状分类工具
├── classification_model/ # 分类模型库
│ ├── Classification/ # 分类算法
│ │ ├── Cls.py # 主要分类接口SVM/RF/XGB等
│ │ ├── ClassicCls.py # 经典机器学习分类器
│ │ ├── ClassicClsHY.py # 经典分类器HY版本
│ │ ├── DeepCls.py # 深度学习分类器
│ │ ├── CNN.py # CNN模型
│ │ ├── CNN_SAE.py # CNN+SAE模型
│ │ ├── CNN_Transfomer.py # CNN+Transformer模型
│ │ ├── CNN_HYper.py # 超参数优化CNN
│ │ ├── CNN_deepseek.py # DeepSeek优化CNN
│ │ ├── SAE.py # 自编码器
│ │ └── *_网格搜索.py # 网格搜索优化版本
│ ├── WaveSelect/ # 波段选择算法
│ │ ├── Pca.py # 主成分分析
│ │ ├── Spa.py # 连续投影算法
│ │ ├── Spa_acc.py # 加速SPA
│ │ ├── GA.py # 遗传算法
│ │ ├── Cars.py # CARS算法
│ │ ├── ReliefF.py # ReliefF算法
│ │ ├── Uve.py # UVE算法
│ │ ├── MRMR.py # 最大相关最小冗余
│ │ ├── Lar.py # LARS算法
│ │ └── centry.py # 信息熵算法
│ ├── Preprocessing/ # 预处理
│ │ └── Preprocessing.py # 光谱预处理方法
│ ├── DataLoad/ # 数据加载
│ │ └── DataLoad.py # 数据加载接口
│ ├── Evaluate/ # 评估
│ │ └── RgsEvaluate.py # 回归评估指标
│ └── Parallel/ # 并行处理
│ ├── predict_plastic.py # 塑料分类预测接口
│ └── test.py # 测试脚本
├── modelsave/ # 预训练模型存储
│ └── svm.m # 默认SVM分类模型
├── requirements.txt # 项目依赖
└── README.md # 项目说明
```
![img.png](img.png)
### 输入输出格式
#### 输入文件格式
- BIL 格式高光谱数据文件 (.bil)
- 对应的 HDR 头文件 (.hdr)
- **BIL格式高光谱数据文件** (`.bil`)Band Interleaved by Line格式
- **HDR头文件** (`.hdr`):包含图像尺寸、波段数、波长等信息
#### 输出文件格式
- ENVI 分类结果文件 (.dat)
- ENVI 头文件 (.hdr)
- **ENVI分类结果文件** (`.dat`):分类结果图像
- **ENVI头文件** (`.hdr`):包含类别定义、像素大小等信息
**输出类别定义**
| 像素值 | 类别名称 | 说明 |
|--------|------------|--------------------|
| 0 | background | 背景/滤纸 |
| 1 | ABS | 丙烯腈-丁二烯-苯乙烯 |
| 2 | HDPE | 高密度聚乙烯 |
| 3 | LDPE | 低密度聚乙烯 |
| 4 | PA6 | 尼龙6 |
| 5 | PET | 聚对苯二甲酸乙二醇酯 |
| 6 | PP | 聚丙烯 |
| 7 | PS | 聚苯乙烯 |
| 8 | PTFE | 聚四氟乙烯 |
| 9 | PVC | 聚氯乙烯 |
### 处理流程
1. 读取BIL格式高光谱数据
2. 转换为RGB图像
3. 使用UNet模型生成掩膜
4. 提取光谱特征
5. 应用背景校正
6. 数据清理和过滤
7. 使用分类模型预测材料类型
8. 保存ENVI格式分类结果
1. **输入验证**检查BIL/HDR文件完整性验证波段数需≥160波段
2. **HDR补齐**:自动添加波长信息(如缺失)
3. **RGB生成**将BIL数据转换为RGB图像使用波段9, 59, 159
4. **图像分割**使用Cellpose生成微塑料掩膜和滤纸掩膜
5. **特征提取**:提取每个颗粒的光谱特征和形状特征
6. **背景校正**:用滤纸背景光谱对样本光谱进行校正
7. **波长重采样**如需要重采样到训练相机波长237通道
8. **数据清理**:过滤面积<500像素、轮廓点不足的样本
9. **主分类**使用SVM等模型进行9类分类
10. **二次分类**对HDPE/LDPE类别进行精细分类
11. **后处理**识别并修正类别7/8中的阴影误分类
12. **轮廓收缩**对轮廓进行1像素腐蚀避免相邻粘连
13. **结果保存**输出ENVI格式分类结果
### 支持的塑料类型
### 分类模型说明
工具支持以下塑料材料的分类:
#### 支持的分类器类型
| 类别编号 | 材料名称 |
|----------|----------|
| 1 | ABS |
| 2 | HDPE |
| 3 | LDPE |
| 4 | PA6 |
| 5 | PET |
| 6 | PP |
| 7 | PS |
| 8 | PTFE |
| 9 | PVC |
| 模型类型 | 说明 | 适用场景 |
|----------|-------------------------|----------------------|
| SVM | 支持向量机 | 小样本、高维特征 |
| RF | 随机森林 | 通用场景、特征重要性分析 |
| XGBoost | 极端梯度提升 | 大规模数据、高精度需求 |
| LightGBM | 轻量梯度提升 | 大规模数据、快速训练 |
| CNN | 卷积神经网络 | 深度特征学习 |
| SAE+CNN | 堆叠自编码器+CNN | 无监督预训练+微调 |
#### 波段选择算法
| 算法 | 说明 |
|----------|-----------------------------|
| PCA | 主成分分析降维 |
| SPA | 连续投影算法 |
| CARS | 竞争性自适应重加权采样 |
| GA | 遗传算法特征选择 |
| ReliefF | 基于实例的特征权重算法 |
| UVE | 无信息变量消除法 |
| MRMR | 最大相关最小冗余 |
### 依赖库
主要依赖的 Python 库:
**核心依赖**
- `numpy` - 数值计算
- `pandas` - 数据处理
- `opencv-python` - 图像处理
- `scikit-learn` - 机器学习
- `torch`/`torchvision` - 深度学习框架
- `spectral` - 高光谱数据处理
- `cellpose` - 细胞/颗粒分割通过mask.py集成
- `plantcv` - 植物/颗粒计算机视觉
- opencv-python
- numpy
- matplotlib
- pandas
- pywavelets
- scikit-learn
- torch
**其他重要依赖**
- `scipy` - 科学计算
- `matplotlib` - 可视化
- `PyWavelets` - 小波变换
- `joblib` - 模型序列化
- `tqdm` - 进度条
- `xgboost`/`lightgbm`/`catboost` - 梯度提升库
完整依赖请查看 `requirements.txt` 文件。
### 许可证
本项目采用 Creative Commons 非商业许可证。
完整依赖列表请查看 `requirements.txt`
### 训练相机波长
模型训练使用的237波段波长范围912.36nm - 1706.6nm),系统自动进行波长对齐和重采样。
### 常见问题
@ -150,22 +258,53 @@ hyperspec-plastic-classification/
2. **处理大型文件时内存不足**
考虑减少处理区域或增加系统内存
考虑减少处理区域或增加系统内存,建议使用固态硬盘。
3. **分类结果不准确**
3. **BIL文件波段数不足**
检查输入数据质量,确认模型是否适合当前数据类型
程序需要至少160个波段用于RGB生成且推荐237波段以获得最佳分类效果。
4. **分类结果不准确**
- 检查输入数据质量
- 确认HDR文件包含正确的波长信息
- 验证模型与当前数据类型匹配
5. **HDR文件缺少波长信息**
程序会自动检测并追加默认波长信息但建议提供完整的HDR文件。
### 开发计划
- [ ] 支持更多高光谱数据格式如ENVI、TIFF
- [ ] 添加可视化界面
- [ ] 集成更多深度学习模型
- [ ] 支持在线学习/增量学习
- [ ] 添加更多后处理选项
### 许可证
本项目采用 Creative Commons 非商业许可证 (CC BY-NC 4.0)。
### 联系方式
作者:[北京依锐思]
邮箱:[huilai_zhang@126.com](mailto:your.email@example.com)
项目地址:[https://github.com/yourusername/hyperspec-plastic-classification](https://github.com/yourusername/hyperspec-plastic-classification)
作者:北京依锐思
邮箱:[huilai_zhang@126.com](mailto:huilai_zhang@126.com)
项目地址:[https://github.com/yourusername/micro_plastic](https://github.com/yourusername/micro_plastic)
### 更新日志
- v1.0.0 (2025-08-26)
初始版本发布
- 支持BIL格式高光谱数据处理
- 集成UNet分割和SVM分类
- 输出ENVI格式分类结果
#### v1.1.0 (2026-04-14)
- 新增波段选择工具 `chose_bands.py`
- 新增滤纸背景样本提取工具 `fliter_sample_spectral.py`
- 优化波长重采样逻辑,支持更多高光谱相机
- 改进类别7/8的后处理阴影识别算法
- 添加轮廓收缩功能,避免相邻颗粒粘连
- 更新项目文档和结构说明
#### v1.0.0 (2025-08-26)
- 初始版本发布
- 支持BIL格式高光谱数据处理
- 集成Cellpose分割和SVM分类
- 输出ENVI格式分类结果
- 支持9种塑料材料分类