Files
micro_plastic/项目交接文档.md
2026-04-14 08:57:29 +08:00

416 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 高光谱塑料分类工具 - 项目交接文档
---
## 一、项目概述
### 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文件波段数需≥160RGB生成需求
2. 滤纸检测依赖于阈值方法,对非标准滤纸可能需要调整参数
3. 二次分类仅针对HDPE/LDPE
### 12.2 建议改进方向
1. 增加更多二次分类场景如PP/PS等易混淆材料
2. 优化内存使用,支持更大文件流式处理
3. 添加GUI界面便于非技术用户使用
4. 增加批处理脚本的配置化能力
---
**文档生成日期:** 2026-04-10
**文档版本:** 1.0