Skip to main content

Processing Video Data in LakeInsight

Demo Content:

1. Read raw video files, extract key frames using Daft, and write to LakeSoul multimodal lakehouse

2. Read and display video frames from LakeSoul

You can access the LakeInsight Demo Environment and open video_demo/video.ipynb to view the demo code.

1. Read video files and extract information using Daft

import logging
logging.disable(logging.CRITICAL)

Use daft.read_video_frames to extract key frames from the video

import daft
from daft import col, DataType
from daft.functions import encode_image

video_path = "/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi"
# Configure Daft executor
daft.set_runner_ray(noop_if_initialized=True)
df = daft.read_video_frames(
path=video_path,
image_height=480,
image_width=640,
is_key_frame=True,
sample_interval_seconds=1.0,
)
df = df.with_column( "video_path", daft.lit(video_path)).with_column("data", encode_image(col("data"), "JPEG"))

df.show()


path
String
frame_index
Int64
frame_time
Float64
frame_time_base
String
frame_pts
Int64
frame_dts
Int64
frame_duration
Int64
is_key_frame
Bool
data
Binary
video_path
String
file:///home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
0
0
1001/30000
0
0
1
true
b"ÿØÿàJFIF"...
/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
file:///home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
3
1.2012
1001/30000
36
36
1
true
b"ÿØÿàJFIF"...
/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
file:///home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
5
2.002
1001/30000
60
60
1
true
b"ÿØÿàJFIF"...
/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
file:///home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
8
3.2032
1001/30000
96
96
1
true
b"ÿØÿàJFIF"...
/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
file:///home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
10
4.004
1001/30000
120
120
1
true
b"ÿØÿàJFIF"...
/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
Cell Details

Click on a cell to view its full content

(Showing first 5 of 5 rows)

2. Write to LakeSoul Multimodal Lakehouse

Use create_table to create a LakeSoul table, then write data

from lakesoul.metadata import create_table
from lakesoul.ray import LakeSoulDatasink
schema = df.schema().to_pyarrow_schema()
create_table(
"video_frames_table",
table_schema=schema,
table_path="/tmp/lakesoul/video_frames_table",
)
ds = df.to_ray_dataset()
sink = LakeSoulDatasink("video_frames_table")
ds.write_datasink(sink)
(pid=181785) PhysicalScan->Project:   0%|          | 0.00/1.00 [00:00<?, ?it/s]

3. Read Video Data from Lakehouse

Use ray.data.read_lakesoul() to read the LakeSoul table
Then convert ray.data.Dataset to daft.dataframe
Decode the key frame data into images

import ray
import lakesoul.ray
df = ray.data.read_lakesoul("video_frames_table").to_daft()

from daft import col
from daft.functions import decode_image

df = df.with_column(
"data",
decode_image(col("data"))
)

df.show()
path
String
frame_index
Int64
frame_time
Float64
frame_time_base
String
frame_pts
Int64
frame_dts
Int64
frame_duration
Int64
is_key_frame
Bool
data
Image[RGB]
video_path
String
file:///home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
0
0
1001/30000
0
0
1
true
<Image>
/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
file:///home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
3
1.2012
1001/30000
36
36
1
true
<Image>
/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
file:///home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
5
2.002
1001/30000
60
60
1
true
<Image>
/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
file:///home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
8
3.2032
1001/30000
96
96
1
true
<Image>
/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
file:///home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
10
4.004
1001/30000
120
120
1
true
<Image>
/home/maji/data/Projects/multi/video/data/UCF101_subset/train/Basketball/v_Basketball_g01_c01.avi
Cell Details

Click on a cell to view its full content

(Showing first 5 of 5 rows)