File size: 4,603 Bytes
6994be4
99ec731
 
 
 
 
 
 
 
 
 
 
6994be4
99ec731
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
license: other
language:
- zh
pipeline_tag: video-text-to-text
tags:
- qwen3.5
- vision-language-model
- video
- fire-safety
- sft
- kunlun-xpu
---

# Lumen:Qwen3.5-9B 火灾安全微调模型仓库

本仓库包含基于 **Qwen3.5-9B** 微调得到的火灾安全视觉语言模型(VLM),用于分析监控视频中的消防安全状况、判断是否存在火灾(明火/起火),并输出结构化 JSON 分析报告。

## 仓库内容

| 路径 | 说明 |
|---|---|
| [`Qwen3.5-9B-fire-hazard-hf/`](./Qwen3.5-9B-fire-hazard-hf/) | **最终微调模型**(HF 格式,bf16,约 19GB)。基底为 Qwen3.5-9B,先在消防视频上做视频 SFT,再用 100 条"九小场所"消防隐患监控视频续训,在 val 集 38 条上达到 **acc 1.0000** |

---

# Qwen3.5-9B-Fire-Hazard 火灾安全隐患视觉语言模型

## 模型概述(Model Overview)

- **模型类型**:多模态大语言模型(VLM,视觉-语言模型),支持视频 + 文本输入,输出结构化 JSON
- **基座模型**:Qwen3.5-9B(`qwen3_5` 架构,含 MTP 预测头)
- **参数量**:约 9B(Dense)
- **权重格式**:bfloat16,约 19GB(4 个 safetensors shard)
- **输入**:监控视频 + 文本提示
- **输出**:严格 JSON —— `{"is_fire": true或false, "类别": "...", "火灾隐患": "...", "场景描述": "...", "判定依据": "...", "整改措施": "..."}`

## 训练信息(Training Details)

- **训练框架**:LoongForge(基于 Megatron-LM)
- **训练硬件**:昆仑芯 Kunlun P800(XPU),单机 2 卡(TP1 + DP2,96GB×2)
- **训练方式**:全参数 SFT(全量微调),bf16
- **微调阶段**  1. 视频 SFT:51 条消防视频(火灾 28 + 隐患 35),200 iterations
  2. 隐患视频 SFT(最终阶段):100 条九小场所消防隐患监控视频(无明火,`is_fire=false`),续训 150 iterations(iteration 200→350)
- **关键超参数**:global-batch 32(DP2×grad-accum 16)、micro-batch 1、seq-length 4096、lr 1e-5→1e-6(cosine)、warmup 0.02、激活重计算、hybrid CPU-offload optimizer

## 能力与用途(Intended Use)

- 分析监控视频中的消防安全状况
- 判断画面中是否存在火灾(明火/起火)
- 识别消防隐患:疏散通道堵塞、厨房动火无人看管、违规使用液化气钢瓶/酒精炉/电暖器、电动车室内/楼道充电与飞线充电、货物遮挡消防设施等
- 输出包含判定依据和整改措施的结构化 JSON

## 评测结果(Evaluation)

val 集 38 条(24 条火灾视频 + 14 条消防隐患视频,后者为模型训练时**未见过**的 holdout 数据):

| 指标 | 数值 |
|---|---|
| 准确率 | 1.0000 |
| TPR(火灾召回) | 1.000 |
| TNR(隐患/无火灾) | 1.000 |
| 平衡准确率 | 1.0000 |
| 输出解析失败 | 0 |

## 使用方式(Usage)

```python
import torch
from transformers import AutoProcessor, Qwen3_5ForConditionalGeneration

model = Qwen3_5ForConditionalGeneration.from_pretrained(
    "liuwangaaaa/lumen/Qwen3.5-9B-fire-hazard-hf",
    trust_remote_code=True, torch_dtype=torch.bfloat16,
).to("cuda").eval()
proc = AutoProcessor.from_pretrained("liuwangaaaa/lumen/Qwen3.5-9B-fire-hazard-hf",
                                     trust_remote_code=True)

prompt = ("请分析这段监控视频中的消防安全状况:1) 判断画面中是否存在火灾(明火/起火);"
          "2) 说明场景类别;3) 描述画面场景细节;4) 给出判定依据;5) 给出整改措施。"
          "请只以严格的 JSON 格式回答:{\"is_fire\": true或false, \"类别\": \"...\", "
          "\"火灾隐患\": \"...\", \"场景描述\": \"...\", \"判定依据\": \"...\", \"整改措施\": \"...\"}")

msgs = [{"role": "user", "content": [{"type": "video"}, {"type": "text", "text": prompt}]}]
text = proc.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True)
inputs = proc(text=[text], videos=["/path/to/video.mp4"], return_tensors="pt", fps=2)
inputs = {k: v.to(model.device) if torch.is_tensor(v) else v for k, v in inputs.items()}
with torch.no_grad():
    out = model.generate(**inputs, max_new_tokens=300, do_sample=False)
print(proc.batch_decode(out[:, inputs["input_ids"].shape[1]:], skip_special_tokens=True)[0])
```

## 限制(Limitations)

- 训练数据以九小场所(餐饮、商店、旅馆、网吧、美容美发、幼儿园、诊所、作坊等)AI 生成的隐患监控视频为主,真实场景泛化能力需进一步验证
- 判定结果仅供消防安全辅助参考,不作为唯一依据