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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: [Python]webスクレイピングと画像比較

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

#5

by eyedrops » 6年前

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

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

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

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

#4

by よもやま » 6年前

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

アイドル画像の枚数が5040枚で、理想としては10秒以内…ですが今は1分未満の速度を目標にしたいです。
制限というのは「〇枚まで比較してなければ中断」ということでしょうか?
アプリの完成系が「画像をアップロードするとその画像のアイドル名、カード名が表示される」というもので画像比較はその為に必要な機能と考えています。なので制限はかけられないですね…
一つ目のスレッドに書くべきでした、申し訳ありません…
えっと。
複数の環境が候補に挙がっているようですが
検証ということであれば、ロジックを変更せずに各環境での実測データを収集されることをおすすめします。
というのは、誰かに報告するにしても何も根拠なしに「~の環境をおすすめします。」とは言えないので。
あと、比較枚数の制限についてですが物理的な画像ファイルが相手ですので単純な画像全ファイル比較すると1枚あたり数ミリ秒でも
1万、5万ともなると結構な時間となります。
そのため、制限があるのかなーと思った次第です。(あと物理ディスク容量がどこまで使用できるか不明ですし。。)

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

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

#3

by eyedrops » 6年前

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

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

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

#2

by よもやま » 6年前

eyedrops さんが書きました: 画像が数枚程度なら速度は気にならないのですが、5000枚ほどの画像と比較するのでとても遅いです。
目標とする速度があるのでしょうか。
・5000枚で1分未満?とか1万枚で3分未満?
・比較枚数に制限は設けてない?

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

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

#1

by eyedrops » 6年前

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

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

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

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

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

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

画像の枚数分繰り返す

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

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

以下現在までのコードです。

コード:

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

ページトップ