085cbc9950
1. 输出格式优化: - faults中移除冗余的bbox和confidence字段 - summary中fault_count改名为detection_count 2. fault_status与fault_type逻辑统一: - normal状态时fault_type为'none',不再使用'suspect' - abnormal状态时才进行故障类型分类(hotspot/local_overheating/overheat) 3. 修复usage_example.py图像通道问题: - YOLO检测使用彩色图,温度提取时再转灰度图
326 lines
10 KiB
Markdown
326 lines
10 KiB
Markdown
# 工作进度记录
|
||
|
||
## 项目概述
|
||
|
||
- **项目名称**: 红外故障检测 (InfraredFault)
|
||
- **项目路径**: `/home/sky/files/PythonProjects/InfraredFault/2BaseOnYOLO_InfraredData`
|
||
- **基于报告**: 李傲琦-阶段性报告(202602).pdf
|
||
- **目标**: 基于YOLO实现红外图像目标识别与ROI区域温度特征提取
|
||
- **更新日期**: 2026-03-26
|
||
|
||
---
|
||
|
||
## 阶段一:项目初始化与环境配置 ✅
|
||
|
||
### 完成时间
|
||
2026-03-26
|
||
|
||
### 完成内容
|
||
|
||
#### 1. 环境配置
|
||
- 使用 `uv` 管理Python环境
|
||
- 初始化项目 `infrared-fault` (Python 3.10)
|
||
- GPU支持:
|
||
- GPU: NVIDIA GeForce RTX 4060 (8GB)
|
||
- 驱动版本: 595.79
|
||
- CUDA Driver: 13.2
|
||
- PyTorch 2.11.0+cu130
|
||
- cuDNN 9.19.0.56
|
||
- YOLO GPU推理已验证 ✅
|
||
- 安装核心依赖:
|
||
- `torch==2.11.0`, `torchvision==0.26.0` (深度学习框架)
|
||
- `ultralytics>=8.4.27` (YOLOv8目标检测)
|
||
- `opencv-python` (图像处理)
|
||
- `numpy`, `pandas`, `pillow`, `matplotlib`, `seaborn`, `scikit-learn`, `tqdm`
|
||
|
||
#### 2. 项目目录结构
|
||
```
|
||
1BaseOnYOLO/
|
||
├── data/
|
||
│ ├── images/ # 红外图像目录
|
||
│ ├── labels/ # YOLO标注文件目录
|
||
│ └── yaml/
|
||
│ └── dataset.yaml # YOLO数据集配置
|
||
├── models/
|
||
│ └── train/ # 训练输出目录
|
||
├── src/
|
||
│ ├── __init__.py
|
||
│ ├── detect.py # YOLO检测模块
|
||
│ ├── extract_temp.py # ROI温度特征提取
|
||
│ ├── diagnose.py # 故障诊断Pipeline
|
||
│ └── utils/
|
||
│ ├── __init__.py
|
||
│ └── temp_utils.py # 温度特征工具函数
|
||
├── weights/ # 模型权重目录
|
||
├── 工作计划.md # 项目工作计划
|
||
└── pyproject.toml # uv项目配置
|
||
```
|
||
|
||
#### 3. 核心模块实现
|
||
|
||
**src/detect.py** - YOLO目标检测模块
|
||
- `InfraredDetector` 类:红外图像目标检测器
|
||
- `load_model()`: 加载YOLO模型
|
||
- `detect()`: 返回检测结果列表(含bbox、confidence、class_id、class_name)
|
||
- `detect_and_draw()`: 检测并绘制结果图像
|
||
- `train_yolo_model()`: YOLO模型训练函数
|
||
- `validate_model()`: 模型验证函数
|
||
|
||
**src/extract_temp.py** - ROI温度特征提取模块
|
||
- `TempFeatureExtractor` 类:温度特征提取器
|
||
- `detect_and_extract()`: 检测+温度提取
|
||
- `extract_from_roi()`: 从ROI提取温度特征
|
||
- `extract_from_bbox()`: 从指定边界框提取温度特征
|
||
- `load_infrared_image()`: 加载红外图像
|
||
- `batch_extract_features()`: 批量处理图像
|
||
|
||
**src/diagnose.py** - 故障诊断模块
|
||
- `FaultDiagnoser` 类:故障诊断器
|
||
- `diagnose()`: 单图故障诊断
|
||
- `_check_fault()`: 判断是否故障
|
||
- `_classify_fault()`: 故障分类(hotspot/local_overheating/overheat/suspect)
|
||
- `_generate_summary()`: 生成诊断摘要
|
||
- `batch_diagnose()`: 批量诊断
|
||
- `load_threshold_config()`: 加载温度阈值配置
|
||
|
||
**src/utils/temp_utils.py** - 温度特征工具函数
|
||
- `extract_temp_stats()`: 温度统计特征(max/min/mean/std/median)
|
||
- `extract_temp_histogram()`: 温度分布直方图
|
||
- `calculate_temp_gradient()`: 温度梯度特征
|
||
- `extract_temp_features()`: 完整温度特征提取
|
||
- `normalize_roi()`: ROI归一化处理
|
||
|
||
**data/yaml/dataset.yaml** - YOLO数据集配置
|
||
- 数据集路径配置
|
||
- 类别定义(fault)
|
||
- 图像尺寸和批量大小配置
|
||
|
||
#### 4. Git提交记录
|
||
|
||
| Commit | 消息 |
|
||
|--------|------|
|
||
| `10094b1` | 初始化项目结构 |
|
||
| `f393acd` | 添加pyproject.toml项目配置 |
|
||
| `81fdf8b` | 添加uv.lock依赖锁文件 |
|
||
| `8e12633` | 添加源代码:检测、温度提取、诊断模块 |
|
||
| `fdd9274` | 更新.gitignore忽略.python-version |
|
||
|
||
---
|
||
|
||
## 阶段二:YOLO模型训练与优化 ✅
|
||
|
||
**状态**: 已完成
|
||
|
||
### 完成内容
|
||
|
||
#### 1. 训练脚本
|
||
- `scripts/train.py`: YOLO模型训练脚本
|
||
- `scripts/prepare_dataset.py`: 数据集准备脚本
|
||
- `scripts/create_sample_dataset.py`: 示例数据集生成器
|
||
|
||
#### 2. 测试脚本
|
||
- `scripts/test_cuda.py`: CUDA/cuDNN环境测试脚本
|
||
|
||
#### 3. 数据集下载与转换
|
||
- 数据来源: SCIDB红外电力设备数据集
|
||
- 下载URL: data/dataurls.txt (895个链接)
|
||
- 下载完成: 763张图像
|
||
- 类别: Wave Traps(153), Power Transformers(178), Circuit Breakers(162), Surge Arresters(181), Disconnectors(89)
|
||
- 训练集: 610张, 验证集: 153张
|
||
- 格式: YOLO格式 (data/infrared/)
|
||
- **类别ID**: Wave Traps=0, Power Transformers=1, Circuit Breakers=2, Surge Arresters=3, Disconnectors=4
|
||
|
||
#### 4. 模型训练
|
||
- 基础模型: YOLOv8n (nano)
|
||
- 训练轮数: 46 epochs (EarlyStopping触发,最佳在epoch 26)
|
||
- 图像尺寸: 640
|
||
- 批量大小: 16
|
||
- 训练设备: GPU (CUDA)
|
||
- 训练状态: ✅ 已完成
|
||
- 模型权重: `weights/infrared_yolov8n.pt`
|
||
|
||
#### 5. 训练结果(5类别模型)
|
||
| 类别 | Precision | Recall | mAP@0.5 |
|
||
|------|----------|--------|---------|
|
||
| Wave Traps | 0.998 | 1.000 | 0.995 |
|
||
| Power Transformers | 0.993 | 1.000 | 0.995 |
|
||
| Circuit Breakers | 0.998 | 1.000 | 0.995 |
|
||
| Surge Arresters | 1.000 | 0.971 | 0.995 |
|
||
| Disconnectors | 0.998 | 1.000 | 0.995 |
|
||
| **总体** | **0.997** | **0.994** | **0.995** |
|
||
|
||
**模型性能**: mAP@0.5 = 99.5%, mAP@0.5:0.95 = 99.5%, Precision = 99.7%, Recall = 99.4%
|
||
|
||
### 待完成
|
||
- [x] 准备YOLO格式数据集
|
||
- [x] 数据集划分(训练集/验证集)
|
||
- [x] YOLOv8模型训练(28 epochs完成)
|
||
- [x] 导出best.pt模型
|
||
- [x] 模型评估与优化(EarlyStopping在epoch 28触发)
|
||
|
||
---
|
||
|
||
## 阶段三:ROI温度特征提取 ✅
|
||
|
||
**状态**: 已完成
|
||
|
||
### 完成时间
|
||
2026-03-26
|
||
|
||
### 完成内容
|
||
|
||
#### 1. 温度统计特征 (`src/utils/temp_utils.py`)
|
||
- `extract_temp_stats()`: max/min/mean/std/median 温度统计
|
||
- `extract_temp_histogram()`: 温度分布直方图(32 bins)
|
||
- `calculate_temp_gradient()`: 温度梯度特征(Sobel算子)
|
||
- `normalize_roi()`: ROI归一化处理(minmax/zscore)
|
||
|
||
#### 2. 温度特征提取器 (`src/extract_temp.py`)
|
||
- `TempFeatureExtractor` 类:
|
||
- `detect_and_extract()`: 检测+温度特征提取
|
||
- `extract_from_roi()`: 从ROI提取完整温度特征
|
||
- `extract_from_bbox()`: 从指定边界框提取温度特征
|
||
- `load_infrared_image()`: 红外图像加载
|
||
- `batch_extract_features()`: 批量处理
|
||
|
||
#### 3. 端到端测试验证
|
||
- YOLO检测: 成功检测到Wave Traps,置信度0.995
|
||
- 温度特征: 成功提取temp_max=255, temp_mean=97.49, gradient等
|
||
- 故障诊断: 成功诊断出1个故障
|
||
|
||
---
|
||
|
||
## 阶段四:故障诊断接口 ✅
|
||
|
||
**状态**: 已完成
|
||
|
||
### 完成时间
|
||
2026-03-26
|
||
|
||
### 完成内容
|
||
|
||
#### 1. 故障诊断器 (`src/diagnose.py`)
|
||
- `FaultDiagnoser` 类:
|
||
- `diagnose()`: 单图故障诊断(检测+温度提取+判断)
|
||
- `_check_fault()`: 根据温度阈值判断是否故障
|
||
- `_classify_fault()`: 故障分类(hotspot/local_overheating/overheat/suspect)
|
||
- `_generate_summary()`: 生成诊断摘要
|
||
- `batch_diagnose()`: 批量诊断
|
||
- `load_threshold_config()`: 加载温度阈值配置
|
||
|
||
#### 2. 故障分类规则
|
||
| 类型 | 条件 |
|
||
|------|------|
|
||
| hotspot | std_temp > 30 |
|
||
| local_overheating | temp_range(max-mean) > 50 |
|
||
| overheat | max_temp > 180 |
|
||
| suspect | 其他情况 |
|
||
|
||
#### 3. 输出格式
|
||
```json
|
||
{
|
||
"image": "FLIR0150.jpg",
|
||
"detections": [...],
|
||
"faults": [{
|
||
"temp_max": 255.0,
|
||
"fault_status": "abnormal",
|
||
"fault_type": "hotspot"
|
||
}],
|
||
"summary": {
|
||
"status": "fault_detected",
|
||
"detection_count": 1,
|
||
"abnormal_count": 1
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 阶段五:测试与验证 ✅
|
||
|
||
**状态**: 已完成
|
||
|
||
### 完成时间
|
||
2026-03-26
|
||
|
||
### 完成内容
|
||
|
||
#### 1. 端到端流程测试
|
||
- ✅ YOLO目标检测正常工作
|
||
- ✅ ROI温度特征提取正常
|
||
- ✅ 故障诊断Pipeline正常工作
|
||
- ✅ 批量诊断功能正常
|
||
|
||
#### 2. 测试结果
|
||
| 测试项 | 结果 |
|
||
|--------|------|
|
||
| 检测速度 | ~5ms/图像(GPU inference) |
|
||
| 温度特征提取 | 成功提取7维特征 |
|
||
| 诊断状态 | 返回结构化JSON结果 |
|
||
| 批量诊断 | 153张验证集图像全部处理成功 |
|
||
|
||
#### 3. 性能指标
|
||
- GPU推理速度: 4.4-9.2ms/图像
|
||
- 检测置信度: >0.99
|
||
- 温度特征: max/min/mean/std/median/histogram/gradient
|
||
|
||
---
|
||
|
||
## 更新记录
|
||
|
||
- **2026-03-26**: 完成阶段一,项目初始化与环境配置
|
||
- **2026-03-26**: 完成数据集下载(763张),开始YOLOv8训练
|
||
- **2026-03-26**: 完成4 epoch训练,mAP@0.5达99.5%,模型已保存
|
||
- **2026-03-26**: 修复GPU环境问题,PyTorch 2.11.0+cu130与cuDNN 9.19.0.56正常工作
|
||
- **2026-03-26**: 修复diagnose.py导入错误,完成阶段三(ROI温度特征提取)和阶段四(故障诊断接口)代码实现
|
||
- **2026-03-26**: 完成端到端Pipeline测试,所有模块正常工作
|
||
- **2026-03-26**: 完成阶段二训练优化:28 epochs训练,mAP@0.5=99.5%, Precision=100%, Recall=100%
|
||
- **2026-03-26**: 修复convert_to_yolo.py类别ID错误,重新转换数据集并训练5类别模型
|
||
- **2026-03-26**: 5类别模型训练完成:46 epochs,mAP@0.5=99.5%,各类别均衡
|
||
|
||
---
|
||
|
||
## 新数据集训练记录 (12类)
|
||
|
||
**完成时间**: 2026-03-26
|
||
|
||
### 新数据集概况
|
||
- **数据集**: 12类电力设备红外图像
|
||
- **训练集**: 6735张
|
||
- **验证集**: 767张
|
||
- **类别**: bushing, arrester, breaker, clamp, conservator, current-transformer, disconnector, disconnector2, disconnector3, heat-sink, insulator, transformer
|
||
|
||
### 训练配置
|
||
- **基础模型**: YOLOv8n
|
||
- **训练轮数**: 50 epochs
|
||
- **图像尺寸**: 640
|
||
- **设备**: NVIDIA GeForce RTX 4060 (GPU)
|
||
|
||
### 验证结果
|
||
| 指标 | 值 |
|
||
|------|-----|
|
||
| mAP@0.5 | 76.42% |
|
||
| mAP@0.5:0.95 | 61.64% |
|
||
| Precision | 66.58% |
|
||
| Recall | 87.93% |
|
||
|
||
### 各类别性能
|
||
| 类别 | Precision | Recall | mAP@0.5 |
|
||
|------|-----------|--------|---------|
|
||
| bushing | 0.925 | 0.990 | 0.994 |
|
||
| arrester | 0.930 | 0.980 | 0.991 |
|
||
| breaker | 0.797 | 0.910 | 0.898 |
|
||
| clamp | 0.781 | 0.973 | 0.918 |
|
||
| conservator | 0.546 | 0.823 | 0.718 |
|
||
| current-transformer | 0.856 | 0.977 | 0.951 |
|
||
| disconnector | 0.651 | 0.975 | 0.813 |
|
||
| disconnector2 | 0.306 | 0.767 | 0.286 |
|
||
| disconnector3 | 0.566 | 0.940 | 0.886 |
|
||
| heat-sink | 0.612 | 0.429 | 0.546 |
|
||
| insulator | 0.731 | 0.966 | 0.880 |
|
||
| transformer | 0.289 | 0.822 | 0.290 |
|
||
|
||
### 数据问题
|
||
- 发现2张图像标签存在类别ID越界问题(class 12超出0-11范围),需要修正
|
||
- disconnector2和transformer类别mAP较低,可能需要更多训练数据或数据增强
|