工具
Minus:用本地视觉模型拦截网页广告的 Chrome 扩展
Minus 是基于视觉语言模型的 Chrome 广告拦截扩展,全部推理在浏览器本地完成,识别后用单词卡片覆盖广告。
2026.08.11 · 周二约 4 分钟阅读
Minus 是一款 Chrome 浏览器扩展,它没有采用传统的 URL 过滤列表方案,而是在浏览器内运行一个 4.5 亿参数的视觉语言模型 Minus-v0.1,直接「看」页面元素来判断是否为广告,并将被拦截的广告位替换为外语单词闪卡。所有推理均在用户本地完成,不上传任何页面数据,也不需要订阅或联网。
核心思路:从匹配 URL 到识别像素
传统广告拦截器依赖 EasyList 这类规则库去匹配 URL,面对轮换域名、原生信息流(chum-box)和视频流内广告常常失效。Minus 改为对候选元素进行像素级分类:第一方广告、赞助卡片、推荐位以及流媒体视频广告都能被同一套模型覆盖。拦截后页面布局保持原样,仅在被识别为广告的元素上覆盖一层单词闪卡,不会破坏阅读流。
工作流程
整个流水线由 content.js、后台 Service Worker 和 offscreen.js 三部分协作完成:
- 候选收集:content script 扫描所有 frame,收集
<img>、<iframe>以及 id/class 类似广告位的容器,并结构化剔除同意横幅、视频播放器、未加载占位图等明显非广告元素。 - 取图:对展示元素调用
captureVisibleTab截取当前激活标签的局部截图(带速率限制),对<video>元素直接读取视频帧。 - 模型推理:裁剪图送入 4.5 亿参数的 Minus-v0.1(基于 LiquidAI LFM2.5-VL-450M 微调),通过 WebGPU + transformers.js + ONNX Runtime Web 运行,量化后约 430 MB,仅回答「这是广告吗?」,并以 Yes/No 的 logits 给出校准后的 P(ad)。
- 分级阈值:处于广告上下文的元素在 P ≥ 0.60 时拦截;裸图须同时满足 P ≥ 0.88 且尺寸近似广告形状(近方形商品/编辑图不会被拦);视频需要连续两帧判定为广告才会覆盖,并在广告结束时立即取消覆盖。
- 覆盖而非破坏:被拦截元素被替换为带词义、例句的闪卡,跟随元素位置,遇到弹窗会自动让出,附有「✕ 临时显示」和「⚑ 不是广告」反馈按钮。
只有当前激活标签会被扫描,扫描任务在没有覆盖内容时会自动合并挂起,WebGPU 设备丢失时引擎会自行重建。
覆盖范围
- 展示/横幅广告:静态
<img>、广告<iframe>以及广告形状的容器,基于标签截图分类。 - 视频广告:检测器对每个视频帧运行,播放内
<video>广告约每 2.5 秒重采一次并采用两帧滞后策略;在跨源 iframe 内无法直接读取视频的播放中广告由顶层 motion sampler 兜底;广告一结束立即取消覆盖。DRM 视频(如部分 Vevo 音乐视频)渲染为不可读黑色硬件叠加层,模型无法识别,其前贴片不会被覆盖,内容也不会被误伤。 - 弹窗/劫持标签页:识别「点击非链接区域→弹出整页广告落地页」的模式,由模型确认后给出「关闭标签页」或「显示页面」选项,绝不自动关闭真实链接打开的标签。
- 弹层让位:当模态框覆盖在被拦截广告之上时,闪卡通过 clip-path 让出区域,保持对话框可点击。
模型与基准
默认引擎 Minus-v0.1 已在 Hugging Face 开源,是 LiquidAI LFM2.5-VL-450M 的微调版本,训练数据来自 minus HDMI 设备采集的流媒体电视画面、网页展示广告以及约 1 万条挖掘出的困难负样本(商品图、编辑内容、UI 元素、同意横幅、聊天窗口)。其发布门槛上的表现如下:
- 流媒体留出集(1,956 帧):广告召回率 99.90%,非广告召回率 98.06%。
- 静态网页基准(999 张图):广告召回率 98.0%,仅 11 个误报。
- 商品图误报留出集:199 张中误报 1 张。
- 浏览器实跑精度:经数月持续运行,稳定在约 90–94%。
模型卡中包含训练方法、ONNX 量化策略以及 transformers.js 的调用示例。弹出面板提供本页面拦截计数、暂停、类型开关、阈值滑杆、引擎选择和单词闪卡的间隔重复复习入口。
