合計 昨日 今日
インフォメーション: 当サイトは3/3~3/4に大規模なメンテを実施し大幅リニューアルします。そのため3/3~3/4に長時間の利用停止時間が発生します。ご了承ください。

[Python]webスクレイピングと画像比較

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: eyedrops
[URL]
ぴよぴよ(689 ポイント)
Date: 2018年2月09日(金) 14:10
No: 1
(OFFLINE)

 [Python]webスクレイピングと画像比較

初めまして。python歴は2か月未満です。

現在pythonでアイマス画像の類似度比較アプリを作っているのですが詰まったのでヒントが欲しいです。

処理工程はこのようになります。
1:webスクレイピング

2:web上の画像(一枚)をtemp.jpgに保存

3:あらかじめ保存しておいた比較元画像とtemp.jpgの類似度を求める

4:類似度が高い場合temp.jpgを別名で保存 (今は類似度完全一致で求めています)

画像の枚数分繰り返す

画像が数枚程度なら速度は気にならないのですが、5000枚ほどの画像と比較するのでとても遅いです。先に全部保存しておいて比較する方法も試すつもりですが、目標はこの工程で、と考えています。可能か不可能か、また可能ならそれはどのような処理か、不可能ならどう変更すればよいかを教えていただきたいです。

あと、画像見つけた時に処理を終えるために多重ループの良い抜け方も教えていただきたいです...

以下現在までのコードです。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import requests
import shutil
from bs4 import BeautifulSoup
import cv2
import os
 
IMAS_SITE_PATH = 'http://125.6.169.35/idolmaster/image_sp/card/l/'
COMPARING_IMG_PATH = "c:\\imas\\image\\temp.jpg"
IMG_DIR = os.path.abspath(os.path.dirname(__file__)) + '/image/'
IMG_SIZE = (640,800)
 
 
TARGET_FILE = 'target.jpg'
SEARCH_FILE = 'c:\\imas\\image\\search.jpg'
 
End_Flag = False
 
def download_img(url, file_name):   # 画像ダウンロード&保存
 
    r = requests.get(url, stream=True)
    if r.status_code == 200:
        with open(file_name, 'wb') as f:
            r.raw.decode_content = True
            shutil.copyfileobj(r.raw, f)
 
 
def get_target_hist():          # 比較元画像のヒストグラム取得
 
 
    target_img_path = IMG_DIR + TARGET_FILE
    target_img = cv2.imread(target_img_path)
    target_img = cv2.resize(target_img,IMG_SIZE)
    target_hist = cv2.calcHist([target_img],[0],None,[256],[0, 256])
    return target_hist
 
 
def comparing(target_hist):     #比較対象画像のヒストグラム取得&比較
 
    comparing_img_path = COMPARING_IMG_PATH
    comparing_img = cv2.imread(comparing_img_path)
    comparing_img = cv2.resize(comparing_img, IMG_SIZE)
    comparing_hist = cv2.calcHist([comparing_img],[0],None,[256],[0,256])
 
 
    ret = cv2.compareHist(target_hist, comparing_hist, 0)
 
    return ret
 
 
"""メイン"""
 
for idol_cnt in range(1, 204):
 
    if End_Flag == True:
        os.remove(COMPARING_IMG_PATH)
        break
 
    req = requests.get("http://imas.gamedbs.jp/cg/idol/detail/" + str(idol_cnt))
    soup = BeautifulSoup(req.text, "lxml")
    a = soup.find_all("a", class_="swap-card")
    for image in a:
        img = image.find("img")
        data = img['data-original']
        imas_card_path = data[21:]
 
        CARD_PATH = IMAS_SITE_PATH + imas_card_path
        download_img(CARD_PATH,COMPARING_IMG_PATH)
        ret = comparing(get_target_hist())
 
        if ret == 1.0:
            shutil.copyfile(COMPARING_IMG_PATH,SEARCH_FILE)
            End_Flag = True

Name: よもやま
[URL]
かけだし(2,484 ポイント)
Date: 2018年2月09日(金) 14:26
No: 2
(OFFLINE)

 Re: [Python]webスクレイピングと画像比較

eyedrops さんが書きました:画像が数枚程度なら速度は気にならないのですが、5000枚ほどの画像と比較するのでとても遅いです。

目標とする速度があるのでしょうか。
・5000枚で1分未満?とか1万枚で3分未満?
・比較枚数に制限は設けてない?

実証環境としては
Windows
Apache
ですかね。

Name: eyedrops
[URL]
ぴよぴよ(689 ポイント)
Date: 2018年2月09日(金) 17:56
No: 3
(OFFLINE)

 Re: [Python]webスクレイピングと画像比較

すみません、環境を書いていませんでした…
今のところWindowsのみです
サーバーはGoogle App Engineを使ってみようと思っています。
GAEではPython3が使えないかもしれないのでHerokuを使うことも考えています

アイドル画像の枚数が5040枚で、理想としては10秒以内…ですが今は1分未満の速度を目標にしたいです。
制限というのは「〇枚まで比較してなければ中断」ということでしょうか?
アプリの完成系が「画像をアップロードするとその画像のアイドル名、カード名が表示される」というもので画像比較はその為に必要な機能と考えています。なので制限はかけられないですね…
一つ目のスレッドに書くべきでした、申し訳ありません…

Name: よもやま
[URL]
かけだし(2,484 ポイント)
Date: 2018年2月09日(金) 22:05
No: 4
(OFFLINE)

 Re: [Python]webスクレイピングと画像比較

eyedrops さんが書きました:すみません、環境を書いていませんでした…
今のところWindowsのみです
サーバーはGoogle App Engineを使ってみようと思っています。
GAEではPython3が使えないかもしれないのでHerokuを使うことも考えています

アイドル画像の枚数が5040枚で、理想としては10秒以内…ですが今は1分未満の速度を目標にしたいです。
制限というのは「〇枚まで比較してなければ中断」ということでしょうか?
アプリの完成系が「画像をアップロードするとその画像のアイドル名、カード名が表示される」というもので画像比較はその為に必要な機能と考えています。なので制限はかけられないですね…
一つ目のスレッドに書くべきでした、申し訳ありません…

えっと。
複数の環境が候補に挙がっているようですが
検証ということであれば、ロジックを変更せずに各環境での実測データを収集されることをおすすめします。
というのは、誰かに報告するにしても何も根拠なしに「~の環境をおすすめします。」とは言えないので。
あと、比較枚数の制限についてですが物理的な画像ファイルが相手ですので単純な画像全ファイル比較すると1枚あたり数ミリ秒でも
1万、5万ともなると結構な時間となります。
そのため、制限があるのかなーと思った次第です。(あと物理ディスク容量がどこまで使用できるか不明ですし。。)

検証前でロジックにテコ入れしたいのであれば
比較対象となる画像ファイル群を5000ファイル単位なりに分割し
分割したファイル群との比較結果をまとめるようにするとよいのではないでしょうか。
その場合は比較対象ファイルのリストと結果の扱いをどうするかを考えないといけないですね。

Name: eyedrops
[URL]
ぴよぴよ(689 ポイント)
Date: 2018年2月10日(土) 19:19
No: 5
(OFFLINE)

 Re: [Python]webスクレイピングと画像比較

確かにその通りですね、まず検証しないことには速度なんて言ってる場合じゃないですね...
まず検証してみて自力で解決できそうになければまた質問しようと思います。

なるほど、全部一気に調べていくのではなく特定数のファイル群で調べるということですね。
試してみようと思います。

今回はありがとうございました。
おそらくまた質問すると思うので都合がよければ教えてくださいm(__)m


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[20人]