Як клеїти по 13 дівчат на годину, використовуючи машинне навчання та Tinder

* Тільки для вивчення Machine Learning, очевидно. Під трохи незадоволеним поглядом коханої дружини.

Напевно, немає настільки простого рівня спинно-мозкових рефлексів додатків, як Tinder. Для того, щоб ним користуватися достатньо одного пальця, щоб свайпать і трохи нейронів, щоб вибирати дівчат або чоловіків, які тобі більше подобаються. Ідеальна реалізація брутфорсу у виборі пари.

Я вирішив, що це непоганий спосіб трохи помацати машинне навчання на новій відеокарті. Залишиться тільки пояснити дружині, що мені не потрібна товща нова жінка, а я просто треную нейромережі.

Як клеїти по 13 дівчат на годину, використовуючи машинне навчання та Tinder

У чому проблема мереж для знайомств

Був такий ресурс – Ashley Madison. Специфічний, із гаслом «Life is short. Have an affair». Основна аудиторія - одружені чоловіки, які шукають собі інтрижку на стороні. Монетизація теж весела - крім стандартних "витратити бали, щоб лайкнути і написати" вони просили $19, щоб видалити обліковий запис користувача без слідів.

У 2015 році сайт закономірно протік і 60 ГБ персональних даних вибігли у відкритий доступ. Крім безлічі зруйнованих сімей, цей витік дав дуже багато цікавої інформації аналітикам. Я завжди підозрював, що чоловіків на сайтах знайомств набагато більше, але в цьому випадку дуже цікаво. Журналістка Annalee Newitz, аналізуючи втіклі дані виявила, що з 5 мільйонів користувачів тільки 12 000 були схожі на справжні облікові записи дівчат і використовувалися регулярно. Інші були просто ботами, які спілкувалися із чоловіками відвідувачами.

Подібна перевага у бік чоловічих облікових записів характерна не тільки для цього ресурсу, але і для більшості інших сайтів знайомств. Впевнений, що багато хто стикався з цією безсумнівно несправедливою ситуацією, коли тобі доводиться старанно продумувати знайомство, а дівчині досить просто зареєструватися. Якість цього натовпу шанувальників залишимо осторонь, але факт безперечний, баланс попиту та пропозиції явно зміщений на користь дівчат.

Особливість Tinder

Як клеїти по 13 дівчат на годину, використовуючи машинне навчання та Tinder
Ідеальний брутфорсер у гендерних відносинах

Основна риса цієї платформи саме в низьких витратах на одне знайомство. Достатньо збігу двох свайпів і ви вже спілкуєтеся з потенційно цікавою людиною. Проблема в тому, що та сама гендерна диспропорція призводить до того, що більшість дівчат мають десятки збігів на добу. Це означає, що їм, швидше за все, буде колись звертати на вас увагу серед інших кандидатів.

Цілком зрозуміло, що платформа має на увазі мало можливостей оцінити глибокий внутрішній світ людини за півторасекундним поглядом на фотографію в купальнику або за кермом модного тонованого автомобіля. Тому, якщо ви не виглядаєте просто божественно на своїх фотографіях, вам не залишається нічого іншого, як збільшити свої шанси, перейнявши r‑стратегію у деяких видів. Простіше кажучи, брутфорситимемо і братимемо обсягом, щоб збільшити свої шанси на розмноження успіх. Так як вам треба іноді відволікатися на їжу і сон, а свайпи обмежені, то ви напевно віддасте перевагу, щоб автоматизація вибирала найбільш підходящі під ваші уподобання дівчат або чоловіків. Рудих маленького зросту або високих брюнеток - це вже на вашу думку.

збираємо дані

Перш за все, вам потрібно дуже багато даних для нормальної точності. Будь-хто, хто стикався з машинним навчанням, знає, як складно буває набрати коректно зібраний і розмічений датасет. Теоретично, як джерело даних підійде будь-який подібний ресурс, будь то Instagram або інші соціальні мережі. Але найкраще навчати саме на тих зразках, на яких мережа працюватиме надалі.

За основу візьмемо репозиторій TinderAutomation. Фотографії Tinder завжди загальнодоступні, але функція «лайків» вже лімітована. Тому треба витягти все живе в радіусі та ретельно промаркувати. Для початку треба скористатися досить простим скриптом:

from skimage.io import imread, imsave, imshow, show
import matplotlib.pyplot as plt
import pynder
from helpers import get_access_token, get_login_credentials
from io_helper import save_image

email, password, FBID = get_login_credentials()
FBTOKEN = get_access_token(email, password)
session = pynder.Session(facebook_token=FBTOKEN)

while True:
    users = session.nearby_users()
    for user in users:
        photos = user.get_photos()
        print("Fetched user photos..")
        for photo in photos:
            print(photo)
            image = imread(photo)
            imshow(image)
            show()

            input_string = "Write 1 to like. Write 2 to dislike."
            ans = str(input(input_string)).lower()

            if ans == "1":
                save_image(image, photo, True)
            else:
                save_image(image, photo, False)

Він дозволить вам максимально швидко розмітити датасет лише двома кнопками. Ключовий підводний камінь полягає в тому, що бібліотека werkzeug зламала зворотну сумісність і доведеться робити її примусовий даунгрейд. Інакше вивалює ось таку помилку.

Traceback (most recent call last):
  File "img_scrape.py", line 4, in <module>
    from helpers import get_access_token, get_login_credentials
  File "/home/someone/tmp/TinderAutomation/helpers.py", line 1, in <module>
    import robobrowser
  File "/home/someone/tmp/TinderAutomation/venv/lib/python3.6/site-packages/robobrowser/__init__.py", line 3, in <module>
    from .browser import RoboBrowser
  File "/home/someone/tmp/TinderAutomation/venv/lib/python3.6/site-packages/robobrowser/browser.py", line 8, in <module>
    from werkzeug import cached_property
ImportError: cannot import name 'cached_property'

Тому в requirements.txt треба прописати Werkzeug==0.16.1. Тоді злетить.
Друга проблема — добути цей токен. Стандартний спосіб з репозиторію у мене не злетів, але вдалося видобути його з консолі розробника. Для цього переходимо по за посиланням і висмикуємо відповідь на POST-запит у www.facebook.com/v2.6/dialog/oauth/confirm?dpr=1. Всередині шукаємо "access_token". З першого разу чомусь не вийшло, але потім я його знайшов і захардкодив у скрипт.

Вимоги до датасету

Є кілька ключових вимог до датасет машинного навчання:

  1. Достатність
  2. Рівномірність
  3. різноманітність

Достатність у разі вимагає щонайменше 10000 фотографій для побудови адекватної моделі. Так, це дуже багато. Саме тому й існують послуги начебто Amazon Mechanical Turk, де за певну плату ви можете доручити розмітку вашого датасету іншим людям. З іншого боку, ви точно хочете, щоб ваш бот лайкал чудових луноликих азіаток або не менш прекрасних дівчат з індійським корінням? Все-таки модель має відображати саме ваш смак.

З різноманітністю проблем особливо немає, всі фотографії представлені у різноманітних ракурсах та освітленні. В окулярах, сукнях, купальниках та лижних костюмах. Проблема може виникнути з рівномірністю датасету. В ідеалі, коли ми розмітимо нашу вибірку, вона має складатися з приблизно рівних частин. Якщо у вас вийшов «перекошений» датасет, його доведеться розбавляти фотографіями з інших джерел. Більше симпатичних треба буде додати або навпаки ви визначите за результатом розмітки. У мене вийшло щось у районі 60% симпатичних. Чи то я не надто перебірливий, чи мені просто пощастило і навколо багато симпатичних дівчат.

Я також не відкидаю гіпотезу, що серед них багато ботів. Навчаємо бота, який лайкатиме інших ботів. У цьому є якась іронія.

Обробка даних

Ми маємо купу розмічених фотографій, але вони дуже різношерсті. Денні, нічні, зі спини та інші. З жалем розумію, що навчати на фотографіях зі зворотного ракурсу особливо не вийде, оскільки вибірка буде нерівномірною. Тому оптимальним варіантом буде використання осіб як опорної ознаки «симпатичності». Все ж таки для нас, як і для інших приматів, це ключовий параметр.

Тому скористаємося каскадами Хаара. Це відмінний алгоритм, який дозволяє знаходити особи на зображеннях з низьким відсотком помилково-позитивних помилок.

Як клеїти по 13 дівчат на годину, використовуючи машинне навчання та Tinder
Докладніше це описано в мануалі до OpenCV

На наступному етапі, після того, як у вибірці виявляться лише обличчя, має сенс усунути колір. Насправді, вам навряд чи доведеться вибирати між прекрасно-блакитною мешканкою Пандори чи зеленошкірою красунею.

Як клеїти по 13 дівчат на годину, використовуючи машинне навчання та Tinder
Джерело

У людей Hue параметр у кольорі шкіри не привносить значного внеску в оцінку привабливості.
Тому варто просити роботу нейромережі і залишити тільки рожевийскаль.

Побудова моделі

Відразу хочу сказати, що без хорошої відеокарти та CUDA ви, швидше за все, просто не отримаєте навчену модель в адекватні терміни. Тому відразу націлюйтеся на розрахунки у спеціалізованих хмарах або з використанням python-CUDA.

Я взяв базовий тришаровий приклад у автора репозиторію і, на диво, він показав точність у районі 72%, що є цілком добрим результатом.

model = Sequential()
model.add(Convolution2D(32, 3, 3, activation='relu', input_shape=(img_size, img_size, 3)))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Convolution2D(32, 3, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Convolution2D(64, 3, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
          
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))

adam = optimizers.SGD(lr=1e-4, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
              optimizer= adam,
              metrics=['accuracy'])

Якщо є хороша вибірка, її цілком може виявитися достатньо для отримання придатної для роботи моделі.

Запускаємо бота

Як клеїти по 13 дівчат на годину, використовуючи машинне навчання та Tinder

Дякуємо автору репозиторію за готовий варіант для швидкої перевірки ідеї. Насправді цілком працює в базовому варіанті і можна, в принципі, запустити на нашому готовому орендованому сервері. Навчати поки що не вийде, на даний момент ми не надаємо віртуальні машини з підтримкою CUDA для розрахунків, але запустити щось на 24/7 можна без проблем. Робот досить легкий, тому вигідніше буде взяти тариф із оплатою за використані ресурси.

Результати

Як клеїти по 13 дівчат на годину, використовуючи машинне навчання та Tinder
Напевно, я дуже симпатичний. І маю багатий внутрішній світ. Отримав щось у районі 13 збігів протягом години. Причому кілька разів дівчата писали першими.
У результаті виходили дуже милі діалоги, де я розповідав, що зайшов виключно пограти з машинним навчанням та розміткою даних. Одна з дівчат дуже зацікавилася, оскільки сама розробник. Є стійке відчуття, що вона зрештою прочитає цю посаду на Хабрі. Я дуже сподіваюся, що Оксана збереже мою анонімність. 🙂
* махає лапою і передає привіт

Трохи про етичний бік питання

Чесно кажучи, мені взагалі не подобається сама ідея роботизації стосунків між чоловіками та дівчатами. Є щось дуже правильне в тому, щоб накинути свою куртку на плечі до замерзлої незнайомої дівчини, яка стоїть на самоті. Або підійти до симпатичної дівчини у літньому кафе та разом випити кави. Вилазьте вже через монітори.

Навколо літо. Час знайомитися.

Як клеїти по 13 дівчат на годину, використовуючи машинне навчання та Tinder

Як клеїти по 13 дівчат на годину, використовуючи машинне навчання та Tinder

Джерело: habr.com

Додати коментар або відгук