機械学習で女性のタイプ判定処理を行う
こんにちは、江口です。
前回に引き続き、pythonネタです。
皆さんは、同僚との会話で「この女優、どう?」と聞かれて困ったことはありませんか?
私はあります。そして、良いとも悪いとも思えず、なんと言いますか、興味が湧かない時が一番返答に困ります。
今回はズバリ「機械学習で好みの女性なのかどうか仕分ける!」です。
ネタではありますが、真剣です。これによりデータに基づいた返答ができるようになります。
▼概要
1. 自分好みの女優の画像とそうでない画像を収集する。
2. 収集した画像から顔だけを抽出し、100x100にリサイズして保存する。
3. SVM分類器にかけて、機械学習を行い、学習結果をpickleに漬け込む
4. 女優画像が自分の好みかどうか判定する
こんな流れになってます。
詳しい流れ、実装は後述するソース解説で紹介します。
▼使用技術とその用途
・python 3.6
・scikit-learn -> 機械学習ライブラリ
・GoogleCustomSearch API -> 画像取得に使用
・BeautifulSoup -> スクレイピングに使用
・SVM分類器 -> 実際に機械学習するアルゴリズム
・OpenCV -> 画像から顔・輪郭抽出するのに使用
・joblib->pickleファイル漬け込み
▼1. 自分好みの女優の画像とそうでない画像の収集
収集はsave_beautiful.pyで行います。
# -*- coding: utf-8 -*-
import requests
import re
import os
from PIL import Image as resizer
API_URL = "https://www.googleapis.com/customsearch/v1?key=[APIKEY] &cx=[ENGINE] &q=%s &searchType=image &start=%s"
def getImageFromCustomAPI(start, end, word, kind):
for i in range(start, end, 10):
print(API_URL % (word, str(i)))
response = requests.get(API_URL % (word + ",正面", str(i)))
for j in range(len(response.json()["items"])):
json = response.json()["items"][j]
res = requests.get(json["link"], stream=True)
if res.status_code == 200:
with open("images/target_%s_%s.png" % (kind, (str(i) + "_" + str(j))), 'wb') as file:
for chunk in res.iter_content(chunk_size=1024):
file.write(chunk)
def resizeImages(dirname, regular):
"""