副标题:整理资料时的灵机一动------HSV 能不能当 YOLO 的兜底?
摘要 :上篇 标准交付 走 YOLO 伪流;本篇讲我整理 Step 6 资料时突然想通的一件事:既然 HSV 本来就能做 mask、做染色,滤镜栈又已经拆好了,能不能整条链只换 mask 引擎、不训模型也上浏览器 demo? 2026-06-25 试完:本片肉眼与 YOLO 无差,略卡可优化,代码 + 少量手工取色 能扛很多事------YOLO 训练成本高,HSV 不必 universal 平替,作兜底策略够用了。
0. 灵机一动:视频流到底怎么加滤镜?
这篇不是先想「甲方盒子烂怎么办」,是整理资料时拐出来的。
上篇把链路跑通之后,我开始啃 Step 6:视频流上到底怎么加滤镜? 理了一遍,心里模型其实不复杂:
text
go2rtc 播原片(test)
→ Python 读帧
→ 每隔 N 帧算一次 mask(YOLO)
→ 中间帧复用上一张 mask
→ unified 调色
→ ffmpeg 推回 go2rtc(test_blue)
→ 浏览器里看「更蓝」的那路
默认 每 5 帧 才让 YOLO 做一次分割------不是偷懒,是真 GPU 扛不住每帧推理;海天在 25fps 里动得没那么快,复用 mask 肉眼能接受。
然后问题就来了:中篇花大力气调的 HSV 五道门 ,本来就能出 mask、出 overlay、做单帧染色------伪标注工厂 也是它。既然伪流这条链上,重的只是「mask 从哪来」,滤镜 sky_filter_core 两边共用......
那能不能做一个更便宜的方案?不训模型,六点 + JSON 直接上伪流?
2026-06-25 写了 run_sky_filter_stream_hsv.py,浏览器里并排 test_blue 和 test_blue_hsv。结论下文说------方向值得试,而且本片试成了。
1. 伪视频流怎么搭:换引擎,不换滤镜
整条链和 YOLO 版对称,只换 mask 函数:
text
go2rtc test(原片 RTSP)
→ Python 读帧
→ mask:YOLO sky-seg.pt OR HSV A+B′
→ sky_filter_core · unified 调色
→ ffmpeg RTSP publish → test_blue / test_blue_hsv
| 换什么 | 不改什么 |
|---|---|
mask 脚本(run_sky_filter_stream.py vs _hsv.py) |
sky_filter_core 调色参数 |
| go2rtc 输出流名 | 读帧 / 推流 / 跳帧复用逻辑 |
--input 源地址 |
换真摄像头 RTSP 只改 source |
test 是 go2rtc 自己循环播 mp4 的原片;test_blue / test_blue_hsv 是 Python 处理完 推回去 的滤镜流------不是 go2rtc 里跑模型。
接真视频也一样:把 --input 改成摄像头或平台的 RTSP,mask 和滤镜循环不变。上篇验的是「滤镜对不对」,这篇验的是「mask 引擎能不能换便宜的」。
2. 跑起来会踩什么坑
伪流第一次搭,卡的不在算法,在链路:
| 坑 | 怎么回事 |
|---|---|
go2rtc.yaml 加了 test_blue_hsv: [] 但推流被拒 |
go2rtc 要 docker compose restart,不然 ffmpeg 管道反复断 |
mp4 循环读 test 时 h264 / RTP 警告 |
YOLO 和 HSV 都有,不是算力崩了,demo 可忽略 |
浏览器只看到 test 没有蓝的那路 |
先确认 Python 脚本在跑、终端有 fps effective 输出 |
细节命令沉仓库:playbook/08-HSV平替伪流.md、scripts/hsv_sky_mask.py。正文记住一句:原片一路、滤镜一路,Python 夹在中间当滤镜工人。
3. 有点卡,但效果是有的
跑通之后第一观感:HSV 版比 YOLO 版略慢、略顿 ------不是滤镜没染上天,是出画速率跟不上。
原因不神秘:
YOLO test_blue |
HSV test_blue_hsv |
|
|---|---|---|
| mask 怎么算 | 每 5 帧 GPU 推理一次 | 默认每帧 CPU 跑完整五道门 |
| 重的环节 | 推理跳帧后甩给 GPU | 解码 + inRange + morph + 海天 + B′ + 编码 全挤 CPU |
| 本片实测 | ~22 fps effective | ~14--15 fps (mask-every=5 对齐后) |
HSV 不是算法不行,是默认更拼 CPU 。海天动得慢,--mask-every 5 跳帧复用 mask 和 YOLO 公平------浏览器会顺一截。再往下还有编码参数、分辨率可以抠,demo 够用先交差,流畅度后面优化。

左原右滤 · 离线验收截帧;伪流并排未录,肉眼结论:天变蓝了,HSV/YOLO 本片看不出差别
4. 本片:HSV 跟 YOLO 没有任何区别
这是实验里最重要的一句:同片、同 unified 滤镜、mask 引擎不同------我肉眼分不出来。
没录 test_blue vs test_blue_hsv 并排视频,图也不硬补;compare.jpg 左原右滤,效果验收够了。要抠数字,成本表在这:
| 维度 | HSV(五道门) | YOLOv8n-seg |
|---|---|---|
| 训练 | 无(六点 + JSON) | 32 帧伪标注训 1 次 |
| 推理硬件 | 纯 CPU | GPU 强烈建议 |
| 本片伪流 fps | ~14--15 | ~22 |
| 换片 | 可能要重调六点 | 训好后相对省心 |
所以本片语境下说 「平替」 不过分------不是吹牛说 HSV 永远替代 YOLO,是这片海岸固定机位、六点已锁的前提下,交付画面可以一样蓝。
5. 实验结论:代码 + 少量手工标注,能扛很多事
三条我想留下来的判断:
-
mask 不必一上来就神经网络。 六点取色 + 中篇那套海天规则 + 一点手抠 exclude,代码能跑出能用的 mask;HSV 先是学习工具、伪标注工厂,后验成运行时选项------Step 2 没白做两次。
-
YOLO 训练成本高 (标数据、训 seg、部署权重、吃 GPU)。有算力、要泛化,上 YOLO;边缘盒子、现场只给 CPU、demo 赶时间------HSV fallback 滤镜栈不动,只换 mask 脚本,是实实在在的退路。
-
就算不叫平替,也叫兜底。 不必 over-promise「换片零成本」;换海天差很大的片,仍可能要重调六点或重训 seg。但在已调参场景 里,HSV 与 YOLO 肉眼无差、略卡可优化------够交差,够 demo,够面试讲一条对称架构。
text
离线 mp4 验参数,伪流验链路:
go2rtc → mask(YOLO|HSV) → unified → WebRTC
有 GPU 上 YOLO;没 GPU 上 HSV + mask-every 跳帧。
6. 系列导航
| 篇 | 内容 |
|---|---|
| 上篇 · 甲方吐槽天不够蓝 | 全流程速通 |
| 中篇 · 海天线前世今生 | 六点 + 海天线 |
| 本篇 | HSV 伪流兜底 |