Concepts liés au framework

Avant d'utiliser le framework MediaPipe, familiarisez-vous avec les concepts suivants.

Principes de base

Paquet

Unité de flux de données de base. Un paquet se compose d'un horodatage numérique et d'un pointeur partagé vers une charge utile immutable. La charge utile peut être de n'importe quel type C++, et le type de la charge utile est également appelé type du paquet. Les paquets sont des classes de valeurs et peuvent être copiés à moindre coût. Chaque copie partage la propriété de la charge utile, avec une sémantique de comptage de références. Chaque copie a son propre code temporel. Voir aussi Paquet.

Graphique

Le traitement MediaPipe a lieu dans un graphe, qui définit les chemins de flux de paquets entre les nœuds. Un graphe peut comporter un nombre illimité d'entrées et de sorties, et le flux de données peut comporter des embranchements et des fusions. En règle générale, les données avancent, mais les boucles arrière sont possibles. Pour en savoir plus, consultez la section Graphiques.

Nœuds

Les nœuds produisent et/ou consomment des paquets, et c'est là que l'essentiel du travail du graphe a lieu. Elles sont également appelées "calculateurs" pour des raisons historiques. L'interface de chaque nœud définit un certain nombre de ports d'entrée et de sortie, identifiés par une balise et/ou un index. Pour en savoir plus, consultez Calculatrices.

Diffusions

Un flux est une connexion entre deux nœuds qui transporte une séquence de paquets, dont les horodatages doivent être croissants de manière monotone.

Paquets secondaires

Une connexion par paquet latéral entre les nœuds transporte un seul paquet (avec un horodatage non spécifié). Elle peut être utilisée pour fournir des données qui resteront constantes, tandis qu'un flux représente un flux de données qui change au fil du temps.

Ports de paquets

Un port est associé à un type : les paquets transitant via le port doivent être de ce type. Un port de flux de sortie peut être connecté à un nombre illimité de ports de flux d'entrée du même type. Chaque consommateur reçoit une copie distincte des paquets de sortie et possède sa propre file d'attente, ce qui lui permet de les consommer à son propre rythme. De même, un port de sortie de paquet latéral peut être connecté à autant de ports d'entrée de paquets latéraux que vous le souhaitez.

Un port peut être requis, ce qui signifie qu'une connexion doit être établie pour que le graphe soit valide, ou facultatif, ce qui signifie qu'il peut rester déconnecté.

Entrées et sorties

Le flux de données peut provenir de nœuds sources, qui n'ont pas de flux d'entrée et produisent des paquets spontanément (par exemple, en lisant un fichier) ou de flux d'entrée de graphe, qui permettent à une application de transmettre des paquets à un graphe.

De même, des nœuds récepteurs reçoivent des données et les écrivent dans différentes destinations (par exemple, un fichier, un tampon de mémoire, etc.). Une application peut également recevoir le résultat du graphique à l'aide de rappels.

Comportement lors de l'exécution

Durée de vie du graphique

Une fois qu'un graphe a été initialisé, il peut être démarré pour commencer à traiter les données et traiter un flux de paquets jusqu'à ce que chaque flux soit fermé ou annulé. Vous pouvez ensuite détruire le graphique ou le réactiver.

Durée de vie des nœuds

Le framework appellera trois méthodes de durée de vie principales sur un nœud:

  • Open: appelée une fois, avant les autres méthodes. Lorsqu'elle est appelée, tous les paquets côté entrée requis par le nœud sont disponibles.
  • Processus: appelé plusieurs fois, lorsqu'un nouvel ensemble d'entrées est disponible, en fonction de la règle d'entrée du nœud.
  • Fermeture: appelée une fois, à la fin.

En outre, chaque calculateur peut définir un constructeur et un destructeur, qui sont utiles pour créer et répartir des ressources indépendantes des données traitées.

Règles de saisie

La règle d'entrée par défaut est un classement déterministe des paquets par code temporel. Un nœud reçoit toutes les entrées pour le même horodatage au même moment, lors d'un appel de sa méthode de traitement ; et les ensembles d'entrées successifs sont reçus dans leur ordre d'horodatage. Cela peut nécessiter de retarder le traitement de certains paquets jusqu'à ce qu'un paquet avec le même horodatage soit reçu sur tous les flux d'entrée ou jusqu'à ce qu'il soit garanti qu'un paquet avec cet horodatage n'arrivera pas sur les flux qui ne l'ont pas reçu.

D'autres règles sont également disponibles. Elles sont implémentées à l'aide d'un type de composant distinct appelé InputStreamHandler.

Pour en savoir plus, consultez la section Synchronisation.

Flux en temps réel

Les graphiques des calculatrices MediaPipe sont souvent utilisés pour traiter des flux d'images vidéo ou audio pour des applications interactives. Normalement, chaque calculatrice s'exécute dès que tous ses paquets d'entrée pour un horodatage donné sont disponibles. Les calculateurs utilisés dans les graphiques en temps réel doivent définir des limites d'horodatage de sortie en fonction des limites d'horodatage d'entrée afin de permettre la planification rapide des calculateurs en aval. Pour en savoir plus, consultez Flux en temps réel.