paint-brush
Construindo pesquisa avançada de vídeo: pesquisa de quadros versus incorporações multimodaisby@datastax
278

Construindo pesquisa avançada de vídeo: pesquisa de quadros versus incorporações multimodais

DataStax10m2024/07/10
Read on Terminal Reader

Um mergulho na incorporação multimodal e na pesquisa de quadros, duas técnicas avançadas de pesquisa de vídeo
featured image - Construindo pesquisa avançada de vídeo: pesquisa de quadros versus incorporações multimodais
DataStax HackerNoon profile picture

Imagine um cientista de dados estudando o comportamento da vida selvagem, analisando centenas de horas de imagens de vídeo de câmeras em uma floresta remota. Ou um treinador esportivo que precisa identificar as principais jogadas dos jogos de uma temporada inteira para desenvolver novas estratégias. Como alternativa, considere um cineasta procurando cenas específicas em uma enorme galeria de vídeos para montar um documentário.


Tradicionalmente, todos esses especialistas enfrentam o desafio demorado, sujeito a erros e esmagador de classificar manualmente intermináveis horas de filmagens.


No entanto, os avanços da inteligência artificial e do aprendizado de máquina transformaram drasticamente os aplicativos de pesquisa de vídeos. Essas tecnologias agora nos permitem pesquisar objetos e eventos específicos em extensos conjuntos de dados de vídeo com incrível sofisticação. Cientistas e pesquisadores de dados podem identificar segmentos de vídeo relevantes com precisão e eficiência excepcionais.


OpenOrigins cria ferramentas para a proveniência do conteúdo de mídia e para permitir que os usuários verifiquem sua autenticidade. Para aumentar a sua oferta, a empresa sediada no Reino Unido decidiu desenvolver uma plataforma para que os arquivistas pudessem encontrar de forma rápida e eficiente vídeos relevantes em arquivos de mídia digital.


O objetivo era simplificar o processo de pesquisa, fornecendo recursos avançados de pesquisa, permitindo aos usuários localizar facilmente imagens com conteúdo ou propriedades específicas de conjuntos de dados de vídeo extremamente grandes.


Utilizando algoritmos de busca sofisticados e uma interface amigável, o OpenOrigins teve como objetivo tornar a plataforma uma ferramenta importante para esta comunidade.


OpenOrigins considerou duas abordagens tecnológicas para construir esta oferta de pesquisa de vídeo: pesquisa de quadros usando embeddings de imagens e embeddings multimodais. Vamos dar uma olhada em cada opção.

Pesquisa semântica em conteúdo de vídeo

Permitir a pesquisa semântica em vídeo para responder a perguntas complexas como: "Quantos minutos de conteúdo de vídeo existem que mostram cervos em seu habitat natural?" requer recursos de pesquisa sofisticados que possam compreender e interpretar o conteúdo dos vídeos além da correspondência básica de metadados de palavras-chave. A chave para conseguir isso? Incorporações multimodais.

Modelos de incorporação multimodal e modelos multimodais de grandes linguagens (LLMs) podem ser vistos como soluções semelhantes. Modelos como CLIP e embeddings multimodais do Google geram embeddings para tipos de dados como texto, imagens e vídeo, criando vetores de alta dimensão que capturam significado semântico. Isso permite aplicações como pesquisa semântica, recuperação de conteúdo e detecção de similaridade.


Por outro lado, LLMs multimodais como GPT-4 (com capacidades multimodais), Flamingo e Gemini são projetados para compreender e gerar conteúdo através de diferentes tipos de dados.


Esses modelos funcionam bem com tarefas complexas, como IA conversacional e geração de conteúdo, usando entradas multimodais (texto e imagens, por exemplo) e gerando resultados multimodais, resultando em respostas significativas e contextualmente ricas.


Embora os modelos de incorporação se concentrem na busca e recuperação eficientes, os LLMs multimodais são adequados para gerar e compreender diversos conteúdos, tornando-os ideais para chatbots, assistentes interativos e interações multimodais.


Modelos de incorporação multimodal

Modelos Multimodais de Grandes Linguagens (LLMs)

Propósito principal

Habilite pesquisa e recuperação em diferentes modalidades de dados, como texto e imagem

Gere e compreenda conteúdo em múltiplas modalidades

Caso de uso principal

Pesquisa semântica, recuperação de conteúdo e similaridade

IA conversacional, geração de conteúdo e sistemas de diálogo

Modelos de exemplo

CLIP, modelo de incorporação multimodal do Google

GPT-4 (com capacidades multimodais), Llava, Gemini, Flamingo, LaMDA

Pesquisa e recuperação

Otimizado para pesquisa e similaridade rápidas e precisas

Otimizado para compreensão e geração abrangentes de diferentes tipos de dados.

Formulários

Moderação de conteúdo, sistemas de recomendação, pesquisa semântica

Agentes conversacionais, criação de conteúdo, interações multimodais

Abordagem 1: pesquisa de quadros com incorporações de imagens

O primeiro método que o OpenOrigins analisou envolveu a análise quadro a quadro de vídeos usando incorporações de imagens. Essa abordagem divide o vídeo em quadros individuais, cada um convertido em uma incorporação vetorial usando GRAMPO modelos de incorporação.



Figura 1: Resumo do diagrama de abordagem (adaptado de “Aprendendo modelos visuais transferíveis da supervisão de linguagem natural”). Enquanto os modelos de imagem padrão treinam em conjunto um extrator de recursos de imagem e um classificador linear para prever algum rótulo, o CLIP treina em conjunto um codificador de imagem e um codificador de texto para prever os pares corretos de um lote de exemplos de treinamento (imagem, texto). No momento do teste, o codificador de texto aprendido sintetiza um classificador linear zero-shot incorporando os nomes ou descrições das classes do conjunto de dados de destino.


CLIP, desenvolvido pela OpenAI , é um modelo de IA que aprende a compreender imagens por meio da linguagem natural, ao contrário dos modelos tradicionais que dependem de imagens especificamente rotuladas.


Ao estudar milhões de imagens da web com suas descrições, o CLIP compreende conceitos visuais de uma forma semelhante à forma como os humanos percebem e descrevem o mundo. O seu treino envolve uma “aprendizagem contrastiva”, onde aprende a combinar imagens com as suas descrições corretas, dando-lhe a capacidade única de lidar com diversas tarefas, compreendendo a ligação entre o que vemos e as palavras que usamos.


Isso torna o CLIP altamente adaptável e útil para aplicações que exigem um conhecimento profundo de imagens e linguagem em conjunto.


Essas incorporações são armazenadas em um banco de dados vetorial, que permite pesquisas rápidas e precisas, combinando texto com texto, texto com imagem ou imagem com imagem com base na semelhança semântica.


A extração de quadros decompõe vídeos em quadros em intervalos especificados. Cada quadro é processado por meio de um modelo de incorporação de imagem para gerar uma representação vetorial de alta dimensão. Esses vetores são armazenados em um armazenamento de vetores como o DataStax Astra DB, que permite pesquisas eficientes por similaridade.


Este método oferece alta precisão na pesquisa semântica multimodal e é adequado para pesquisar objetos ou cenas específicas. No entanto, é computacionalmente intensivo, especialmente para vídeos longos, e pode perder o contexto temporal ou mudanças entre os quadros.

Abordagem 2: incorporações multimodais com nó de incorporação multimodal do Google

A segunda abordagem aproveita a mais recente tecnologia de IA generativa com incorporações multimodais, especificamente usando o Google modelo de incorporação multimodal . Este método inovador permite aos usuários pesquisar vídeos usando imagens, texto ou vídeos, convertendo todas as entradas em um espaço de incorporação comum . O modelo gera incorporações para vários tipos de entrada e os mapeia em um espaço vetorial compartilhado. Os usuários podem pesquisar usando diferentes modalidades convertidas para os mesmos embeddings dimensionais.

Modelo de incorporação multimodal do Google: dimensão 1048*

Incorporações multimodais do Google Cloud Vertex AI para vídeo

Vertex AI do Google Cloud oferece incorporações multimodais poderosas, incluindo incorporações de vídeo sofisticadas que transformam conteúdo de vídeo em vetores de alta dimensão. Essas incorporações de 1408 dimensões permitem diversas aplicações, como moderação de conteúdo, pesquisa semântica e classificação de vídeo.


Ao representar os vídeos numericamente, essas incorporações permitem tarefas avançadas de aprendizado de máquina, facilitando a pesquisa, a análise e a categorização do conteúdo do vídeo.


Integrando esses embeddings com Banco de dados DataStax Astra garante o manuseio eficiente de grandes conjuntos de dados e fornece suporte de back-end robusto para recuperação eficaz. Essa abordagem melhora a relevância e a precisão da pesquisa, oferecendo suporte a vários tipos de entrada para consultas de pesquisa e aplicando recursos avançados de IA. Este método gerencia com eficiência grandes conjuntos de dados com contexto temporal, tornando-o uma excelente escolha para cenários de pesquisa complexos.


Os embeddings multimodais do Google e o método CLIP incorporam dados multimodais em um espaço de incorporação comum. A principal diferença é que os embeddings multimodais do Google suportam vídeo, enquanto o CLIP não.

Visão geral técnica

Reunimos os repositórios abaixo para iluminar e aplicar exemplos para análise de vídeo de pesquisa de quadros e incorporações multimodais. Estes exemplos fornecem demonstrações práticas e instruções detalhadas para ajudar a implementar e avaliar cada abordagem de forma eficaz.

Abordagem 1: pesquisa de quadros com incorporações de imagens

Nesta abordagem, apresentamos uma Caderno Colab projetado para demonstrar a análise de vídeo de busca de quadros usando incorporações de imagens. O notebook fornece um guia passo a passo para dividir o conteúdo de vídeo em quadros individuais e analisar cada quadro usando o modelo de incorporação CLIP. Essa abordagem permite pesquisas de alta precisão de objetos ou cenas específicas nos dados de vídeo.


A função get_single_frame_from_scene calcula o ID do quadro e define a captura de vídeo para este quadro e o lê:


 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))


A função get_frames_from_video processa um vídeo, detectando cenas usando o AdaptiveDetector, e extrai um único quadro de cada cena chamando get_single_frame_from_scene, armazenando esses quadros em uma 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


A função get_image_embedding usa um Modelo CLIPE para gerar uma incorporação para uma determinada imagem, passando-a pelo modelo e retornando o vetor de recursos resultante como uma lista de pontos flutuantes:


 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 um banco de dados Astra DB, cria uma coleção de objetos JSON com incorporações de vetores e insere esses objetos na coleção "video" do banco de dados:


 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)


Pesquise um determinado texto usando embeddings OpenAI Clip:


 query_text = "men with white hair" query_embedding = get_text_embedding(query_text) result = collectiondb.find_one({}, vector=query_embedding)


Abordagem 2: incorporações multimodais com o modelo de incorporação multimodal do Google

Aqui, você pode ver como criar embeddings de vídeo usando o modelo de incorporação multimodal do Google e armazená-los no Astra DB, incluindo informações de metadados como start_offset_sec e end_offset_sec (confira o Repositório GitHub ).


 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)


Aqui, montamos o UI simplificada , uma ferramenta poderosa para criar aplicativos da Web interativos e orientados a dados com esforço mínimo, usando a simplicidade e o poder do Python. Além disso, habilitamos a funcionalidade de pesquisa para textos ou imagens específicas no código abaixo:


 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)


Veja como são os resultados:

Conclusão

A exploração dessas duas abordagens destaca o potencial significativo das técnicas modernas de IA em aplicações de pesquisa de vídeo. Embora a pesquisa de quadros com incorporações de imagens forneça alta precisão para pesquisas visuais específicas, a flexibilidade e o poder das incorporações multimodais as tornam uma escolha superior para requisitos de pesquisa multimodais complexos.


Ao usar o Astra DB, uma plataforma de pesquisa de vídeo pode fornecer aos usuários recursos avançados de pesquisa, permitindo a recuperação precisa e eficiente de conteúdo de vídeo específico de grandes conjuntos de dados. Isto melhora significativamente a capacidade de analisar e interpretar dados de vídeo, levando a insights mais rápidos e precisos.


Olhando para o futuro, o futuro da pesquisa de vídeos é brilhante com pesquisa e desenvolvimento contínuos. Os avanços na IA e na aprendizagem automática continuarão a melhorar estas técnicas, tornando-as mais acessíveis e eficientes. A integração com outras tecnologias emergentes, como a realidade aumentada e a análise de vídeo em tempo real, expandirá ainda mais as suas capacidades.


Por Matthew Pendlebury , chefe de engenharia, OpenOrigins, e Betul O'Reilly , arquiteto de soluções, DataStax