Hakuin: PythonのフロントエンドM(VC)フレームワーク

ぼくも日本酒にちなんだフレームワークをつくりたいなーと思っていたので、Zen of PythonScriptでSpineインスパイアなHakuinというPythonのフロントエンドM(VC)フレームワークを作って遊んでいる(韻を踏むかは個人的に超重要)。

hakuin

ちなみに0.6.1では動くけれど0.7.4では動かないので、これから対応していく。今のとこ

  • クラスメソッドがうまくうごかない
  • シングルトンの作り方がわからないのでグローバル
  • e.preventdefault()が使えない
  • importのやり方がわからないので、とりあえずベタ書き

というあたりの制約があるため、ほぼ100%トイプログラミングなのだけどtodoくらいなら動く。それから上記1番目の理由でSpineインスパイアなのにCollectionモデルを取り入れている。

次回のShizuoka.pyで話す予定

以下の日本語注釈付きソースは参考になった。backbone.jsのほうは次回の「TalkNote × Frontrend(フロントレンド)」の演者の人が管理されているようなので、興味があれば参加するといいと思う。個人的にはSASS/Compassのセッションが超気になるんだけど、吉原祇園祭と被っているのでかなり参加は厳しい。

そして白隠正宗ではなく臥龍梅を飲み始めた。この純米吟醸まじ美味い。緑のラベルの超辛口ってのもあったんだけど、酒屋の奥さんのすすめの通り赤いラベルが正解だな。(さらに奥さん情報によると袋しぼりがメチャウマだったらしいんだけど、売り切れたらしい。)

1369817478

そのうちこんや銘酒館で日本酒を飲みながら、日本酒フレームワークハッカソンでもやりたい。

PythonScriptでjQueryを扱う

次回のShizuoka.pyはサーバーサイド寄りの演題が多めなので、カウンターとしてフロントエンド寄りのネタでもやろうかなと思いPythonScriptをいじっている。

PythonScriptでjQueryを使うのは簡単。jQueryとラッパーを呼び出しておけばJでアクセスできる。

index.html

<!DOCTYPE html>
<html>
    <head>
        <title>PythonScript & jQuery</title>
    </head>
    <body>
      <div id="mydiv">click      
      </div>
      <script src="pythonscript.js"></script>
      <script src="jquery.js"></script>
      <script src="jquery.py.js"></script>
      <script src="app.py.js"></script>
    </body>
</html>

app.py

J()でjQueryのラッパーオブジェクトを作れるが、jQueryオブジェクトはj属性で参照されるので注意。

class Model():
    def __init__(self, tag):
        self.el = J(tag)
        self.el.bind("click", self.el, self.say)

    def say(self):
        d = J('<p>:-)</p>')
        self.el.append(d.j)
        print "hello PythonScript"

m = Model('#mydiv')

pythonscript & jQuery

PythonScriptのクラスシステムを読んでみた

PythonScriptではクラスがどういうjavascriptにトランスレートされるのか気になったので。

class C():
    def __init__(self, x, y):
        self.x = x
        self.y = y

c1 = C(1, 2)
c2 = C(3, 4)

print c1.x, c2.y

これは以下のjavascriptに変換される

C = {};
parents = create_array();
var C____init__ = function(args, kwargs) {
    var signature = {"kwargs": {}, "args": create_array("self", "x", "y")};
    var arguments = get_arguments(signature, args, kwargs);
    var self = arguments["self"];
    var x = arguments["x"];
    var y = arguments["y"];
    set_attribute(self, "x", x);
    set_attribute(self, "y", y);
}

C.__init__ = C____init__;
C = create_class("C", parents, C);
c1 = get_attribute(C, "__call__")(create_array(1, 2), {});
c2 = get_attribute(C, "__call__")(create_array(3, 4), {});
console.log(get_attribute(c1, "x"), get_attribute(c2, "y"));

create_array, get_arguments, create_class, get_attribute, set_attributeはpythonscript.jsのほうに定義されている。create_classは次のように定義されている

var create_class = function(class_name, parents, attrs) {
    if(attrs.__metaclass__) {
        var metaclass;
        metaclass = attrs.__metaclass__;
        attrs.__metaclass__ = undefined;
        return metaclass([class_name, parents, attrs]);
    }
    else {

    }

    var klass;
    klass = {};
    klass.bases = parents;
    klass.__name__ = class_name;
    klass.__dict__ = attrs;
    var __call__ = function() {
        var object;
        object = {};
        object.__class__ = klass;
        object.__dict__ = {};
        var init;
        init = get_attribute(object, "__init__");
        if(init) {
            init.apply(undefined, arguments);
        }
        else {

        }

        return object;
    }

    klass.__call__ = __call__;
    return klass;
}

eしずおかのブログで興味ありそうなものを自動でピックアップ

eしずおかの新着一覧をチェックするためにベイズ分類器にeオプションを足した。ついでに来週の入門機械学習読書会はベイズ分類なので興味があれば参加してみてください(あと一人ですが)。

$ ./nk -e
きみにあわないよ: Lab's Numazu (http://labsnumazu.eshizuoka.jp/)
きみにあわないよ: 備忘録に代えて (http://bibouroku.eshizuoka.jp/)
きみにあわないよ: 焼津の服屋さん Primera estrella (http://primera.eshizuoka.jp/)
きみにあわないよ: 静岡市の美容室 Hills earl&bee <ヒルズ・・・ (http://hills.eshizuoka.jp/)
きみにあわないよ: DIESEL  ONLYSHOP   EURO UNO  (http://eurouno.eshizuoka.jp/)
きみにあうよ: 明るい母ちゃん!楽しい子供!日記 (http://karashi21012.eshizuoka.jp/)
きみにあわないよ: Abricotの気ままなスタッフブログ (http://hal.eshizuoka.jp/)
きみにあうよ: Aroma&Herbでりらっくすしましょ。 (http://konohana.eshizuoka.jp/)
きみにあわないよ: 心も体もぽっかぽっか♪整体・ロミロミ・マ・・・ (http://kamomechan.eshizuoka.jp/)
きみにあわないよ: ROH SHIZUOKA (http://roh.eshizuoka.jp/)
きみにあわないよ: 焼津 海味工房ぬかや斎藤商店 (http://nukaya4239.eshizuoka.jp/)
きみにあわないよ: 森の小さなアイス屋 (http://morinoiceya.eshizuoka.jp/)
きみにあわないよ: ものづくり生活 (http://handmadelife2.eshizuoka.jp/)
きみにあわないよ: СнⅠкдの日常Вlοg (http://ganeesha9465.eshizuoka.jp/)
きみにあわないよ: 「食」プロデュース◇中野ヤスコ◇食の学び舎・・・ (http://nakanoyasuko.eshizuoka.jp/)
きみにあわないよ: 女性のための癒しと健康 『sora(http://surugaseifu.eshizuoka.jp/)
きみにあわないよ: おいしい幸せ  「京菜や」 (http://kyousaiya.eshizuoka.jp/)
きみにあわないよ: タイマイのおススメ (http://elonia.eshizuoka.jp/)
きみにあわないよ: au ショップスタッフの enjoy スマホ Life (http://aushop.eshizuoka.jp/)
きみにあわないよ: strawberry×strawberry (http://oshirukomoe.eshizuoka.jp/)
きみにあわないよ: 伊豆不動産リゾート情報 (http://blog.towa-kaihatsu.co.jp/)
きみにあわないよ: コリの無いシアワセな日々へ・クラリオンヒ・・・ (http://r1633.eshizuoka.jp/)
きみにあわないよ: 菓子工房 クレオ (http://ecreo.eshizuoka.jp/)
きみにあわないよ: インテリア雑貨shopcozy Life(http://cozylife.eshizuoka.jp/)

ローカルの食べ物ネタとかお酒について書かれているブログがヒットしやすくなって調子いい。

Pythonでスクレイピングするならrequests+pyqueryの組み合わせは鉄板。

def check_eshizuoka():
    d = pq(requests.get("http://www2.eshizuoka.jp/allentry").content)
    for e in d("#newEntry li .blogTitle a"):
        blog_title = e.get("title")
        blog_url = e.get("href")
        blog_rss = e.get("href") + "index.xml"
        r = test(blog_rss)
        print "{}: {} ({})".format(r['status'], blog_title.encode('utf-8'), blog_url)

バグではなく仕様

写真はパグです。

1368783238

from base64 import encodestring, decodestring
from random import randint

mat = encodestring(open("orig.jpg", "rb").read())
gt = "".join([str(randint(0, 9)) if c == '0' and randint(0, 9) < 1 else c for c in mat])
open("glitched.jpg", "wb").write(decodestring(gt))

実践コンピュータビジョン 7-10章

6章の画像クラスタリングを含めて7-9章は画像認識を扱っている章になっている。10章はOpenCVを触り程度に紹介。

7章は画像から記述子を取り出してきて、テキストマイニングするような感じで画像検索を行う。というよりtf-idf法を使っているだけなのでわかりやすい。最終的にCherryPyを使ってWebアプリを作っているが、色々応用が効きそうなヒントが得られた。

8章は画像認識で、これまた面白い。最初にkNNを使ってSIFT特徴量から手話画像の認識をさせる。でこれの精度を改良するためにいくつかのアルゴリズムを試す。

最初はベイズ分類+SIFTをPCAで次元削減したものを利用するが精度が改善しない。しかしこの手法の良いところは元のデータを保持しなくていいところ。

次にSVMを使って精度が改善するという流れ。次元を減らしても精度がそれほど落ちないとか、よくある話に持っていく。

今時なら、このあとにRandomForestが出てきて云々がはじまるのが定番なんだけど、この本ではそこまでは説明していないので、興味があればRFまでやってみるのがいいかもしれない。

最後に多クラスSVMとして数独の写真を認識する例がある。3章でやった射影変換を利用して斜めに移った写真でもきちんと正方形になおしてから分類するという内容で興味深かった。

9章は画像の領域分割で「背景を分離する」みたいな話。最大フローとかそういう話題。最初ベイズ分類器が出てくるのがよく分からなかくて悩んだんだけど、図9.2を見ながらよく考えたら理解した。

10章はOpenCVの基本なので。興味を持ったらドキュメントを読むか他の本をあたれというところか。

ProductName 実践 コンピュータビジョン
Jan Erik Solem
オライリージャパン / 3150円 ( 2013-03-23 )


まとめ

あまり手を動かしてないので、次は章末の演習問題も解きながらやってみるかもしれない。入門機械学習の次に読む本としても面白いかも(Pythonを書けることが前提になるかもしれないが)。

OpenCVとScipyのドキュメントはひと通り目を通しておく。

他に気になる本

ProductName 詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識
Gary Bradski
オライリージャパン / 4830円 ( 2009-08-24 )


ProductName Learning Opencv: Computer Vision in C++ With the Opencv Library
Gary Bradski
Oreilly & Associates Inc / 6309円 ( 2013-06 )


フロントエンド(webブラウザ)でPythonを使いたい時の選択肢を調べてみた

普段ブラウザまわりのjavascriptが必要な時にはCoffeeScriptで書いているけど、最近ではHaskellでもかけるしPythonでもかけるようになってきているので調べてみた。尚、Fayに関しては「Introduction to Fay」がわかりやすい。

見つかったのは次の5つのプロジェクト。最初の2つはjavascriptで実装されたPython実行環境で残りの3つはPythonコードをJavascriptに変換するトランスレータ。

Brython

ゴールが非常にわかりやすい。

Brython's goal is to replace Javascript with Python, as the scripting language for web browsers.

CoffeeScriptなんかとは競合しますね。

<script type="text/python" src="test.py"></script>

で実行できるのでpythonでwebアプリが作れます。Galleryも面白いのが増えてた。カンバンエミュレータとかヨーロッパの国名一致させるデモとか。

Compiling and running によるとjavascriptのパーサを通して構文解析して構文木をつくってjavascriptを出力してevalしている。そのため最初立ち上げると若干モサッと感はある。あとjavascriptでモジュール書か必要があるのかな(import implementationのところ)

それからjQueryみたいなjavascriptのライブラリを使いまわせるかどうかは分からなかった。ajax用のライブラリとか実装しているところをみるとできないのかなぁ(要調査)

Skulpt

ブラウザでPythonの実行環境を提供するのが目的なのかなぁ。立ち位置がよくわからん。教育を目的としているのかなぁ。

PythonScript

コードを読んだ感じでは、pythonで書かれたトランスレータを通してjavascriptにコンパイルするという流れ。まず最初に、コードがPythonのastモジュールでパースされ抽象構文木に変換された後、PythonToPythonJSにより抽象構文木がちょいちょいといじられてPythonJS(これまた抽象構文木の状態)という中間言語というか制限付きのPython(RPythonみたいなニュアンス?)みたいなものにされる。その後javascriptにダンプされてます。

ドキュメントもあわせて読むとわかりやすいかも。それからPyPyを参照しているのだけどPyPyも同じような流れなのだろうか?あとで調べるかも。

livereloadなんかのサポートを借りればさくさく開発出来そうという意味で、イメージとしてはSass/Compassに近いかなぁ。

JSで囲めば素のjavascriptとして実行されるのと、jQueryがJ()で使えるようになっている。fayがpreludeを置き換え版を提供しているように、PythonScript用の標準モジュールみたいなものを提供することになるのだろうかな?

あとCreating bindings is very easy, jQuery bindings are available. と説明されているようにバインディング書くのは楽そうなので、既存のjavascript資産は有効利用できそうな感じなんだけど、手で書かなきゃいけないのかなぁ。あとでなんか書いてみる。

Pyjaco

py2jsのフォークらしい。PythonScriptと似た感じだけど開発はアクティブではない感じ。version1.0だからひと通り実装できたと見るべきなのかなぁ。

jQueryの呼び出しはこんな感じ。デコレータ使えるのはいいかも。

Pyjs

webアプリケーションを作るためのフレームワークを目指しているらしい。

pyjs contains a Python-to-JavaScript compiler, an AJAX framework and a Widget Set API. pyjs started life as a Python port of Google Web Toolkit, the Java-to-JavaScript compiler.

もともとpyjamasという名前だったのが、名前を変えて新しい開発体制で動いているそうだ。PythonScriptやPyjaco同様トランスレータでjavascriptに変換しているとのことだが、ソースコードをちゃんと読んでないので詳しいところはわからん。

PyjsもJS()で囲めばjavascriptをそのまま実行するらしくjQueryの呼び出しはこうやれば良いらしい。

まとめ

自分が使うならPyjacoがいいかなと思うが、開発の勢い次第ではPythonScriptのほうが充実しそうかなぁ。多分両方使って使いやすい方を選択することになると思う。Brythonも気になるけどjQueryを一緒に使えるのかどうかわからないのとCoffeeScriptみたいにコンパイルされたJavascriptを出力できるのかどうかわからない(プロダクション環境では毎回コンパイルさせたくない)のでそこら辺調べてから決める。

個人的にはbrythonでpython版Spineを書いてみるのは面白いかなと思っているんだけど。まぁそのうちpython版のクライアントサイドMVCフレームワークはなんか出てくるんじゃないかなぁ(出て欲しいなぁ)と。

実践コンピュータビジョン 4-6章

面白いのでどんどん読んでいる。

ProductName 実践 コンピュータビジョン
Jan Erik Solem
オライリージャパン / 3150円 ( 2013-03-23 )


4章はピンホールカメラモデルを使って拡張現実の基礎っぽいあたりを静止画像に対してやっている。つづいて5章では多視点の幾何に移っていくが、こっちはあまり興味が沸かなかったのでとりあえず読み流した。

4章はもうちょっとサンプル的に面白いものを選択して欲しかった。よくあるOpenGLのティーポットが乗っかっててもなぁ。あとで自分でいじってみてなんか他のものをあわせてみる。こびとのモデルとかあればいいんだけど。

6章からは画像のクラスタリングの話に移って、7章で検索、8章が画像認識、9章が領域分割なので6-9がひとまとまりだと思うけど、今日は6章までしか読んでない。K-meansとスペクトラルクラスタリングというオーソドックスな手法。 K-meansはあちこちに分かりやすい説明(これとか)があるけどスペクトラルクラスタリングは本書の説明だけではわかりにくいかもしれないので、きちんと理解したければ「Rで学ぶクラスタ解析」をよめばよい。

ProductName Rで学ぶクラスタ解析
新納 浩幸
オーム社 / 3360円 ( 2007-11 )


SciPyでK-meansって初めて書いたけど、わかりやすかった。

from scipy.cluster.vq import *
from pylab import *
import numpy as np

# サンプルデータを作成
class1 = 1.5 * np.random.randn(100, 2)
class2 = np.random.randn(100, 2) + np.array([5,5])
features = np.vstack((class1, class2))
# 分類
centroids, variances = kmeans(features, 2)
code, distances = vq(features, centroids)
# 可視化
figure()
ndx = where(code==0)[0]
plot(features[ndx,0], features[ndx,1], '*')
ndx = where(code==1)[0]
plot(features[ndx,0], features[ndx,1], 'r.')
plot(centroids[:,0], centroids[:,1], 'go')
axis('off')
show()

出来た図

kmeans

実践コンピュータビジョン 1-3章

実践コンピュータビジョンはPythonで画像処理とかコンピュータビジョンの解説をしている本です。

入門機械学習とはちがって数式による説明がされているので、線形代数くらいの基礎知識はあったほうがいいかも。なくてもPythonのコードが読めればなんとかなる気もするが。

ProductName 実践 コンピュータビジョン
Jan Erik Solem
オライリージャパン / 3150円 ( 2013-03-23 )


1章はPythonの基本的な 画像処理の説明に費やされていて、PILとかnumpy,Scipy,matplotlibとか定番の話。ちなみにmabplotlibはインストールにはまりやすいので素直にScipy Superpackを入れるのが確実。でもこれだと/usr/bin/python使わないといけないのでhomebrewで入れたopencvをインポート出来ないのでちょっと悲しい。

matplotlibを諦めればnumpy,scipyは入るのでそっちでもいいかも。ただし、今朝もこれではまってたので注意

最近pandasをバリバリ使っていて、なんとなくRよりはPythonでなんでもやる方向にシフトしたほうが幸せになれるのかなぁといったことを考えている。ggplot2がPythonに移植されればなぁ。

2章はHarrisコーナー検出アルゴリズムやSIFTという記述子を利用して画像(ホワイトハウス)をグルーピングするという内容。静岡県民としては富士山がどこから撮影されたかのグルーピングを試してみたいところ。

3章はアフィン変換で画像を変形したりして最終的にパノラマを作成する。この章は個人的にはあまりそそられなかったので流し読みした。

PythonでOpenCVを利用するのは簡単そうだ

遅ればせながらDeep Learningアツいぜっていう感情の高まりがアップしたので、画像いじりが再燃した。ちなみにglitchとか好きです

Deep Learningはここらへんを読むと良いです。

opencvはbrewで入れた。ffmpegを入れておく必要があります。

あと上記URLを参考に。

PythonからOpenCVを使う

import cv2
cap = cv2.VideoCapture(0)
ret, im = cap.read()
cv2.imwrite('cap.jpg', im)

と書くだけで、MBAのカメラからキャプチャしてcap.jpgという名前で保存します。おもろい。

ProductName 実践 コンピュータビジョン
Jan Erik Solem
オライリージャパン / 3150円 ( 2013-03-23 )