File size: 5,837 Bytes
bcc6605
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# VectorLLM HF 0407

这是当前可直接分发使用的 Hugging Face 版本导出目录模板,已经包含:

- C-RADIO 视觉塔实现与权重映射逻辑
- VectorLLM 自定义 `AutoModel` / `AutoProcessor`
- 本地可加载的 processor / image processor / modeling 代码
- `bfloat16` 推理配置

当前推荐在 GPU 上使用,推荐环境:

```bash
/home/zhangtao/env/xtuner/bin/python
```

## 目录说明

- `model.safetensors`: 合并后的主模型权重
- `config.json`: 主配置
- `generation_config.json`: 生成配置
- `preprocessor_config.json`: 图像预处理配置
- `test_hf.py`: 单图推理与可视化示例脚本
- `gradio_bbox_demo.py`: 整图画框、后端裁剪和全图回映射的 Gradio 脚本
- `conversion_report.json`: 与 xtuner 对齐验证结果
- `radio_bundle/`: 打包后的 C-RADIO 相关实现

## 设计目标

- 可通过 `AutoModel``AutoProcessor` 拉起
- 不依赖外部 Hugging Face cache 中的自定义代码
- 不要求 `trust_remote_code=True`
- 适用于“单个物体已裁剪好”的输入图像,不做二次裁剪

## 快速开始

### 1. 命令行推理

推荐直接使用目录内置的 [test_hf.py](/home/zhangtao/hf_model/vectorllm_hf_0407/test_hf.py):

```bash
/home/zhangtao/env/xtuner/bin/python \
  /home/zhangtao/hf_model/vectorllm_hf_0407/test_hf.py \
  /home/zhangtao/hf_model/vectorllm_hf_0407 \
  /path/to/your_image.png \
  --save-dir /tmp/vectorllm_hf_demo
```

输出:

- `overlay.png`: 叠加 polygon 的可视化结果
- `report.json`: 文本输出、网格坐标、回映射后的 polygon

### 2. Python 方式加载

必须先把模型目录的父目录加入 `sys.path`,再导入包本身完成本地注册:

```python
import sys
from pathlib import Path

import torch
from PIL import Image
from transformers import AutoModel, AutoProcessor, GenerationConfig

model_path = Path("/home/zhangtao/hf_model/vectorllm_hf_0407")
sys.path.insert(0, str(model_path.parent))
import vectorllm_hf_0407  # noqa: F401

from vectorllm_hf_0407.test_hf import DEFAULT_RAW_PROMPT, decode_generated_text, get_stop_criteria

model = AutoModel.from_pretrained(
    model_path,
    trust_remote_code=False,
    torch_dtype=torch.bfloat16,
).cuda().eval()
processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=False)
tokenizer = processor.tokenizer

image = Image.open("/path/to/your_image.png").convert("RGB")
model_inputs = processor(text=[DEFAULT_RAW_PROMPT], images=[image], return_tensors="pt")
model_inputs = {
    key: value.to(model.device) if torch.is_tensor(value) else value
    for key, value in model_inputs.items()
}

stop_criteria = get_stop_criteria(tokenizer, ["<|im_end|>", "<|endoftext|>"])
output = model.generate(
    **model_inputs,
    generation_config=GenerationConfig(
        max_new_tokens=640,
        do_sample=False,
        eos_token_id=tokenizer.eos_token_id,
        pad_token_id=tokenizer.pad_token_id or tokenizer.eos_token_id,
        temperature=0.0,
        top_k=1,
    ),
    bos_token_id=tokenizer.bos_token_id,
    stopping_criteria=stop_criteria,
    output_hidden_states=False,
    return_dict_in_generate=True,
    do_sample=False,
    temperature=0.0,
    top_k=1,
)

text = decode_generated_text(output, model_inputs, tokenizer)
print(text)
```

### 3. Gradio 交互

若输入是整图,希望在图上手动画 bbox,再由后端扩框裁剪后送入模型,可直接启动:

```bash
/home/zhangtao/env/xtuner/bin/python \
  /home/zhangtao/hf_model/vectorllm_hf_0407/gradio_bbox_demo.py \
  --model-path /home/zhangtao/hf_model/vectorllm_hf_0407 \
  --server-name 0.0.0.0 \
  --server-port 7861
```

功能说明:

- 前端直接在整图上拖拽一个或多个 bbox
- 后端按 `1.0-1.3` 可调扩展比例裁剪
- 裁剪图送入 VectorLLM HF 模型推理
- 结果会回映射到整图,并展示全图 overlay、裁剪预览和结构化 JSON

使用步骤:

1. 打开页面后先上传整图。
2. 在左侧画布上拖拽 bbox,可连续画多个框。
3. `Prompt Target` 选择 `Building``Object`4. `BBox Expand Ratio` 控制后端扩框比例。`1.0` 表示仅按原框裁剪,`1.15``1.2` 通常更稳,`1.3` 适合给目标留更多上下文。
5. 点击 `Run` 执行推理,点击 `Clear` 清空当前图像和框。

页面输出说明:

- `Full-Image Overlay`: 全图可视化结果,同时叠加原始 bbox、扩框后的 bbox 和回映射后的 polygon
- `Expanded Crop Preview`: 每个 bbox 对应的裁剪图及其局部 polygon,可用来快速检查裁剪是否合理
- `Model Text Output`: 模型原始输出文本,便于排查 `<xN><yN>` 序列
- `Structured Result`: 结构化 JSON,包含原框、扩框、裁剪尺寸、网格坐标和全图坐标 polygon

补充说明:

- 当前脚本默认监听 `7861` 端口,可通过 `--server-port` 调整
- 服务启动后若需停止,终端里直接 `Ctrl+C` 即可
- 首次启动会加载大模型,耗时会明显长于后续推理

## 输入要求

- 输入应为单个目标的裁剪图
- 当前默认 prompt 针对建筑轮廓提取
- 模型输出为 `<xN><yN>` 格式的离散 polygon 点序列

## 结果说明

- 网格坐标范围默认是 `0~127`
- [test_hf.py](/home/zhangtao/hf_model/vectorllm_hf_0407/test_hf.py) 会自动把离散点映射回原图坐标并可视化
- [gradio_bbox_demo.py](/home/zhangtao/hf_model/vectorllm_hf_0407/gradio_bbox_demo.py) 会把裁剪区域内的离散点恢复到全图坐标后再叠加显示
- 当前 GPU 实测下,回载后的 HF 输出与 xtuner 已基本对齐,可能存在极轻微的离散点差异

## 备注

- 若从别的工作目录调用,不要省略 `sys.path.insert(...)``import vectorllm_hf_0407`
- 若只想快速跑 demo,优先使用 [test_hf.py](/home/zhangtao/hf_model/vectorllm_hf_0407/test_hf.py)