TAMALOG

プログラミングがあれば遠いところへ行けます。プログラムと人の共生を記録します。

ビュールレ・コレクションを見に行った。

国立新美術館で、印象派の展覧会があったので行ってきた。ビュールレ・コレクションは近いうちにチューリヒ美術館に寄贈されるらしく、日本これだけの作品を見られるのはこの機会だけらしい。

僕は絵画が好きなだけなので、あまり歴史には詳しくない。美術館へ行くたびに自分の好きな絵画を探している。今回気に入った作品が以下。興味が出た人はぜひ。

カミーユ・ピサロ「ルーヴシエンヌの雪道」 http://www.tokyo-np.co.jp/article/event/bi/buehrle/list/images/PK2018012902100168_size0.jpg

カミーユ・ピサロ「会話、ルーヴシエンヌ」 http://www.tokyo-np.co.jp/article/event/bi/buehrle/list/images/PK2018013002100166_size0.jpg

アルフレッド・シスレー「ブージヴァルの夏」 http://www.tokyo-np.co.jp/article/event/bi/buehrle/list/images/PK2018021502100169_size0.jpg

「ヴェトゥイユ近郊のヒナゲシ畑」 http://www.tokyo-np.co.jp/article/event/bi/buehrle/list/images/PK2018020302100100_size0.jpg

東京新聞でも絵画の画像つき記事が上がっているので見てみると良いかも。 東京新聞:集う巨匠の美 14日から国立新美術館:至上の印象派展 ビュールレ・コレクション:イベント情報(TOKYO Web)

「お金2.0」を読んだ。

去年、「金持ち父さん、貧乏父さん」という本に触発されて依頼、お金への関心が強くなっている。「お金2.0」を読み終わったので、雑な要約を載せておく。

今日読み終えた「お金2.0」という本では、今300年の歴史がある貨幣経済にパラダイムシフトが起こっていると指摘する。貨幣をうまく利用できる者がより貨幣を持つように、個人の人気をうまく利用できる者がより人気を獲得できる世の中になっている。YouTuberやInstagramerがそう。YouTuberにとって、ファンやチャンネル登録者が減ることは、金銭を失うことと同じあるいはそれ以上に不安を抱くこともあるらしい。

筆者の考える経済を構成するための4つの普遍的な性質を例にとり、貨幣経済も評価経済(人間の人気や期待、体験など)も同じだと主張する。まだ評価経済は始まったばかりで、その仕組みは完全ではなく若い世代(ミレニアム世代)がそれを作り上げる感覚を持っているのではないかと筆者は煽る。

貨幣経済が評価経済に成り代わると主張したいわけではなく、生き方の選択肢が広がるだろう。貨幣経済では認められづらかった価値が、評価経済の中で評価される。例えば、プロにはなれないがカラオケが上手い人が動画をアップロードして人気を集め、ファンから物をもらい受けたりということがありえる。

貨幣経済の中で生きなくても、評価経済の中で生きていける。働けなくても生きていける道も拓ける。

金本位制が終了した時点で、貨幣経済は国が担うものとなったが、インターネットやブロックチェーンなどの技術を使えば評価経済の仕組みは一会社や、ましてやビットコインのように個人が提示できる。この仕組をうまく作ることが評価経済を加速する方法であり、ビジネスチャンスでもあり、人々に新しい生き方を提示できる。

このブログを読んだが、声質変換の知識と多層ニューラルネットワークの知識が足りずに全体的にわからなかった。

hiroshiba.github.io

特にわからなかったのは以下。pix2pixが適しているのかよくわからない。

少ないデータ数で学習させるには、pix2pixモデルが適している。 今回はこのpix2pixモデルを使って声質変換タスクを解いた。

声質変換で注目していたのは、クリムゾンテクノロジー株式会社の「リアチェンvoice」だった。デモを聞いてみるとかなり違和感が少ないことに驚くと思う。

www.youtube.com

NGT(高次元ベクトルデータ検索技術)をGolangでごまかして雑なJSON APIにする

類似画像検索システムに組み込むための高次元ベクトルデータ検索技術を探していました。Yahoo! Japanが開発したNGT(高次元ベクトルデータ検索技術)を見つけたので試してみます。

f:id:tamanobi:20170627025115p:plain https://www.flickr.com/photos/21001756@N06/2087512650/

表形式をJSON APIに変換する

前回は、NGTをDockerで動かすところまで紹介しました。 tamanobi.hatenablog.com

公式ドキュメントに従って検索コマンドを実行すると、表形式の出力が得られます。 github.com

 $ ngt search -n 20 index ./data/sift-query-3.tsv
  Query No.1
  Rank  ID  Distance
  1 3031    239.332
  2 4079    240.002
  3 3164    244.504
  4 3718    246.763
  5 157 251.094
  6 2422    251.185
  7 1313    251.34
  8 379 252.446
  9 3521    260.158
  10    2594    261.132
  11    4627    262.381
  12    2159    263.471
  13    3519    264.909
  14    1764    265.136
  15    4400    266.156
  16    2717    266.914
  17    3168    269.637
  18    4236    270.673
  19    4700    272.725
  20    679 272.973
  Query Time= 0.000472 (sec), 0.472 (msec)

検索システムとして利用する上では、この表示形式は使いづらいためJSONで返せるようにパッチを当てます。

JSON出力ができるようにパッチを当てる

NGTはC++で書かれているので、STLをJSONにシリアライズするライブラリを探します。今回はヘッダーを読み込むだけで利用できるライブラリを使用しました。 github.com

ngt searchコマンドにjson出力用のオプションを加えました。本家のmasterとの差分は以下のリンクを参照してください。個人向けの雑な修正なので本家にPRは送らない予定です。

Comparing yahoojapan:master...tamanobi:feature/json_output · yahoojapan/NGT · GitHub

差分を取り込んで、buildすればjsonオプションが有効になります。例えば、 ngt search -o j -n 20 index ./data/sift-query-3.tsvとoオプションにjを渡せば、JSONが出力できます。

ここまでで検索バックエンドの下準備は終わりました。JSONは出力されるものの、HTTP経由でのアクセスに対応していないので何かしらの言語でウェブサーバーを立ててAPIサーバーにします。

GolangでさくっとAPIサーバー

開発速度を鑑みて、それなりに高速でシンプルにJSON APIサーバーかける言語を採用します。今回はGolangにしました。コードはとてもシンプルです。特定のエンドポイントにファイルがPOSTされたらコマンドを実行するだけです。

https://gist.github.com/tamanobi/d10c932eebbd8c4c5ee0ca6f5143f3e9

tsv形式のファイルをいちいち送らないといけないのが、ナンセンスですが今回はよしとします。

Docker

これまでに、2つの変更を行いました。NGTにパッチを当てたこと、GoでのAPIサーバーの作成です。何も考えずに実行できるようにDockerfileを作りました。

github.com

リポジトリにDockerfileが入っているので、 docker build -t tamanobi/ngt_webapp .としてビルドを行ってください。ビルド後に、docker run -it -p 2300:8000 tamanobi/ngt_webappとすればウェブサーバーが立ち上がり、ホストOSの2300番ポートにAPIサーバーに転送されるようになります。

まとめ

NGTをHTTPを介して使うために、2つの準備を行いました。

  1. NGTにパッチを当てて、JSON出力に対応
  2. GolangでNGTコマンドを発行するウェブサーバーを立てる

次回

次回は、Golangのサーバーに対してリクエストを送ってNGTのデータベース構築や検索を行ってみます。

高次元ベクトルデータ検索技術「NGT」の環境をDockerで爆速構築

類似画像検索システムを構築するにあたり、高次元ベクトルデータの検索にNGTを使いました。本稿では、NGTの環境をDockerで爆速構築する方法を紹介します。

f:id:tamanobi:20170626030130j:plain

NGT

NGTとは、高次元ベクトルデータを高速に検索するコマンド及びライブラリのことです。Yahoo! Japanによって開発されました。

techblog.yahoo.co.jp

膨大なベクトルデータの検索でこのようなライブラリが必要とされます。僕は、十万枚規模の画像特徴ベクトル(4000次元)の検索に利用しました。

Docker

NGTはUbuntuでの動作確認が行われています。UbuntuをベースイメージとしたDockerコンテナを作っていきます。

Dockerコンテナの作成

以下のようなDockerfileとシェルスクリプトを用意します。これらを実行するだけです。

for NGT · GitHub

シェルスクリプトを動作させれば、NGTがコンパイルされた状態のDockerコンテナが作成され、コンテナのbashにアタッチできます。 アタッチした環境(Bash環境)では、 ngt コマンドが動作します。

ビルド時間は長いですが、一度環境を作ってしまえばとても簡単にベクトルデータ検索ライブラリが使えるようになります。

NGTを試す

NGTの試し方は公式を参考にしてください。

github.com

まとめ

Yahoo! Japanが作成した高次元ベクトルデータ検索ライブラリNGTを試せる環境をDockerを用いて瞬時に作成する方法を紹介しました。

Dockerfileに環境構築の手順が書いてあるので、時間が経ったあとでも環境を再現しやすいでしょう。

次回予定

次はGolangでNGTをバックエンドにした(雑な)APIサーバーを作ります。

画像収集基盤の構築ログ10

目的

人の代わりに画像を集めてくれるシステムを構築すること。なお、個人的な趣味でイラスト画像を対象としている。

tamanobi.hatenablog.com

進捗

  • Dockerのネットワーク絡みの問題を解消
  • 暫定的にローカルに保存していた画像をテーブルに格納した
  • Viewのコード整理(DRY)
  • Controllerのコード整理(ハードコーディング除去)

  • そろそろクローリング戦略に手をつけたい

画像収集基盤の構築ログ9

目的

人の代わりに画像を集めてくれるシステムを構築すること。なお、個人的な趣味でイラスト画像を対象としている。

tamanobi.hatenablog.com

進捗

雑感

これまでやりたいと思っていたことが優秀なミドルウェアによってスムーズに実現できている。この数日間は特にDockerにとても助けられている。それぞれ別の役割を持ったアプリケーションサーバーが10弱も必要になったことがわかったときにはシステムの起動・再起動をどう制御しようか思いつかなかった。Dockerであれば構成がテキストファイルとして管理できる。再起動も容易だ。こんなに便利な存在を教えてくれた GitHub - isucon/isucon6-final には感謝している。ISUCONは勝ち負けのあるコンテストだが、負けたからといって学びがないわけではない。雑なアプリケーションがどういうものか知ることができるし、そもそもアプリケーションの構成も学びになる。Dockerもそれで知った。たったひとつのコマンドでミドルウェアを含めてアプリケーションが立ち上がる様は、圧巻だった。

参考文献