Представьте себе ученого, изучающего поведение диких животных и анализирующего сотни часов видеозаписей с камер в отдаленном лесу. Или спортивный тренер, которому необходимо выявить ключевые моменты игр всего сезона, чтобы разработать новые стратегии. В качестве альтернативы рассмотрим режиссера, который ищет определенные сцены в огромной видеогалерее, чтобы собрать воедино документальный фильм.
Традиционно все эти эксперты сталкиваются с трудоемкой, подверженной ошибкам и сложной задачей ручной сортировки бесконечных часов отснятого материала.
Однако достижения в области искусственного интеллекта и машинного обучения радикально изменили приложения для поиска видео. Эти технологии теперь позволяют нам с невероятной сложностью искать конкретные объекты и события в обширных наборах видеоданных. Специалисты по данным и исследователи могут определять соответствующие сегменты видео с исключительной точностью и эффективностью.
Цель заключалась в том, чтобы упростить процесс исследования, предоставив расширенные возможности поиска, позволяющие пользователям легко находить кадры с определенным содержанием или свойствами в чрезвычайно больших наборах видеоданных.
Используя сложные алгоритмы поиска и удобный интерфейс, OpenOrigins стремилась сделать платформу важным инструментом для этого сообщества.
OpenOrigins рассмотрела два технологических подхода к созданию этого предложения по поиску видео: поиск кадров с использованием встраивания изображений и мультимодальное встраивание. Давайте рассмотрим каждый вариант.
Включение семантического поиска по видео для ответа на сложные вопросы, например: «Сколько минут видеоконтента показывают оленей в их естественной среде обитания?» требуются сложные возможности поиска, которые могут понимать и интерпретировать содержание видео, выходя за рамки базового сопоставления метаданных ключевых слов. Ключ к достижению этого? Мультимодальные вложения.
Мультимодальные модели внедрения и мультимодальные модели большого языка (LLM) можно рассматривать как аналогичные решения. Такие модели, как мультимодальные внедрения CLIP и Google, генерируют внедрения для таких типов данных, как текст, изображения и видео, создавая многомерные векторы, которые улавливают семантическое значение. Это позволяет использовать такие приложения, как семантический поиск, поиск контента и обнаружение сходства.
С другой стороны, мультимодальные LLM, такие как GPT-4 (с мультимодальными возможностями), Flamingo и Gemini, предназначены для понимания и создания контента на основе различных типов данных.
Эти модели хорошо справляются со сложными задачами, такими как диалоговый искусственный интеллект и генерация контента, используя мультимодальные входные данные (например, текст и изображения) и генерируя мультимодальные выходные данные, что приводит к значимым и контекстуально богатым ответам.
В то время как модели внедрения ориентированы на эффективный поиск и извлечение информации, мультимодальные LLM подходят для создания и понимания разнообразного контента, что делает их идеальными для чат-ботов, интерактивных помощников и мультимодальных взаимодействий.
| Мультимодальные модели внедрения | Мультимодальные модели большого языка (LLM) |
---|---|---|
Главное предложение | Включите поиск и извлечение данных в различных модальностях, таких как текст и изображения. | Генерируйте и анализируйте контент в различных модальностях. |
Основной вариант использования | Семантический поиск, извлечение контента и сходство | Диалоговый искусственный интеллект, генерация контента и диалоговые системы |
Примеры моделей | CLIP, Мультимодальная модель внедрения Google | GPT-4 (с мультимодальными возможностями), Llava, Gemini, Flamingo, LaMDA |
Поиск и извлечение | Оптимизирован для быстрого и точного поиска и сходства. | Оптимизирован для всестороннего понимания и создания различных типов данных. |
Приложения | Модерация контента, рекомендательные системы, семантический поиск | Диалоговые агенты, создание контента, мультимодальные взаимодействия |
Первый метод, который рассмотрела OpenOrigins, включал покадровый анализ видео с использованием встраивания изображений. Этот подход разбивает видео на отдельные кадры, каждый из которых преобразуется в векторное внедрение с помощью
Изучая миллионы веб-изображений с их описаниями, CLIP понимает визуальные концепции так же, как люди воспринимают и описывают мир. Его обучение включает в себя «контрастное обучение», когда он учится сопоставлять изображения с их правильными описаниями, что дает ему уникальную способность решать различные задачи, понимая связь между тем, что мы видим, и словами, которые мы используем.
Это делает CLIP легко адаптируемым и полезным для приложений, требующих глубокого понимания изображений и языка одновременно.
Эти внедрения хранятся в базе данных векторов, что обеспечивает быстрый и точный поиск путем сопоставления текста с текстом, текста с изображением или изображения с изображением на основе семантического сходства.
Извлечение кадров разбивает видео на кадры с заданными интервалами. Каждый кадр обрабатывается с помощью модели внедрения изображения для создания многомерного векторного представления. Эти векторы хранятся в хранилище векторов, таком как DataStax Astra DB, что обеспечивает эффективный поиск по сходству.
Этот метод обеспечивает высокую точность мультимодального семантического поиска и хорошо подходит для поиска конкретных объектов или сцен. Однако он требует больших вычислительных ресурсов, особенно для длинных видео, и может упускать временной контекст или изменения между кадрами.
Второй подход использует новейшую технологию генеративного искусственного интеллекта с мультимодальными встраиваниями, в частности с использованием Google.
Представляя видео в числовом виде, эти встраивания позволяют выполнять сложные задачи машинного обучения, упрощая поиск, анализ и классификацию видеоконтента.
Интеграция этих вложений с
Мультимодальные внедрения Google и метод CLIP встраивают мультимодальные данные в общее пространство внедрения. Основное отличие состоит в том, что мультимодальные встраивания Google поддерживают видео, а CLIP — нет.
Мы собрали репозитории ниже, чтобы осветить и применить примеры как для анализа видео с поиском кадров, так и для мультимодального встраивания. Эти примеры содержат практические демонстрации и подробные инструкции, которые помогут эффективно реализовать и оценить каждый подход.
В этом подходе мы вводим
Функция get_single_frame_from_scene
вычисляет идентификатор кадра, устанавливает захват видео для этого кадра и считывает его:
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))
Функция get_frames_from_video
обрабатывает видео, определяя сцены с помощью AdaptiveDetector, и извлекает один кадр из каждой сцены, вызывая get_single_frame_from_scene, сохраняя эти кадры в списке:
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
Функция get_image_embedding использует
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))
Этот код подключается к базе данных Astra DB, создает коллекцию объектов JSON с векторными вложениями и вставляет эти объекты в коллекцию «видео» в базе данных:
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)
Найдите определенный текст с помощью вложений OpenAI Clip:
query_text = "men with white hair" query_embedding = get_text_embedding(query_text) result = collectiondb.find_one({}, vector=query_embedding)
Здесь вы можете увидеть, как создавать встраивания видео с использованием мультимодальной модели встраивания Google и сохранять их в базе данных Astra, включая информацию метаданных, такую как start_offset_sec и end_offset_sec (см.
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)
Здесь мы настроили
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)
Вот как выглядят результаты:
Изучение этих двух подходов подчеркивает значительный потенциал современных методов искусственного интеллекта в приложениях для поиска видео. Хотя поиск кадров с внедрением изображений обеспечивает высокую точность для конкретного визуального поиска, гибкость и мощность мультимодальных внедрений делают их превосходным выбором для сложных требований мультимодального поиска.
Используя Astra DB, платформа поиска видео может предоставить пользователям расширенные возможности поиска, обеспечивая точный и эффективный поиск конкретного видеоконтента из больших наборов данных. Это значительно улучшает возможности анализа и интерпретации видеоданных, что приводит к более быстрому и точному получению информации.
Заглядывая в будущее, можно сказать, что будущее видеопоиска светлое благодаря постоянным исследованиям и разработкам. Достижения в области искусственного интеллекта и машинного обучения будут продолжать совершенствовать эти методы, делая их более доступными и эффективными. Интеграция с другими новыми технологиями, такими как дополненная реальность и анализ видео в реальном времени, еще больше расширит их возможности.
Мэтью Пендлбери , руководитель технического отдела OpenOrigins, и Бетул О'Рейли , архитектор решений, DataStax