キーワードでgoogle画像検索 (python)

どうも( ´_ゝ`)
キーワードで画像を検索することってありますよね. というわけでそれをPythonでできないかやってみました. キーワードを与えるとn個の画像のurl達が帰ってきます. ちなみにnの最大は50としています. これを超えるとエラーが出たからです.
コードはここからダウンロードできます.download
一応結果とともにここにも貼っておきます.
(httpはttpにしています.)

import json
import urllib2

# search url
url = "http://ajax.googleapis.com/ajax/services/search/images?q={0}&v=1.0&rsz=large&start={1}"
# queries (string) -> n image urls (list)
def search(query, n=8):
    """
    query: search term
    n < 50: the number of images you want to get
    in default setting, google image search returns 8 images per a page.
    """
    results = []
    for i in range((n/8)+1):
        res = urllib2.urlopen(url.format(query, i*8))
        data = json.load(res)
        results += [result["url"] for result in data["responseData"]["results"]]
    return results[:n]

if __name__ == '__main__':
    img_urls = search("apple", n=50)
    print "the number of images: ", len(set(img_urls))
    print "\n".join(img_urls)

In [1]: import imgsearch
import imgsearch

In [2]: urls = imgsearch.search("apple", n=10)
urls = imgsearch.search("apple", n=10)

In [3]: print "\n".join(urls)
print "\n".join(urls)
ttp://upload.wikimedia.org/wikipedia/commons/0/07/Honeycrisp-Apple.jpg
ttp://b-i.forbesimg.com/spleverage/files/2013/04/silver-apple-logo-apple-picture.jpg
ttp://eofdreams.com/data_images/dreams/apple/apple-02.jpg
ttp://eofdreams.com/data_images/dreams/apple/apple-10.jpg
ttp://eofdreams.com/data_images/dreams/apple/apple-05.jpg
ttp://static.giantbomb.com/uploads/scale_small/0/316/520157-apple_logo_dec07.jpg
ttp://www.grindd.com/blog/wp-content/uploads/2013/10/Apple_gray_logo.png
ttp://www.familyfuntwincities.com/wp-content/uploads/2013/09/apple_red_1_clipart.png
ttp://www.mobilemag.com/wp-content/uploads/2013/05/apple-wallpaper-logo.jpg
ttp://theawesomecave.com/wp-content/uploads/2013/01/p1010716-e1317767547948.jpg

広告

n枚の画像を1枚のキャンバスに最適なサイズで描画するには?(javascript.canvas)

どうも( ´_ゝ`)
タイトルの通り,n枚の画像を1枚のキャンバスに最適なサイズで描画するにはどうしたら良いか考えました. 最適化問題として定式化したいと思います.結論を言うと,まだ解けていません.

考え方としては,i番目の画像に拡大率x_iをかけることにより,画像のサイズを調整する. まず,オリジナルの画像をo^{(1)}, \ldots, o^{(n)}とする. そしてi番目の画像o^{(i)}のwidth, heightをそれぞれo^{(i)}_w, o^{(i)}_hとする. 同様に,リサイズされた画像をz^{(1)}, \ldots, z^{(n)}とし, i番目のリサイズされた画像のwidth, heightをz^{(i)}_w, z^{(i)}_hとする. 元の画像とリサイズされた画像のwidth,heightの関係は以下のように定義する.

\displaystyle  z^{(i)}_w = \sqrt{x_i} o^{(i)}_w\\ z^{(i)}_h = \sqrt{x_i} o^{(i)}_h

こうすると,各画像の面積の関係は以下のようになる.

\displaystyle  z^{(i)}_w z^{(i)}_h = x_i o^{(i)}_w o^{(i)}_h = x_i y_i

ここで,y_iは元の画像の面積である.

次に,評価関数f({\bf x}), {\bf x} = [x_1, \ldots, x_n]を作る. 元の画像の面積に近ければ近いほど良い と考え,各画像サイズの二乗誤差を用いて以下のように定義することにした.

\displaystyle  f({\bf x}) = \sum_i (y_i - x_i y_i)^2 = \sum_i y^2_i (1 - xi)^2

これを最小化する{\bf x}を見つければよいが,このままだとx_i=1 \forall i=1,\ldots,n,つまり元のサイズで出せば良いじゃん?と言われてしまう. そこで,リサイズされた画像の面積の合計が,canvasの面積Sを超えないように,という条件を加える. これらを統合すると,以下の最適化問題を解くことになる.

\displaystyle  \min_{{\bf x}} \sum_i y^2_i (1 - xi)^2 \\ s.t. \sum_i x_i y_i \leq S \\  0 \leq x_i \leq 1 \forall i=1,\ldots,n

これを解くにはKKT条件を使うことになりそうだが,まだ解けていないので解けたら載せたいと思います.

virtualenvで作った環境を移動させるとぶっ壊れる?

どうも( ´_ゝ`)

Pythonで開発をしていて,環境ごと人に渡したい,と思うのは自然なことと思われます. 僕はvirtualenvを使えばそれが達成できると思っていました. というわけで下を見てください.

% virtualenv work1 #環境を作る
<                virtualenv work1
New python executable in work1/bin/python
Installing setuptools............done.
Installing pip...............done.
% pip freeze #今のパッケージ一覧を見てみる.
BeautifulSoup==3.2.1
Django==1.5
MySQL-python==1.2.4b4
PyRSS2Gen==1.0.0
PyYAML==3.10
zope.interface==3.8.0
...
% source work1/bin/activate #work1環境に入る
(work1)% pip freeze #work1環境にインストールされたパッケージ一覧
wsgiref==0.1.2

さあ,ここでwork1環境ごと人に渡したいのです. というわけでwork1フォルダを移動してみました.

% deactivate #環境を抜ける
% mkdir work2
% mv work1/ work2/
% cd work2/
work2% ls
work1

この状態でwork1環境をactivateしてみます.

work2% source work1/bin/activate
(work1)work2% pip freeze
BeautifulSoup==3.2.1
Django==1.5
MySQL-python==1.2.4b4
PyRSS2Gen==1.0.0
PyYAML==3.10
...続く

どうですか.ぶっ壊れてますよね.笑 これにはどう対処したらいいのか,調べました. 以下のように,もう一度virtualenvを呼んでやるといいみたいです.

work2% ls
work1
work2% virtualenv work1
work2% source work1/bin/activate
(work1)work2% pip freeze
wsgiref==0.1.2

どうですか素晴らしいですよね. これでPythonの開発環境ごと人に渡せるはずです.

では,また( ´_ゝ`)

多次元正規分布に従うd次元ベクトルからなる標本を作成(python.numpy)

どうも( ´_ゝ`)

前回python.pyplotでとんでもない間違いをしていたことを書きましたので,前の記事の修正版です.

import numpy as np
import matplotlib.pyplot as plt

# create random variance-covariance matrix (positive-definite symmetric matrix)
def rand_vcm(d):
    A = np.random.normal(size=(d,d)) + np.eye(d)
    return A.T.dot(A)

# settings
d = 2
mu = np.random.normal(size=d)
sigma0 = rand_vcm(d)
sigma1 = rand_vcm(d)
n0, n1 = 100, 100
N = n0, n1
x0 = np.random.multivariate_normal(mu, sigma0, n0)
x1 = np.random.multivariate_normal(mu, sigma1, n1)

plt.figure(1)
plt.plot(x0[:,0], x0[:,1], "ro")
plt.plot(x1[:,0], x1[:,1], "bx")
plt.show()

正しい結果はこんな感じになります. wpid-20131101_1.png

Pythonでmatplotlib.pyplotを使うときの注意点

どうも( ´_ゝ`)

Pythonでグラフをプロットするときに,matplotlib.pyplotをよく使うのですが,どうやら僕はとんでもない間違いをおかしていたみたいです. numpy.arrayの1次元目,2次元目を明示的に指定してやらないといけないみたいです. 以下のコードをみてください.全てを物語っています.

import numpy as np
import matplotlib.pyplot as plt

#なんと以下の結果が違う.
x = np.array([[0,0], [0,1], [0,0.5], [0.5,0], [1,0.5], [0.5,1], [1,0], [1,1]])
plt.plot(x[:,0], x[:,1], "bo")
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.show()
plt.plot(x, "bo")
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.show()

結果はこんな感じです.皆さんも僕みたいなあほなことはしないように.笑 org20131101_1.png 20131101.png

では,また( ´_ゝ`)

emacs24で急にanythingが使えなくなる

どうも. emacsの設定をいじっていたら,急にanythingが使えなくなりました.涙 以下のようなメッセージが出るのですが,これはなんでしょうか.

Please update anything.el
http://www.emacswiki.org/cgi-bin/wiki/download/anything.el
or
M-x install-elisp-from-emacswiki anything

そして言われた通り,インストールしても何も解決しないという.笑えますね.

“Please update anything.el!!”
でフレーズ検索してみたところ,同じエラーで困っている人をTwitterで発見. しかし,解決策がない.

しばし探すと,解決策を発見.

神だ.ありがとうございます. どうやら僕はpackageでanythingをアップグレードしたのですが,これが発端. anything-configが悪さをしているらしいです. elpa/anything-config* を削除.解決だ.

決して踏み込んではいけない,emacs evernote-modeについて

夢のような響きのevernote-modeですが,これは絶対にやろうとしてはだめです. エラーの山です.やめた方がいいです.

僕は3度挫折しています. というわけで4度目の挑戦です.あきらめ悪いな自分. 結論を言いますと成功しました. 以下の手順で行いました.

1 package.elでevernote-modeをインストール

M-x list-packages evernote-mode

でインストールします.おそらく現時点で0.41.

2 evernote-mode.el, enclient.rbを編集

3 setup.rbを走らせる

ruby setup.rb

を走らせます.ちなみにOSXの人はここで悩まされるかもしれません(僕のように).
なにで怒られたか忘れたので,悩んだらコメントをください. たしか,標準搭載のrubyではGDBM?がなくてうまく動かないので,homebrewでインストールしなおした気がします. この辺りもわからなかったらコメントをください.笑

4 デベロッパートークンを使うようにする

基本的にここの言う通りにします.僕は手動で書き換えましたがね.笑

5 waiting for the results で固まったら

6 まとめ

こんな感じでしょうか.OAuthを使うような方向性もあるみたいですね.

途中でいろんなエラーに遭遇しましたが,無事にできました. エラーが出過ぎてちゃんとログをとっていないので,この手順は定かではないです. 全然まとまってなくて記事として成立していないので,ノートパソコンにいれる時また確かめてみます. 最後に最も大事なことを書きます.

動かなかったらemacsを再起動してみて!
これで直ることが結構あるのです… ではまた( ´ゝ`)