はじめに

スケベとDeep Learningが出会うとき、技術の進化は訪れる!

ということで、出会い系アプリtinderをpythonからいじる pynderを試してみました。

そして、Deep Learningの無駄遣いをして、画像データを元に美人判定をして、 美人ならばlikeを、そうでなければnopeをすることをしてみました。

今回の記事は、以下の記事に触発されています。

pynderをいじる

まずは、インストールから。

$ pip install pynder

facebook トークンの取得

https://tinderface.herokuapp.com/ にアクセス。

GET STARTEDを押すことで、ガイドラインが表示されるので、それに従って tokenを取得する。

はじめの一歩

以下のようなサンプルソースを動かす。

import pynder
session = pynder.Session(facebook_auth_token) # 取得したaccess tokenを設定

for user in session.nearby_users():
    print(user.name)

名前が取得できました。

M
みっ
Charlene
はるな
詩羚
Yuki
Mi
Nattarawan
みなみ
Marina
かな

画像データを手に入れる

これでtinderのユーザの画像データが取得できました。

users = session.nearby_users()
user = next(users)

import urllib.request
 
url = user.thumbnails[0]
savename = "test.png"
 
png = urllib.request.urlopen(url).read()
with open(savename, mode="wb") as f:
    f.write(png)

like, nopeを送信する

like, dislikeのメソッドを呼び出すことで, likeとnopeを送信できます。

user.like
user.dislike

これで、pynderの調査は終わり。次は、Deep Learningです。

Deep Learningで美人判定

人工知能に美人かそうでないかを判定させるというのは、いかがなものかと思うのだが、 それは置いておいて、美人判定をする方法を調べました。

先行事例

SCUT-FBP5500 Dataset

SCUT-FBP Datasetというものがあった。 顔写真のデータと、その表情がどのくらい魅力的かどうかを5 段階評価でラベルづけされたもの。

美人かそうでないかの二値分類をするときの学習に使うためのラベルづけが大変そうだと思ったがか このデータセットを使って学習ができそうだ。1,2,3点の人はブス、4,5の人は美人と判定する。

実験

SCUT-FBP のデータセットを利用して、美人判定モデルを作成しました。 詳細は、gistに譲りますが、このモデルでは、85% の精度を達成できた。

以下、要点を列挙。

  • データセットの 女性だけを利用。2250枚。そのうちの1/5をvalidationとして利用。
  • fastai(PyTorch)ライブラリを利用。ResNet32をファインチューニング。
  • チューニング方法は過去記事参照。85%の精度。
  • targetラベルは、ratingを利用。3.0以下をnope, 3.0以上をlikeと分類するようにする。

tinder の画像から推論

画像データの取得、モデル作成とできたので、次は画像データを元に like/nopeを判定する。

like

nope

を、なかなかよさそうじゃんと思ったのだけれども、犬を美人判定にかけたらlikeと判定されてしまった。。 いやいや、犬は、好きではないのですが。。

まとめ

以下ができた。

  • pynder を利用して、tinderから画像データの取得
  • deep learning を利用して、美人判定モデルの構築
  • 美人判定モデルからの like/nope判定の自動化

美人判定モデルの精度がよかったら、ここから機械学習アプリの作成に移るところだった。 しかしながら、判定結果に不満があり、アプリ作成までは実施しないことにした。

今後の課題は、

  • 人判定のモデルをつくる。Object Detection?? 犬をlikeと判定するようではダメだ。
  • 画像以外の特徴量もまぜる。紹介文とか。NLP。
  • データセットを多くする。自分でラベルづけをしていって、それを学習していく。

現在開催中のkaggleのavitoコンペがこのtinderの問題に似ている気がするので、 avitoコンペで培ったkaggle力を無駄に利用して取り組みたい。

また、調べてみると、arxivにもtinder関連のpaperがいくつかあるようだ(スケベめ)。これを読んでいこう。