- Tìm kiếm cảnh trong các tệp video như dashcam bằng ngôn ngữ tự nhiên và tự động cắt ra đoạn tương ứng bằng một hệ thống tìm kiếm theo ngữ nghĩa
- Sử dụng mô hình Google Gemini Embedding 2 để embedding trực tiếp chính video thành vector, rồi lưu vào ChromaDB để so sánh trực tiếp với truy vấn văn bản
- Dùng ffmpeg để chia video thành các chunk chồng lấn rồi embedding, khi tìm kiếm sẽ trả về đoạn giống nhất với tốc độ ở mức dưới một giây
- Có các tính năng tiền xử lý và bỏ qua khung hình tĩnh để giảm chi phí gọi API; chi phí lập chỉ mục 1 giờ video vào khoảng $2.84
- Tận dụng khả năng embedding trực tiếp video của Gemini Embedding 2 để cho phép tìm kiếm ngữ nghĩa nhanh trên nhiều giờ video mà không cần tạo phụ đề
Tổng quan
- SentrySearch là một công cụ thực hiện tìm kiếm theo ngữ nghĩa (semantic search) trên video dashcam; khi người dùng nhập truy vấn bằng ngôn ngữ tự nhiên, công cụ sẽ trả về một clip đã được cắt (trimmed clip) chứa cảnh tương ứng
- Công cụ dùng mô hình Google Gemini Embedding 2 để embedding trực tiếp chính video thành vector và lưu vào cơ sở dữ liệu cục bộ ChromaDB
- Truy vấn văn bản cũng được embedding vào cùng không gian vector để tìm ra mảnh video tương đồng nhất
- Kết quả tìm kiếm được tự động cắt và lưu từ tệp gốc, cung cấp tốc độ tìm kiếm ở mức dưới một giây (sub-second)
Cách hoạt động
- Video được chia thành các đoạn chồng lấn (overlapping chunks), và mỗi đoạn được embedding trực tiếp thông qua mô hình Gemini Embedding
- Mỗi vector embedding được lưu trong ChromaDB; khi tìm kiếm, truy vấn văn bản được chuyển sang cùng không gian vector để đối sánh
- Đoạn có độ tương đồng cao nhất sẽ được tự động cắt từ video gốc và lưu thành clip
- ffmpeg được dùng cho việc chia nhỏ và cắt video; nếu hệ thống chưa cài đặt,
imageio-ffmpeg sẽ tự động được sử dụng
Cài đặt và thiết lập ban đầu
- Có thể cài đặt trong môi trường Python 3.10 trở lên bằng lệnh sau
- sau
git clone, chạy pip install -e .
- Dùng lệnh
sentrysearch init để thiết lập Gemini API key và lưu vào tệp .env
- Công cụ sẽ thực hiện một phép embedding thử để kiểm tra tính hợp lệ của key
- Khi cấu hình thủ công, có thể sao chép
.env.example rồi tự thêm API key
Các lệnh và tùy chọn chính
-
index
- Quét đệ quy các tệp
.mp4 trong thư mục được chỉ định để lập chỉ mục
- Mỗi tệp sẽ được chia thành nhiều chunk để embedding
- Tùy chọn
--chunk-duration : độ dài chunk (tính bằng giây)
--overlap : độ dài chồng lấn giữa các chunk
--no-preprocess : bỏ qua giảm độ phân giải và giảm số khung hình
--target-resolution : độ phân giải mục tiêu khi tiền xử lý (mặc định 480p)
--target-fps : tốc độ khung hình mục tiêu khi tiền xử lý (mặc định 5fps)
--no-skip-still : embedding cả các đoạn khung hình tĩnh
-
search
- Ví dụ:
sentrysearch search "red truck running a stop sign"
- Kết quả được hiển thị cùng điểm tương đồng, và kết quả tốt nhất sẽ được tự động cắt và lưu
- Nếu điểm tương đồng thấp hơn ngưỡng mặc định (0.35), hệ thống sẽ hiển thị lời nhắc xác nhận
- Tùy chọn
--results N : số lượng kết quả hiển thị
--output-dir DIR : đường dẫn lưu clip
--no-trim : tắt cắt tự động
--threshold : điều chỉnh ngưỡng tương đồng
-
stats
- Hiển thị tổng số chunk đã lập chỉ mục và số tệp gốc
-
--verbose
- Xuất thông tin debug như số chiều embedding, thời gian phản hồi API, điểm tương đồng, v.v.
Nền tảng kỹ thuật
- Gemini Embedding 2 có thể embedding trực tiếp video và so sánh với truy vấn văn bản trong cùng không gian vector 768 chiều
- Không cần quy trình tạo phụ đề hay caption cho từng frame
- Ví dụ, truy vấn văn bản “red truck at a stop sign” có thể được so sánh trực tiếp với một clip video dài 30 giây
- Tính năng này cho phép tìm kiếm ngữ nghĩa dưới mức giây trên nhiều giờ video
Cấu trúc chi phí
- Với cấu hình mặc định (chunk 30 giây, chồng lấn 5 giây), chi phí lập chỉ mục 1 giờ video vào khoảng $2.84
- Gemini API chỉ xử lý 1 frame mỗi giây từ video được tải lên
- Quá trình tiền xử lý giảm xuống 480p, 5fps nhằm tối ưu tốc độ truyền tải và tránh timeout
-
Tối ưu để giảm chi phí
- Tiền xử lý (preprocessing) : giảm kích thước tải lên và thời gian truyền
- Bỏ qua khung hình tĩnh (still-frame skipping) : bỏ qua embedding cho các đoạn không có thay đổi hình ảnh
- Đặc biệt hiệu quả với video quay đỗ xe trong thời gian dài
- Truy vấn tìm kiếm chỉ cần embedding văn bản nên chi phí gần như không đáng kể
- Các tùy chọn điều chỉnh bổ sung
--chunk-duration, --overlap : điều chỉnh số lần gọi API
--no-skip-still : embedding mọi chunk
--target-resolution, --target-fps : điều chỉnh chất lượng tiền xử lý
--no-preprocess : gửi nguyên chunk gốc
Giới hạn và cải tiến trong tương lai
- Phát hiện khung hình tĩnh dựa trên heuristic so sánh kích thước tệp JPEG, nên có thể bỏ sót chuyển động nhỏ hoặc đưa nhầm các đoạn tĩnh vào
- Chất lượng tìm kiếm phụ thuộc vào ranh giới chunk; nếu một sự kiện nằm vắt qua hai chunk thì có thể không được bắt trọn vẹn
- Trong tương lai có thể cải thiện bằng cách chia chunk dựa trên phát hiện cảnh (scene detection)
- Gemini Embedding 2 hiện vẫn ở giai đoạn preview, nên hành vi API và giá có thể thay đổi
Tương thích và yêu cầu
- Hoạt động với mọi tệp video định dạng
.mp4, không giới hạn ở video Tesla Sentry Mode
- Quét đệ quy mọi tệp
.mp4 bất kể cấu trúc thư mục
- Yêu cầu
- Python 3.10 trở lên
- Cần cài đặt
ffmpeg (hoặc tự động dùng imageio-ffmpeg)
- Cần Gemini API key (có thể lấy key miễn phí tại: aistudio.google.com/apikey)
1 bình luận
Ý kiến trên Hacker News
Tôi thấy cách triển khai này thực sự rất hay. Embedding vẫn có phần nào đó giống như phép màu
Nhưng điều tôi lo nhất là công nghệ kiểu này có thể dẫn tới một xã hội giám sát ngoài đời thực
Hiện nay có vô số camera, nhưng trên thực tế con người không thể xem hết mọi video, nên vẫn còn giữ được một mức độ ẩn danh và riêng tư nhất định
Tuy nhiên, nếu AI có thể phân tích mọi video theo thời gian thực và phát hiện một người hay hành vi cụ thể bằng ngôn ngữ tự nhiên, thì giám sát toàn diện (panopticon) có thể trở thành hiện thực
Dù có những ứng dụng tích cực như phát hiện tội phạm hay phát hiện té ngã, nếu không có quy định kiểm soát thì hậu quả sẽ rất nguy hiểm
Nó tích hợp nhiều hệ thống camera, ALPR và cảnh báo, đồng thời cho phép truy vấn video bằng ngôn ngữ tự nhiên
Trong tương lai còn dự định tích hợp cả camera do người dân lắp đặt. Rốt cuộc nếu thứ này kết nối với dịch vụ như Citizen app, thì có thể sẽ đến lúc camera nhà hàng xóm được nối thẳng vào hệ thống của cảnh sát
Đây thực sự là một hướng đi đáng lo ngại
Vì thế tôi nghĩ điều quan trọng là xử lý kiểu này bằng mô hình cục bộ để video không bị đưa ra ngoài
Nhưng xét về tổng thể thì hướng phát triển của công nghệ này cần được cân nhắc rất thận trọng
Vấn đề xuất hiện khi nó được triển khai ở quy mô lớn như Flock hay Ring, hoặc khi một công ty có thể truy cập toàn bộ video
Có vẻ AI đa phương thức sẽ tạo ra một cuộc chạy đua vũ trang giữa phát hiện quảng cáo và chèn quảng cáo
Trước đây tôi từng thử nghiệm việc gỡ quảng cáo bằng AI với một model trước Gemini, còn công nghệ lần này mạnh hơn nhiều nên có lẽ sẽ nhận diện quảng cáo ngay lập tức rồi tắt tiếng hoặc loại bỏ chúng
Tôi có tổng hợp các thử nghiệm liên quan ở đây
Rốt cuộc quảng cáo sẽ không biến mất. Nhà cung cấp AI có thể nhận whitelist quảng cáo, hoặc tệ hơn nữa là chính AI sẽ quảng bá sản phẩm quảng cáo
Vài tháng trước tôi mua một dashcam Rexing, nhưng việc truy cập video quá bất tiện nên tôi đang định tự làm một hệ thống
Mục tiêu là có thể duyệt và tải video mà không cần tháo thẻ SD
Trong lúc cuộn qua các đoạn ghi hình, tôi đã nghĩ “giá mà có thể tìm kiếm cảnh này bằng ngôn ngữ tự nhiên thì tốt”, và khi thấy dự án này thì muốn áp dụng ngay
Cảm ơn vì đã chia sẻ
Tôi tò mò liệu công nghệ này có thể áp dụng vào phần mềm dựng video không
Ví dụ trong plugin Premiere, chỉ cần nói “hãy xóa tất cả các cảnh có mèo xuất hiện”, rồi nó tự động tạo EDL (Edit Decision List)
SentrySearch đã trả về chính xác timestamp in/out cho các truy vấn ngôn ngữ tự nhiên và tự động cắt bằng ffmpeg
Mở rộng nó thành EDL hoặc plugin Premiere là một bước tiến hóa rất tự nhiên
Tôi không phải chuyên gia Premiere, nhưng nếu ai đó thử làm EDL exporter hoặc plugin, tôi sẵn sàng hỗ trợ review PR và merge
Nếu bắt đầu thì hãy báo qua GitHub issue nhé
Tôi tò mò không biết cái này có thể chạy được cả trên mô hình cục bộ không
Ngoài dashcam thì dùng cho giám sát tại nhà cũng khá thú vị
Chỉ cần tua nhanh qua lại là cũng dễ dàng tìm được khoảng 30 giây có người tiến lại gần cửa trước
Trước đây tôi từng phải xem đi xem lại video hàng giờ chỉ để kiểm tra xem con mèo có chạy ra ngoài khi cửa mở không, nhưng hóa ra nó chỉ đang trốn trong nhà
Tôi cũng đang làm một dự án embedding, nhưng hiện vẫn mới ở giai đoạn prototype
Trường hợp của tôi không dùng Gemini mà là làm một trò reverse connections dạng puzzle
Có thể xem thêm tại đây
Tôi có xem phần code để “kiểm tra xem một đoạn video chủ yếu là khung hình tĩnh hay không”, và nghĩ rằng có thể tự động xử lý chuyện này bằng cách kết hợp tham số select và scene của ffmpeg
Tôi làm việc trong lĩnh vực content/video intelligence
Gemini thực sự là một công cụ rất phù hợp cho kiểu use case này
Tôi bật cười khi thấy bản demo tìm kiếm kiểu “lúc một chiếc xe có giá chở xe đạp phía sau chen vào làn của tôi vào ban đêm”
Có lẽ việc tìm ra chiếc xe đó mới chính là động lực thật sự để làm dự án này