Sudabaka commited on
Commit
9aec0ed
·
verified ·
1 Parent(s): 72375af

Upload folder using huggingface_hub

Browse files
Files changed (4) hide show
  1. README.md +169 -184
  2. config.json +5 -5
  3. example_infer.py +2 -3
  4. model.onnx +2 -2
README.md CHANGED
@@ -1,184 +1,169 @@
1
- ---
2
- license: cc-by-nc-4.0
3
- library_name: onnxruntime
4
- tags:
5
- - video
6
- - frame-deduplication
7
- - siamese-network
8
- - knowledge-distillation
9
- - onnx
10
- - directml
11
- datasets:
12
- - wikimedia-commons
13
- ---
14
-
15
- # Easy4K SFDP · Siamese NET AI
16
-
17
- 面向视频帧去重的轻量孪生网络。输入相邻两帧的同一位置灰度块,输出 0~1 的连续相似度,
18
- 用于识别 1 拍 2 / 1 拍 3 等重复帧场景。模型通过知识蒸馏复现 Easy4K SFDP 四阶判决器
19
- (像素差、dHash、QR 分解、Farnebäck 光流)的判定行为,可在 NVIDIA / AMD / Intel 显卡上
20
- 通过 DirectML 统一推理。
21
-
22
- ## 模型详情
23
-
24
- | 项目 | 说明 |
25
- |---|---|
26
- | 开发者 | Sudabaka(Easy4K) |
27
- | 模型类型 | 孪生卷积网络(Siamese CNN),共享权重双分支 |
28
- | 架构 | 深度可分离卷积编码器(5 级下采样,384 维嵌入)+ 差分/乘积融合头(768 隐层) |
29
- | 参数量 | 1,402,465 |
30
- | 输入 | `frame_a`、`frame_b`:灰度 128×128,float32,范围 [0, 1],NCHW |
31
- | 输出 | `score`:形状 [batch, 1],Sigmoid 后位于 [0, 1],越接近 1 越可能重复 |
32
- | 导出格式 | ONNX,opset 17,动态 batch |
33
- | 文件大小 | 5.36 MB |
34
- | 运行后端 | onnxruntime:`DmlExecutionProvider`(DirectML)/ `CPUExecutionProvider` |
35
- | 建议阈值 | 0.5;需要更低误判时可用 0.6~0.7 |
36
- | 许可证 | CC BY-NC 4.0(仅限非商业用途) |
37
-
38
- ## 快速开始
39
-
40
- ```bash
41
- pip install onnxruntime-directml numpy
42
- ```
43
-
44
- ```python
45
- import numpy as np
46
- import onnxruntime as ort
47
-
48
- sess = ort.InferenceSession(
49
- "model.onnx",
50
- providers=["DmlExecutionProvider", "CPUExecutionProvider"],
51
- )
52
-
53
- a = np.random.rand(1, 1, 128, 128).astype(np.float32) # 灰度值 / 255
54
- b = a.copy()
55
-
56
- score = sess.run(["score"], {"frame_a": a, "frame_b": b})[0][0, 0]
57
- print(float(score)) # 1.0 表示两帧重复
58
- ```
59
-
60
- 完整的预处理与调用示例见仓库内 `example_infer.py`。
61
-
62
- ## 使用场景
63
-
64
- **适用**
65
-
66
- - 视频补帧 / 超分前的重复帧检测,尤其是动画 1 拍 2、1 拍 3 的帧复用;
67
- - 作为 Easy4K SFDP 的快速前置筛选,降低后续 QR 与光流计算的调用次数;
68
- - 需要跨厂商 GPU 统一推理路径的桌面端场景(DirectML 单套算子覆盖三家)。
69
-
70
- **不适用**
71
-
72
- - 整帧级、跨场景的重复镜头检索(模型只判断 128×128 局部块);
73
- - 经过强压缩、去噪、缩放等处理后的一致性判定(训练分布未覆盖);
74
- - 需要逐像素级精确对齐的场合,本模型输出的是相似度分数而非位移场。
75
-
76
- ## 训练方法
77
-
78
- ### 教师与标签
79
-
80
- 教师为 Easy4K 生产环境的 SFDP 完美模式(四阶全开)。对每个样本同时记录判决阶段与中间指标:
81
-
82
- - 教师判重且光流位移为 0:软标签 1.0;
83
- - 教师判重但存在可测位移:软标签 `clip(1 - flow / 2.0, 0, 1)`;
84
- - 教师在光流阶段判否:同样按上式映射,光流 0.1~0.4 的模糊区丢弃;
85
- - 教师在前三阶判否:明确负样本,软标签 0;
86
- - 第一阶段判为相同、被光流救回的样本标记为 hard,损失权重 2.0。
87
-
88
- ### 数据
89
-
90
- | 项目 | 数值 |
91
- |---|---|
92
- | 素材来源 | Wikimedia Commons(CC BY / CC BY-SA / CC0),31 支视频 |
93
- | 片段构造 | 固定窗口连续帧,按 1拍1 / 1拍2 / 1拍3 / 混合节奏展开,共 676 个片段 |
94
- | 样本总数 | 81,782(训练 71,862 / 验证 9,920) |
95
- | 正负比 | 1 : 1.27 |
96
- | 难例 | 419 个(光流救回,权重 2.0) |
97
- | 划分方式 | 按来源视频隔离,验证集素材不参与训练 |
98
-
99
- 素材清单、作者与许可证见仓库内 `sources.json`。
100
-
101
- ### 训练配置
102
-
103
- | 项目 | 值 |
104
- |---|---|
105
- | 目标函数 | 软标签 MSE 回归(非二分类交叉熵) |
106
- | 优化器 | AdamW,weight decay 1e-4 |
107
- | 学习率 | 2e-3,2 epoch 线性 warmup + 余弦退火 |
108
- | Batch size | 256 |
109
- | Epoch | 25 |
110
- | 硬件 | NVIDIA P106-100(6 GB),CUDA 12.4,PyTorch 2.6.0 |
111
- | 单轮耗时 | 约 50 秒 |
112
-
113
- ## 评测结果
114
-
115
- ### 与教师的一致性(验证集 9,920 样本,按视频隔离)
116
-
117
- | 指标 | 数值 |
118
- |---|---|
119
- | 软标签 MAE | 0.00573 |
120
- | 判决准确率(阈值 0.5) | 99.44% |
121
- | 精确率 / 召回率 | 99.36% / 99.36% |
122
- | 正样本 MAE | 0.00476 |
123
- | 负样本 MAE | 0.00613 |
124
-
125
- ### 阈值扫描
126
-
127
- | 阈值 | 准确率 | 精确率 | 召回率 | F1 |
128
- |---|---|---|---|---|
129
- | 0.30 | 99.43% | 99.22% | 99.47% | 0.9935 |
130
- | 0.40 | 99.45% | 99.29% | 99.45% | 0.9937 |
131
- | 0.50 | 99.44% | 99.36% | 99.36% | 0.9936 |
132
- | 0.60 | 99.49% | 99.47% | 99.36% | 0.9942 |
133
- | 0.70 | 99.51% | 99.52% | 99.36% | 0.9944 |
134
- | 0.80 | 99.49% | 99.54% | 99.29% | 0.9942 |
135
-
136
- ### 推理性能
137
-
138
- | 硬件 | 后端 | 批量 | 每对耗时 |
139
- |---|---|---|---|
140
- | AMD Radeon RX 580 | DirectML 1.24.4(Windows 11) | 64 | 0.61 ms |
141
- | NVIDIA P106-100 | CPU 执行器 | 32 | 0.22 ms |
142
-
143
- 真实切片端到端验证:AMD RX 580 上 744 对样本,在阈值 0.5 / 0.6 / 0.7 下与教师判决
144
- 一致率均为 100%。
145
-
146
- ### 数值一致性
147
-
148
- ONNX 与 PyTorch 输出最大绝对误差 1.2e-7,可直接替换训练端推理。
149
-
150
- ## 局限与风险
151
-
152
- - **题材覆盖**:训练素材以实拍街景、交通与开源动画短片为主,动画 1 拍 2 / 1 拍 3 的真实
153
- 番剧样本有限,建议在目标内容上先做小规模验证再上线。
154
- - **局部判定**:模型只看 128×128 灰度块,不理解整帧语义;涉及大面积平移、缩放、转场的
155
- 判定仍需上层聚合逻辑。
156
- - **压缩与后处理**:强压缩块效应、降噪、锐化会改变像素分布,可能影响分数校准。
157
- - **系统要求**:DirectML 需要 Windows 10 1903+ 或 Windows 11;更旧的系统需回退 CPU。
158
- - **蒸馏上限**:模型逼近教师而非超越教师,教师判错的样本同样会被学习。
159
- - **许可证**:CC BY-NC 4.0 禁止商业性使用;商业发行需另行授权。
160
-
161
- ## 引用
162
-
163
- ```bibtex
164
- @misc{easy4k_sfdp_siamese_net_ai,
165
- author = {Sudabaka},
166
- title = {Easy4K SFDP - Siamese NET AI},
167
- year = {2026},
168
- howpublished = {\url{https://huggingface.co/Sudabaka/SFDP-Siamese-NET-AI}},
169
- note = {Frame-duplicate similarity model distilled from the Easy4K SFDP judge}
170
- }
171
- ```
172
-
173
- ## 致谢
174
-
175
- - 训练素材来自 [Wikimedia Commons](https://commons.wikimedia.org/),遵循各自 CC BY / CC BY-SA /
176
- CC0 许可,完整作者与许可证信息见 `sources.json`;
177
- - 教师模型与推理实现来自 Easy4K SFDP(帧去重四阶判决器);
178
- - 跨厂商推理基于 ONNX Runtime DirectML。
179
-
180
- ## 许可证
181
-
182
- 模型权重与示例代码采用
183
- [Creative Commons Attribution-NonCommercial 4.0 International](https://creativecommons.org/licenses/by-nc/4.0/)
184
- (CC BY-NC 4.0)许可:允许复制、修改与非商业性再分发,须保留署名并注明修改。
 
1
+ ---
2
+ license: cc-by-nc-4.0
3
+ library_name: onnxruntime
4
+ tags:
5
+ - video
6
+ - frame-deduplication
7
+ - siamese-network
8
+ - knowledge-distillation
9
+ - onnx
10
+ - directml
11
+ datasets:
12
+ - wikimedia-commons
13
+ ---
14
+
15
+ # Easy4K SFDP · Siamese NET AI
16
+
17
+ 面向视频帧去重的轻量孪生网络。输入相邻两帧的同一位置灰度块,输出 0~1 的连续相似度,
18
+ 用于识别 1 拍 2 / 1 拍 3 等重复帧场景。模型通过知识蒸馏复现 Easy4K SFDP 四阶判决器
19
+ (像素差、dHash、QR 分解、Farnebäck 光流)的判定行为,可在 NVIDIA / AMD / Intel 显卡上
20
+ 通过 DirectML 统一推理。
21
+
22
+ ## 模型详情
23
+
24
+ | 项目 | 说明 |
25
+ |---|---|
26
+ | 开发者 | Sudabaka(Easy4K) |
27
+ | 模型类型 | 孪生卷积网络(Siamese CNN),共享权重双分支 |
28
+ | 架构 | 深度可分离卷积编码器(6 级下采样、512 维嵌入)+ 差分/乘积融合头(1024 隐层) |
29
+ | 参数量 | 2602017 |
30
+ | 输入 | `frame_a`、`frame_b`:灰度 128×128,float32,范围 [0, 1],NCHW |
31
+ | 输出 | `score`:形状 [batch, 1],Sigmoid 后位于 [0, 1],越接近 1 越可能重复 |
32
+ | 导出格式 | ONNX,opset 17,动态 batch |
33
+ | 文件大小 | 9.95 MB |
34
+ | 运行后端 | onnxruntime:`DmlExecutionProvider`(DirectML)/ `CPUExecutionProvider` |
35
+ | 建议阈值 | 0.5;需要更低误判时可用 0.6~0.7 |
36
+ | 许可证 | CC BY-NC 4.0(仅限非商业用途) |
37
+
38
+ ## 快速开始
39
+
40
+ ```bash
41
+ pip install onnxruntime-directml numpy
42
+ ```
43
+
44
+ ```python
45
+ import numpy as np
46
+ import onnxruntime as ort
47
+
48
+ sess = ort.InferenceSession(
49
+ "model.onnx",
50
+ providers=["DmlExecutionProvider", "CPUExecutionProvider"],
51
+ )
52
+
53
+ a = np.random.rand(1, 1, 128, 128).astype(np.float32) # 灰度值 / 255
54
+ b = a.copy()
55
+
56
+ score = sess.run(["score"], {"frame_a": a, "frame_b": b})[0][0, 0]
57
+ print(float(score)) # 1.0 表示两帧重复
58
+ ```
59
+
60
+ 完整的预处理与调用示例见仓库内 `example_infer.py`。
61
+
62
+ ## 使用场景
63
+
64
+ **适用**
65
+
66
+ - 视频补帧 / 超分前的重复帧检测,尤其是动画 1 拍 2、1 拍 3 的帧复用;
67
+ - 作为 Easy4K SFDP 的快速前置筛选,降低后续 QR 与光流计算的调用次数;
68
+ - 需要跨厂商 GPU 统一推理路径的桌面端场景(DirectML 单套算子覆盖三家)。
69
+
70
+ **不适用**
71
+
72
+ - 整帧级、跨场景的重复镜头检索(模型只判断 128×128 局部块);
73
+ - 经过强压缩、去噪、缩放等处理后的一致性判定(训练分布未覆盖);
74
+ - 需要逐像素级精确对齐的场合,本模型输出的是相似度分数而非位移场。
75
+
76
+ ## 训练方法
77
+
78
+ ### 教师与标签
79
+
80
+ 教师为 Easy4K 生产环境的 SFDP 完美模式(四阶全开)。对每个样本同时记录判决阶段与中间指标:
81
+
82
+ - 教师判重且光流位移为 0:软标签 1.0;
83
+ - 教师判重但存在可测位移:软标签 `clip(1 - flow / 2.0, 0, 1)`;
84
+ - 教师在光流阶段判否:同样按上式映射,光流 0.1~0.4 的模糊区丢弃;
85
+ - 教师在前三阶判否:明确负样本,软标签 0;
86
+ - 第一阶段判为相同、被光流救回的样本标记为 hard,损失权重 2.0。
87
+
88
+ ### 数据
89
+
90
+ | 项目 | 数值 |
91
+ |---|---|
92
+ | ���材来源 | Wikimedia Commons(CC BY / CC BY-SA / CC0)31 支;用户提供的术力口 / 真人 MV 10 支;公开网络 MV(术力口 / 动画 / 真人 / Live,仅训练使用,不随模型分发) |
93
+ | 片段构造 | 固定窗口连续帧,按 1拍1 / 1拍2 / 1拍3 / 混合节奏展开,共 2300 个片段 |
94
+ | 样本总数 | 242916(训练 202770 / 验证 40146) |
95
+ | 正负比 | 1 : 1.00 |
96
+ | 难例 | 5018 个(光流救回,权重 2.0) |
97
+ | 划分方式 | 按来源视频隔离,验证集素材不参与训练 |
98
+
99
+ CC 素材清单、作者与许可证见仓库内 `sources.json`。
100
+
101
+ ### 训练配置
102
+
103
+ | 项目 | 值 |
104
+ |---|---|
105
+ | 目标函数 | 软标签 MSE 回归(非二分类交叉熵) |
106
+ | 优化器 | AdamW,weight decay 1e-4 |
107
+ | 学习率 | 2e-3,2 epoch 线性 warmup + 余弦退火 |
108
+ | Batch size | 256 |
109
+ | Epoch | 12 |
110
+ | 硬件 | NVIDIA P106-100(6 GB),CUDA 12.4,PyTorch 2.6.0 |
111
+
112
+ ## 评测结果
113
+
114
+ ### 与教师的一致性(验证集 40146 样本,按视频隔离)
115
+
116
+ | 指标 | 数值 |
117
+ |---|---|
118
+ | 软标签 MAE | 0.02017 |
119
+ | 判决准确率(阈值 0.5) | 98.12% |
120
+ | 精确率 / 召回率 | 98.08% / 98.45% |
121
+ | 正样本 MAE | 0.00763 |
122
+ | 负样本 MAE | 0.02659 |
123
+
124
+ ### 推理性能
125
+
126
+ | 硬件 | 后端 | 批量 | 每对耗时 |
127
+ |---|---|---|---|
128
+ | AMD Radeon RX 580 | DirectML 1.24.4(Windows 11) | 64 | 0.73 ms |
129
+ | NVIDIA P106-100 | CPU 执行器 | 32 | 0.342 ms |
130
+
131
+ ### 数值一致性
132
+
133
+ ONNX 与 PyTorch 输出最大绝对误差不超过 1.2e-7,可直接替换训练端推理。
134
+
135
+ ## 局限与风险
136
+
137
+ - **题材覆盖**:训练素材以实拍街景、开源动画与音乐视频为主,番剧 1 拍 2 / 1 拍 3 的真实样本
138
+ 仍有限,建议在目标内容上先做小规模验证再上线。
139
+ - **局部判定**:模型只看 128×128 灰度块,不理解整帧语义;涉及大面积平移、缩放、转场的
140
+ 判定仍需上层聚合逻辑。
141
+ - **压缩与后处理**:强压缩块效应、降噪、锐化会改变像素分布,可能影响分数校准。
142
+ - **系统要求**:DirectML 需要 Windows 10 1903+ 或 Windows 11;更旧的系统需回退 CPU。
143
+ - **蒸馏上限**:模型逼近教师而非超越教师,教师判错的样本同样会被学习。
144
+ - **许可证**:CC BY-NC 4.0 禁止商业性使用;商业发行需另行授权。
145
+
146
+ ## 引用
147
+
148
+ ```bibtex
149
+ @misc{easy4k_sfdp_siamese_net_ai,
150
+ author = {Sudabaka},
151
+ title = {Easy4K SFDP - Siamese NET AI},
152
+ year = {2026},
153
+ howpublished = {\url{https://huggingface.co/Sudabaka/SFDP-Siamese-NET-AI}},
154
+ note = {Frame-duplicate similarity model distilled from the Easy4K SFDP judge}
155
+ }
156
+ ```
157
+
158
+ ## 致谢
159
+
160
+ - CC 训练素材来自 [Wikimedia Commons](https://commons.wikimedia.org/),遵循各自 CC BY /
161
+ CC BY-SA / CC0 许可,完整作者与许可证信息见 `sources.json`;
162
+ - 教师模型与推理实现来自 Easy4K SFDP(帧去重四阶判决器);
163
+ - 跨厂商推理基于 ONNX Runtime DirectML。
164
+
165
+ ## 许可证
166
+
167
+ 模型权重与示例代码采用
168
+ [Creative Commons Attribution-NonCommercial 4.0 International](https://creativecommons.org/licenses/by-nc/4.0/)
169
+ (CC BY-NC 4.0)许可:允许复制、修改与非商业性再分发,须保留署名并注明修改。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
config.json CHANGED
@@ -1,5 +1,6 @@
1
  {
2
  "model_name": "Easy4K SFDP - Siamese NET AI",
 
3
  "architecture": "siamese depthwise-separable CNN + difference/product fusion head",
4
  "input": {
5
  "names": [
@@ -28,17 +29,16 @@
28
  "meaning": "1 = duplicate"
29
  },
30
  "opset": 17,
31
- "params": 1402465,
32
  "providers": [
33
  "DmlExecutionProvider",
34
  "CPUExecutionProvider"
35
  ],
36
  "recommended_threshold": 0.5,
37
  "metrics": {
38
- "val_mae": "0.00573",
39
- "val_acc": "0.99435",
40
- "pos_mae": "0.00476",
41
- "neg_mae": "0.00613"
42
  },
43
  "license": "cc-by-nc-4.0"
44
  }
 
1
  {
2
  "model_name": "Easy4K SFDP - Siamese NET AI",
3
+ "model_version": "0.2.0",
4
  "architecture": "siamese depthwise-separable CNN + difference/product fusion head",
5
  "input": {
6
  "names": [
 
29
  "meaning": "1 = duplicate"
30
  },
31
  "opset": 17,
 
32
  "providers": [
33
  "DmlExecutionProvider",
34
  "CPUExecutionProvider"
35
  ],
36
  "recommended_threshold": 0.5,
37
  "metrics": {
38
+ "val_mae": 0.02017,
39
+ "val_acc": 0.98119,
40
+ "precision": 0.98076,
41
+ "recall": 0.98451
42
  },
43
  "license": "cc-by-nc-4.0"
44
  }
example_infer.py CHANGED
@@ -5,12 +5,11 @@ import onnxruntime as ort
5
 
6
 
7
  def make_session(model_path="model.onnx"):
8
- providers = ["DmlExecutionProvider", "CPUExecutionProvider"]
9
- return ort.InferenceSession(model_path, providers=providers)
10
 
11
 
12
  def score(sess, gray_a, gray_b):
13
- """gray_a / gray_b: uint8 或 float32 的 128x128 灰度块。返回 0~1。"""
14
  def prep(x):
15
  x = np.asarray(x, dtype=np.float32)
16
  if x.max() > 1.5:
 
5
 
6
 
7
  def make_session(model_path="model.onnx"):
8
+ return ort.InferenceSession(model_path, providers=["DmlExecutionProvider", "CPUExecutionProvider"])
 
9
 
10
 
11
  def score(sess, gray_a, gray_b):
12
+ """gray_a / gray_b: 128x128 灰度块(uint8 或 float)。返回 0~1。"""
13
  def prep(x):
14
  x = np.asarray(x, dtype=np.float32)
15
  if x.max() > 1.5:
model.onnx CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:749d1705c43610787f1df3b738e0fcaf37d85c30bc09cb987644b1cd88aac537
3
- size 5624038
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8fad7e9e8eeff174ebfd2bad4d2a8cb57ee9ae003bf26909fdbcdf5582d0e643
3
+ size 10431409