Imaginez un data scientist étudiant le comportement de la faune et analysant des centaines d’heures de séquences vidéo provenant de caméras dans une forêt isolée. Ou un coach sportif qui a besoin d'identifier les éléments clés des matchs d'une saison entière pour développer de nouvelles stratégies. Alternativement, considérez un cinéaste recherchant des scènes spécifiques dans une immense galerie vidéo pour reconstituer un documentaire.
Traditionnellement, tous ces experts sont confrontés au défi fastidieux, sujet aux erreurs et écrasant de trier manuellement des heures interminables de séquences.
Cependant, les progrès de l’intelligence artificielle et de l’apprentissage automatique ont considérablement transformé les applications de recherche vidéo. Ces technologies nous permettent désormais de rechercher des objets et des événements spécifiques dans de vastes ensembles de données vidéo avec une sophistication incroyable. Les data scientists et les chercheurs peuvent identifier les segments vidéo pertinents avec une précision et une efficacité exceptionnelles.
L'objectif était de simplifier le processus de recherche en fournissant des capacités de recherche avancées, permettant aux utilisateurs de localiser facilement des séquences avec un contenu ou des propriétés spécifiques à partir d'ensembles de données vidéo extrêmement volumineux.
En utilisant des algorithmes de recherche sophistiqués et une interface conviviale, OpenOrigins visait à faire de la plateforme un outil important pour cette communauté.
OpenOrigins a envisagé deux approches technologiques pour créer cette offre de recherche vidéo : la recherche d'images utilisant des intégrations d'images et des intégrations multimodales. Jetons un coup d'œil à chaque option.
Permettre la recherche sémantique sur vidéo pour répondre à des questions complexes telles que : « Combien de minutes de contenu vidéo existe-t-il qui montrent des cerfs dans leur habitat naturel ? » nécessite des capacités de recherche sophistiquées capables de comprendre et d'interpréter le contenu des vidéos au-delà de la correspondance de base des métadonnées des mots clés. La clé pour y parvenir ? Intégrations multimodales.
Les modèles d'intégration multimodaux et les grands modèles de langage multimodaux (LLM) peuvent être considérés comme des solutions similaires. Des modèles tels que les intégrations multimodales CLIP et Google génèrent des intégrations pour des types de données tels que le texte, les images et la vidéo, créant ainsi des vecteurs de grande dimension qui capturent une signification sémantique. Cela permet des applications telles que la recherche sémantique, la récupération de contenu et la détection de similarités.
D'un autre côté, les LLM multimodaux comme GPT-4 (avec des capacités multimodales), Flamingo et Gemini sont conçus pour comprendre et générer du contenu sur différents types de données.
Ces modèles fonctionnent bien avec des tâches complexes telles que l'IA conversationnelle et la génération de contenu en utilisant des entrées multimodales (texte et images, par exemple) et en générant des sorties multimodales, ce qui donne lieu à des réponses significatives et riches en contexte.
Alors que les modèles d'intégration se concentrent sur une recherche et une récupération efficaces, les LLM multimodaux sont adaptés à la génération et à la compréhension de contenus diversifiés, ce qui les rend idéaux pour les chatbots, les assistants interactifs et les interactions multimodales.
| Modèles d'intégration multimodaux | Grands modèles de langage multimodaux (LLM) |
---|---|---|
Objectif principal | Activer la recherche et la récupération sur différentes modalités de données telles que le texte et l'image | Générer et comprendre du contenu selon plusieurs modalités |
Cas d'utilisation principal | Recherche sémantique, récupération de contenu et similarité | IA conversationnelle, génération de contenu et systèmes de dialogue |
Exemples de modèles | CLIP, modèle d'intégration multimodale de Google | GPT-4 (avec capacités multimodales), Llava, Gemini, Flamingo, LaMDA |
Recherche et récupération | Optimisé pour une recherche et une similarité rapides et précises | Optimisé pour une compréhension et une génération complètes de différents types de données. |
Applications | Modération de contenu, systèmes de recommandation, recherche sémantique | Agents conversationnels, création de contenu, interactions multimodales |
La première méthode examinée par OpenOrigins impliquait une analyse image par image de vidéos à l’aide d’intégrations d’images. Cette approche décompose la vidéo en images individuelles, chacune convertie en intégration vectorielle en utilisant
En étudiant des millions d'images Web avec leurs descriptions, CLIP comprend les concepts visuels d'une manière similaire à la façon dont les humains perçoivent et décrivent le monde. Sa formation implique un « apprentissage contrasté », où il apprend à faire correspondre les images avec leurs descriptions correctes, ce qui lui confère la capacité unique de gérer diverses tâches en comprenant le lien entre ce que nous voyons et les mots que nous utilisons.
Cela rend CLIP hautement adaptable et utile pour les applications nécessitant une compréhension approfondie des images et du langage.
Ces intégrations sont stockées dans une base de données vectorielle, qui permet des recherches rapides et précises en faisant correspondre texte à texte, texte à image ou image à image sur la base d'une similarité sémantique.
L'extraction d'images décompose les vidéos en images à des intervalles spécifiés. Chaque image est traitée via un modèle d'intégration d'image pour générer une représentation vectorielle de grande dimension. Ces vecteurs sont stockés dans un magasin de vecteurs comme DataStax Astra DB, ce qui permet des recherches de similarité efficaces.
Cette méthode offre une grande précision dans la recherche sémantique multimodale et convient bien à la recherche d'objets ou de scènes spécifiques. Cependant, cela nécessite beaucoup de calculs, en particulier pour les vidéos longues, et peut manquer le contexte temporel ou les changements entre les images.
La deuxième approche exploite la dernière technologie d'IA générative avec des intégrations multimodales, en utilisant spécifiquement l'outil de Google.
En représentant les vidéos numériquement, ces intégrations permettent des tâches avancées d'apprentissage automatique, facilitant ainsi la recherche, l'analyse et la catégorisation du contenu vidéo.
Intégrer ces intégrations avec
Les intégrations multimodales de Google et la méthode CLIP intègrent chacune des données multimodales dans un espace d'intégration commun. La principale différence est que les intégrations multimodales de Google prennent en charge la vidéo, contrairement à CLIP.
Nous avons rassemblé les référentiels ci-dessous pour éclairer et appliquer des exemples à la fois pour l'analyse vidéo par recherche d'images et pour les intégrations multimodales. Ces exemples fournissent des démonstrations pratiques et des instructions détaillées pour aider à mettre en œuvre et à évaluer efficacement chaque approche.
Dans cette approche, nous introduisons un
La fonction get_single_frame_from_scene
calcule l'ID de l'image, définit la capture vidéo sur cette image et la lit :
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 fonction get_frames_from_video
traite une vidéo, détecte les scènes à l'aide d'AdaptiveDetector, et extrait une seule image de chaque scène en appelant get_single_frame_from_scene, en stockant ces images dans une liste :
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 fonction get_image_embedding utilise 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))
Ce code se connecte à une base de données Astra DB, crée une collection d'objets JSON avec des intégrations vectorielles et insère ces objets dans la collection « vidéo » de la base de données :
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)
Recherchez un certain texte à l'aide des intégrations OpenAI Clip :
query_text = "men with white hair" query_embedding = get_text_embedding(query_text) result = collectiondb.find_one({}, vector=query_embedding)
Ici, vous pouvez voir comment créer des intégrations vidéo à l'aide du modèle d'intégration multimodal de Google et les stocker dans Astra DB, y compris des informations de métadonnées telles que start_offset_sec et end_offset_sec (consultez le
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)
Ici, nous avons mis en place le
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)
Voici à quoi ressemblent les résultats :
L'exploration de ces deux approches met en évidence le potentiel important des techniques modernes d'IA dans les applications de recherche vidéo. Alors que la recherche de trames avec intégration d'images offre une grande précision pour des recherches visuelles spécifiques, la flexibilité et la puissance des intégrations multimodales en font un choix supérieur pour les exigences de recherche multimodales complexes.
En utilisant Astra DB, une plate-forme de recherche vidéo peut fournir aux utilisateurs des capacités de recherche avancées, permettant une récupération précise et efficace de contenus vidéo spécifiques à partir de grands ensembles de données. Cela améliore considérablement la capacité d’analyse et d’interprétation des données vidéo, ce qui permet d’obtenir des informations plus rapides et plus précises.
Pour l’avenir, l’avenir de la recherche vidéo s’annonce prometteur grâce à la recherche et au développement en cours. Les progrès de l’IA et de l’apprentissage automatique continueront d’améliorer ces techniques, les rendant plus accessibles et efficaces. L'intégration avec d'autres technologies émergentes, telles que la réalité augmentée et l'analyse vidéo en temps réel, élargira encore leurs capacités.
Par Matthew Pendlebury , responsable de l'ingénierie, OpenOrigins, et Betul O'Reilly , architecte de solutions, DataStax