ToliV
Tinder est une application addictive et fastidieuse à utiliser. J'ai donc décider 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 a 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 a des coordonnées spécifique dans un espace à 512 dimensions. C'est à dire que 2 images sémantiquement proches seront également dimentionellement rapprochées.
Partant de ce principe, on peu é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 a gauche.
Bien évidemment cet 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'aie pas de réelles utilité, ce projet m'a permis d'approfondir mes connaissances dans le domaine de l'IA et de l'embedding.