File size: 2,158 Bytes
6103aca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# SAM2 ONNX 独立推理包

**模型**: sam2-hiera-base-plus (Segment Anything Model 2)

## 文件清单

| 文件 | 大小 | 说明 |
|------|------|------|
| `vision_encoder.onnx` | 264 MB | Vision Encoder (Hiera backbone + FPN) |
| `mask_decoder.onnx` | 16 MB | Mask Decoder (点/bbox prompt → mask) |
| `conv_s0.npz` | 33 KB | FPN conv 权重 (256→32 ch) |
| `conv_s1.npz` | 65 KB | FPN conv 权重 (256→64 ch) |
| `prompt_encoder.npz` | 29 KB | Prompt Encoder 权重 (位置编码 + 类型嵌入) |
| `preprocessor_config.json` | — | 预处理配置 |
| `infer.py` | — | 独立推理脚本 |

## 依赖

```bash
pip install numpy opencv-python onnxruntime
```

**无需 torch / CUDA**

## 用法

```bash
# 单点分割
python infer.py --image photo.jpg --point 500 400

# 多点分割 (每 2 个点自动分组)
python infer.py --image photo.jpg --point 500 400 --point 600 300

# bbox 中心点分割
python infer.py --image photo.jpg --bbox 100 200 500 600

# 保存结果
python infer.py --image photo.jpg --point 500 400 --save result.png --save-mask mask.png
```

## 模型规格

### Vision Encoder
- **输入**: `pixel_values` — (1, 3, 1024, 1024) float32
- **输出** (7 个):
  - last_hidden_state, fpn_0 (256ch, 256×256), fpn_1 (256ch, 128×128), fpn_2 (256ch, 64×64)
  - pos_0, pos_1, pos_2 (对应位置编码)

### Mask Decoder
- **输入**: image_embeddings, image_pos_enc, sparse_prompt_emb (B,1,2,256), dense_prompt_emb, high_res_feat_0/1
- **输出**: iou_scores, pred_masks, object_score_logits

## 推理流程

1. **图像预处理**: resize longest edge → 1024, pad → 1024×1024, ImageNet normalize
2. **Vision Encoder**: 1 次调用 → 图像特征缓存 (可复用多次分割)
3. **Prompt Encoder**: 点坐标 → sinusoidal 位置编码 + 类型嵌入
4. **Mask Decoder**: 生成 256×256 mask → resize 回原始尺寸

## 坐标系

- 输入坐标使用 **原始图像像素坐标** (自动缩放到 1024 空间)
- 支持前景点 (label=1) 和背景点 (label=0)

## 限制

- ONNX mask_decoder 固定 n_points=2 (单点自动填充 not-a-point)
- 仅支持 batch_size=1
- 固定输入尺寸 1024×1024