はじめに
スケベと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で美人判定
人工知能に美人かそうでないかを判定させるというのは、いかがなものかと思うのだが、 それは置いておいて、美人判定をする方法を調べました。
先行事例
- Deep Learning (Machine Learning) applied to Tinder – Philippe Remy – My Blog.
- How Attractive Are You in the Eyes of Deep Neural Network?
- Can deep learning help find the perfect date?
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がいくつかあるようだ(スケベめ)。これを読んでいこう。