遵循本文所述步骤,您可完整体验从视频数据入湖、视频数据集处理,到文搜图 / 图搜图的全流程端到端实践。通过该过程,您可以掌握以下技能:
视觉大模型可理解视频中的视觉信息,完成如描述其中的物体、分析动作逻辑等视觉相关任务,可用于自动化视频内容审核、智能监控分析等,大幅节省人工成本,适用于智能安防、体育赛事分析、媒体内容管理等领域。
常见的基于 VLM 的业务系统构建思路如下。
可将音视频内容可存储在火山引擎 TOS;通过 LAS 将音视频数据入湖(转为 Lance 格式数据)后,调用 LAS 数据处理算子对音视频数据进行处理,并对音视频内容进行内容理解/向量化,便于后续对音视频内容进行消费。
本次实践通过对视频文件进行关键内容抽帧作为示例,为您介绍视频数据入湖与处理的操作流程,您可准备一个 MP4, AVI, MOV 等常见视频格式的测试视频文件,跟随本实践操作步骤一步步完成操作。
您需要开通好火山引擎对象存储 TOS,并创建好 TOS bucket 用于本次实验过程中存储测试的视频数据。
准备工作 | 操作要点 | 参考文档 | 配置示例 |
|---|---|---|---|
创建 Bucket |
| Bucket名:las-doctest |
您需要登录进去访问控制(IAM)控制台,准备一个用于后续使用 API 方式访问 TOS 、LAS 的 AK和SK。
准备工作 | 操作要点 | 参考文档 | 配置示例 |
|---|---|---|---|
获取AK、SK | 为了确保访问 TOS/LAS 服务的安全性,您必须提供有效的访问密钥 (AK/SK),用于后续的鉴权。
|
您需要开通好 LAS 服务,并创建好用于本次实验的队列资源和开发机环境。
准备工作 | 操作要点 | 参考文档 | 配置示例 |
|---|---|---|---|
队列资源 |
| 参见操作要点 | |
LAS API Key | 您调用 LAS 在线算子之前,您需要先生成 API Key 用于算子调用的鉴权。
注意 LAS 的为您提供了离线和在线两类数据处理算子,仅在线算子需使用 LAS API Key 鉴权。
| 参见操作要点 | |
开发机 | 您调用 LAS 离线算子之前,您需要先准备好离线算子的调用开发环境。
|
注意
本实践步骤的主要目的是将视频上传至TOS Bucket中,并在 LAS 创建一个视频数据集,后续即可直接在 LAS 的视频数据集对视频进行预览、数据处理等操作。
登录至 TOS 产品控制台后,将待处理的视频上传至TOS Bucket中。
操作步骤 | 操作要点 | 参考文档 | 配置示例 |
|---|---|---|---|
上传视频 | 在准备好的 TOS Bucket 中上传待处理的视频。您可根据需要创建文件夹,将视频上传至文件夹中。 | TOS 路径为: |
登录 LAS 控制台,单击左侧导航栏的 数据集 > 通用数据集,进入数据集页面后单击“创建数据集”。参考以下配置要点,配置数据集参数,完成后单击“创建”,完成视频数据集创建。
操作步骤 | 操作要点 | 参考文档 | 配置示例 |
|---|---|---|---|
创建视频数据集 |
|
|
数据集创建完成后,您可在数据集详情页面查看数据集基本信息,对于视频数据集,支持预览前十条视频。
注意
本实践步骤的主要目的是将视频数据集转为 Lance 数据集,实现视频数据入湖,便于后续对视频数据进行视频抽帧等数据处理操作。
您需要先登录 TOS 控制台,准备好一个用于存储转换后 Lance 数据集数据的 TOS 路径。本示例的 Lance 数据集的 TOS 路径为:tos://las-doctest/video2lance/。
此步骤的操作主要在开发机中使用VeDaft调用SDK对数据集进行读写等操作,过程中涉及TOS Bucket的访问等,建议将一些鉴权参数、固定的路径参数配置为开发环境的环境变量,便于后续实际执行代码中引用。
您可参考下文准备好环境变量的配置。
# 地域设置,本示例使用华北2-北京地域 export REGION="cn-beijing" # 鉴权AK相关环境变量 # 访问TOS、LAS的认证sk、ak export LAS_TOS_SECRET_KEY="<your_sk>" export LAS_TOS_ACCESS_KEY="<your_ak>" # TOS 访问相关环境变量 # TOS的访问端点 export LAS_TOS_ENDPOINT="https://tos-cn-beijing.ivolces.com" # TOS端点(用于TOSConfig) export TOS_ENDPOINT="https://tos-cn-beijing.ivolces.com"
在开发机环境中执行 source env.sh 命令,使环境变量生效。
# 请在 LAS 开发机中执行以下代码 import os """ 转为 Lance 数据集 """ import daft from daft.io import CreateLasDatasetOptions, IOConfig, LanceWriteOptions from daft.las.io import TOSConfig # 您可以自定义您新数据集的路径 dataset_name = "las_dataset_video" lance_tos_dir = f"tos://las-doctest/video2lance/{dataset_name}.lance" LANCE_DATASET_FORMAT = "lance" # 创建相关的配置 io_config = IOConfig(s3=TOSConfig.from_env().to_s3_config()) write_options = LanceWriteOptions(io_config=io_config, uri=lance_tos_dir) create_ds_options = CreateLasDatasetOptions( nick_name="daft_test_lance_write", privacy="public", description="This is my dataset", ) # 读取原始数据 df = daft.read_las_dataset(name=dataset_name) # 在这里进行创建 new_dataset_name = dataset_name + "_lance" df.write_las_dataset( name=new_dataset_name, format=LANCE_DATASET_FORMAT, write_options=write_options, create_ds_options=create_ds_options, ) # 读取转换后的新数据集 df = daft.read_las_dataset(name=new_dataset_name) print("\n\nnew dataset:") df.show()
您需要修改以下参数。
las_dataset_video其他参数可保持示例值即可。
new dataset: ╭────────────────────────────────┬───────────┬──────────╮ │ video ┆ size ┆ num_rows │ │ --- ┆ --- ┆ --- │ │ String ┆ Int64 ┆ Int64 │ ╞════════════════════════════════╪═══════════╪══════════╡ │ s3://las-doctest/video/LAS AI… ┆ 225602609 ┆ None │ ╰────────────────────────────────┴───────────┴──────────╯
转换后的 Lance 数据集包含“video”、“size”、“num_rows”字段。其中:
回显中如果出现ERROR提示,但是正常返回了数据集数据,可忽略ERROR提示。
完成转 Lance 数据集的操作后,您可登录 LAS 控制台,在数据集列表页面查看新创建的Lance数据集。
注意
本实践步骤的主要目的是对视频进行简单处理,将视频二进制数据也写入入湖后的 Lance 数据集中,便于后续在 Lance 数据集中直接预览视频内容,以及为后续对视频数据进行视频内容理解、向量化等数据处理操作做准备。
本实践步骤的主要目的是调用 LAS 的数据处理算子,对视频进行数据增值处理:
调用多模态向量化算子:二通过大模型将视频进行向量化,将向量化的结果写入 Lance 数据集,便于后续进消费视频数据(例如图搜图)的应用场景使用。
# 地域设置,本示例使用华北2-北京地域 export REGION="cn-beijing" # 鉴权AK相关环境变量 # 访问TOS、LAS的认证sk、ak export LAS_TOS_SECRET_KEY="<your_sk>" export LAS_TOS_ACCESS_KEY="<your_ak>" # TOS 访问相关环境变量 # TOS的访问端点 export LAS_TOS_ENDPOINT="https://tos-cn-beijing.ivolces.com" # TOS端点(用于TOSConfig) export TOS_ENDPOINT="https://tos-cn-beijing.ivolces.com" # DAFT执行器类型,设置为本地模式 export DAFT_RUNNER="native"
本步骤新增了:
source env.sh 命令,使环境变量生效。以下使用视频关键帧抽取作为示例,如何处理视频。处理时,会新建一个 Lance 数据集,并将原始视频所在的TOS路径、视频抽帧后的二进制结果/TOS路径等关键参数写入新建的 Lance 数据集中。
在开发机中执行以下脚本。
# 从未来版本导入特性,确保兼容性 from __future__ import annotations # 导入必要的库 import base64 # 用于Base64编码和解码 import hashlib # 用于生成SHA256哈希 import os # 用于操作系统交互,如环境变量获取 import pyarrow as pa # 用于处理列式数据 import daft # 导入daft数据处理框架 from daft import DataType, col # 导入数据类型和列操作工具 from daft.io import ( CreateLasDatasetOptions, # 用于创建LAS数据集的配置选项 IOConfig, # IO配置类 LanceWriteOptions, # Lance格式写入选项 ) from daft.io.object_store_options import io_config_to_storage_options # 转换IO配置为存储选项 from daft.daft import IOConfig # 再次导入IOConfig(可能是为了确保正确性) from daft.las.functions.udf import las_udf # 导入LAS用户定义函数装饰器 from daft.las.functions.video import VideoKeyframes # 导入视频关键帧处理函数 from daft.las.io.tos import TOSConfig # 导入TOS存储配置 # 设置视频源文件所在的TOS路径 TOS_TEST_DIR = "tos://las-doctest/video/LAS AI Product Introduction.mp4" # 设置视频抽帧后的结果图片存储的TOS路径 TOS_TEST_OUTPUT_DIR = "tos://las-doctest/video/result/" # 将视频抽帧结果创建为一个新的Lance数据集,以下参数用于配置新的Lance数据集参数 # 自定义新的Lance数据集名称 DATASET_NAME = "las_dataset_video_lance_kf" # 设置新的Lance数据集的TOS路径 TOS_TEST_LANCE_DIR = "tos://las-doctest/video2lance/las_dataset_video_kf.lance" # 抽帧后,写入Lance数据集中,自定义的视频路径列名 VIDEO_COLUMN = os.getenv("VIDEO_COLUMN", "video") # 抽帧后,写入Lance数据集中,自定义的视频关键帧列名 VIDEO_KEYFRAMES_COLUMN = os.getenv("VIDEO_KEYFRAMES_COLUMN", "video_keyframes") # 抽帧后,写入Lance数据集中,自定义的视频关键帧所在TOS路径列名 VIDEO_KEYFRAMES_TOS_COLUMN = os.getenv("VIDEO_KEYFRAMES_TOS_COLUMN", "video_keyframes_tos") # 如果DAFT执行器是ray,则初始化ray if os.environ['DAFT_RUNNER'] == 'ray': import ray # 导入ray分布式计算框架 ray.init(address='auto') # 自动连接到ray集群 # 定义DAFT UDF:将Base64字符串转换为二进制数据 # ✅ 新写法:@daft.func 替代 @daft.udf(无状态函数) @daft.func def base64_to_binary(base64_str: DataType.string()) -> DataType.binary(): import base64 as b64 return b64.b64decode(base64_str) # 定义DAFT UDF:生成SHA256哈希值 @daft.func def generate_sha256_hash(s: DataType.string()) -> DataType.string(): import hashlib return hashlib.sha256(str(s).encode()).hexdigest() # 主函数入口 if __name__ == "__main__": # 从环境变量配置创建IO配置(适配TOS存储) io_config = IOConfig(s3=TOSConfig.from_env().to_s3_config()) # 创建包含视频路径的样本数据 samples = {VIDEO_COLUMN: [f"{TOS_TEST_DIR}"]} # 从字典创建daft数据集 ds = daft.from_pydict(samples) # 创建视频关键帧提取器UDF extractor = las_udf( VideoKeyframes, # 使用视频关键帧提取函数 construct_args={ "method": "I_frame", # 提取方法:I帧 "keyframes_cnt": 50, # 提取的关键帧数量 "output_tos_dir": f"{TOS_TEST_OUTPUT_DIR}", # 输出到TOS的目录 }, ) # 应用提取器,添加关键帧列到数据集 ds = ds.with_column(VIDEO_KEYFRAMES_COLUMN, extractor(col(VIDEO_COLUMN))) # 从关键帧结果中提取TOS路径列 ds = ds.with_column(VIDEO_KEYFRAMES_TOS_COLUMN, col(VIDEO_KEYFRAMES_COLUMN)["tos_paths"]) # 从关键帧结果中提取base64编码的图像数据 ds = ds.with_column(VIDEO_KEYFRAMES_COLUMN, col(VIDEO_KEYFRAMES_COLUMN)["base64"]) # 对关键帧数据和对应的TOS路径进行展开(一行变多行) ds = ds.explode(col(VIDEO_KEYFRAMES_COLUMN), col(VIDEO_KEYFRAMES_TOS_COLUMN)) # 将base64编码的图像数据转换为二进制 ds = ds.with_column(VIDEO_KEYFRAMES_COLUMN, base64_to_binary(col(VIDEO_KEYFRAMES_COLUMN))) # 基于TOS路径生成数据项ID(SHA256哈希) ds = ds.with_column("__data_item_id", generate_sha256_hash(col(VIDEO_KEYFRAMES_TOS_COLUMN))) # 设置数据存储格式为lance format = "lance" # 配置Lance写入选项 write_options = LanceWriteOptions(uri=TOS_TEST_LANCE_DIR, io_config=io_config) # 打印IO配置(用于调试) print(io_config) # 配置创建LAS数据集的选项 create_ds_options = CreateLasDatasetOptions( nick_name=DATASET_NAME, # 数据集昵称 privacy="public", # 隐私设置:公开 description="This is test dataset" # 数据集描述 ) # 将数据集写入LAS ds.write_las_dataset( name=DATASET_NAME, # 数据集名称 format=format, # 存储格式 write_options=write_options, # 写入选项 create_ds_options=create_ds_options, # 创建数据集选项 ) # 读取数据集 df = daft.read_las_dataset(name=DATASET_NAME) df.show()
您需要根据实际情况修改一些参数:
您还可按需修改调用视频关键帧抽取算子的算子相关参数:
在 LAS 的数据集中可以看到创建的视频抽帧结果数据集,点击“数据详情”可以查看到已经抽帧的视频结果图片以 Lance 格式存储在湖中。