2 điểm bởi GN⁺ 27 ngày trước | 1 bình luận | Chia sẻ qua WhatsApp
  • 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ảitrá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

    • Thực ra chuyện này đang được triển khai rồi. Tôi đã nghe thảo luận về hợp đồng camera ALPR trong một cuộc họp hội đồng thành phố, và từ đó biết đến sản phẩm dashboard tên là Fusus
      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
    • Hiện tại vì chi phí ($2.50/giờ) và độ trễ (latency) nên rất khó lập chỉ mục theo thời gian thực, nhưng sớm muộn gì cũng sẽ làm được
      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
    • Phần lớn camera không phải để một tổ chức có thể truy cập toàn bộ, và nếu chính phủ muốn xem thì cần có trát đòi hầu tòa (subpoena)
      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
    • Về mặt kỹ thuật thì hệ thống giám sát toàn diện đã khả thi rồi. Chỉ là hiện giờ còn quá tốn kém thôi
    • Khi các mô-đun nhận diện thị giác kiểu này có thể chạy được trên cả ASIC công suất thấp, drone có thể trở thành một loại vũ khí đáng sợ
  • 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

    • Bài đó rất thú vị. Có người từng phác họa tương lai của tìm kiếm web dựa trên AI, và kết luận thì không mấy sáng sủa
      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)

    • Ý tưởng hay đấy. Tôi cũng đang nghĩ đây là bước tiếp theo
      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ị

    • Phần lớn hệ thống giám sát tại nhà chỉ ghi hình khi phát hiện chuyển động, nên không gian tìm kiếm đã giảm đi rất nhiều
      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
    • Tôi nghĩ tính năng này rồi sẽ trở thành tính năng bắt buộc của mọi hệ thống an ninh gia đình
      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ố selectscene 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

    • Nghe cũng không sai lắm