Juliaと画像処理

Dsuke_KATO氏(以下、Dsuke_KATO):加藤大典と申します。「Juliaと画像処理」で、Juliaで画像処理をやろうとしたらそれ用のライブラリがあったのでちょっと触ってみたという話です。

自己紹介。大阪大学で視覚神経について大学で10年くらいやっていました。ソフトウェアのベンターにいって、今は医療機器のメーカーで働いています。

MATLABときどきCやってきました。仕事を始めてからやったPython触って、「お、これは便利だ」というのを始めて知って。そのあと須山さんの本でJuliaを知って、黒木さんに捕捉されるという馴れ初めです(笑)。

(会場笑)

現在の仕事はCとかC++を使っているだけなので、あんまりちょっと出番がなくなってどうしようと。

こんな画像とか撮るメーカーで働いています。

こういうのは分析もやらないといけないので、ここで画像処理をどうやってやろうかなということで、結局C+使うんですけど。コンパイルが面倒くさいなと。

PythonでAPI叩くだけならいいんですが、構文をぐるぐる回すのは嫌なので、何人かの方がおっしゃっているように速いということでちょっとJuliaを。

Juliaで画像を扱うには

そもそもJuliaで画像を扱うのはどうなんだろうと思って調べてみたところ、JuliaImagesというところが今いろんなパッケージを包括的に扱っていて。ちょっとそれを触ってみたという感じです。

表示はわりとMATLABとかインターフェースに似ていて楽ちんです。

何個かJupyter Notebookを使って書いてみたので、それをちょっとだけ回してみたいと思います。(参考注:JuliaImagesSamples.ipynb

これはTwitterでリンクを回しているんですが、サンプルの読み込みは、ここではTestImageを使っています。

インターフェースとしては線形フィルターでぼやかしたり。これはガウシアンフィルターですけど。まだAPIがいろいろと統一されていなかったり非効率なんですが、わかりやすいとか、効率的だけどわかりにくいとか。

まだAPIが整理されていませんが、整理されていない分ちょっとおもしろいところがあります。それがカーネルファクターとかそのへんです。

それから線形フィルター用のAPIも提供されています。アルゴリズムによってはもっと最適化できるとは思うんですけど、これはMAD関数だけ用意しておいて、それにどんな関数を掛けていきますかと。

この場合、メディアンフィルターをかけたらこうなります。汎用的なインターフェースが定義されていて。issueやプルリクを見ていたらメディアンフィルターはもっと効率的なアルゴリズムがあるぞとプルリクが投げられていたりするので、わりとそれ見ているのもおもしろいです。

画像の縮小をやりたいときは、自分で1回ダウンサンプリングするときにアンチエイリアスの対応をしてくれないので、なにかかまさないといけません。

あと、画像の回転とか。ひと通り画像処理に必要な分とか、物体検出もやりたいなと思っています。そもそも検出領域を描けるのかって、ImageDrawとかで長方形書いたりとかできます。わりと必要最低限の分は揃っているかなと思っています。OpenCVほどいろいろな関数が準備されているわけではないんですが。

あと、画像処理じゃないんですが、色空間の話も便利に扱えるようになります。これはJuliaじゃないですが、色空間でJPEGの圧縮に使われている表現なんですが、輝度情報と色差空間で画像を表現しましょうと。

いわゆる色相、彩度、明度とか、そういった変換をしてデータを扱う。それをすぐに簡単に表示することができるので、ディープラーニングとはぜんぜんつながってないんですが、そういったかたちで非常にデータが扱いやすい構造に準備されているという印象です。

特徴的なデータの扱い方

データの扱い方がちょっとだけ特徴的です。基本的にデータは0、1の範囲で全部正規化して扱うそうです。

中のデータ構造は8ビットです。例えばuintとかcharとか、いわゆるC言語で使われていたものも0、1で扱います。

そのときに使われていたのが固定小数点数です。例えばN0f8とか、ノーマライズドの0。ちょっと赤色で、こういうことがあるので、赤色の部分。この場合16ビット分の2バイトのデータなんですけど。

例えば8ビットのデータを扱う人がほとんどだとは思うんですけど、ものによっては10ビットとか12ビットとか高解像度のものを扱うときにもそれ用のデータ構造が用意されています。

下は12ビットでそれを0、1の値で扱いますよといった固定小数点数でデータストレージを扱うというところがあります。

あともう1個だけ。イメージの画像でchannelviewの話もちょっとあったんですけれども。例えばこれで画像を1個作ってみて、それのサイズを見てやると普通はRGBなのでchannelの数字が出てきそうなんですけど、64×64という数字が返ってきてます。

これはちょっとJuliaの特徴的なところだと思います。実際にそれのデータを取ってこいというのはchannelviewという関数が用意されているので見てやると、そうしたらやっと3×64×64というよく見るデータが出てきます。

これはグレー画像とカラー画像を同じようなアルゴリズムで処理できるので便利だろうというのでこうしているみたいです。

ちょっといろいろと触ってみた感じなんですが、最初に始める分にはいいんですが、まだまだ成長途中なのでそれを追いかけながら自分で実装して楽しむというにはいいと思います。私が当初考えていたのは、どう使うかはまだまだです。以上です。ありがとうございました。

(会場拍手)