@shi3z さんの "Caffeモデル+Selective Search+Chainer"を使ってみる

@shi3z さんが Caffe 使った一般物体認識のスクリプトを書いていたので、試してみた。

元ネタ:
Caffeモデル+Selective Search+Chainerを使って、写真のどの部分に何があるのかなんとなく判定させてみる - shi3zの長文日記
CUDAなしMacで、Chainer使ってCaffeモデルをインポートして画像認識させてみる - shi3zの長文日記

まず、OpenCV 入れていない人はそこから。
PythonでOpenCVを使う@Mac - Qiita
ちなみに僕はうまくリンクが貼れておらず、ここも参考にした。
osx - python cannot import opencv because it can't find libjpeg.8.dylib - Stack Overflow

他にも依存関係があるので、pip で一括インストール。

pip install numpy selectivesearch
pip install chainer -U

ちなみに Chainer は upgrade でインストールしないと、CaffeFunction が入らないので、upgrade オプション必須。

googlenetのモデルをインストール + モデルデータを取得

git clone https://github.com/pfnet/chainer.git
cd chainer/examples/modelzoo
python download_model.py googlenet
# これで bvlc_googlenet.caffemodel というモデルがダウンロードされるので、これを取得
python download_mean_file.py

Cuda をセットアップする
CUDA開発環境を構築する~[Mac OSX編] | ヤノラボ:やのしん研究所
この辺を読めばいけるはず。
MBAではさすがにやらなかったけど、、、。

最後に、shi3z さんが
Caffeモデル+Selective Search+Chainerを使って、写真のどの部分に何があるのかなんとなく判定させてみる - shi3zの長文日記
に書いてるスクリプトをコピペして、image.py とか適当にファイルをつくる。

一通り上記をやってから、

python image.py hoge.jpg googlenet bvlc_googlenet.caffemodel

とやると動くはず。

hoge.jpg は適当なイメージファイル名、
bvlc_googlenet.caffemodel は先ほど download_model.py を実行して得られたモデルファイル。

RequireJS + WordPress

以前、こんな記事を書いた。 Bower + RequireJS - Code to Fab

そもそもなんでこんなことをしていたかと言えば、WordPress のテーマ用の開発だったのだが、こんなに準備しても冷静に考えれば WordPress の場合は PHP の方で JavaScript の実行が制御されてしまうから、当然のごとくぽっと置いただけではうまくいかない。 調べてみると、wp_enqueue_scripts() を使って以下のようにすればいいらしい:

JavaScript を呼び出したい WordPress 側:

<?php
  // WordPress の関数を使って baseUrl のパスを作成
  $componentsUri = get_template_directory_uri() . '/js/components';
  // wp_enqueue_script を使って require.js を呼び出し
  wp_enqueue_script('requirejs', $componentsUri.'/requirejs/require.js');
  // require.js に baseUrl のパスを渡す
  wp_localize_script('requirejs', 'require', array(
      'baseUrl' => $componentsUri,
      'deps'    => array( get_template_directory_uri() . '/js/main.js')
  ));
?>

呼び出される main.js 側:

// 渡された変数を使って baseUrl をセット
requirejs.config({
  baseUrl: requirejs.toUrl('')
});

これだけで OK 。

割とすっきりかける。 Browserify ならもっと楽に書けそう。

参考: WordPress › WordPress Ideas — RequireJS

PRIMARY KEYがついているカラムをAUTO_INCREMENTに

ある、hoge_tb というテーブルをつくって、しばらく運用してしまった後に、そのカラム ID をAUTO_INCREMENTにしたくなったときにどうしたらよいか、という話。

といあえず思いついた2パターンを試してみる。

mysql> ALTER TABLE hoge_tb CHANGE id INT(11) NOT NULL AUTO_INCREMENT;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT(11) NOT NULL AUTO_INCREMENT' at line 1
mysql> ALTER TABLE hoge_tb CHANGE id id INT(11) NOT NULL AUTO_INCREMENT;
ERROR 1062 (23000): ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'PRIMARY'

ダメだ、、、。

調べてみると、どうやら sql_mode をいじればよいとのこと。

mysql> SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';
mysql> ALTER TABLE hoge_tb CHANGE id id INT(11) NOT NULL AUTO_INCREMENT;
mysql> SET SESSION sql_mode='';

ちなみに、その後大体テストをすると思うのだが、それはすなわち AUTO_INCREMENT のインデックスが進んでしまうということ。 インデックスをリセットするためには、

ALTER TABLE hoge_tb AUTO_INCREMENT=1000;

とかすればよい。

参考: MySqlでauto_increment を追加しようとしたら、エラー!! | Webridge Tech Blog

JavaScriptの勉強方法

Node やら Socket.io を使うプロジェクトがはじまったので、きちんと JavaScript を勉強しようと思って、二週間ほど記事読んだり、いろいろ見たりしていた。 普段、ブラウザで表示するためのものを書く分には何も気にせず jQuery 使っていればいいのだと思うのだけれど(この時点で異論がある人もいる気がするけれど、僕はフロントエンドフリークじゃないんで、 jQuery ファイルひとつで済むようなことしかしないし、アニメーション描きたい人は Bower や CoffeeScript の達人でも参照してくれ)、サーバサイド書くとなるともう少しいろいろ気にしなければいけないなと思ったので。 結論から言うと、下の三つのサイトがかなり役に立った。

補足:コールバックがどう動作しているのかを理解するのはとても重要なことだと思うのだけれど、日本語の記事がまともに存在していない気がする。対処法ばかりではなく、そもそもの動作原理を知ると理解が早い気がする。 Node.jsフロー制御 Part 1 – コールバック地獄 vs. Async vs. Highland | プログラミング | POSTD とかは対処法についての解説として非常によいのだけれど。

JavaScript.isSexy はとても参考になる。 かなりいい記事がある印象。

この reddit のスレッド も随分参考になった。

なんとなく使い方が分かったら、あとは使うだけだと思うんだけれど、 Train with Programming Challenges/Kata | Codewars とか使って、調べつつも書き続けるのが一番上達しそうな気がした。

コールバックの記事とか和訳の価値ある気がするけど、長い、、、。

----- 2015/12/28追記

Qiita 上で年末まとめ記事が大量に出ている中で、keitarou さんがご自身の JavaScript 習得経験をまとめていらっしゃったので、追記:

1年間真剣にJavaScriptに取り組んだ話 - Qiita