File size: 3,441 Bytes
c2b1b26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# 浒苔预测阈值修复说明

## 问题描述

当处理整张没有浒苔的256x256图片时,模型可能会把整张图片全部预测为浒苔。这是因为:

1. **原始预测逻辑**:使用 `torch.argmax()` 直接选择概率最高的类别
2. **问题原因**:当两个类别的概率接近时(比如都是0.5左右),`argmax` 会选择概率稍高的那个
3. **类别不平衡**:如果训练数据中浒苔样本较多,模型可能倾向于预测浒苔类别

## 解决方案

添加了**概率阈值机制**- **修改前**:直接使用 `argmax` 选择概率最高的类别
- **修改后**:只有当浒苔(类别1)的概率**超过阈值**(默认0.5)时,才预测为浒苔

### 代码修改`predict_image()` 函数中:

```python

# 修改前

pred_class = torch.argmax(pred, dim=1).squeeze(0).cpu().numpy()



# 修改后

seaweed_prob = pred[0, 1].squeeze(0).cpu().numpy()

pred_class = (seaweed_prob > threshold).astype(np.uint8)

```

## 使用方法

### 1. 基本使用(使用默认阈值0.5)

直接运行预测脚本即可,默认阈值为0.5:

```bash

python predict_seaweed_256x256_simple.py

```

### 2. 自定义阈值

在脚本的 `main()` 函数中修改 `prediction_threshold` 变量:

```python

# 预测阈值:只有当浒苔概率超过此阈值时才预测为浒苔

# 建议值:0.5-0.7,可以根据验证集调整

prediction_threshold = 0.5  # 修改为你需要的值

```

### 3. 阈值选择建议

- **0.5**:平衡阈值,适合大多数情况
- **0.6-0.7**:更保守,减少误报(假阳性),但可能漏检一些浒苔
- **0.4-0.5**:更宽松,减少漏检(假阴性),但可能增加误报

**建议**:在验证集上测试不同阈值,选择F1分数最高的阈值。

## 修改的文件

1. `predict_seaweed_256x256_simple.py` - 单张256x256图片预测脚本
2. `predict_large_image_tiles_256.py` - 大图瓦片预测脚本

## 验证方法

运行预测后,检查以下内容:

1. **概率图**:查看 `*_probability.png` 文件,确认无浒苔图片的概率值是否低于阈值
2. **预测结果**:查看 `*_prediction.png` 文件,确认无浒苔图片是否被正确预测为背景
3. **统计信息**:查看 `prediction_results.json`,检查无浒苔图片的 `seaweed_ratio` 是否接近0

## 进一步优化建议

如果问题仍然存在,可以考虑:

1. **调整阈值**:根据验证集结果调整阈值
2. **重新训练模型**:增加无浒苔样本的训练数据
3. **使用类别权重**:在训练时给背景类别更高的权重
4. **后处理**:添加形态学操作(如开运算)去除小的误检区域

## 技术细节

### 为什么会出现这个问题?

1. **Softmax特性**:softmax会将logits转换为概率分布,即使两个类别的logits很接近,softmax后的概率也会强制归一化
2. **模型倾向性**:如果训练数据中浒苔样本较多,模型可能学习到倾向于预测浒苔的模式
3. **边界情况**:当输入特征不明显时,模型可能给出不确定的预测

### 阈值机制的工作原理

- 阈值机制相当于在softmax概率上添加了一个"置信度门控"
- 只有当模型对浒苔的预测**足够确信**(概率>阈值)时,才预测为浒苔
- 这样可以有效减少在不确定情况下的误判