flicker-detector-gpu 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flicker_detector_gpu-0.1.1/PKG-INFO +165 -0
- flicker_detector_gpu-0.1.1/README.md +242 -0
- flicker_detector_gpu-0.1.1/pyproject.toml +39 -0
- flicker_detector_gpu-0.1.1/setup.cfg +4 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/__init__.py +5 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/__main__.py +6 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/api/__init__.py +0 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/api/app.py +379 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/cli.py +107 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/config/__init__.py +195 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/db/__init__.py +537 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/deploy/Dockerfile +42 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/deploy/docker-compose.yml +35 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/services/__init__.py +0 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/services/docker_service.py +55 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/services/job_runner.py +294 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/utils/__init__.py +0 -0
- flicker_detector_gpu-0.1.1/src/flash_detector_web/utils/natural_sort.py +82 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/__init__.py +3 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/cli.py +84 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/client_cli.py +190 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/detect.py +205 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/frames_io.py +103 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/infer/__init__.py +1 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/infer/anomaly.py +54 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/infer/predictor.py +193 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/model_resolve.py +37 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/natural_sort.py +83 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu/server_main.py +11 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu.egg-info/PKG-INFO +165 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu.egg-info/SOURCES.txt +39 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu.egg-info/dependency_links.txt +1 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu.egg-info/entry_points.txt +4 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu.egg-info/requires.txt +13 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_gpu.egg-info/top_level.txt +3 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_webui/__init__.py +1 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_webui/dist/assets/index-CdtG7wB1.css +1 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_webui/dist/assets/index-Z2lOOlpf.js +67 -0
- flicker_detector_gpu-0.1.1/src/flicker_detector_webui/dist/index.html +13 -0
- flicker_detector_gpu-0.1.1/src/pypi/README.md +146 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: flicker-detector-gpu
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: GPU flicker detection via PredNet SavedModel (dvdface/next-frame-predict): CLI, web server, HTTP client.
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: tensorflow<3,>=2.14
|
|
8
|
+
Requires-Dist: numpy>=1.23
|
|
9
|
+
Requires-Dist: pillow>=9.0
|
|
10
|
+
Requires-Dist: huggingface_hub>=0.20
|
|
11
|
+
Requires-Dist: opencv-python-headless>=4.8
|
|
12
|
+
Requires-Dist: fastapi>=0.110
|
|
13
|
+
Requires-Dist: uvicorn[standard]>=0.27
|
|
14
|
+
Requires-Dist: python-multipart>=0.0.9
|
|
15
|
+
Requires-Dist: pydantic>=2.6
|
|
16
|
+
Requires-Dist: httpx>=0.27
|
|
17
|
+
Provides-Extra: dev
|
|
18
|
+
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
19
|
+
|
|
20
|
+
# flicker-detector-gpu
|
|
21
|
+
|
|
22
|
+
安装后提供三个命令行入口(Windows 下为 `Scripts` 目录中的 **`gpu-flicker-detector.exe`**、**`gpu-flicker-detector-server.exe`**、**`gpu-flicker-detector-client.exe`**):本地检测、启动带 Web 界面的服务、以及作为客户端调用已运行的服务。
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pip install flicker-detector-gpu
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## `gpu-flicker-detector`(本地检测)
|
|
31
|
+
|
|
32
|
+
在本地直接跑 PredNet 推理,将结果写入 **JSON 文件**。
|
|
33
|
+
|
|
34
|
+
### 常用参数
|
|
35
|
+
|
|
36
|
+
| 参数 | 说明 |
|
|
37
|
+
|------|------|
|
|
38
|
+
| `--type` | **必填**。`dir`:单层目录内图片(自然排序);`video`:单个视频;`sequence`:多张图片,每个文件一次 `--input` |
|
|
39
|
+
| `--input` | **必填**,可重复。`dir`/`video` 各 1 个路径;`sequence` 至少 **4** 个图片路径(GPU 版 PredNet 滑动窗为 4 帧) |
|
|
40
|
+
| `--output` | **必填**。输出 JSON 路径(父目录不存在时会创建) |
|
|
41
|
+
| `--fps` | 仅视频:覆盖 FPS,`0` 表示从容器读取 |
|
|
42
|
+
| `--frame-interval-ms` | `dir` / `sequence`:大于 0 时,用 `帧索引 × 毫秒` 作为时间戳 |
|
|
43
|
+
| `--model-dir` | SavedModel 目录;省略时使用环境变量或自动下载(需网络时可配置 Hub 令牌等) |
|
|
44
|
+
| `--threshold` | 异常阈值,默认 `0.025`(与训练时多层预测误差加权损失同量纲,需按模型自行标定) |
|
|
45
|
+
| `--layer-loss-weights` | 逗号分隔浮点,须与模型层数一致;默认 `1,0.1,0.1,0.1` |
|
|
46
|
+
| `--write-pred-frames DIR` | 若指定,将每帧 PredNet 预测 RGB 存为 `DIR` 下 `pred_00000.png` 等 |
|
|
47
|
+
|
|
48
|
+
**支持的视频扩展名示例**:`.mp4`、`.webm`、`.mov`、`.mkv`、`.avi`、`.m4v`。
|
|
49
|
+
|
|
50
|
+
**最少帧数**:任意模式均需至少 **4** 帧,否则进程以非零退出并在 stderr 说明原因。
|
|
51
|
+
|
|
52
|
+
### 退出码
|
|
53
|
+
|
|
54
|
+
- **`0`**:成功写出 `--output`
|
|
55
|
+
- **`2`**:输入/模型/参数等错误(详情在 stderr)
|
|
56
|
+
|
|
57
|
+
### 输出 JSON(`--output`)
|
|
58
|
+
|
|
59
|
+
顶层字段:
|
|
60
|
+
|
|
61
|
+
| 字段 | 含义 |
|
|
62
|
+
|------|------|
|
|
63
|
+
| `version` | 结果格式版本号(整数) |
|
|
64
|
+
| `input_type` | `dir` \| `video` \| `sequence` |
|
|
65
|
+
| `findings` | 异常区段列表(见下) |
|
|
66
|
+
| `frame_scores` | 逐帧分数与阈值信息(见下) |
|
|
67
|
+
| `pred_frames` | 仅当使用 `--write-pred-frames` 时出现:预测图相对路径与帧索引、时间 |
|
|
68
|
+
|
|
69
|
+
**`findings[]` 每项**(合并后的连续异常段):
|
|
70
|
+
|
|
71
|
+
- `flash_type`:固定为 PredNet 异常类型标识
|
|
72
|
+
- `scene`:场景标签(当前为 `STABLE`)
|
|
73
|
+
- `start_time_ms` / `end_time_ms`:区段起止时间(毫秒)
|
|
74
|
+
- `during_time_ms`:持续时间
|
|
75
|
+
- `video_start_time_ms` / `video_end_time_ms`:相对序列起点的时间
|
|
76
|
+
- `start_frame` / `end_frame`:帧索引
|
|
77
|
+
- `path_start` / `path_end`:起止帧对应的路径或标签
|
|
78
|
+
- `score_peak`:该段内峰值分数
|
|
79
|
+
- `metric`:分数名称(`prednet_total`,与训练 `val_loss` 量纲一致)
|
|
80
|
+
|
|
81
|
+
**`frame_scores`**:
|
|
82
|
+
|
|
83
|
+
- `values`:每帧一个浮点分数(与 `metric` 一致)
|
|
84
|
+
- `metric`:`prednet_total`
|
|
85
|
+
- `threshold`:使用的阈值
|
|
86
|
+
- `max_value`:全序列最大分数(若无有效值则为 `null`)
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## `gpu-flicker-detector-server`(HTTP 服务 + 界面)
|
|
91
|
+
|
|
92
|
+
启动 **FastAPI** 服务;若本机已安装 **Docker Compose v2** 且能找到项目内 compose 文件,**默认优先**用 Docker 拉起 GPU 镜像,否则在本机用 **Uvicorn** 直接跑 API。
|
|
93
|
+
|
|
94
|
+
### 参数
|
|
95
|
+
|
|
96
|
+
| 参数 | 说明 |
|
|
97
|
+
|------|------|
|
|
98
|
+
| `--host` | 监听地址;默认来自 `FLICKER_DETECTOR_BIND` / `FLASH_DETECTOR_BIND`,再否则 `127.0.0.1` |
|
|
99
|
+
| `--port` | 端口;默认来自 `FLICKER_DETECTOR_PORT` / `FLASH_DETECTOR_PORT`,再否则 **8765** |
|
|
100
|
+
| `--docker-build` | 仅在 Docker 模式下:启动前执行 `docker compose up --build` |
|
|
101
|
+
|
|
102
|
+
### 常用环境变量
|
|
103
|
+
|
|
104
|
+
| 变量 | 作用 |
|
|
105
|
+
|------|------|
|
|
106
|
+
| `FLICKER_DETECTOR_USE_DOCKER` | 设为 `0` / `false` / `no` / `off` 时强制本机 Uvicorn,不尝试 Docker |
|
|
107
|
+
| `FLICKER_DETECTOR_COMPOSE_DIR` | 含 `docker-compose.yml` 的目录(否则自动在包内 `deploy`、仓库根、`cwd` 等查找) |
|
|
108
|
+
| `FLICKER_DETECTOR_WEB_DATA` / `FLASH_DETECTOR_WEB_DATA` | 数据根目录(上传、SQLite 等);默认当前工作目录下 `flicker_detector_web_data` |
|
|
109
|
+
| `FLICKER_DETECTOR_ARGV_JSON` | JSON 字符串数组,自定义检测子进程 argv(最高优先级) |
|
|
110
|
+
| `FLICKER_DETECTOR_EXE` | 指定检测可执行文件路径(不设则默认 `python -m flicker_detector_gpu.cli`) |
|
|
111
|
+
| `FLICKER_DETECTOR_RELOAD` | 设为 `1` 时仅在本机 Uvicorn 下开启代码热重载 |
|
|
112
|
+
|
|
113
|
+
启动成功后,在浏览器打开 **`http://<host>:<port>/`**(本机默认 `http://127.0.0.1:8765/`)。若已构建并打包前端静态资源,根路径会提供 SPA。
|
|
114
|
+
|
|
115
|
+
### Web 界面说明
|
|
116
|
+
|
|
117
|
+
顶部导航为 **「闪屏检测」** 品牌与两个入口:
|
|
118
|
+
|
|
119
|
+
| 路由 | 说明 |
|
|
120
|
+
|------|------|
|
|
121
|
+
| **`/` 工作台** | 创建检测任务:上传视频或图片(文件夹/多图),查看任务列表与状态 |
|
|
122
|
+
| **`/reports` 检测记录** | 历史任务与统计趋势等报表视图 |
|
|
123
|
+
| **`/job/:jobId`** | 单个任务的详情页(从列表或链接进入) |
|
|
124
|
+
|
|
125
|
+
界面通过同源的 **`/api/*`** 与后端通信;CLI 客户端则使用下文 **`gpu-flicker-detector-client`** 访问同一套 API。
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## `gpu-flicker-detector-client`(调用远程服务)
|
|
130
|
+
|
|
131
|
+
向已运行的 `gpu-flicker-detector-server` **创建任务、轮询状态**,结束时将 **完整任务 JSON** 打印到标准输出或写入文件。
|
|
132
|
+
|
|
133
|
+
### 参数
|
|
134
|
+
|
|
135
|
+
| 参数 | 说明 |
|
|
136
|
+
|------|------|
|
|
137
|
+
| `--url` | 服务根地址,默认 `http://127.0.0.1:8765` |
|
|
138
|
+
| `--mode` | **必填**。`video`:1 个视频路径;`sequence`:至少 **4** 个图片路径;`folder`:1 个目录(递归收集图片,至少 4 张) |
|
|
139
|
+
| `--poll` | 轮询间隔(秒),默认 `0.5` |
|
|
140
|
+
| `--timeout` | 等待任务结束的最长时间(秒),默认 `7200` |
|
|
141
|
+
| `--http-timeout` | 单次 HTTP 超时(秒),默认 `60` |
|
|
142
|
+
| `--upload-timeout` | `POST /api/jobs` 超时(秒),默认 `3600` |
|
|
143
|
+
| `-o` / `--output` | 将最终 JSON 写入文件 |
|
|
144
|
+
| `-q` / `--quiet` | 减少控制台输出 |
|
|
145
|
+
| `--skip-health` | 跳过启动时的 `GET /api/health` |
|
|
146
|
+
| **位置参数 `paths`** | 由 `--mode` 决定数量与含义(见上) |
|
|
147
|
+
|
|
148
|
+
### 输出
|
|
149
|
+
|
|
150
|
+
- 默认(非 `-q`):先打印 **`/api/health`** 的 JSON(除非 `--skip-health`),再打印 `job_id` 与轮询过程中的 `[status] stage` 行。
|
|
151
|
+
- 任务结束后:打印 **完整任务对象 JSON**(与 `-o` 写入文件内容相同),字段含 `status`(如 `done` / `failed`)、`stage`、结果与错误信息等(与 Web 详情一致)。
|
|
152
|
+
|
|
153
|
+
### 退出码
|
|
154
|
+
|
|
155
|
+
| 码 | 含义 |
|
|
156
|
+
|----|------|
|
|
157
|
+
| `0` | 任务成功完成(`status == done`) |
|
|
158
|
+
| `1` | 任务结束但失败 |
|
|
159
|
+
| `2` | HTTP 错误或响应异常 |
|
|
160
|
+
| `3` | 命令行路径 / 模式校验失败 |
|
|
161
|
+
| `4` | 等待结果超时 |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
更完整的部署、Docker、开发与模型说明见仓库根目录 **`README.md`**。
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# flicker-detector-gpu
|
|
2
|
+
|
|
3
|
+
基于 TensorFlow **SavedModel**(下一帧预测)的 GPU 闪烁 / 异常检测:本地 CLI、带 Web 界面的 HTTP 服务、以及与服务端交互的 Python 客户端。
|
|
4
|
+
|
|
5
|
+
## 环境要求
|
|
6
|
+
|
|
7
|
+
- Python **3.10+**(跑 CLI、本机 HTTP 服务或客户端时)
|
|
8
|
+
- 依赖见仓库根目录 [`pyproject.toml`](pyproject.toml)(含 TensorFlow 2.14+、OpenCV、FastAPI 等)
|
|
9
|
+
- **本机 Uvicorn 模式**:是否用到 NVIDIA GPU 取决于当前 Python 环境里的 TensorFlow 与 CUDA
|
|
10
|
+
- **Docker 模式**(推荐用于服务端 GPU):主机需安装 [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html);Windows 上通常使用 Docker Desktop 的 **WSL2** 后端
|
|
11
|
+
|
|
12
|
+
## 安装与命令一览
|
|
13
|
+
|
|
14
|
+
在仓库根目录执行可编辑安装后,会注册三个控制台命令:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pip install -e .
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| 命令 | 作用 |
|
|
21
|
+
|------|------|
|
|
22
|
+
| `gpu-flicker-detector` | 本地直接跑检测,输出 JSON 文件 |
|
|
23
|
+
| `gpu-flicker-detector-server` | 启动 Web API + 可选前端静态资源 |
|
|
24
|
+
| `gpu-flicker-detector-client` | 向已启动的服务提交任务并轮询结果 |
|
|
25
|
+
|
|
26
|
+
安装后(Windows 为 `Scripts` 下的 `.exe`)三个命令各司其职:检测、起服务、连服务,无需记子命令,也与 CPU 版 `flicker-detector*.exe` 并存时不重名。
|
|
27
|
+
|
|
28
|
+
开发依赖(可选):`pip install -e ".[dev]"`。
|
|
29
|
+
|
|
30
|
+
单元测试在各包的 `src/<包名>/tests/` 下;在仓库根执行(需将 `src` 加入模块搜索路径):
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
PYTHONPATH=src python -m unittest discover -s src -p "test_*.py"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
PowerShell:`$env:PYTHONPATH="src"; python -m unittest discover -s src -p "test_*.py"`。
|
|
37
|
+
|
|
38
|
+
等价的模块方式(未安装包、但 `src` 在 `PYTHONPATH` 上时也可用):
|
|
39
|
+
|
|
40
|
+
- `python -m flicker_detector_gpu.cli`(同 `gpu-flicker-detector`)
|
|
41
|
+
- `python -m flash_detector_web`(同 `gpu-flicker-detector-server`)
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## `gpu-flicker-detector`(本地 CLI)
|
|
46
|
+
|
|
47
|
+
与 CPU 版 **`--type` 命名**一致:**`dir` \| `video` \| `sequence`**。多图请使用 **`sequence`** 并多次传入 **`--input`**(与 CPU 相同),不再支持单独的「路径列表文本文件」模式。
|
|
48
|
+
|
|
49
|
+
**与 CPU 的差异(实现限制)**:本 GPU 版使用 PredNet **4 帧滑动窗**,因此 **`sequence` 至少需要 4 张图**、目录任务也至少需要 **4** 张可识别图片;CPU 版 `sequence` 最少为 **2** 张。视频扩展名需为:`.mp4`、`.webm`、`.mov`、`.mkv`、`.avi`、`.m4v`(与 CPU 客户端一致)。
|
|
50
|
+
|
|
51
|
+
### 与 CPU 对齐的常用参数
|
|
52
|
+
|
|
53
|
+
- `--type`:`dir`(**单层**目录内图片,按自然序排序)、`video`(单个视频文件)、`sequence`(多张图片,每个文件一次 `--input`,**至少四个**)
|
|
54
|
+
- `--input`:`dir` / `video` 各一个路径;`sequence` 为多个路径(顺序即时间序,与 CPU 一致)
|
|
55
|
+
- `--output`:输出 JSON 路径(父目录不存在时会创建)
|
|
56
|
+
- `--fps`:视频:覆盖容器 FPS(`0` 表示从文件读取)
|
|
57
|
+
- `--frame-interval-ms`:`dir` / `sequence`:大于 0 时,用 `索引 × 毫秒` 作为时间戳
|
|
58
|
+
|
|
59
|
+
### GPU 专有参数(CPU 版无对应项)
|
|
60
|
+
|
|
61
|
+
- `--model-dir`:SavedModel 目录;省略时见下文「模型路径」
|
|
62
|
+
- `--threshold`:异常阈值,默认 `0.025`(量纲为训练时 **多层预测误差加权损失**;请按验证集自行标定)
|
|
63
|
+
- `--layer-loss-weights`:逗号分隔浮点,须与模型层数一致;默认 `1,0.1,0.1,0.1`
|
|
64
|
+
- `--write-pred-frames`:将每帧预测图写入指定目录
|
|
65
|
+
|
|
66
|
+
得分为各层误差的加权总和(与训练时验证损失 **`val_loss`** 同量纲);SavedModel 必须导出 **`layer_errors`**。
|
|
67
|
+
|
|
68
|
+
### 示例
|
|
69
|
+
|
|
70
|
+
目录内图片(仅该目录**直接**下的文件,常见图片扩展名,自然排序):
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
gpu-flicker-detector --type dir --input ./frames/ --output ./out.json
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
单个视频:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
gpu-flicker-detector --type video --input ./clip.mp4 --output ./out.json
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
多张图片(至少四张,`--input` 顺序即帧序):
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
gpu-flicker-detector --type sequence --input ./a.png --input ./b.png --input ./c.png --input ./d.png --output ./out.json
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
指定本地 SavedModel:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
gpu-flicker-detector --type video --input ./clip.mp4 --output ./out.json --model-dir D:/models/my_savedmodel
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
至少需要 **4 帧** 才会开始推理;不满足时进程会以非零退出码结束并在 stderr 打印原因。
|
|
95
|
+
|
|
96
|
+
### 模型路径(未传 `--model-dir` 时)
|
|
97
|
+
|
|
98
|
+
按顺序尝试:
|
|
99
|
+
|
|
100
|
+
1. 环境变量 **`FLICKER_GPU_MODEL_DIR`** 或 **`NEXT_FRAME_PREDICT_MODEL_DIR`**(须为已存在的目录)
|
|
101
|
+
2. 否则由程序将默认 SavedModel 下载到本地缓存(需可访问外网;若默认源需要认证,请按项目依赖中模型下载库的说明配置令牌与环境变量)
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## `gpu-flicker-detector-server`(HTTP 服务)
|
|
106
|
+
|
|
107
|
+
在仓库内执行时,**默认优先用 Docker Compose** 拉起带 GPU 的镜像(Compose 与 [`Dockerfile`](src/flash_detector_web/deploy/Dockerfile) 位于 [`src/flash_detector_web/deploy/`](src/flash_detector_web/deploy/))。若未安装 `docker compose`、找不到 compose 文件,或显式关闭 Docker,则退回到**本机 Uvicorn** 跑 FastAPI。
|
|
108
|
+
|
|
109
|
+
监听地址默认 **`127.0.0.1:8765`**(Docker 模式下会映射到宿主机的 `--host` / `--port`)。
|
|
110
|
+
|
|
111
|
+
### 命令行参数
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# 默认:在可用时执行 docker compose up(前台附加日志)
|
|
115
|
+
gpu-flicker-detector-server
|
|
116
|
+
|
|
117
|
+
# 绑定与端口(Docker 模式下写入 FLICKER_DETECTOR_PORT_PUBLISH,如 8765 或 127.0.0.1:8765)
|
|
118
|
+
gpu-flicker-detector-server --host 0.0.0.0 --port 8765
|
|
119
|
+
|
|
120
|
+
# Docker 模式下构建镜像后再启动
|
|
121
|
+
gpu-flicker-detector-server --docker-build
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
- `--host`:省略时使用 **`FLICKER_DETECTOR_BIND`** 或 **`FLASH_DETECTOR_BIND`**,再否则 `127.0.0.1`(仅本机 Uvicorn;Docker 时用于端口发布侧的主机地址)
|
|
125
|
+
- `--port`:省略时使用 **`FLICKER_DETECTOR_PORT`** 或 **`FLASH_DETECTOR_PORT`**,再否则 `8765`
|
|
126
|
+
- `--docker-build`:仅在 **Docker 模式**下生效,等价于 `docker compose up --build`
|
|
127
|
+
|
|
128
|
+
### Docker 与本机 Uvicorn 切换
|
|
129
|
+
|
|
130
|
+
| 变量 | 说明 |
|
|
131
|
+
|------|------|
|
|
132
|
+
| `FLICKER_DETECTOR_USE_DOCKER` | 设为 `0` / `false` / `no` / `off` 时**强制本机 Uvicorn**,不尝试 Docker |
|
|
133
|
+
| `FLICKER_DETECTOR_COMPOSE_DIR` | 显式指定包含 `docker-compose.yml` 的目录(否则优先 `flash_detector_web/deploy`,再尝试仓库根、`cwd` 等) |
|
|
134
|
+
|
|
135
|
+
也可不经过 CLI,在仓库根执行:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
docker compose -f src/flash_detector_web/deploy/docker-compose.yml up --build
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
或在 `src/flash_detector_web/deploy` 下执行 `docker compose up --build`。
|
|
142
|
+
|
|
143
|
+
Compose 里容器内固定监听 `8765`;宿主机端口由环境变量 **`FLICKER_DETECTOR_PORT_PUBLISH`** 控制(默认 `8765`,或 `127.0.0.1:8765` 仅本机回环)。由 `gpu-flicker-detector-server` 启动时会根据 `--host` / `--port` 自动设置该变量。
|
|
144
|
+
|
|
145
|
+
**注意**:`FLICKER_DETECTOR_RELOAD` / `FLASH_DETECTOR_RELOAD` 仅在本机 Uvicorn 模式下生效;Docker 模式下会被忽略。
|
|
146
|
+
|
|
147
|
+
### 与检测后端相关的环境变量
|
|
148
|
+
|
|
149
|
+
服务会通过子进程或指定可执行文件调用「与 `gpu-flicker-detector` 相同参数风格」的检测命令,解析逻辑在 `flash_detector_web.config`:
|
|
150
|
+
|
|
151
|
+
| 变量 | 含义 |
|
|
152
|
+
|------|------|
|
|
153
|
+
| `FLICKER_DETECTOR_ARGV_JSON` | JSON 字符串数组,整条 argv 前缀(优先级最高) |
|
|
154
|
+
| `FLICKER_DETECTOR_EXE` / `IMAGE_FLASH_DETECTOR_EXE` | 检测可执行文件路径 |
|
|
155
|
+
| (均未设置) | 默认 `python -m flicker_detector_gpu.cli`(即用当前环境的 Python 跑 CLI) |
|
|
156
|
+
|
|
157
|
+
### 数据目录与其它常用变量
|
|
158
|
+
|
|
159
|
+
| 变量 | 默认 / 说明 |
|
|
160
|
+
|------|----------------|
|
|
161
|
+
| `FLICKER_DETECTOR_WEB_DATA` / `FLASH_DETECTOR_WEB_DATA` | 数据根目录;默认当前工作目录下 `flicker_detector_web_data` |
|
|
162
|
+
| `FLICKER_DETECTOR_MAX_UPLOAD_MB` / `FLASH_DETECTOR_MAX_UPLOAD_MB` | 上传大小上限(MB),默认 2048 |
|
|
163
|
+
| `FLICKER_DETECTOR_MAX_CONCURRENT_JOBS` / `FLASH_DETECTOR_MAX_CONCURRENT_JOBS` | 并发任务数,默认 1 |
|
|
164
|
+
| `FLICKER_DETECTOR_JOB_TIMEOUT_SEC` / `FLASH_DETECTOR_JOB_TIMEOUT_SEC` | 单任务超时(秒),默认 7200 |
|
|
165
|
+
| `FLICKER_DETECTOR_THRESHOLD` / `FLASH_DETECTOR_JOB_THRESHOLD` | Web 任务的 `--threshold`(不设则用 CLI 默认 `0.025`) |
|
|
166
|
+
| `FLICKER_DETECTOR_LAYER_LOSS_WEIGHTS` / `FLASH_DETECTOR_LAYER_LOSS_WEIGHTS` | 逗号分隔层权重,如 `1,0.1,0.1,0.1` |
|
|
167
|
+
| `FLICKER_DETECTOR_TRUST_PROXY` / `FLASH_DETECTOR_TRUST_PROXY` | 反向代理信任(`1`/`true`/`yes`) |
|
|
168
|
+
| `FLICKER_DETECTOR_RELOAD` / `FLASH_DETECTOR_RELOAD` | 设为 `1` 时 **仅本机 Uvicorn** 开启 reload(开发用) |
|
|
169
|
+
|
|
170
|
+
静态站点:若已构建前端,仓库内 `src/flicker_detector_webui/dist/index.html` 存在时(或安装包中的 `flicker_detector_webui` 资源),**本机 Uvicorn** 会挂载该 SPA;官方 Docker 镜像在构建阶段已打入同一 `dist`,无需在容器外再执行 `npm run build`。
|
|
171
|
+
|
|
172
|
+
### `POST /api/jobs`(与 CPU 版服务对齐)
|
|
173
|
+
|
|
174
|
+
- **`input_kind`**:`video` | `dir_files` | `dir_folder` | `images`(`images` 与 `dir_files` 同义,与 CPU 版 `flicker-detector-server` 一致)。
|
|
175
|
+
- **`files`**:`video` 仅允许一个文件且扩展名须为 `.mp4` / `.webm` / `.mov` / `.mkv` / `.avi` / `.m4v`;图片类任务中**每个**文件均须为受支持的图片扩展名,混入其它类型会整单 400。图片任务至少 **4** 帧(GPU PredNet;CPU 服务为至少 2 帧)。
|
|
176
|
+
- **`threshold`**(可选):GPU 版扩展表单字段;CPU 版服务无此项,按 CPU 契约集成的客户端省略即可。
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## `gpu-flicker-detector-client`(调用服务端)
|
|
181
|
+
|
|
182
|
+
向运行中的 `gpu-flicker-detector-server` 创建任务、轮询状态,并在结束时打印或写入完整任务 JSON。
|
|
183
|
+
|
|
184
|
+
### 常用参数
|
|
185
|
+
|
|
186
|
+
- `--url`:服务根地址,默认 `http://127.0.0.1:8765`
|
|
187
|
+
- `--mode`:**`video`** | **`sequence`** | **`folder`**(非法拼写会被 argparse 拒绝;与 CPU C++ 客户端一致)
|
|
188
|
+
- `--poll`:轮询间隔(秒),默认 `0.5`
|
|
189
|
+
- `--timeout`:等待任务结束的最长时间(秒),默认 `7200`
|
|
190
|
+
- `--http-timeout`:单次 HTTP 超时(秒),默认 `60`
|
|
191
|
+
- `--upload-timeout`:`POST /api/jobs` 超时(秒),默认 `3600`
|
|
192
|
+
- `-o` / `--output`:将最终 JSON 写入文件
|
|
193
|
+
- `-q` / `--quiet`:减少输出
|
|
194
|
+
- `--skip-health`:跳过启动时的 `GET /api/health`
|
|
195
|
+
|
|
196
|
+
### 模式与路径要求
|
|
197
|
+
|
|
198
|
+
- **`video`**:恰好 **1** 个视频路径(扩展名需为客户端识别的视频类型,如 `.mp4` 等)
|
|
199
|
+
- **`sequence`**:至少 **4** 个图片路径(按顺序作为帧序列;CPU 客户端为至少 **2** 张,GPU 服务端与 PredNet 要求 **4** 张)
|
|
200
|
+
- **`folder`**:恰好 **1** 个目录,递归收集其下图片,至少 **4** 张
|
|
201
|
+
|
|
202
|
+
### 示例
|
|
203
|
+
|
|
204
|
+
上传视频并等待结果:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
gpu-flicker-detector-client --mode video -o result.json ./clip.mp4
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
指定远程服务:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
gpu-flicker-detector-client --url http://192.168.1.10:8765 --mode folder -o out.json ./frames_dir
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 退出码(便于脚本)
|
|
217
|
+
|
|
218
|
+
- **`0`**:任务成功完成
|
|
219
|
+
- **`1`**:任务结束但状态为失败
|
|
220
|
+
- **`2`**:HTTP 错误或响应异常
|
|
221
|
+
- **`3`**:命令行路径 / 模式校验失败
|
|
222
|
+
- **`4`**:等待结果超时
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Web 前端(可选)
|
|
227
|
+
|
|
228
|
+
前端源码在 [`src/flicker_detector_webui/`](src/flicker_detector_webui/)(与 Python 包 `flash_detector_web` 并列,各自占一个 `src/` 子目录)。本地改 UI 时:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
cd src/flicker_detector_webui
|
|
232
|
+
npm install
|
|
233
|
+
npm run build
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
生成的 `dist/` 由 `flicker_detector_webui` 的 `package-data` 打入 wheel;在项目根执行 **`FLICKER_DETECTOR_USE_DOCKER=0`** 下的 `gpu-flicker-detector-server` 即可用浏览器打开服务根地址。开发中也可在该目录运行 `npm run dev`(Vite 默认把 `/api` 代理到 `http://127.0.0.1:8765`,需另起后端)。
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 许可证与模型
|
|
241
|
+
|
|
242
|
+
你所使用的 SavedModel 权重与授权以该模型的发布方或许可条款为准;本仓库仅提供推理与工具代码。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=69", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "flicker-detector-gpu"
|
|
7
|
+
version = "0.1.1"
|
|
8
|
+
description = "GPU flicker detection via PredNet SavedModel (dvdface/next-frame-predict): CLI, web server, HTTP client."
|
|
9
|
+
readme = { file = "src/pypi/README.md", content-type = "text/markdown" }
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"tensorflow>=2.14,<3",
|
|
13
|
+
"numpy>=1.23",
|
|
14
|
+
"pillow>=9.0",
|
|
15
|
+
"huggingface_hub>=0.20",
|
|
16
|
+
"opencv-python-headless>=4.8",
|
|
17
|
+
"fastapi>=0.110",
|
|
18
|
+
"uvicorn[standard]>=0.27",
|
|
19
|
+
"python-multipart>=0.0.9",
|
|
20
|
+
"pydantic>=2.6",
|
|
21
|
+
"httpx>=0.27",
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
[project.optional-dependencies]
|
|
25
|
+
dev = ["ruff>=0.4"]
|
|
26
|
+
|
|
27
|
+
[project.scripts]
|
|
28
|
+
gpu-flicker-detector = "flicker_detector_gpu.cli:main"
|
|
29
|
+
gpu-flicker-detector-server = "flicker_detector_gpu.server_main:main"
|
|
30
|
+
gpu-flicker-detector-client = "flicker_detector_gpu.client_cli:main"
|
|
31
|
+
|
|
32
|
+
[tool.setuptools.packages.find]
|
|
33
|
+
where = ["src"]
|
|
34
|
+
include = ["flicker_detector_gpu*", "flash_detector_web*", "flicker_detector_webui*"]
|
|
35
|
+
exclude = ["flicker_detector_gpu.tests*", "flash_detector_web.tests*"]
|
|
36
|
+
|
|
37
|
+
[tool.setuptools.package-data]
|
|
38
|
+
flicker_detector_webui = ["dist/**"]
|
|
39
|
+
flash_detector_web = ["deploy/Dockerfile", "deploy/docker-compose.yml"]
|
|
File without changes
|