2014年6月26日木曜日

Python製オープンソースライブラリ「Scrapy」でスクレイピングしてみた話


Web上を自由に徘徊(クローリング)して,必要な情報抜き出してほしい情報を抽出(スクレイピング)してみたくなりました.

世の中にはいくらでもスクレイピングツールが出回っていますが,
プログラマブルなスクレイピングモジュールって少し敷居が高いと思って敬遠していました.

軽く足が突っ込めるようにPythonで,サクっとスクレイピングしてデータマイニング入門できるようなツールを探したところ,Scrapyと呼ばれるオープンソースのスクレイピングライブラリを見つけました,
https://github.com/scrapy/scrapy/

準備:
- scrapyのインストール
   $ pip install scrapy

手順:
scrapyを使ってスクレイピングを行うにあたっては以下の3stepの作業になります.

1. scrapyプロジェクトの作成
$ scrapy startproject tutorial
  # tutorial プロジェクトが出来ました.
  # 生成物は以下のとおり

$ tree tutorial/
tutorial/
├── Books
├── Resources
├── items.json
├── scrapy.cfg
└── tutorial
    ├── __init__.py
    ├── __init__.pyc
    ├── items.py
    ├── items.pyc
    ├── items.py~
    ├── pipelines.py
    ├── settings.py
    ├── settings.pyc
    └── spiders
        ├── __init__.py
        ├── __init__.pyc
        └── __init__.py~


 2. 抽出する情報の型を定義
tutorial/tutorial/items.py を編集します

 3. spiderと呼ばれるWeb上を徘徊するコードと情報の抽出ロジックを書く
tutorial/tutorial/spiders/__init__.py を以下のように編集します


実行
$ scrapy crawl dmoz -o items.json -t json
items.jsonにtitle, link, desc タグがjsonデータで取得されていれば問題なく使えています.


参考:
http://doc.scrapy.org/en/latest/intro/tutorial.html

2014年6月17日火曜日

無料で手軽に音声信号処理のお勉強をする方法

MATLABが無いと信号処理できないゆとり世代の私にとって朗報。
Pythonでも音声信号処理のライブラリが充実してることを知った。

その名も、pyaudio。
そのままな名前ですがwaveファイル開いて簡単に信号処理したりとかできちゃいそうです。

信号処理って基本は高度な数学を使うし、FFTとかしようと思ったらライブラリ入れる必要もあるしで、ものすごい学習コストが有りました。
大昔( 5~6年前? )にはSpectrum subtruction法による音声雑音除去のプログラム実装する課題が研究室で出されてカナリ苦労したことを思い出します。。
前提としては、人間のしゃべり声とガウス性雑音が載った音声ファイルから、
雑音を消すといったもので、単純にFFT掛けて雑音のパワー分差っ引くというだけです。

鬼のように学習コストが下がっていきますね。
忌み嫌われがちな信号処理が和解に向かって進んでいる!いい傾向!

良い学習リソースがあったのでリンク貼っておく。
 Pythonで音声信号処理

パターン認識と機械学習、初歩の初歩


* 機械学習フィーバーの背景

人工知能だビッグデータだ機械学習だって凄く話題になってる。
なぜこんなに言われるようになったか。

一つの要員としてはプロセッサの急速な高スペック化・低価格化があると思います。
機械学習ってどのくらいの計算コストがかかると思いますか?
例えば、画像一枚のデータに対して何かしらのパターン認識をかませることを考えます。
対象の画像が、RGBの要素を持っていて500px×500pxだったとすると
入力データのパラメータ量としては、 3 * 500 * 500 = 750000次元
糞小さい画像でも75万次元のデータがあるわけです。
これを解析するのに必要なプロセッサの能力だとか、
うまーく有限時間で解けるアルゴリズムだとか、そのへんのインフラが整ってきたのでこんなに騒がれているわけです。


* パターン認識の流れ

大きく3つのフェーズからなります。 1. 前処理、2.特徴抽出、3.識別
"入力データ => (前処理) => (特徴抽出) => 特徴ベクトル => (識別) => クラス"

1. 前処理
明らかにいらない情報を捨てる。
分野ごとに要らない情報の落とし方はやり方が確立されてる事が多い
 (ex) 文字認識においては一、大きさ、向き、色は文字の種類と無関係なので無視

2. 特徴抽出
識別に用いる特徴量を抽出し次元を削減

3. 識別
導出された特徴量を用いて、一番それっぽいクラスを選択するフェーズ。
「それっぽい」の判断基準は数学的な問題、特に統計的なイシューになります。
データの種類やデータの量によって色々な手法があります。


* 神教材

動画:

パターン認識と機械学習入門@ワークスアプリケーションズ


プレゼン資料:
パターン認識と機械学習勉強会 資料

イケてると思うベンチャーリスト

面白い試みがあったのでメモ。


Raffaello D'Andrea: The astounding athletic power of quadcopters

クアッドコプターに運動能力をもたせたという話。

ジャイロセンサ、加速度センサから得えられる情報を利用して
フィードバック制御することによりクアッドコプターを安定して制御させることができる。

クアッドコプターは4つ羽があり安定性を保っているが、
この数学的な制御理論を用いることで、例えば2つの羽が機能しなくなった時であっても
安定性を保たせる事ができる。

複数のクアッドコプターで協調制御させたり、
投げたボールをキャッチしたりもできる。


My work is focused on the creation of systems that leverage technological innovations, scientific principles, advanced mathematics, algorithms, and the art of design in unprecedented ways, with an emphasis on advanced motion control.
By their very nature, these creations require a team to realize. Many are enabled by the research I conduct with my graduate students. Many are also the fruit of collaborations with architects, entrepreneurs, and artists.
My hope is that these creations inspire us to rethink what role technology should have in shaping our future.

2014年6月16日月曜日

本田圭佑 プロフェッショナル仕事の流儀


「この世に天才などいない」


基本的にはですよ、
ゼロとは僕は言わないですけど
天才なんかこの世の中にほぼ居ないと思っています。


才能の差は若干なりともあるのも認めます。
ただ、”若干”でしょということを僕は言いたいんです。


ライオンと格闘するわけじゃない、
馬と競争するわけじゃない。
あいつが別の生き物だとか、
あいつだからっていう考えは、
馬やライオンにすればいいんです。
そんな天と地がひっくり返るほどの差はないでしょって。


だから、僕よりも才能のある選手に今までも勝ってきた。
なぜならそんな差はなかったんです。
でもその差を大きいと見るか、超えられるものと見るかは自分次第なんです。
それをみんな自分の限界を決めてしまって挑戦することをやめてしまうんです。
だから夢がかなわないなんてことになるんです。


夢が叶うと子どもたちに言ったことはないです。
大きな夢を持って下さいと僕は言うんです。
頑張れば叶う可能性があるわけです。
頑張るということは自分で決められるんです。
叶う可能性があるかどうかはあなた次第ですよ。

2014年6月6日金曜日

Wiiリモコンハック with Raspberry Pi


今回はRaspberry Pi と Wiiリモコンを使って、コントローラ入力レコーダーと、コントローラ入力再生機を作ってみます。
とはいってもいろんな技術をガッツリ使うものなので、回数に分けて段階的に紹介していきます。


【 必要なもの 】

 - Raspberry Pi
 - Bluetooth USBドングル(Wiiリモコンの通信用)
 - SDカード(RaspbianOSのインストール用)
 - Wiiリモコン


【 やりたいこと 】

 ① Wiiリモコンからの入力をRaspberry Pi でレコーディング
 ② レコーディングした入力データを再生してみる
 ③ 再生した入力をトリガーにして何か面白いことを実行してみる
   (今回はカメラモジュールを使った写真撮影をします)


① Wiiリモコンからの入力をレコーディング

まずはWiiリモコンとRaspberry Piを接続するところから。
これはcwiidと呼ばれるライブラリを使えば驚くほど簡単にできます。
 cwiid 本家
 cwiid @ github

接続するためにはRaspberry Pi 側に種々の必要なライブラリをセットアップ必要があります。
今回の入力レコーダーで必要なライブラリとしては numpy, cwiid, bluetooth です。
numpyは行列演算とかを容易にするライブラリ。ボタン入力処理を賢くサクッと書くために使います。
cwiidはWiiリモコンとの接続を簡単に行うためのAPIがたくさん用意されています。
bluetoothはBTドングルのデバイスドライバです。
ライブラリの追加インストール手順については以下のリンクが参考になりました。
    http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/robot/downloads/

めんどくせぇ、英語よくわかんねぇって人は以下のコマンドをおもむろにコピペするがいい
$ sudo apt-get install python-smbus ipython bluetooth bluez-utils \python-cwiid python-scipy python-numpy python-pygame \python-setuptools libsdl-dev
 コピペしてインストールが完了すればRaspberry Pi側のセットアップは完了です。
今度はBluetoothドングルの機能が正しく使えるかテストしよう。


$ sudo service bluetooth status
以下のレスポンスが帰ってくればOKです。

[ ok ] bluetooth is running.
あとはこちらのサイトにあるサンプルスクリプトを実行してみる。
http://www.raspberrypi-spy.co.uk/2013/02/nintendo-wii-remote-python-and-the-raspberry-pi/

ご丁寧にwgetでダウンロードできるよ!って書いてあるんでこれを実行してローカルに落とす。


$ wget http://www.raspberrypi-spy.co.uk/archive/python/wii_remote_1.py
落としたスクリプトを下記の通り実行

1
python wii_remote_1.py
実行したあと、Wiiリモコンの1,2ボタンを同時押しして接続。
接続が成功したログがでたらボタン押下してみて入力が正しく取得できていることを確認。

サンプルスクリプトだと、多少delayは入れてくれているけど、ボタン押している間、ダラダラログがでてくるのがいただけない。。
レコーディングするデータの冗長性はどうしても省きたいので、「ボタン入力のステートに変化があった時だけ記録する」方針を立てる。
といっても実装は簡単で、一フレーム前のボタンデータを現在のボタンデータが違ったら記録するだけ。
レコーディングのフォーマットはこんな感じ。
# Timing, Button
3.17495703697,1024
3.27394509315,0
6.9152610302,2048
6.94527006149,0
6.95132398605,512
6.98429703712,0
7.00630521774,1024
7.09829521179,0
7.18631219864,2048
7.29432606697,2304
7.32930803299,2048
7.37030911446,0
7.37931108475,512
7.50533699989,0
9.30555820465,512
9.35757017136,0
11.710750103,8
11.7407782078,0
11.9258739948,8
12.0262951851,0
12.1567862034,8
12.2268311977,0
12.3577971458,8
    *              , *
    *              , *

実装しているスクリプトはgithubにおいています。
https://github.com/ks6088ts/python/tree/master/WiiRemoteProject

速さ重視で即席で作ったのでモジュール化がいまいちだったり、リファクタリングできてなかったりでひどいソースですがとりあえず動作することは確認しました。
# レコーディングと並行して入力データを元にGPIO経由でデバイス制御もしてます。
# 関係ないソースコードがあったりしますがご了承下さい。。


2014年6月3日火曜日

こんなビリヤードをやってみたい感。

何かおもろいスマホアプリないかなぁなんて思考を巡らせてみました。
メモ書き程度のクオリティだが晒してみる。