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.
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.
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 |
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
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.
A segunda abordagem aproveita a mais recente tecnologia de IA generativa com incorporações multimodais, especificamente usando o Google
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
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.
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.
Nesta abordagem, apresentamos uma
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
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)
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
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
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:
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