Imagine a un científico de datos que estudia el comportamiento de la vida silvestre y analiza cientos de horas de video de cámaras en un bosque remoto. O un entrenador deportivo que necesita identificar jugadas clave de partidos de una temporada completa para desarrollar nuevas estrategias. Alternativamente, considere un cineasta que busca escenas específicas dentro de una enorme galería de videos para armar un documental.
Tradicionalmente, todos estos expertos se enfrentan al desafío abrumador, propenso a errores y que requiere mucho tiempo de clasificar manualmente horas interminables de metraje.
Sin embargo, los avances en inteligencia artificial y aprendizaje automático han transformado drásticamente las aplicaciones de búsqueda de vídeos. Estas tecnologías ahora nos permiten buscar objetos y eventos específicos dentro de extensos conjuntos de datos de video con una sofisticación increíble. Los investigadores y científicos de datos pueden identificar segmentos de vídeo relevantes con una precisión y eficiencia excepcionales.
El objetivo era simplificar el proceso de investigación proporcionando capacidades de búsqueda avanzada, permitiendo a los usuarios localizar fácilmente imágenes con contenido o propiedades específicas de conjuntos de datos de vídeo extremadamente grandes.
Mediante el uso de sofisticados algoritmos de búsqueda y una interfaz fácil de usar, OpenOrigins pretendía hacer de la plataforma una herramienta importante para esta comunidad.
OpenOrigins consideró dos enfoques tecnológicos para construir esta oferta de búsqueda de video: búsqueda de fotogramas utilizando incrustaciones de imágenes e incrustaciones multimodales. Echemos un vistazo a cada opción.
Permitir la búsqueda semántica en video para responder preguntas complejas como: "¿Cuántos minutos de contenido de video hay que muestran ciervos en su hábitat natural?" requiere capacidades de búsqueda sofisticadas que puedan comprender e interpretar el contenido de los videos más allá de la coincidencia básica de metadatos de palabras clave. ¿La clave para lograrlo? Incrustaciones multimodales.
Los modelos de integración multimodal y los modelos de lenguaje grande (LLM) multimodales podrían verse como soluciones similares. Modelos como CLIP y las incrustaciones multimodales de Google generan incrustaciones para tipos de datos como texto, imágenes y video, creando vectores de alta dimensión que capturan el significado semántico. Esto permite aplicaciones como búsqueda semántica, recuperación de contenido y detección de similitudes.
Por otro lado, los LLM multimodales como GPT-4 (con capacidades multimodales), Flamingo y Gemini están diseñados para comprender y generar contenido a través de diferentes tipos de datos.
Estos modelos funcionan bien con tareas complejas como la IA conversacional y la generación de contenido mediante el uso de entradas multimodales (texto e imágenes, por ejemplo) y la generación de salidas multimodales, lo que da como resultado respuestas significativas y contextualmente ricas.
Si bien los modelos integrados se centran en la búsqueda y recuperación eficientes, los LLM multimodales son adecuados para generar y comprender contenido diverso, lo que los hace ideales para chatbots, asistentes interactivos e interacciones multimodales.
| Modelos de incrustación multimodales | Modelos de lenguaje grande multimodales (LLM) |
---|---|---|
Propósito principal | Habilite la búsqueda y recuperación en diferentes modalidades de datos, como texto e imagen. | Generar y comprender contenido en múltiples modalidades. |
Caso de uso principal | Búsqueda semántica, recuperación de contenidos y similitud. | IA conversacional, generación de contenidos y sistemas de diálogo |
Modelos de ejemplo | CLIP, modelo de incrustación multimodal de Google | GPT-4 (con capacidades multimodales), Llava, Gemini, Flamingo, LaMDA |
Búsqueda y recuperación | Optimizado para búsqueda y similitud rápidas y precisas | Optimizado para una comprensión y generación integrales de diferentes tipos de datos. |
Aplicaciones | Moderación de contenidos, sistemas de recomendación, búsqueda semántica. | Agentes conversacionales, creación de contenidos, interacciones multimodales. |
El primer método que analizó OpenOrigins implicó el análisis cuadro por cuadro de videos utilizando incrustaciones de imágenes. Este enfoque divide el vídeo en fotogramas individuales, cada uno de los cuales se convierte en un vector incrustado mediante el uso
Al estudiar millones de imágenes web con sus descripciones, CLIP comprende conceptos visuales de una manera similar a cómo los humanos perciben y describen el mundo. Su entrenamiento implica un "aprendizaje contrastante", donde aprende a relacionar imágenes con sus descripciones correctas, lo que le otorga la capacidad única de manejar diversas tareas al comprender el vínculo entre lo que vemos y las palabras que usamos.
Esto hace que CLIP sea altamente adaptable y útil para aplicaciones que requieren una comprensión profunda de las imágenes y el lenguaje en conjunto.
Estas incrustaciones se almacenan en una base de datos vectorial, lo que permite búsquedas rápidas y precisas al hacer coincidir texto con texto, texto con imagen o imagen con imagen en función de la similitud semántica.
La extracción de fotogramas descompone los vídeos en fotogramas a intervalos específicos. Cada cuadro se procesa a través de un modelo de incrustación de imágenes para generar una representación vectorial de alta dimensión. Estos vectores se almacenan en un almacén de vectores como DataStax Astra DB, que permite búsquedas de similitudes eficientes.
Este método ofrece alta precisión en la búsqueda semántica multimodal y es muy adecuado para buscar objetos o escenas específicas. Sin embargo, requiere una gran cantidad de cálculo, especialmente para vídeos largos, y puede pasar por alto el contexto temporal o los cambios entre fotogramas.
El segundo enfoque aprovecha la última tecnología de IA generativa con incorporaciones multimodales, específicamente utilizando Google
Al representar videos numéricamente, estas incrustaciones permiten tareas avanzadas de aprendizaje automático, lo que facilita la búsqueda, el análisis y la categorización de contenido de video.
Integrando estas incrustaciones con
Las incrustaciones multimodales de Google y el método CLIP incrustan datos multimodales en un espacio de incrustación común. La principal diferencia es que las incrustaciones multimodales de Google admiten vídeo, mientras que CLIP no.
Hemos reunido los repositorios a continuación para iluminar y aplicar ejemplos tanto para el análisis de video de búsqueda de cuadros como para las incrustaciones multimodales. Estos ejemplos proporcionan demostraciones prácticas e instrucciones detalladas para ayudar a implementar y evaluar cada enfoque de manera efectiva.
En este enfoque, introducimos un
La función get_single_frame_from_scene
calcula el ID del fotograma, establece la captura de vídeo en este fotograma y lo lee:
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))
La función get_frames_from_video
procesa un video, detecta escenas usando AdaptiveDetector y extrae un solo cuadro de cada escena llamando a get_single_frame_from_scene, almacenando estos cuadros en una lista:
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
La función get_image_embedding utiliza un
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))
Este código se conecta a una base de datos Astra DB, crea una colección de objetos JSON con incrustaciones de vectores e inserta estos objetos en la colección de "videos" de la base de datos:
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)
Busque un texto determinado utilizando incrustaciones de OpenAI Clip:
query_text = "men with white hair" query_embedding = get_text_embedding(query_text) result = collectiondb.find_one({}, vector=query_embedding)
Aquí puede ver cómo crear incrustaciones de vídeo utilizando el modelo de incrustación multimodal de Google y almacenarlos en Astra DB, incluida información de metadatos como start_offset_sec y end_offset_sec (consulte la
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)
Aquí configuramos el
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)
Así es como se ven los resultados:
Explorar estos dos enfoques resalta el importante potencial de las técnicas modernas de inteligencia artificial en aplicaciones de búsqueda de videos. Si bien la búsqueda de cuadros con incrustaciones de imágenes proporciona una alta precisión para búsquedas visuales específicas, la flexibilidad y el poder de las incrustaciones multimodales las convierten en una opción superior para requisitos de búsqueda multimodales complejos.
Al utilizar Astra DB, una plataforma de búsqueda de videos puede brindar a los usuarios capacidades de búsqueda avanzadas, lo que permite la recuperación precisa y eficiente de contenido de video específico a partir de grandes conjuntos de datos. Esto mejora significativamente la capacidad de analizar e interpretar datos de vídeo, lo que genera información más rápida y precisa.
De cara al futuro, el futuro de la búsqueda de vídeos es brillante gracias a la investigación y el desarrollo continuos. Los avances en inteligencia artificial y aprendizaje automático seguirán mejorando estas técnicas, haciéndolas más accesibles y eficientes. La integración con otras tecnologías emergentes, como la realidad aumentada y el análisis de vídeo en tiempo real, ampliará aún más sus capacidades.
Por Matthew Pendlebury , jefe de ingeniería, OpenOrigins, y Betul O'Reilly , arquitecto de soluciones, DataStax