
タスクについて簡単に説明します。多数の写真を含む写真ポートフォリオがあり、人気のあるトピックと人気のないトピックのリストを知りたいです。
たとえば、iStockを使用した
著者のポートフォリオを検討します(2歳未満の写真のみ、約5000枚の写真を考慮してください)。
これは、iStockから情報を引き出したい人向けです写真へのリンクは次のようになります。www.istockphoto.com/ru/ru/photo/view-number-glow-gm516188033-48762778?st=5721cc0、gmの後、ハイフンの前の行は写真のIDです(516188033)。
写真に関する情報(ダウンロード数、アップロード日、キーワード、著者名など)は、
rest.istockphoto.com /
api /
v1 /
assets /
516188033で確認できます。
rest.apiでjsonページをダウンロードするためのサンプルスクリプトimport requests from bs4 import BeautifulSoup import wget import json import sys import time author_name = "urbancow" author_id = 300612 page_count = 93 path_to_save = "/home/forcesh/Downloads/Projects/iStock/urbancow/" for page in range(1, page_count): search_url = 'http://www.istockphoto.com/ru/portfolio/'+author_name data = {"facets": {"pageNumber": page, "perPage": 100, "abstractType": ["photos", "illustrations"], "order": "bestMatch", "portfolioID": [author_id], "additionalAudio": "false"}} r = requests.post(search_url, json.dumps(data)) soup = BeautifulSoup(r.text, "lxml") scope = soup.select("div.results-container") search_list = scope[0].select("section.search-list") figure_list = search_list[0].select("figure") for figure in figure_list: href = figure.select("a")[0].get("href") gm_id = href.rsplit("gm", 1)[1].split('-')[0] rest_url = "https://rest.istockphoto.com/api/v1/assets/"+gm_id wget.download(rest_url, out = path_to_save + gm_id)
画像をダウンロードしてcsvファイルを生成するためのサンプルスクリプト import json import requests import wget import time author_name = 'urbancow' portfolio_path = '/home/forcesh/Downloads/Projects/iStock/' path_to_gm_ids_list = portfolio_path + author_name + '/gm_ids_list.txt' gm_ids = open(path_to_gm_ids_list,'r') rest_info_file = open(portfolio_path + author_name + '/rest_info.csv','a') rest_info_file.write('gm_id,downloads,keywords\n') for gm_id in gm_ids: gm_id = gm_id.replace('\n','') rest_page = open(portfolio_path + author_name + '/' + gm_id,'r').read() parsed_string = json.loads(rest_page) downloads_count = parsed_string['downloadsCount'] info = gm_id + ',' info += str(downloads_count) info += ','.join( parsed_string['keywords']) rest_info_file.write(info) thumbnails_preview_url = parsed_string['thumbnails']['previewUrl'] wget.download(thumbnails_preview_url, out = portfolio_path + author_name+'/images/'+gm_id+'.jpg') print thumbnails_preview_url time.sleep(0.5)
データを分割するための兆候は、inceptionV3モデルを使用して取得されます。 ただし、ニューロンが検出するオブジェクトの名前ではなく、最後から2番目のレイヤー(2048記号)からの出力信号を使用します。
Kerasの最後から2番目のレイヤーから信号をプルするスクリプトの例 訓練されたInceptionV3へのリンク次に、高次元データを視覚化するツールであるt分布のStochastic Neighbor Embedding(t-sne)を使用します。 ドキュメントのSklearn開発者は、次元を減らすために他の方法を使用することを推奨しています(高密度データの場合はPCA、放電データの場合はTruncatedSVD)。 たとえば、ディメンションを50に圧縮してから、t-sneを使用します。
この場合、データは放電されるため、TruncatedSVDを選択し、次元を50に圧縮します。その後、データを2次元空間に圧縮します。 それだけです、絵を描くことができます。
構築された画像で人気のあるトピックと人気のないトピックを強調するために、sklearnのgaussian_kde(密度を推定する関数)を使用します。 ダウンロードの平均(平均)および平均(SD)を計算し、写真の4つのグループを選択します。
- ダウンロードした写真= 0
- ダウンロードした写真> 0および<=平均+ sd
- ダウンロード数>平均+ sdおよび<=平均+ 2 * sdの写真
- ダウンロード数のある写真>平均+ 2 * sd
次に、写真のグループごとに4枚の写真を作成します。 青から緑、緑から赤へのグラデーションを使用して、この領域のドット(写真)の密度を視覚化します。 色が赤に近づくほど、この領域内のポイントは考慮中のグループに属します。
以下の画像が作成されました(画像のサイズは約50 MB、解像度は約10k x 10kです; GPicViewはそれらをうまく開きます):
著者には次の一般的なトピックがあることがわかりました。
- 上からのストリート写真
- 大勢の人がいる場所(メトロ、...);
- 観光地
- 小学生
- 子供がいるスーパーマーケット内
人気がありません:
PS特にデータを収集して特徴を計算したくないが、データがどのように視覚化されるかを見たい人のために、別の著者の
ポートフォリオと計算された特徴を投稿します。