sentrysearch
用自然语言在视频里精准定位关键时刻,支持本地离线运行
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用自然语言在视频里精准定位关键时刻,支持本地离线运行
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你有过这样的经历吗?行车记录仪、监控摄像头、运动相机……日积月累留下了几百小时的视频素材,等到真正要找某段画面——比如"那辆闯红灯的红色卡车"或者"孩子第一次骑自行车的瞬间"——却发现只能靠记忆在人眼筛查,几百小时的内容翻起来比登天还难。
SentrySearch 正是为解决这一痛点而生:它将视频内容变成可搜索的"语义向量数据库",你只需输入一段自然语言描述,比如"一辆红色卡车闯红灯",系统就能自动定位到对应的画面时间点,并裁剪出一段精准的视频片段返回给你。整个过程本地化运行,不依赖任何云端处理(使用本地 Qwen3-VL 模型时),数据完全属于你自己。
这个项目的诞生极具个人色彩。作者是一位特斯拉车主,日常使用特斯拉的哨兵模式(Sentry Mode)持续录制行车视频,积累了大量片段。当他想要回溯某个特定场景时,发现没有任何好用的工具——按时间戳回忆不靠谱,逐帧回放又太折磨人。
于是他决定自己动手。SentrySearch 最早是一个解决个人痛点的脚本,后来逐渐演变成一个功能完整的开源工具。它的定位非常明确:面向个人用户和小型团队,服务于本地视频素材的语义检索场景,尤其是行车记录仪、监控视频、运动相机等第一手录制的原始素材。
随着项目影响力扩大,作者还围绕它构建了完整的工具链生态:
三个工具组合在一起,形成了一套从"找到画面"到"剪辑拼接"再到"隐私保护"的完整闭环。
SentrySearch 的核心工作流程分为三个阶段:分块、向量化、存储检索。
系统首先将长视频切分成固定时长的重叠片段(默认每块 20 秒,相邻块之间重叠 5 秒)。为什么要重叠?为了避免关键事件恰好被切在两块交界处而导致漏检。分块后,每块由 ffmpeg 提取帧序列,送入 Embedding 模型。
这是技术含量最高的一步。SentrySearch 支持三种后端:
Google Gemini Embedding 2(默认):通过 Google AI Studio API 调用,适合追求精度且不介意联网的用户。Gemini 的视频理解能力在业界领先,能捕捉时序动态和语义关联。
阿里云 DashScope Qwen Cloud:通过阿里云的通义千问 API 调用,适合国内用户,延迟更低,数据不出境。
本地 Qwen3-VL(完全离线):使用 HuggingFace 上的 Qwen3-VL 模型,配合 transformers 库本地推理。适合对数据隐私有严格要求、不希望任何数据外传的用户。本地模式还支持 INT4 量化(bitsandbytes),大幅降低显存需求。
# 本地模式安装
uv tool install --extras local sentrysearch
sentrysearch index /path/to/footage --backend local
每块视频被编码为一个高维向量,存储在本地 ChromaDB 向量数据库中。整个索引是一次性构建的,后续搜索直接查询,无需重复处理视频。
搜索时,用户输入的文字描述同样经过 Embedding 模型转换为向量,然后在 ChromaDB 中做余弦相似度检索。得分最高的视频块即为最佳匹配,系统自动从原视频中裁剪出对应时间段,保存为独立片段。
此外,SentrySearch 还支持"以图搜视频"——上传一张图片,系统找出视频中与该图片语义最相似的片段。它还内置了 reranker(重排序)机制,对候选结果做二次精排,进一步提升准确性。
对于有视频素材检索需求的普通用户来说,SentrySearch 的上手门槛非常低。标准安装流程(以 Gemini API 后端为例):
# 1. 安装 uv 包管理器(一行命令)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. 安装 SentrySearch
git clone https://github.com/ssrajadh/sentrysearch.git
cd sentrysearch
uv tool install .
# 3. 初始化并配置 API Key
sentrysearch init
# 按提示输入 Gemini API Key(从 aistudio.google.com/apikey 免费获取)
# 4. 为素材建立索引
sentrysearch index /path/to/footage
# 5. 搜索!
sentrysearch search "red truck running a stop sign"
全流程无需 Docker,无需容器化,一个 uv 命令搞定所有依赖。唯一的系统依赖是 ffmpeg(用于视频解码和裁剪),如果系统没有安装,程序会自动回退使用随包自带的 imageio-ffmpeg。
不过需要注意的是:本地 Qwen3-VL 模式需要至少 8GB 显存的 GPU(如 RTX 3080 及以上),且仅支持 Python 3.11/3.12(3.13 暂不支持)。
SentrySearch 并不是万能的。作者在 README 中坦诚列出了几点局限:
搜索精度依赖 Embedding 模型能力:模型对动作、物体、场景的理解有上限。某些模糊、抽象或高度依赖上下文的描述,可能无法准确匹配。
遮挡与复杂场景:被大面积遮挡的物体、极度相似的连续画面、语义高度重复的片段(如长时间停车等待),可能导致误检或漏检。
无法理解抽象概念:它能做语义匹配,但不具备真正的视频理解能力。比如"司机打了个哈欠"这种需要细粒度行为识别的描述,目前还难以实现。
成本考量:Gemini API 按调用量计费,大规模素材库(数千小时视频)建索引的成本可能较高。本地模式虽无 API 费用,但 GPU 硬件投入不可忽视。
SentrySearch 代表了一个重要趋势:AI 正在从云端走向本地,从通用走向垂直场景。
在它出现之前,视频语义搜索是大型科技公司的专利,依赖昂贵的云端 API 和复杂的机器学习基础设施。而 SentrySearch 用几百行 Python 代码,将这一能力普惠到每一个拥有本地视频素材的个人用户。它证明了:在特定领域(如行车记录仪、监控视频),用开源模型 + 本地向量数据库,完全可以实现媲美商业方案的搜索效果。
项目采用 Apache-2.0 开源许可,代码质量较高(有完整的 pytest 测试套件和覆盖率报告),文档详尽(英文原版 + 中文翻译同步维护),对于希望学习视频 AI、向量检索工程实践的开发者来说,是一个值得研究的参考实现。
如果你也有大量本地视频素材正在"吃灰",不妨试试 SentrySearch——也许你一直在找的那个瞬间,就藏在某段被遗忘的片段里。

图1:SentrySearch 搜索结果示例——特斯拉哨兵模式元数据叠加界面