VLM 视频摘要#

概述#

视频记录系统收集大量数据,其中通常包含稀疏但重要的感兴趣事件。事件发生时可能会持续一段时间,但根据其持续时间,可能不值得进行长时间的提及。这些方面使得高效且有效的视频摘要成为基于 AI 的视频系统整体实用性的重要特征。生成式 AI 提供了一种基于自然语言接口的准确、可泛化的视频摘要技术,该技术已受到业界的积极研究。视频摘要微服务解决了这些功能和设计要求,用户可以开箱即用地利用这些要求。它的设计和功能是仿照 NVIDIA 针对 Tesla GPU 发布的 视频搜索和摘要 (VSS) 代理蓝图 构建的。

视频摘要服务的使用包括 2 步过程,实现了与 VSS 蓝图的 API 兼容性。用户首先通过 files API 上传文件,这将返回一个句柄。然后,用户可以通过调用 summarize API 启动摘要功能。

视频摘要微服务基于 NVIDIA Jetson 平台的 NanoLLM 框架。该微服务采用了以下几个关键策略

  1. 事件嵌入和聚类:对于检测到的事件,我们使用 SigLIP 生成帧嵌入,并开发了一种基于 DBSCAN 的聚类算法。它将相似事件分组,以支持复杂的检测。

  2. 视频内容检索:通过将嵌入存储在 CUDA 加速的向量数据库中,我们启用了视频内容检索功能。这允许用户使用自然语言查询搜索特定事件。

  3. 视频摘要:我们使用 VILA1.5 模型创建视频摘要,将多个帧作为输入以生成字幕。这些字幕与 GPT-4 结合使用,以生成简洁、有代表性的事件文本摘要。本质上,该系统在边缘端高效运行,进行连续录制和 VLM 处理,并受益于我们的优化

两个具体的优化用途包括

  1. 量化技术:我们使用 INT4 MLC 和 AWQ 量化的 VLM 来加速推理。

  2. KV 缓存和 CUDA 加速优化:我们开发了 KV 缓存来优化 LLM 令牌预填充过程,从而实现高效的 VLM 输入处理

  3. Faiss_lite:用于加速检索

运行视频摘要#

  1. 启动 Redis 平台服务

    $ sudo systemctl start jetson-redis
    
  2. 创建配置文件

    创建一个包含以下内容的 json 配置文件。应将 openai_api_key 更新为您的 OpenAI API 密钥。此密钥对于摘要服务的正常运行是必需的。

    {
        "api_server_port": 19000,
        "redis_host": "localhost",
        "redis_port": 6379,
        "redis_stream": "test",
        "redis_output_interval": 60,
        "log_level": "INFO",
        "jetson_ip": "localhost",
        "video_port": 81,
        "max_images": 8,
        "ingress_port": 30080,
        "streamer_port": 31000,
        "segment_time": 20,
        "openai_api_key": "key"
    }
    
  3. 拉取并启动摘要容器

    $ sudo docker pull nvcr.io/nvidia/jps/vlm_summarization:2.0.9
    $ sudo docker run -itd --runtime nvidia --network host -v ./config/main_config.json:/configs/main_config.json -v /data/vsm-videos/:/data/videos/ -v /data/vsm-cache/:/root/.cache/huggingface/ -e CONFIG_PATH="/configs/main_config.json" nvcr.io/nvidia/jps/vlm_summarization:2.0.9
    

    请注意,可能需要修改 docker run 命令,以更改您在上一步中创建的配置文件的名称/位置,具体取决于其所在位置。同样,可能需要修改 /data/videos//data/vsm-cache/ 位置,具体取决于输入视频在系统上的存储位置以及您希望缓存存储的位置。

  4. 查看容器日志以确定服务何时完全启动。当您看到类似以下内容的输出时,即表示服务已完全启动。这可能需要一些时间,因为需要拉取模型文件。

    INFO:     Started server process [1]
    INFO:     Waiting for application startup.
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://0.0.0.0:19000 (Press CTRL+C to quit)
    
  5. 上传视频文件

    使用以下 curl 命令上传视频文件

    $ curl -X POST "https://127.0.0.1:19000/files?filepath=/data/videos/demo.mp4"
    

    文件路径基于文件在容器内的位置。

  6. 请求摘要

    使用以下命令请求视频摘要

    $ curl -X POST "https://127.0.0.1:19000/summarize" \
        -H "accept: application/json" \
        -H "Content-Type: application/json" \
        -d '{"stream": false, "id": "01fc1241-27a2-4f91-a771-bcb65d0846ba", "model": "vila-1.5", "chunk_duration": 20}'
    

    将 ID 值更改为步骤 4 返回的 ID。此过程可能需要一些时间,并且会因输入视频的长度而有很大差异。

    使用的模型可以是 vila-1.5gpt-4o

  7. 获取摘要结果

    使用以下命令检索摘要结果

    $ curl -X GET "https://127.0.0.1:19000/summarize?stream=false&id=01fc1241-27a2-4f91-a771-bcb65d0846ba"
    

    将 ID 值更改为步骤 4 返回的 ID。在视频完全处理完成之前,这将返回错误。