ToliV
Tinder est une application addictive et fastidieuse à utiliser. J'ai donc décidé d'essayer d'automatiser son utilisation tout en testant mes compétences en Python.
Le Défi
Quantifier les préférences de l'utilisateur pour connaître la probabilité qu'il(elle) "swipe" à droite ou à gauche et ainsi obtenir un score pour chaque personne proposée par l'application.
Quantification du score "d'attractivité"
L'idée part du fait que des modèles de vectorisation d'images tels que CLIP (Contrastive Language–Image Pre-training) permettent d'associer des images à des coordonnées spécifiques dans un espace à 512 dimensions. C'est-à-dire que 2 images sémantiquement proches seront également dimensionnellement rapprochées.
Partant de ce principe, on peut établir la moyenne de ce que représente une personne "attractive" et comparer cette moyenne à des photos pour établir un "score" qui définit la probabilité qu'un utilisateur "swipe" à droite ou à gauche.
Bien évidemment, cette approche est naïve et il existe des moyens plus complexes permettant de meilleurs résultats
Lecture de l'interface
Étant donné que j'utilise le mirroring de l'écran d'un téléphone portable vers un ordinateur, pyautogui est utilisé pour chercher l'état de l'interface. De plus opencv est utilisé pour détecter les publicités et tesseract pour lire les données affichées par l'application.
Implémentation actuelle
A l’issue de 2 semaines de programmation et ~800 lignes de python, le programme peut prévoir la décision de l'utilisateur 68% du temps, cela peut être optimisé en modifiant le calcul du score.
platform = UxPlay(detect="YOLO", encoder="CLIP", score="weighted_cosine")
while platform.session_is_live():
frame = platform.capture_screen(); profile = tesseract(frame)
g_view, b_view, f_view = platform.extract(frame, "cascade_detection")
emb_top, emb_body, emb_face = platform.encode_features([g_view, b_view, f_view])
if user.swipe(profile):
platform_embed.append(profile)
s_global = platform.similarity(emb_top, platform.preference("global"))
s_body = platform.similarity(emb_body, platform.preference("body"))
s_face = platform.similarity(emb_face, platform.preference_center("face"))
b_score = 0.15 * s_global + 0.35 * s_body + 0.50 * s_face
platform.push_feedback(profile, b_score,"confidence")
Bien qu'il n'ait pas de réelle utilité, ce projet m'a permis d'approfondir mes connaissances dans le domaine de l'IA et de l'embedding.