Hãy tưởng tượng một nhà khoa học dữ liệu nghiên cứu hành vi của động vật hoang dã, phân tích hàng trăm giờ video từ camera trong một khu rừng hẻo lánh. Hoặc một huấn luyện viên thể thao cần xác định các trận đấu quan trọng trong cả mùa giải để phát triển các chiến lược mới. Ngoài ra, hãy xem xét một nhà làm phim đang tìm kiếm những cảnh cụ thể trong thư viện video đồ sộ để ghép lại thành một bộ phim tài liệu.
Theo truyền thống, tất cả các chuyên gia này đều phải đối mặt với thách thức tốn thời gian, dễ mắc lỗi và khó khăn khi sắp xếp thủ công các cảnh quay kéo dài hàng giờ đồng hồ.
Tuy nhiên, những tiến bộ về trí tuệ nhân tạo và học máy đã làm thay đổi đáng kể các ứng dụng tìm kiếm video. Những công nghệ này hiện cho phép chúng tôi tìm kiếm các đối tượng và sự kiện cụ thể trong bộ dữ liệu video phong phú với độ tinh vi đáng kinh ngạc. Các nhà khoa học và nhà nghiên cứu dữ liệu có thể xác định chính xác các phân đoạn video có liên quan với độ chính xác và hiệu quả vượt trội.
Mục tiêu là đơn giản hóa quy trình nghiên cứu bằng cách cung cấp khả năng tìm kiếm nâng cao, cho phép người dùng dễ dàng xác định vị trí cảnh quay có nội dung hoặc thuộc tính cụ thể từ bộ dữ liệu video cực lớn.
Bằng cách sử dụng các thuật toán tìm kiếm phức tạp và giao diện thân thiện với người dùng, OpenOrigins nhằm mục đích biến nền tảng này trở thành một công cụ quan trọng cho cộng đồng này.
OpenOrigins đã xem xét hai cách tiếp cận công nghệ để xây dựng dịch vụ tìm kiếm video này: tìm kiếm khung bằng cách nhúng hình ảnh và nhúng đa phương thức. Chúng ta hãy xem xét từng lựa chọn.
Cho phép tìm kiếm ngữ nghĩa qua video để trả lời các câu hỏi phức tạp như "Có bao nhiêu phút nội dung video cho thấy hươu trong môi trường sống tự nhiên của chúng?" yêu cầu khả năng tìm kiếm phức tạp có thể hiểu và diễn giải nội dung của video ngoài việc kết hợp siêu dữ liệu từ khóa cơ bản. Chìa khóa để đạt được điều này? nhúng đa phương thức.
Các mô hình nhúng đa phương thức và các mô hình ngôn ngữ lớn đa phương thức (LLM) có thể được xem là các giải pháp tương tự. Các mô hình như CLIP và nhúng đa phương thức của Google tạo ra các phần nhúng cho các loại dữ liệu như văn bản, hình ảnh và video, tạo ra các vectơ chiều cao nắm bắt được ý nghĩa ngữ nghĩa. Điều này cho phép các ứng dụng như tìm kiếm ngữ nghĩa, truy xuất nội dung và phát hiện sự tương đồng.
Mặt khác, LLM đa phương thức như GPT-4 (có khả năng đa phương thức), Flamingo và Gemini được thiết kế để hiểu và tạo nội dung trên các loại dữ liệu khác nhau.
Các mô hình này hoạt động tốt với các tác vụ phức tạp như AI đàm thoại và tạo nội dung bằng cách sử dụng đầu vào đa phương thức (ví dụ: văn bản và hình ảnh) và tạo ra đầu ra đa phương thức, dẫn đến phản hồi có ý nghĩa và phong phú theo ngữ cảnh.
Trong khi các mô hình nhúng tập trung vào tìm kiếm và truy xuất hiệu quả, LLM đa phương thức phù hợp để tạo và hiểu nội dung đa dạng, khiến chúng trở nên lý tưởng cho chatbot, trợ lý tương tác và tương tác đa phương thức.
| Mô hình nhúng đa phương thức | Mô hình ngôn ngữ lớn đa phương thức (LLM) |
---|---|---|
Mục đích chính | Cho phép tìm kiếm và truy xuất trên các phương thức dữ liệu khác nhau như văn bản và hình ảnh | Tạo và hiểu nội dung trên nhiều phương thức |
Trường hợp sử dụng cốt lõi | Tìm kiếm ngữ nghĩa, truy xuất nội dung và sự tương đồng | AI đàm thoại, tạo nội dung và hệ thống đối thoại |
Mô hình ví dụ | CLIP, Mô hình nhúng đa phương thức của Google | GPT-4 (có khả năng đa phương thức), Llava, Gemini, Flamingo, LaMDA |
Tìm kiếm và truy xuất | Tối ưu hóa để tìm kiếm nhanh, chính xác và tương tự | Được tối ưu hóa để hiểu và tạo toàn diện trên các loại dữ liệu khác nhau. |
Các ứng dụng | Kiểm duyệt nội dung, hệ thống khuyến nghị, tìm kiếm ngữ nghĩa | Tác nhân đàm thoại, sáng tạo nội dung, tương tác đa phương thức |
Phương pháp đầu tiên mà OpenOrigins xem xét liên quan đến phân tích từng khung hình của video bằng cách sử dụng tính năng nhúng hình ảnh. Cách tiếp cận này chia video thành các khung riêng lẻ, mỗi khung được chuyển đổi thành dạng nhúng vectơ bằng cách sử dụng
Bằng cách nghiên cứu hàng triệu hình ảnh trên web cùng với mô tả của chúng, CLIP hiểu các khái niệm trực quan theo cách tương tự như cách con người nhận thức và mô tả thế giới. Quá trình đào tạo của nó bao gồm "học tập tương phản", trong đó nó học cách ghép các hình ảnh với mô tả chính xác, mang lại cho nó khả năng độc đáo để xử lý các nhiệm vụ khác nhau bằng cách hiểu mối liên hệ giữa những gì chúng ta nhìn thấy và những từ chúng ta sử dụng.
Điều này làm cho CLIP có khả năng thích ứng cao và hữu ích cho các ứng dụng đòi hỏi sự hiểu biết sâu sắc về hình ảnh và ngôn ngữ cùng nhau.
Các phần nhúng này được lưu trữ trong cơ sở dữ liệu vectơ, cho phép tìm kiếm nhanh chóng và chính xác bằng cách khớp văn bản với văn bản, văn bản với hình ảnh hoặc hình ảnh với hình ảnh dựa trên sự tương đồng về ngữ nghĩa.
Trích xuất khung hình sẽ phân tách video thành các khung hình theo các khoảng thời gian được chỉ định. Mỗi khung hình được xử lý thông qua mô hình nhúng hình ảnh để tạo ra biểu diễn vectơ chiều cao. Các vectơ này được lưu trữ trong một kho vectơ như DataStax Astra DB, cho phép tìm kiếm sự tương đồng hiệu quả.
Phương pháp này mang lại độ chính xác cao trong tìm kiếm ngữ nghĩa đa phương thức và rất phù hợp để tìm kiếm các đối tượng hoặc cảnh cụ thể. Tuy nhiên, nó đòi hỏi nhiều tính toán, đặc biệt đối với các video dài và có thể bỏ sót bối cảnh thời gian hoặc những thay đổi giữa các khung hình.
Cách tiếp cận thứ hai tận dụng công nghệ AI thế hệ mới nhất với các phần nhúng đa phương thức, đặc biệt là sử dụng Google
Bằng cách biểu diễn video bằng số, các phần nhúng này hỗ trợ các tác vụ học máy nâng cao, giúp việc tìm kiếm, phân tích và phân loại nội dung video trở nên dễ dàng hơn.
Tích hợp các phần nhúng này với
Mỗi phần nhúng đa phương thức của Google và phương pháp CLIP đều nhúng dữ liệu đa phương thức vào một không gian nhúng chung. Sự khác biệt chính là tính năng nhúng đa phương thức của Google hỗ trợ video, trong khi CLIP thì không.
Chúng tôi đã tập hợp các kho lưu trữ bên dưới để làm sáng tỏ và áp dụng các ví dụ cho cả phân tích video tìm kiếm khung và nhúng đa phương thức. Những ví dụ này cung cấp những minh họa thực tế và hướng dẫn chi tiết để giúp thực hiện và đánh giá từng phương pháp một cách hiệu quả.
Trong cách tiếp cận này, chúng tôi giới thiệu một
Hàm get_single_frame_from_scene
tính toán ID khung và đặt chế độ quay video thành khung này và đọc nó:
def get_single_frame_from_scene(scene, video_capture): frame_id = (scene[1] - scene[0]).frame_num // 2 + scene[0].frame_num video_capture.set(cv2.CAP_PROP_POS_FRAMES, frame_id) _, frame = video_capture.read() return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
Hàm get_frames_from_video
xử lý video, phát hiện cảnh bằng AdaptiveDetector và trích xuất một khung hình từ mỗi cảnh bằng cách gọi get_single_frame_from_scene, lưu trữ các khung hình này vào danh sách:
def get_frames_from_video(video_path): res = [] video_capture = cv2.VideoCapture(video_path) content_list = detect(video_path, AdaptiveDetector()) for scene in content_list: res.append(get_single_frame_from_scene(scene, video_capture)) return res
Hàm get_image_embedding sử dụng một
def get_image_embedding(image): inputs = clip_processor(images=image, return_tensors="pt") image_embeddings = model.get_image_features(**inputs) return list(image_embeddings[0].detach().numpy().astype(float))
Mã này kết nối với cơ sở dữ liệu Astra DB, tạo một tập hợp các đối tượng JSON có nhúng vectơ và chèn các đối tượng này vào bộ sưu tập "video" trong cơ sở dữ liệu:
import json from astrapy import DataAPIClient client = DataAPIClient(ASTRA_DB_TOKEN) database = client.get_database(ASTRA_DB_API_ENDPOINT) collectiondb = database.video json_embedding = [ {"id": f"{i+1}", "$vector": values} for i, values in enumerate(image_embeddings) ] response = collectiondb.insert_many(json_embedding)
Tìm kiếm một văn bản nhất định bằng cách sử dụng phần nhúng OpenAI Clip:
query_text = "men with white hair" query_embedding = get_text_embedding(query_text) result = collectiondb.find_one({}, vector=query_embedding)
Tại đây, bạn có thể xem cách tạo các phần nhúng video bằng mô hình nhúng đa phương thức của Google và lưu trữ chúng trong Astra DB, bao gồm thông tin siêu dữ liệu như start_offset_sec và end_offset_sec (xem phần
import vertexai from vertexai.vision_models import MultiModalEmbeddingModel, Video from astrapy import DataAPIClient import streamlit as st # Initialize Vertex AI vertexai.init(project=st.secrets['PROJECT'], location=st.secrets['REGION']) # Initialize the client client = DataAPIClient(st.secrets['ASTRA_TOKEN']) database = client.get_database(st.secrets['ASTRA_API_ENDPOINT']) my_collection = database.create_collection( "videosearch", dimension=1408, metric=astrapy.constants.VectorMetric.COSINE, ) collectiondb = database.videosearch # Load the pre-trained model and video model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding") video = Video.load_from_file(st.secrets['PATH']) # Get embeddings with the specified contextual text embeddings = model.get_embeddings( video=video, contextual_text="Mixed Content", dimension=1408, ) # Video Embeddings are segmented based on the video_segment_config. for video_embedding in embeddings.video_embeddings: # Check if embedding is a numpy array or a tensor and convert accordingly if isinstance(video_embedding.embedding, (list, tuple)): embedding_list = video_embedding.embedding else: embedding_list = video_embedding.embedding.tolist() embedding_data = { "metadata": { "start_offset_sec": video_embedding.start_offset_sec, "end_offset_sec": video_embedding.end_offset_sec }, "$vector": embedding_list # Ensure embedding is in list format } response = collectiondb.insert_one(embedding_data)
Ở đây, chúng tôi thiết lập
import vertexai from vertexai.vision_models import MultiModalEmbeddingModel, Video from vertexai.vision_models import Image as img from astrapy import DataAPIClient import streamlit as st from PIL import Image st.title("Video Search App") user_input_placeholder = st.empty() user_input = user_input_placeholder.text_input( "Describe the content you're looking for:", key="user_input" ) uploaded_file = st.file_uploader("Choose an image file that is similar you're looking for", type="png") if uploaded_file is not None: image = Image.open(uploaded_file) image_path = st.secrets['IMAGE_PATH'] image.save(image_path) saved_image = Image.open(image_path) st.image(saved_image, caption='', use_column_width=True) # Initialize Vertex AI vertexai.init(project=st.secrets['PROJECT'], location=st.secrets['REGION']) # Initialize the client client = DataAPIClient(st.secrets['ASTRA_TOKEN']) database = client.get_database(st.secrets['ASTRA_API_ENDPOINT']) collectiondb = database.videosearch # Load the pre-trained model and video model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding") video = Video.load_from_file(st.secrets['PATH']) # Search action trigger if st.button("Search"): if user_input: embeddings = model.get_embeddings( contextual_text=user_input ) result = collectiondb.find_one({}, vector=embeddings.text_embedding) start_offset_value = result['metadata']['start_offset_sec'] end_offset_value = result['metadata']['end_offset_sec'] st.write("Text input result found between: " + str(start_offset_value) + "-" + str(end_offset_value)) video_file = open(st.secrets['PATH'], 'rb') video_bytes = video_file.read() st.video(video_bytes, start_time=start_offset_value) if uploaded_file is not None: embimage = img.load_from_file(image_path) embeddingsimg = model.get_embeddings( image=embimage ) imgresult = collectiondb.find_one({}, vector=embeddingsimg.image_embedding) start_offset_value = imgresult['metadata']['start_offset_sec'] end_offset_value = imgresult['metadata']['end_offset_sec'] st.write("Image input result found between: " + str(start_offset_value) + "-" + str(end_offset_value)) video_file = open(st.secrets['PATH'], 'rb') video_bytes = video_file.read() st.video(video_bytes, start_time=start_offset_value)
Đây là kết quả trông như thế nào:
Khám phá hai phương pháp này làm nổi bật tiềm năng đáng kể của kỹ thuật AI hiện đại trong các ứng dụng tìm kiếm video. Mặc dù tìm kiếm khung bằng nhúng hình ảnh mang lại độ chính xác cao cho các tìm kiếm trực quan cụ thể, nhưng tính linh hoạt và sức mạnh của nhúng đa phương thức khiến chúng trở thành lựa chọn ưu việt cho các yêu cầu tìm kiếm đa phương thức, phức tạp.
Bằng cách sử dụng Astra DB, nền tảng tìm kiếm video có thể cung cấp cho người dùng khả năng tìm kiếm nâng cao, cho phép truy xuất chính xác và hiệu quả nội dung video cụ thể từ các tập dữ liệu lớn. Điều này cải thiện đáng kể khả năng phân tích và diễn giải dữ liệu video, mang lại thông tin chi tiết nhanh hơn và chính xác hơn.
Nhìn về phía trước, tương lai của tìm kiếm video rất tươi sáng với những nghiên cứu và phát triển không ngừng. Những tiến bộ trong AI và học máy sẽ tiếp tục cải thiện những kỹ thuật này, khiến chúng trở nên dễ tiếp cận và hiệu quả hơn. Việc tích hợp với các công nghệ mới nổi khác, chẳng hạn như thực tế tăng cường và phân tích video thời gian thực, sẽ mở rộng hơn nữa khả năng của chúng.
Bởi Matthew Pendlebury , Trưởng bộ phận Kỹ thuật, OpenOrigins và Betul O'Reilly , Kiến trúc sư giải pháp, DataStax