Як ляпіць па 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‑стратэгію у некаторых відаў. Прасцей кажучы, будзем брутфорсiть і браць аб'ёмам, каб павялічыць свае шанцы на размнажэнне поспех. Бо вам трэба часам адцягвацца на ежу і сон, а свайпы абмежаваныя, тыя вы напэўна аддасце перавагу, каб аўтаматызацыя выбірала найболей падыходныя пад вашыя густы дзяўчын ці мужчын. Рудых маленькага росту або высокіх брунетак - гэта ўжо на ваша меркаванне.

Збіраны дадзеныя

Перш за ўсё вам трэба вельмі шмат дадзеных для нармальнай дакладнасці. Любы, хто сутыкаўся з машынным навучаннем ведае, як складана бывае набраць карэктна сабраны і размечаны датасет. Тэарэтычна, у якасці крыніцы дадзеных падыдзе любы падобны рэсурс, няхай гэта будзе 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 фатаграфій для пабудовы адэкватнай мадэлі. Так, гэта вельмi шмат. Уласна таму і існуюць сэрвісы накшталт Amazon Mechanical Turk, дзе за пэўную плату вы можаце перадаручыць разметку вашага датасета іншым людзям. З іншага боку, вы сапраўды хочаце, каб ваш бот лайка цудоўных луналікі азіятак або не менш выдатных дзяўчат з індыйскімі каранямі? Усёткі мадэль павінна адлюстроўваць менавіта ваш густ.

З разнастайнасцю праблем асабліва няма, усе фатаграфіі прадстаўлены ў разнастайных ракурсах і асвятленні. У акулярах, сукенках, купальніках і лыжных касцюмах. Праблема можа ўзнікнуць з раўнамернасцю датасета. У ідэале, калі мы размецім нашу выбарку, яна павінны складацца з прыблізна роўных частак. Калі ў вас атрымаўся «перакошаны» датасет, тое яго прыйдзецца разводзіць фатаграфіямі з іншых крыніц. Больш сімпатычных трэба будзе дадаць ці наадварот вы вызначыце па выніку разметкі. У мяне атрымалася нешта ў раёне 60% сімпатычных. Ці то я не занадта пераборлівы, ці то мне проста пашанцавала і вакол шмат сімпатычных дзяўчын.

Я таксама не адкідаю гіпотэзу, што сярод іх шмат робатаў. Навучальны робата, які будзе лайкаць іншых робатаў. У гэтым ёсць нейкая іронія.

апрацоўка дадзеных

У нас ёсць куча размечаных фатаграфій, але яны вельмі разнамасныя. Дзённыя, начныя, са спіны і іншыя. Са шкадаваннем разумею, што навучаць на фатаграфіях са зваротнага ракурсу асоба не атрымаецца, бо выбарка будзе моцна нераўнамерная. Таму, аптымальным варыянтам будзе выкарыстанне асоб, як апорнай прыкметы "сімпатычнасці". Усё ж такі для нас, як і для іншых прыматаў, гэта ключавы параметр.

Таму скарыстаемся каскадамі Хаара. Гэта выдатны алгарытм, які дазваляе знаходзіць асобы на выявах з нізкім працэнтам ілжывастаноўчых памылак.

Як ляпіць па 13 дзяўчат у гадзіну, выкарыстоўваючы машыннае навучанне і Tinder
Больш падрабязна гэта апісана ў мануале да OpenCV

На наступным этапе, пасля таго, як у выбарцы апынуцца толькі твары, мае сэнс прыбраць колер. Насамрэч, вам ці наўрад прыйдзецца выбіраць паміж выдатна-блакітнай жыхаркай Пандоры ці зялёнаскурай прыгажуняй.

Як ляпіць па 13 дзяўчат у гадзіну, выкарыстоўваючы машыннае навучанне і Tinder
Крыніца

У людзей Hue параметр у колеры скуры не прыўносіць значнага ўкладу ў адзнаку сімпатычнасці.
Таму, варта ўпрасіць працу нейрасеткі і пакінуць толькі grayscale.

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

Адразу жадаю сказаць, што без добрай відэакарты і 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

Дадаць каментар