416 lines
12 KiB
Markdown
416 lines
12 KiB
Markdown
# 高光谱塑料分类工具 - 项目交接文档
|
||
|
||
---
|
||
|
||
## 一、项目概述
|
||
|
||
### 1.1 项目基本信息
|
||
| 项目属性 | 内容 |
|
||
|---------|------|
|
||
| **项目名称** | 高光谱塑料分类工具 (Hyperspectral Plastic Classification) |
|
||
| **项目目的** | 基于高光谱成像和深度学习的微塑料材料分类与识别 |
|
||
| **开发语言** | Python 3.12 |
|
||
| **当前版本** | v1.0.0 (2025-08-26) |
|
||
| **许可证** | Creative Commons 非商业许可证 |
|
||
|
||
### 1.2 核心功能
|
||
- 支持BIL格式高光谱数据读取和处理
|
||
- 使用UNet模型进行图像分割和掩膜生成
|
||
- 支持9种塑料材料分类识别
|
||
- 背景校正和光谱特征提取
|
||
- 输出ENVI标准格式分类结果
|
||
|
||
### 1.3 支持的塑料类型
|
||
|
||
| 类别编号 | 材料名称 | 英文缩写 |
|
||
|---------|---------|---------|
|
||
| 1 | 丙烯腈-丁二烯-苯乙烯共聚物 | ABS |
|
||
| 2 | 高密度聚乙烯 | HDPE |
|
||
| 3 | 低密度聚乙烯 | LDPE |
|
||
| 4 | 尼龙6 | PA6 |
|
||
| 5 | 聚对苯二甲酸乙二醇酯 | PET |
|
||
| 6 | 聚丙烯 | PP |
|
||
| 7 | 聚苯乙烯 | PS |
|
||
| 8 | 聚四氟乙烯 | PTFE |
|
||
| 9 | 聚氯乙烯 | PVC |
|
||
|
||
---
|
||
|
||
## 二、项目结构
|
||
|
||
```
|
||
micro_plastic/
|
||
├── main.py # 主程序入口(核心流程)
|
||
├── fliter_sample_spectral.py # 滤纸背景样本光谱提取工具
|
||
├── bil2rgb.py # BIL转RGB模块
|
||
├── mask.py # 图像分割/掩膜生成
|
||
├── shape_spectral.py # 光谱特征提取
|
||
├── shape_spectral_background.py # 背景校正计算
|
||
├── extact_shape.py # 特征提取工具(含二次分类背景校正)
|
||
├── chose_bands.py # 波段选择工具
|
||
├── get_glcm.py # GLCM纹理特征提取
|
||
├── only_mask.py # 仅掩膜处理
|
||
├── spectral_shape_class.py # 光谱形状分类
|
||
├── main_batch_nosample.py # 批量处理(无样本)
|
||
├── maintest.py / mainv1.py # 测试/旧版本入口
|
||
├── 多模型.py # 多模型处理脚本
|
||
├── time.py # 时间相关工具
|
||
├── outputs2dataframe.py # 输出转换工具
|
||
├── bil2rgb.py # BIL转RGB工具
|
||
|
||
├── classification_model/ # 分类模型模块
|
||
│ ├── Classification/ # 分类算法
|
||
│ │ ├── ClassicCls.py # 经典分类器
|
||
│ │ ├── ClassicClsHY.py # 经典分类器(优化版)
|
||
│ │ ├── ClassicCls_网格搜索.py # 网格搜索参数优化
|
||
│ │ ├── Cls.py # 基础分类器
|
||
│ │ ├── Cls_网格搜索.py # 分类器网格搜索
|
||
│ │ ├── Cls_超参数.py # 超参数调优
|
||
│ │ ├── DeepCls.py # 深度学习分类器
|
||
│ │ ├── CNN.py # CNN模型
|
||
│ │ ├── CNN_deepseek.py # DeepSeek优化CNN
|
||
│ │ ├── CNN_HYper.py # 超参数CNN
|
||
│ │ ├── CNN_SAE.py # CNN+SAE模型
|
||
│ │ ├── CNN_Transfomer.py # CNN+Transformer
|
||
│ │ ├── SAE.py # 堆叠自编码器
|
||
│ │ └── CNN_网格搜索.py # CNN网格搜索
|
||
│ │
|
||
│ ├── WaveSelect/ # 波长选择算法
|
||
│ │ ├── WaveSelcet.py # 主入口
|
||
│ │ ├── Cars.py # CARS算法
|
||
│ │ ├── GA.py # 遗传算法
|
||
│ │ ├── Lar.py # LARS算法
|
||
│ │ ├── MRMR.py # 最大相关最小冗余
|
||
│ │ ├── Pca.py # 主成分分析
|
||
│ │ ├── ReliefF.py # ReliefF算法
|
||
│ │ ├── Spa.py # SPA算法
|
||
│ │ ├── Spa_acc.py # SPA精确版
|
||
│ │ └── Uve.py # UVE算法
|
||
│ │
|
||
│ ├── DataLoad/ # 数据加载
|
||
│ │ └── DataLoad.py # 数据加载器
|
||
│ │
|
||
│ ├── Preprocessing/ # 预处理
|
||
│ │ └── Preprocessing.py # 数据预处理
|
||
│ │
|
||
│ ├── Evaluate/ # 模型评估
|
||
│ │ └── RgsEvaluate.py # 回归评估
|
||
│ │
|
||
│ └── Parallel/ # 并行处理/预测
|
||
│ ├── predict_plastic.py # 塑料预测主入口
|
||
│ └── test.py # 测试脚本
|
||
│
|
||
├── README.md # 项目说明文档
|
||
├── requirements.txt # Python依赖列表
|
||
└── 项目交接文档.md # 本文件
|
||
```
|
||
|
||
---
|
||
|
||
## 三、技术栈与依赖
|
||
|
||
### 3.1 核心依赖库
|
||
|
||
| 库名称 | 版本 | 用途 |
|
||
|--------|------|------|
|
||
| torch | 2.8.0 | 深度学习框架 |
|
||
| torchvision | 0.23.0 | 图像处理工具 |
|
||
| opencv-python | 4.12.0 | 计算机视觉 |
|
||
| numpy | 2.2.6 | 数值计算 |
|
||
| pandas | - | 数据处理 |
|
||
| scikit-learn | 1.6.1 | 机器学习 |
|
||
| scipy | 1.15.3 | 科学计算 |
|
||
| matplotlib | 3.10.3 | 数据可视化 |
|
||
| spectral | - | 高光谱数据处理 |
|
||
| PyWavelets | 1.8.0 | 小波变换 |
|
||
| plantcv | - | 植物/图像分析 |
|
||
|
||
### 3.2 完整依赖安装
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
---
|
||
|
||
## 四、核心流程说明
|
||
|
||
### 4.1 主程序处理流程 (main.py)
|
||
|
||
```
|
||
1. 读取BIL格式高光谱数据
|
||
↓
|
||
2. 转换为RGB图像 (bil2rgb.py)
|
||
↓
|
||
3. 使用分割模型生成掩膜 (mask.py)
|
||
├─ 微塑料掩膜
|
||
└─ 滤纸背景掩膜
|
||
↓
|
||
4. 提取光谱特征 (shape_spectral.py)
|
||
↓
|
||
5. 计算背景光谱并校正 (shape_spectral_background.py)
|
||
↓
|
||
6. 数据清理和过滤
|
||
├─ 去NA值
|
||
├─ 过滤轮廓点数不足样本
|
||
└─ 过滤面积<500像素的样本
|
||
↓
|
||
7. 主要分类 (classification_model.Parallel.predict_plastic)
|
||
↓
|
||
8. 二次分类(HDPE/LDPE精细分类)
|
||
↓
|
||
9. 后处理类别7/8阴影识别
|
||
↓
|
||
10. 保存ENVI格式分类结果
|
||
```
|
||
|
||
### 4.2 关键参数配置
|
||
|
||
#### 训练相机波长(237通道,912.36-1706.6nm)
|
||
```python
|
||
TRAIN_WAVELENGTHS = [912.36, 915.68, 919, ..., 1703.3, 1706.6]
|
||
```
|
||
|
||
#### 分类处理参数
|
||
- **主模型类型**: SVM
|
||
- **预处理方法1**: SS (Spectral Standardization)
|
||
- **预处理方法2**: None
|
||
|
||
#### 分割参数
|
||
- `flow_threshold`: 0.4
|
||
- `cellprob_threshold`: -1
|
||
- `filter_method`: 'threshold'
|
||
|
||
---
|
||
|
||
## 五、使用方法
|
||
|
||
### 5.1 基本用法
|
||
|
||
```bash
|
||
python main.py --bil_path /path/to/input.bil --output_path /path/to/output --model_path /path/to/model.m
|
||
```
|
||
|
||
### 5.2 参数说明
|
||
|
||
| 参数 | 必需 | 默认值 | 描述 |
|
||
|------|------|--------|------|
|
||
| `--bil_path` | 是 | 无 | 输入BIL文件路径 |
|
||
| `--output_path` | 是 | 无 | 输出目录路径 |
|
||
| `--model_path` | 是 | 无 | 主分类模型路径 |
|
||
| `--unet_path` | 否 | ./unet_pytorch/logs/best_epoch_weights.pth | UNet模型权重路径 |
|
||
|
||
### 5.3 使用示例
|
||
|
||
```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
|
||
|
||
# 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"
|
||
```
|
||
|
||
### 5.4 滤纸背景样本提取 (fliter_sample_spectral.py)
|
||
|
||
```python
|
||
# 处理单个文件或文件夹
|
||
bil_path_or_folder = r"D:\Data\Traindata-11"
|
||
output_csv_path = r"E:\plastic\plastic\output\滤纸样本光谱\11.csv"
|
||
num_masks = 50 # 生成的背景样本数量
|
||
rng_seed = 42 # 随机种子,保证可复现
|
||
```
|
||
|
||
---
|
||
|
||
## 六、输入输出格式
|
||
|
||
### 6.1 输入文件格式
|
||
|
||
| 文件类型 | 扩展名 | 说明 |
|
||
|---------|--------|------|
|
||
| 高光谱数据 | .bil | BIL格式高光谱数据 |
|
||
| 头文件 | .hdr | 对应的ENVI头文件 |
|
||
|
||
**HDR文件关键字段:**
|
||
```
|
||
samples = 1024 # 列数
|
||
lines = 1024 # 行数
|
||
bands = 237 # 波段数
|
||
wavelength = {912.36, 915.68, ...} # 波长列表
|
||
```
|
||
|
||
### 6.2 输出文件格式
|
||
|
||
| 文件类型 | 扩展名 | 说明 |
|
||
|---------|--------|------|
|
||
| 分类结果 | .dat | ENVI分类结果数据 |
|
||
| 头文件 | .hdr | ENVI头文件(含类别定义)|
|
||
|
||
**输出HDR示例:**
|
||
```
|
||
ENVI
|
||
description = {Classification Result.}
|
||
samples = 1024
|
||
lines = 1024
|
||
bands = 1
|
||
classes = 10
|
||
class = { background, ABS, HDPE, LDPE, PA6, PET, PP, PS, PTFE, PVC }
|
||
data type = 2 # 16-bit整数
|
||
```
|
||
|
||
---
|
||
|
||
## 七、关键代码模块详解
|
||
|
||
### 7.1 main.py - 主流程控制
|
||
|
||
**核心函数:**
|
||
- `validate_inputs()` - 输入验证
|
||
- `generate_rgb()` - RGB生成
|
||
- `run_segmentation()` - 图像分割
|
||
- `extract_primary_features()` - 特征提取
|
||
- `compute_background_spectrum()` - 背景计算
|
||
- `apply_background_and_optional_resample()` - 背景校正+重采样
|
||
- `run_primary_classification()` - 主要分类
|
||
- `run_secondary_classification_if_needed()` - 二次分类
|
||
- `postprocess_class7_shadow()` - 阴影后处理
|
||
|
||
### 7.2 mask.py - 图像分割
|
||
|
||
**功能:**
|
||
- 微塑料颗粒检测
|
||
- 滤纸背景区域识别
|
||
- 返回微塑料掩膜和滤纸掩膜
|
||
|
||
**关键参数:**
|
||
- `flow_threshold`: 流动阈值
|
||
- `cellprob_threshold`: 细胞概率阈值
|
||
|
||
### 7.3 shape_spectral.py - 光谱特征提取
|
||
|
||
**功能:**
|
||
- 从BIL数据提取光谱特征
|
||
- 计算形状特征(轮廓、面积等)
|
||
- 使用PlantCV库
|
||
|
||
### 7.4 shape_spectral_background.py - 背景校正
|
||
|
||
**功能:**
|
||
- 计算滤纸背景光谱
|
||
- 用于后续背景校正
|
||
|
||
### 7.5 classification_model.Parallel.predict_plastic - 分类预测
|
||
|
||
**功能:**
|
||
- 加载训练好的模型
|
||
- 特征标准化
|
||
- 预测塑料类别
|
||
|
||
---
|
||
|
||
## 八、注意事项与常见问题
|
||
|
||
### 8.1 系统要求
|
||
- **Python版本**: 3.12+
|
||
- **内存**: 足够处理高光谱数据(建议16GB+)
|
||
- **存储**: 建议使用固态硬盘
|
||
- **GPU**: 可选,用于加速(CUDA支持)
|
||
|
||
### 8.2 常见问题
|
||
|
||
#### Q1: 运行时报错"ModuleNotFoundError"
|
||
**解决:** 确保已安装所有依赖
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
#### Q2: 处理大型文件时内存不足
|
||
**解决:**
|
||
- 考虑减少处理区域
|
||
- 增加系统内存
|
||
- 分批处理数据
|
||
|
||
#### Q3: 分类结果不准确
|
||
**解决:**
|
||
- 检查输入数据质量
|
||
- 确认模型是否适合当前数据类型
|
||
- 验证波长范围是否匹配
|
||
|
||
#### Q4: BIL文件波段数不足
|
||
**解决:** 确保输入文件至少有160个波段(RGB生成需要索引9, 59, 159)
|
||
|
||
#### Q5: 特征维度不匹配错误
|
||
**解决:**
|
||
- 检查模型对应的`scaler_params.pkl`是否存在
|
||
- 确认训练时和预测时的特征维度一致
|
||
|
||
### 8.3 重要注意事项
|
||
|
||
1. **波长对齐**: 系统会自动检测输入波长与训练波长(237通道)是否匹配,不匹配时会自动重采样
|
||
2. **背景校正**: 使用滤纸区域光谱作为背景进行除法校正
|
||
3. **轮廓收缩**: 输出前会自动收缩轮廓1像素,避免颗粒相连
|
||
4. **阴影处理**: 类别7/8会进行阴影检测,低对比度区域会被标记为背景
|
||
|
||
---
|
||
|
||
## 九、模型文件说明
|
||
|
||
### 9.1 模型文件位置
|
||
```
|
||
classification_model/modelsave/
|
||
├── svm.m # 主分类模型(SVM)
|
||
├── scaler_params.pkl # 标准化参数
|
||
└── HDPELDPE_model/
|
||
└── svm.m # HDPE/LDPE二次分类模型
|
||
```
|
||
|
||
### 9.2 支持的模型类型
|
||
- SVM (支持向量机)
|
||
- Random Forest (随机森林)
|
||
- XGBoost/LightGBM (梯度提升)
|
||
- CNN (卷积神经网络)
|
||
- SAE+CNN (堆叠自编码器+CNN)
|
||
|
||
---
|
||
|
||
## 十、开发历史与版本记录
|
||
|
||
### v1.0.0 (2025-08-26)
|
||
- 初始版本发布
|
||
- 支持BIL格式高光谱数据处理
|
||
- 集成UNet分割和SVM分类
|
||
- 输出ENVI格式分类结果
|
||
- 支持9种塑料材料分类
|
||
|
||
---
|
||
|
||
## 十一、联系方式
|
||
|
||
| 项目 | 信息 |
|
||
|------|------|
|
||
| **作者** | 北京依锐思 |
|
||
| **邮箱** | huilai_zhang@126.com |
|
||
|
||
---
|
||
|
||
## 十二、待优化/已知问题
|
||
|
||
### 12.1 已知限制
|
||
1. 输入BIL文件波段数需≥160(RGB生成需求)
|
||
2. 滤纸检测依赖于阈值方法,对非标准滤纸可能需要调整参数
|
||
3. 二次分类仅针对HDPE/LDPE
|
||
|
||
### 12.2 建议改进方向
|
||
1. 增加更多二次分类场景(如PP/PS等易混淆材料)
|
||
2. 优化内存使用,支持更大文件流式处理
|
||
3. 添加GUI界面便于非技术用户使用
|
||
4. 增加批处理脚本的配置化能力
|
||
|
||
---
|
||
|
||
**文档生成日期:** 2026-04-10
|
||
|
||
**文档版本:** 1.0
|