東京 Ruby 会議 11 直前特集号

IMF: Image Manipulation Framework

発表者は、Ruby のための画像操作ライブラリを昨年終盤から開発しています。本発表では、このまだ開発途上のライブラリについて、いま何ができるのか、そして将来どうしようと考えているかをご説明します。

IMF の開発が順調に進めば、いずれ RMagick は不要になります。そういう世界を速く実現するため、本発表を聞いて興味を持った人が開発に協力してくれるようになると嬉しいです。

必要となる知識

JPEG とか PNG とか WEBP などのビットマップ画像を扱ったことがあり、Ruby で画像を処理したいなぁと思ったことがある人向けです。RMagick を使ったことがある人はなお良いです。

村田 賢太
Recruit Holdings Co., Ltd. / Ruby committer

リクルートホールディングス Media Technology Lab にてソフトウェアエンジニアとして働きながら、プライベートでは BigDecimal のメンテナとして Ruby の開発に携わっている。


5/17 Ruby 開発会議をやっている裏でチャットで伺いました(話し手:村田さん、聞き手:笹田)。

IMF gem

笹田 今回のご発表は、IMF という、画像操作ライブラリを作ったので、そのご紹介ということですね。

村田 はい、その通りです。

笹田 RMagick の代替 (同じようなことをやる)、ということでしょうか

村田 僕がやりたかったことが RMagick ではできなかった (と思う) ので、その時に ImageMagick とは関わりたくないなと思って、作ることにしました。

笹田 IMF は、ImageMagick と比べて、できることは多いのでしょうか。

村田 IMF単体では多くはなりません。ただ、将来的には多くなるような構想があります。

笹田 ImageMagick にない、やりたかったことというのは何でしょうか。

村田 画像を開いて、テンソルとして扱いたかったんですね。画像ってベクトル場なんですよ。

笹田 なるほどわからん。数値計算で扱うようにデコードしたかった、というイメージですかね?

村田 そういうことですね。で、そのテンソルを NArray や NMatrix のような行列計算ライブラリでいじったり、OpenCV に渡したり、GSL の関数に渡したり、TensorFlow とか MXNet で作ったニューラルネットワークに渡したりできたら楽しいだろうなと思ったわけですよ。

笹田 なるほど。

村田 RMagick では、そういうのには対応していないと思いますから、やるとしたら RMagick にパッチを送る必要がありました。でも、それはやらなかった。

笹田 RMagick も、中ではそれを取り出してるんだろうけど、それを Ruby レベルでは取り出せなかったんですね。

村田 そうですね

笹田 なんで patch にしなかったんでしょうか。

村田 二つ理由があって、一つはさっき言ったように ImageMagick に強く関係するのはちょっと嫌だなぁと思ったことですね。ImageMagick 自体が大きいですよね、依存関係などを含めると。なので、自分がやりたいことのために ImageMagick が必須になってしまうのは嫌でした。

笹田 なるほど。もう一つは?

村田 もう一つの理由としては、Ruby の IO っぽいオブジェクトから画像を読んだり、画像を書き込んだりできると便利だろうなと思って、それを実現したかったというのもありますね。例えば、IMF は今すでに Zlib::GzipReader から画像を読み込めるんで、便利かどうかは別として Ruby のためのライブラリっぽくはなってます。

笹田 なるほど。

村田 IMF 本体は、今のところ JPEG と PNG に対応していて、東京 Ruby 会議 11 までに WebP にも対応できたら嬉しいなと思って準備を進めているんですが、ファイルフォーマットの読み書きをプラグインで作れるようにしてるので、僕じゃなくても作れるようになってます。

笹田 IMF 自体は、読み込みで終わり?

村田 IMF 自体は読み書き、変形、簡単なフィルタリング、空の画像を作って何か描いたりとかできるようにはしたいですね。

笹田 発表では、これの作り方になる? それとも、使った応用の話ですかね

村田 発表では、このライブラリの目指している位置付けを説明して、一人ではなかなか開発が進まないので協力者を募集しようと思ってます。発表のメインは、この画像ライブラリの中身よりも、むしろ位置付けの部分ですね。

笹田 応用例をご紹介は頂けるでしょうか。

村田 応用例として、そのテンソルデータを他のライブラリとやりとりするための道具も紹介するので、そっちをむしろメインにしたほうが良いかなと今は考えていますね。

笹田 実際の問題を解いた、みたいな例はどうでしょうか。見た目わかりやすいやつ。

村田 ディープラーニング!とかできたら楽しそうですね。

笹田 「Python につなぎます」

村田 実は julia っていう gem も (今は開発が止まってるんですが) 作っていて、Julia と繋ぐやつをもっとちゃんと作りたいなとは思ってますね。Python より良いと思いますよ。

笹田 実際の発表ではできそう?

村田 julia ではないですが、もうちょっとタイムリーな応用例は出すつもりです。

笹田 楽しみですね!

村田 僕は画像ライブラリは、画像を読み書きするところだけちゃんとやっておけば良いと思っていて、画像を加工する部分は他のライブラリに任せられるようになってる方が良いと思うんですよね。なので、IMF はそういう方向で設計と開発を進めて、それと一緒に使うための道具も準備しようという内容の発表になる予定です。

笹田 発表は、こういう応用の世界の広がり、夢広がり、ってやつになるわけですね。

村田 はい、そうです。

笹田 コード例とかどこかで見ることはできるでしょうか。

村田 例えば、https://github.com/mrkn/IMF/blob/image_format/spec/IMF/image/open_spec.rb#L104-L135 がテストになります。使い方などは、GitHub のリポジトリに追々整備していきます。ちなみに、一通り開発が進んだら SciRuby organization に移管しようと思ってます。

SciRuby-jp コミュニティ

笹田 こういう応用を Ruby から使いたい、というと、どの辺をチェックすればいいでしょう。

村田 最近 SciRuby-jp という Google Group を作りました。これは、日本で活動する Rubyists のために日本語と英語で統計や機械学習や科学技術計算について議論できるものです。

笹田 ふむふむ。

村田 これまで SciRuby Development group という Google Group が世界の Rubyist のために開かれたグループだったんですが、日本語では議論がしづらいでしょうし、日本で開かれるイベントの情報を投稿するのもやりにくいので、日本という地域向けにと思って用意しました。ここに、SciRuby 本家の動きを日本語で展開したりもしていこうと思っているので、こういう分野に興味ある人、特に統計や機械学習を Ruby でやってる人の参加をお待ちしてます。

笹田 なるほど。ありがとうございました。発表楽しみにしています。