Catégories
Non classé

Analyse du paysage audiovisuel publicitaire avec des réseaux de neurones

Analyse du paysage audiovisuel publicitaire à l'aide de réseaux de neurones

L’Autorité de Régulation Professionnelle de la Publicité définit des règles d’éthique, leur application et le contrôle de l’application à travers les acteurs de la publicité en France. 

Afin d’étudier la coloration sociale du paysage publicitaire français sur l’année 2019, l’ARPP a commandé une étude sur un corpus de plus de 20 000 clips publicitaires TV et VOD dont nous avons assuré la réalisation.

Cette démarche inédite vise à identifier, dénombrer et suivre les différents acteurs de chaque clip, en déterminant leur âge et leur genre.

Dans ce billet, nous vous présentons notre démarche humaine et technique ainsi que l’intégration de la solution dans des pipelines de production.

Fig. 1. Résultats sur une image d’un clip

Méthodologie

Après avoir audité le besoin et présenté notre approche et ses spécifications techniques à l’ARPP, nous leur avons assuré un suivi constant malgré une date butoir restrictive. Chaque semaine, nous avons fait suivre un rapport technique rédigé sur l’avancée du projet, et sommes restés disponibles concernant des interrogations via des rendez-vous réguliers.

L’étude a été scindée en 3 modules pour plus de flexibilité :

  • Analyse vidéo,
  • Analyse audio,
  • Pipelines de production et solution clé en main.

Le code source, les spécifications techniques et une documentation exhaustive ont été livrés pour chaque module afin de permettre une utilisation autonome de cette solution dans le futur. Afin de valider notre expertise,  nous l’avons appliquée sur les données de l’année 2019.

Analyse vidéo

Détection des visages

Fig. 2. Architecture fonctionnelle globale

Après avoir longuement étudié l’existant à travers plusieurs publications scientifiques, nous avons fait le choix de découper la vidéo en extrayant les images clés en amont de la détection (2).

Les méthodes traditionnelles de machine learning pour la détection de visages utilisent des descripteurs de Haar avec AdaBoost pour entraîner des classificateurs en cascade. [1]
La performance de ces méthodes reste bonne mais elles sont très sensibles aux variations sur les visages : éclairage, orientation, pose… Pour des scènes publicitaires avec des plans très différents, des ethnies et des visages variés, il nous fallait un modèle plus robuste.
Nous avons utilisé l’apprentissage profond avec des cascades de réseaux convolutionnels en 3 phases (MTCNN) [2].  La première consiste à produire un grand nombre de candidats à travers un réseau de neurones peu profond. Les deux phases suivantes utilisent des réseaux plus puissants et profonds pour affiner successivement les résultats.

Dans la publication originale [2], les candidats entre chaque phase sont réduits à l’aide de l’algorithme dit de Non-maximum suppression (NMS). Nous avons également remplacé cet algorithme par une implémentation plus récente et plus efficace appelée Soft-NMS. [3]

Détermination de l’âge et du genre

Les implémentations récentes ont, pour le genre, une précision allant de 70% à 95%, [4] [5] et pour l’âge de 50% à 80% [6] [7] [8] (en 5-off). Toutes ces implémentations utilisent du transfer learning, soit depuis un modèle massif réputé en reconnaissance d’objet (VGG-Net, YoLo, Inception,…), soit directement depuis des modèles spécialisés dans le traitement de visages (FaceNet [8], DeepFace [9]…). Après plusieurs tests, nous avons opté pour une base MobileNet pré-entraînée avec des couches denses rajoutées en fin de réseau, car ce réseau est à la fois robuste et rapide.

Suivi des acteurs

Fig. 3. Etapes du tracking

A tout instant, il faut déterminer si le visage détecté appartient à la même personne qu’aux instants précédents, tout en gardant une cohérence sur le genre et l’âge. De ce fait, notre problématique est une chaîne de Markov, usuellement résolue en Deep-Learning via des réseaux récurrents. Toutefois, ceux-là sont beaucoup plus lents qu’une détection en one-shot, surtout pour du traitement d’images. En pratique, nous avons dû récupérer les feature vectors, qui sont les représentations vectorielles réduites de chaque visage détecté. Pour obtenir les feature vectors les plus aptes à un clustering de visages, nous avons préféré utiliser ceux produits par le FaceNet plutôt qu’en récupérer à la fin de notre propre réseau. Couplée à du preprocessing et des clusterings (3), cette méthode nous offre des résultats très satisfaisants (4).

Fig. 4. Résultats du tracking sur un clip

Analyse audio

Il est nécessaire d’extraire l’audio du clip et de le segmenter, puis pour chaque segment audio de calculer une représentation sous forme de coefficients Cepstraux à fréquence Mel qui permettent de construire une échelle fréquentielle adaptée pour la voix. Cette représentation est ensuite transmise à une mixture Gaussienne, qui a été entraînée au préalable pour reconnaître certaines particularités de la voix. 

Enfin, les groupes de segments sont  transmis à des réseaux convolutionnels, différenciant dans un premier temps le bruit de la voix, puis le genre homme ou femme (5).

Fig. 5. Process d’analyse audio

En 2018, l’Institut National de l’Audiovisuel a construit son propre réseau convolutionnel de segmentation audio [10], qui a été entraîné en utilisant l’INA Speaker Dictionary [11] (speechtrax.ina.fr) qui est la plus grande base de données d’orateurs au monde [12]. Nous l’avons utilisée comme base pour notre détecteur.

Pipeline de production

Pour relier l’étude à l’existant, il était nécessaire d’identifier les métadonnées des films à analyser telles qu’elles étaient présentées en sortie des APIs de l’ARPP. Il fallait également récupérer les clips bruts depuis leur espace de stockage.

Une interface web client a également été construite afin de déclencher une nouvelle analyse à tout instant.

Finalement, nous avons réalisé une chaîne d’intégration et de déploiement continue sur le code, sa conteneurisation ainsi que sa documentation.

L’ensemble de l’étude a été déployé sur le cloud Azure avec l’architecture suivante (6).

Fig. 6. Architecture Cloud de la solution clé en main

Conclusion

Nous remercions chaleureusement l’ARPP qui nous a fait confiance sur toute la durée de ce projet et nous a permis de publier ce billet, et vous invitons à consulter leur article si vous êtes désireux de connaître certains des résultats de l’étude.

 

Etude réalisée par MM. Antoine Champion, Yohann Barré, Pierre-Henry Baudin.

Références

[1] P. Viola, M.J. Jones, Rapid Object Detection using a Boosted Cascade of Simple Features, 2001

[2] K. Zhang et al., Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks, 2015

[3] N. Bolda, B. Singh et al., Improving Object Detection With One Line of Code, 2017

[4] A. Bartle, J.Zheng et al., Gender Classification with Deep Learning, 2015

[5] G. Levi, T. Hassncer, Age and Gender Classification using Convolutional Neural Networks, 2015

[6] R. Rothe, R. Timofte, L.V. Gool, DEX: Deep EXpectation of apparent age from a single image, 2015

[7] K. Zhang et al., Fine-Grained Age Estimation in the Wild with Attention LSTM Networks, 2018

[8] F. Schroff, D. Kalenichenko, J. Philbin, FaceNet: A Unified Embedding for Face Recognition and Clustering, 2015

[9] Y. Taigman, M. Yang, M.A. Ranzato, L. Wolf, DeepFace: Closing the Gap to Human-Level Performance in Face Verification, 2014

[10] D. Doukhan, J. Carrive, F. Vallet, A. Larcher, S. Meignier, An Open-Source Speaker Gender Detection Framework for Monitoring Gender Equality, 2018

[11] F. Vallet, Jim Uro, J. Andriamakaoly, H. Nabi, M. Derval, J. Carrive,  Speech trax: A bottom to the top approach for speaker tracking and indexing in an archiving context, 2016 

[12] A. Nagrani,  J. S. Chung, A. Zisser-man,  Voxceleb: A large-scale speaker  identification dataset, 2017

Catégories
Non classé

Métamorphisme et apprentissage automatique

Métamorphisme et apprentissage automatique

lab-logo

Les programmes métamorphiques mutent lors de leur exécution.

Il est important de protéger tout logiciel commercial contre les techniques de rétro-ingénierie qui ouvriraient la porte au piratage ou au vol de technologie.

Une personne qualifiée peut utiliser un désassembleur pour convertir votre exécutable binaire en langage assembleur (1). Il peut s’agir d’un pirate qui désire le modifier afin de contourner des protocoles de sécurité, ou d’un concurrent qui souhaite comprendre la logique sous-jacente pour réutiliser des parties de votre code.

Un désassembleur en action
Fig. 1: Un désassembleur en action

Programmes métamorphiques

Les programmes métamorphiques peuvent gêner voir empêcher les processus de rétro-ingénierie, car ils changeront de code machine au moment de l’exécution. Ils modifient leur structure, sans modifier leurs fonctionnalités.

Le programme lit son propre code compilé et effectue des modifications soit à la volée dans le code machine chargé dans la RAM, soit dans son fichier binaire. Les techniques couramment utilisées en métamorphisme sont le remplacement de code caves, l’insertion de code superflu, l’échange de registres et la réorganisation d’instructions (2).

Register swapping is a common technique of low-level metamorphismFig.2: L’échange de registres est une technique courante utilisée en métamorphisme

Toutes ces solutions consistent à échanger un court morceau de code ou insérer un remplaçant connu à l’avance. Par conséquent, un agent heuristique bien entraîné pourrait prédire de tels changements.

Idéalement, le framework métamorphique parfait recevrait n’importe quel morceau de code de longueur variable et produirait un code fonctionnellement équivalent mais structurellement différent.

Concept

Le code machine est exécuté séquentiellement. Chaque instruction est la combinaison d’un OP Code et de plusieurs arguments.

Une instruction modifie l’état en mémoire du programme. Ce dernier est composé des registres du processeur, de la pile (stack), du tas (heap) et d’autres sections de mémoire virtuelle qui sont mappées par notre programme.

Si nous observons l’état du programme avant et après avoir exécuté une instruction inconnue, nous sommes en mesure de deviner de quelle instruction il s’agit. 

Ainsi, en entraînant un modèle à déduire une séquence d’instructions depuis la transition de deux états, nous pouvons reconstruire une séquence différente mais de fonction identique. Celle-ci nous permettrait de faire muter notre code machine sans modifier son comportement, ce qui ferait obstacle au travail des pirates.

Par soucis de concision, les détails théoriques et techniques ont été omis, mais restent disponibles dans ce billet ou dans cette publication.  

Données d’entraînement

Pour construire notre jeu de données, nous lançons un programme compilé à travers un désassembleur, nous l’exécutons étape par étape et capturons l’état du programme lors de chaque instruction. Ce processus a été automatisé à l’aide de gdb et de ses APIs python (3).

The scrapping process with gdbFig. 3: Aggrégation d’un jeu de données

Cette technique a permis de récupérer 200 000 séquences d’instructions pour l’entraînement.

Les données doivent être ensuite analysées, puis préparées afin d’être servies à un réseau de neurones.

La figure suivante (4) présente une réduction des données récoltées : chaque carré représente un bit de l’état du programme, et l’intensité de la couleur représente la fréquence à laquelle ce bit change de valeur entre deux instructions.

En réalisant cette figure pour des instructions connues, nous avons pu nous assurer de l’intégrité des données récoltées.


Fig. 5: Visualisation des données récoltées

Modèle d’apprentissage

Le but du projet était de construire un modèle seq2seq simple afin d’inférer les instructions utilisées pour passer d’un état connu à un autre.

L’ensemble du modèle est constitué d’un encodeur et d’un décodeur d’inférence avec des cellules LSTM, et a été construit à l’aide de l’API fonctionnelle Keras. Les modèles ont été entraînés avec un optimiseur Adam en mini batches. 

Fig. 6: Evolution de la précision et de la fonction de coût lors de l’entraînement

 

Le score F1 du modèle sur les données de test est de 0,872.

Après 70 époques d’entraînement, le modèle a commencé à tendre vers un sur-apprentissage (6). Pour le moment, un jeu de données plus large serait la meilleure façon d’améliorer la précision du modèle.

L’intégralité du projet et les modèles pré-entraînés peuvent être consultés sur le dépôt github.

Conclusion

Cette étude offre une approche prometteuse, avec de bons résultats, mais des recherches supplémentaires doivent être menées sur la création de jeux de données plus vastes et sur l’expérimentation de différents modèles.

En l’état, le modèle n’est pas utilisable dans un environnement de production. Néanmoins nous serions à même de construire un agent heuristique utilisant ce réseau de neurones afin de faire muter votre programme, garantissant sa protection.

Une telle approche d’apprentissage automatique nécessite cependant beaucoup de puissance de calcul pour une utilisation en temps réel. L’agent heuristique pourrait utiliser des mutations précalculées de diverses parties du programme qui seraient mélangées pour produire un résultat unique. Ces mutations pourraient être stockées dans un cluster data sécurisé pour empêcher leur exposition à l’utilisateur final.