# 高光谱塑料分类工具 ![CC BY-NC](https://i.creativecommons.org/l/by-nc/4.0/88x31.png) [![Python Version](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org/) ## 基于高光谱成像和深度学习的微塑料材料分类与识别工具 ### 功能特性 - 支持BIL格式高光谱数据读取和处理 - 使用Cellpose/UNet模型进行图像分割和掩膜生成 - 支持9种塑料材料分类识别(ABS、HDPE、LDPE、PA6、PET、PP、PS、PTFE、PVC) - 二次分类支持(HDPE/LDPE精细区分) - 背景校正和光谱特征提取 - 自动波长重采样(支持不同波段数的高光谱相机) - 智能滤纸区域检测 - 输出ENVI标准格式分类结果 - 波段选择工具(基于ANOVA F-score和LDA准则) - 滤纸背景样本光谱提取工具 ### 安装 #### 前置要求 - Python 3.12+ - CUDA (可选,用于GPU加速) - 足够的内存处理高光谱数据(建议16GB+) - 固态硬盘(推荐,处理大文件时更高效) #### 安装步骤 1. 克隆仓库: ```bash git clone cd micro_plastic ``` 2. 安装依赖: ```bash pip install -r requirements.txt ``` ### 使用方法 #### 主程序:高光谱塑料分类 **基本用法** ```bash 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` | 是 | 无 | 输出文件路径(.dat格式) | | `--model_path` | 是 | 无 | 主分类模型路径(.m文件) | **示例** ```bash # 基础用法 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:\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`: 随机种子,保证可复现性 ### 项目结构 ``` micro_plastic/ ├── main.py # 主程序入口(高光谱分类流程) ├── main_batch_nosample.py # 批量处理版本(无样本生成) ├── mainv1.py # 主程序历史版本 ├── maintest.py # 测试版本 ├── chose_bands.py # 波段选择工具 ├── fliter_sample_spectral.py # 滤纸背景样本提取工具 ├── bil2rgb.py # BIL转RGB模块 ├── 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 # 项目说明 ``` ### 输入输出格式 #### 输入文件格式 - **BIL格式高光谱数据文件** (`.bil`):Band Interleaved by Line格式 - **HDR头文件** (`.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/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格式分类结果 ### 分类模型说明 #### 支持的分类器类型 | 模型类型 | 说明 | 适用场景 | |----------|-------------------------|----------------------| | SVM | 支持向量机 | 小样本、高维特征 | | RF | 随机森林 | 通用场景、特征重要性分析 | | XGBoost | 极端梯度提升 | 大规模数据、高精度需求 | | LightGBM | 轻量梯度提升 | 大规模数据、快速训练 | | CNN | 卷积神经网络 | 深度特征学习 | | SAE+CNN | 堆叠自编码器+CNN | 无监督预训练+微调 | #### 波段选择算法 | 算法 | 说明 | |----------|-----------------------------| | PCA | 主成分分析降维 | | SPA | 连续投影算法 | | CARS | 竞争性自适应重加权采样 | | GA | 遗传算法特征选择 | | ReliefF | 基于实例的特征权重算法 | | UVE | 无信息变量消除法 | | MRMR | 最大相关最小冗余 | ### 依赖库 **核心依赖** - `numpy` - 数值计算 - `pandas` - 数据处理 - `opencv-python` - 图像处理 - `scikit-learn` - 机器学习 - `torch`/`torchvision` - 深度学习框架 - `spectral` - 高光谱数据处理 - `cellpose` - 细胞/颗粒分割(通过mask.py集成) - `plantcv` - 植物/颗粒计算机视觉 **其他重要依赖** - `scipy` - 科学计算 - `matplotlib` - 可视化 - `PyWavelets` - 小波变换 - `joblib` - 模型序列化 - `tqdm` - 进度条 - `xgboost`/`lightgbm`/`catboost` - 梯度提升库 完整依赖列表请查看 `requirements.txt` ### 训练相机波长 模型训练使用的237波段波长范围(912.36nm - 1706.6nm),系统自动进行波长对齐和重采样。 ### 常见问题 1. **运行时报错"ModuleNotFoundError"** 确保已安装所有依赖:`pip install -r requirements.txt` 2. **处理大型文件时内存不足** 考虑减少处理区域或增加系统内存,建议使用固态硬盘。 3. **BIL文件波段数不足** 程序需要至少160个波段(用于RGB生成),且推荐237波段以获得最佳分类效果。 4. **分类结果不准确** - 检查输入数据质量 - 确认HDR文件包含正确的波长信息 - 验证模型与当前数据类型匹配 5. **HDR文件缺少波长信息** 程序会自动检测并追加默认波长信息,但建议提供完整的HDR文件。 ### 开发计划 - [ ] 支持更多高光谱数据格式(如ENVI、TIFF) - [ ] 添加可视化界面 - [ ] 集成更多深度学习模型 - [ ] 支持在线学习/增量学习 - [ ] 添加更多后处理选项 ### 许可证 本项目采用 Creative Commons 非商业许可证 (CC BY-NC 4.0)。 ### 联系方式 作者:北京依锐思 邮箱:[huilai_zhang@126.com](mailto:huilai_zhang@126.com) 项目地址:[https://github.com/yourusername/micro_plastic](https://github.com/yourusername/micro_plastic) ### 更新日志 #### 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种塑料材料分类