(後編)マハリクmahalita 白黒アニメよ色よ付け えいっ! (ディープラーニングによる白黒アニメの自動彩色実験)

白黒アニメをカラーで見たい...。

 

  f:id:eiji-kb:20161125214435p:plain     (C)光プロダクション・東映アニメーション/魔法使いサリーより引用。右は自動彩色。

 
前編(この彩色手法の基本的概要)

ネットワーク構造

今回の彩色実験に用いたモデルのネットワーク図です。 

f:id:eiji-kb:20161125224703p:plain

ベースはPavel Gonchar氏のcolornet*1です(上図右側)。これはRyan Dahl氏のAutomatic Colorization*2をベースにしたTensorflowによる実装です。今回作成したモデルは、colornetのChainerによる移植ですが、さらに以下の変更を加えています。

1.色空間としてYUVではなくLabを使用し、colornetの最終層のシグモイドを除外した。
2.VGG16第5層も彩色ネットワーク側に接続し利用した。
3.Satoshi Iizuka, Edgar Simo-Serra, and Hiroshi IshikawaのLet there be Color!*3のFusion Layerに影響を受け、VGG16全結合層を利用する簡易FUSION層を追加した。

や3は、アニメはキャラクタがアップで表示されることがあるため、大域的な領域の、彩色性能の向上を目標として追加しました。
細かい話ですが、colornetでは拡大にバイリニア法が使っていますが、このモデルでは、Upconvolution(Deconvolution)を使用しています。
なおVGG部分は、K. Simonyan氏らによるILSVRC-2014 model*4をCaffeモデルからChainerモデルへ移転したmitmul氏の chainer-imagenet-vgg*5を使用しました。

訓練データ

 実験で使用したアニメは、横山光輝原作、東映動画製作の魔法使いサリーです。少女向けアニメですが、内容的には男児も含めた子供一般が楽しめるように作成されています。放送開始は1966年、17話まで白黒、18話からカラーで制作されました。よってオープニングも白黒版とカラー版が存在します(オープニングは、背景とカメラワークに差異が存在します)。

 今回は、本編(第1話)を彩色することを主な目標とします。そのため、18話からのカラー放送を訓練データとして使用しました。

訓練データ
  魔法使いサリー6話分(18〜23話,OP ED抜き,2時間18分,フレーム数248,433)

 なお、フレーム数は約25万ですが、アニメには連続して同じフレームが存在します。そのため、実質的な訓練データ数としては、もう少し少なめに見積る必要があります。

訓練時間

使用機器

  CPU Intel Core i7-4790K
  GPU NVIDIA TITAN

 訓練時間は1エポック(6話分の訓練データをモデルに1回学習させる)およそ20〜22時間かかりました。なお、学習状況のモニタ機能を利用し、かつ同じ計算機上で別作業も行っていましたので、実際は、もう何割かは速く処理することが可能です。今回は1エポックずつ作業し、3日かけて3エポック実施しました(厳密には、1から2エポックのつなぎ処理が少し漏れましたので,3エポックには満たないです。次章に記載した最大学習回数(741,868)が、フレーム数248,433×3エポック=745,299とイコールでないのはそのため)。
 話が前後しますが、訓練データとして動画をそのまま使用しました。手軽に大容量の訓練データを与えたいというのが第一の理由でしたが、実際に行おうとすると、サリーのカラー放送は全91話ありますので、これを訓練するには1エポックだけでざっと12〜13日はかかりそうです。今回は断念して6話分で訓練を行いました。

実験結果

下図は、白黒放送第1話に、自動彩色を施した結果です。自動彩色に使用したモデルの学習回数は、741868(最大)、720000、680000、660000です。


・学習回数741868(最大)モデルによる自動彩色

 f:id:eiji-kb:20161125231342p:plain  

・学習回数720000モデルによる自動彩色

 f:id:eiji-kb:20161125235630p:plain

・学習回数680000モデルによる自動彩色 

 f:id:eiji-kb:20161126000127p:plain 

・学習回数660000モデルによる自動彩色

 f:id:eiji-kb:20161126001223p:plain


 
 以上の画像ですが、各モデルで見栄えがいいのものを選んで載せています。実際には、彩色はうまく行かなかった例も多々あります。下図では、よし子ちゃん(右のキャラクタ)の腕に塗り漏れが発生しています。 (その他の例は動画で確認できます)


 

 f:id:eiji-kb:20161126001656p:plain

 

学習結果の傾向

 学習モデルによって、彩色の得意不得意があります。例えば学習回数720000では背景の木々の緑がよく出ます。今回、訓練データとして動画を用いましたが、これは、モデルは動画の頭から順に1フレームずつ学習しています。そして、アニメはシーンにより色彩が違ってきます。モデルを保存するタイミングで、そのタイミングのシーンに適合しているため学習モデルによって彩色の傾向に違いが出たと考えられます。またモデルによっては、シーンをまたがっての学習中なのか、まったく冴えない彩色をするモデルもあります。この点は、今回の訓練方式の欠点かと思います。エポックごとに学習係数を低減していくと、もう少しモデル間の差異は小さくなったかもしれませんが、今回は全エポック一律の学習係数で訓練しています。
 学習回数680000のモデルでは、背景の木々が緑だったりピンクだったりに彩色されました。これは訓練データの風景(下図)に、日中の緑の木々だけでなく、桜や夕焼けに染まった風景もあったことが影響したと考えられます。しかしながら、これはこれでグラデーションがかかったように見えていいリズム感が出ましたので、個人的には気に入っています。

 

  f:id:eiji-kb:20161126003319p:plain



ところで、シーンによって彩色が違ってくるということは、やはりそのシーンばかりを集めて専用の訓練データを作って訓練したほうが綺麗では、と考えられます。試してみたところ、魔法の国のシーンでは、カラー放送に近い彩色結果が得られました。 


(左から、白黒、本編モデルで彩色、魔法の国モデルで彩色)

   f:id:eiji-kb:20161126004124p:plain



 しかし、他のシーンでは特に印象的な結果は出ませんでした。理由は6話分(約2時間20分)からシーンを集めましたので、訓練データ自体が小さくなったのが一因と考えられます。かといって訓練データを大きくするのは、現状では手作業となってしまうためあまり現実的とは言えません。魔法の国のシーンがうまくいったのは、元々背景の色が単調であったことや、白黒放送と同じ原画・動画(中割り)を使ったと考えられるシーンがカラー放送にあったためと考えられます。

 

 あと、オープニングについては、カラー放送のオープニングを学習していない本編モデルでも、当然白黒放送のオープニングの彩色はできますが、やはりカラー放送のオープニングを訓練したモデルを使った方が、カラー放送に近い彩色はできます。



(左から、白黒放送、本編モデル(680000)彩色、カラー放送OPモデル彩色、カラー放送)
f:id:eiji-kb:20161109235311j:plain                          ©光プロダクション・東映アニメーション



 サリーちゃん本編(白黒放送第1話)への彩色実験の結果です。今回、複数モデルを使用して彩色しましたので、主観になりますがモデル間で比べてみて綺麗と思ったシーンで編集してみたのが以下の動画となります。(OP+1話。1話はダイジェスト編集しています)


 

     

                      ©光プロダクション・東映アニメーション

 


単体のモデルで彩色した結果を知りたい方は、先に紹介したGitHubに、学習回数680000で彩色した動画のリンクを貼っていますのでご参照ください。

色彩設計の違い

 上の動画を見たら、カブ(下図のキャラクタ)の服の色が、カラー放送と比較してかなり違うと感じられたと思います。また、オープニングの家の屋根も赤になっていません。これらは、カラー放送と白黒放送で色彩設計が違うためと考えられます。


 

(左から、カラー放送、カラー放送→グレースケール化したもの、白黒放送)  

  f:id:eiji-kb:20161126005629p:plain


真ん中がカラー放送をグレースケール化したものですが、白黒放送と比べると服や屋根の輝度が違うのがわかります。カブは白黒放送ではシャツとズボンの違いがはっきりわかりますが、カラー放送をグレースケール化すると、服の境界線が分かりづらくなります。なおカラー放送だからカラーを優先するのは当然ですが、カラー放送に切り替えられた1967年当時はまだカラーTVの普及率は1.6%(翌68年でも5.4%、ただしこの後急速に普及し75年には90%超えます。*6総務省)だったため、当時放送を見ていた、多くのちびっ子たちは切り替わった際に違和感を抱いたのではと思われます。話がそれましたが、今回使った手法では彩色にあたってグレースケールが重要な情報となりますので、輝度にこれだけ違いがあると彩色は難しいようです。
 なおサリーちゃんの服は白黒放送から赤としての設定だったようで、今回の手法でも赤でうまく塗れています。ただしサリーちゃんの顔の色には、ばらつきがでました。原因のひとつとして考えられるのは、訓練データ(カラー放送)でも、サリーちゃんの顔の色にばらつきがあることです。
 また、訓練データについて補足しますと、キャラクターの作画についても多様性があります。サリーちゃんも、顔の描き方から身長まで、かなり幅があります(特に中割りにおいて顕著でした。中にはサリーちゃんじゃなくて別のギャグアニメだろうといったテイストのものまでありました)。

汎化性能

 上で紹介したサリーちゃんの動画も、彩色したのは訓練データには含まれていない白黒作品です。さらに、サリーちゃんで学習したモデルを、まったく違う白黒作品に適用して彩色テストしてみました。テストしたのは、石ノ森章太郎原作、佐武と市捕物控(1968)です。サリーちゃんとはかなり違う作風の作品です。使用したモデルは、サリーちゃん本編学習回数680000のモデルです。

  

  f:id:eiji-kb:20161126025102p:plain


 最後のフレームはかなりポップな彩色となりました。全体的に色がにじみましたが、それでかえって味が出たというか、印象深い彩色になったと感じました。かつてのパソコン、AppleIIやPC-6001では、あえてにじみを活用することで色を出していたといいますが、2016年の今に、このようなアナログっぽい処理が復活するとは感慨深いです。ディープラーニングの自動彩色でこういったことが楽しめるのは、今のうちだけかもしれないですね。
 動画は、後半とOPのみとしています。

 

     

                                ©石森プロ

ソース

 ソースをGitHubに上げています。

github.com

ネットワーク構造は先に述べたとおりです。損失関数は平均二乗誤差(MSE)です。Labのaとbの分それぞれMSEを求めます。そしてそれぞれSGDで最適化します。SGDの学習係数はデフォルト0.0002です。なお、VGGとcolornetの接続については、ソフトなので戻り値でと言われそうですが、ワイヤ的に記述したかったため、そういう書き方にしております。

ネットワーク設定について

 ネットワーク設定するにあたって、実験して結果を見ながら試行錯誤を行いました。しかしディープラーニングは訓練データも大きく実験時間もかかるため、なかなか恵まれた環境でもない限りデータや実験時間に制約を受けてしまうのが実情かと思います。今回、予備実験の段階では、軽めの訓練データで試行して、あたりをつけながら進めていきました。そのため、考察を述べるには実験が不十分な側面がありますが、差し支えないと思える程度で述べておきます。

 2.の第5層の接続ですが、これはもともとオリジナルのAutomatic colorizatonでもマシンリソース不足により実装されなかったことが述べられています。実際にこの層を利用したモデルをいくつか作り実写動画で訓練して試したところ、どのモデルにおいても大域的な領域の、色の学習は速くなりました。その点は良かったのですが、単に第5層を接続しただけのモデルでは、学習時に下図左のような、パズルの抜けのような塗り漏れが散見されました。 

 

    f:id:eiji-kb:20161125230108p:plain

 

第5層は空間情報としては縦横14x14と大域的なため、そのような影響が出たと考えられます。この改善についてはあとで述べます。3.の簡易FUSION層も大域的な塗りの精度向上を目指したものです。これは、意味論的情報(参照論文では大域特徴)である全結合層を再度2次元に束ね、抽象化の進んだ空間的情報(参照論文では中レベル特徴)となった層と融合させるというものです。自分は全結合層の利用は発想にありませんでしたので、最初論文を読んだ時、なるほどと感嘆しました。そしてVGGの全結合層をFUSIONして特徴量として使うだけなら、たいして実装の手間はかからないため追加しました。しかし、当モデルにおいては、大域的な塗りと言う点で期待したほどの効果は表れませんでした。参照論文のモデルとは、ネットワーク構造から損失関数から誤差逆伝搬の範囲から、いろいろと差異があるためと考えられます。しかしながら、前述の塗り漏れについては改善傾向が見られました(上図右)。ただその理由としては、単に第5層の情報が弱まったことでそのような効果が現れた可能性があります(FUSIONする際に第5層由来のデータもサイズが半分に縮小されています)。しかし、第5層を使用したモデルの、大域的な領域の色の学習の速さを持ち、かつ第4層までを使用した従来モデルに劣らない塗りの丁寧さが共存していると評価できましたので、この簡易FUSION層はモデルに採用しました。  

試される方へ

 試して見ようとする方のためにメモ的なことを記しておきます。まず、画像の明度のヒストグラムは、訓練データとテストデータの間で差が小さくなるように調整した方が、良い結果が得られると思います。
 Chainerのバージョンですが、今回紹介した実験は全て1.8.2でおこなっています。現在(2015年12月5日)の最新バージョンは、1.18.0です。この最新バージョンで簡単な動画を使い、訓練と検証が動作することを確認しています。細かいことですが、この間のバージョンでは、動かない場合があるかもしれません。1.13.0にバージョンアップをした時に訓練を試したところ、画像に強いムラが表れました(一度しか試していないため、たまたまかもしれません)。また1.14.0にバージョンアップしたときは、CUDA関連のエラーが出ました。
 CPUでの利用ですが、出先で古いMacBook Air(Late2010)でサリーちゃんOPを使って訓練を試したことがありますが、1エポックでおよそ1日かかりました。CPUのみでの処理なら、検証のみ行うのがおすすめです。

おわりに

 このブログはChainer MeetUP #03で発表した内容をもとに作成しました。それから少し手を加えています。カラー化に関する論文やソースの著者の方に感謝します。そして原作者の方、アニメ制作の方に敬意を表します。サリーちゃん50周年おめでとうございます。mOm

*1:Pavel Gonchar, "colornet", https://github.com/pavelgonchar/colornet, 2016

*2:Ryan Dahl, "Automatic Colorization", https://github.com/Eiji-Kb/mahalitahttp://tinyclouds.org/colorize, 2016

*3:Satoshi Iizuka, Edgar Simo-Serra, and Hiroshi Ishikawa, "Let there be Color!: Joint End-to-end Learning of Global and Local Image Priors for Automatic Image Colorization with Simultaneous Classification",ACM Transaction on Graphics ,Proc. of SIGGRAPH 2016

*4:K. Simonyan, A. Zisserman, "Very Deep Convolutional Networks for Large-Scale Image Recognition", https://arxiv.org/pdf/1409.1556.pdf,2015

*5:mitmul, "chainer-imagenet-vgg", https://github.com/mitmul/chainer-imagenet-vgg, 2015

*6:総務省,平成26年版情報通信白書,http://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h26/html/nc121220.html

「この世界の片隅に」 噂どおり凄かった(ネタバレなし)

これは凄い作品でした。観てから数日たつというのに、まだいろいろ思い出してしまいます。

戦争アニメは、結構観るのが辛かったりしますが、この作品はそれだけでなくて、ユーモアも、そして愛も救いもある作品でした。

   

      f:id:eiji-kb:20161125094527p:plain

       (C)こうの史代・双葉社/「この世界の片隅に」製作委員会  

 

ユーモアは特に女性のツボにはまるシーンがあるのが印象的でした。逆に男性寄りな視点のシーンもあり多様です。

いろいろと考えさせられながら見てしまう映画です。そのため、考え込んでついセリフを聞き逃しそうになりましたが、この作品は暗喩や伏線が多いとわかりますので、本当に絵も声も逃さないようにと大変でした。さりげないシーンにも、深い意味が込められていたりします。

そして、作品を通じて登場人物たちの人生や結末を追ってきた後で見るあのラストシーン。屈指のシーンです。あの瞬間のシーンには、自分もきゅっと心を掴まれてしまいました。

頭から離れないのは、いくつかの感情を同時に揺さぶられたからだと思います。かなしみやあたたかさといった普段同時に起きない感情たちが、さらに普遍的な愛という感情に包まれたという感じでしょうか。なんか陳腐な文章ですね。すみません。

福岡県では今のところ、博多のキャナルシティと北九州のチャチャタウンの、二ヶ所だけでの公開のようです。広がって欲しいですし、これだけの作品なので広がると思います。

個人的には早く円盤でじっくり観たいです。以下はトレーラーです。映画館で公開されたものと違う所がありますが、HDで観ると本当に細かいです。子供たちが縄跳びで遊んでいるとかします。

 

             (C)こうの史代・双葉社/「この世界の片隅に」製作委員会  

 

考証もすごいということで、100年先どころか、1000年後の人類も観る作品だと思いました。:_)

MacのTeX (TeXShop)でpdf経由の図の貼り付け(備忘)

matplotlib などで作成した図を、TeXへ貼り付ける時の手順



1.PDFで貼り付ける.

 (1)python(matplotlib)などで作成した図を、PDFで保存する.

 (2)PPT(パワーポイント)等

   1)PPT等で,貼り付けたい部分を選択する.[編集]-[コピー]

   2)Mac標準の「プレビュー」を起動してPDFに変換する.

      ・ランチャから起動

      ・[ファイル]-[クリップボードから新規作成] で貼り付け.

      ・[ファイル]-[保存] ドロップダウンで,フォーマット「PDF」とし,

       任意ファイル名(例:waowao.pdf)を付けて保存.

       注意!まぎわらしいが,[ファイル]-[PDFとして書き出す]では保存しないこと。

          これで保存すると、A4縦とか横のPDFに変換されるため、

          TeXで読み込んだ時に,異常に縦長とか,90度回転(横)で表示される.

2.ebbでebbファイル作成

 (1)ebbを起動する.(パスを切れば ebbだけでOK)

   ebb -b -x waowao.pdf

   ・フルパスの場合  /usr/local/texlive/2014/bin/x86_64-darwin/ebb -b -x waowao.pdf

3.あとはTeXで指定すればOK.

4.おまけ 写真の加工(例face.jpgからEPS形式に変換)

 (1)convert face.jpg face.eps

 (2)ebb -b -x face.jpg

   ・フルパスの場合/usr/local/texlive/2014/bin/x86_64-darwin/ebb -b -x face.jpg

東と西と (醤油と蕎麦・うどん・がめ煮・筑前煮)

f:id:eiji-kb:20161120233119j:plain

以前勤めていた所で、福岡から東京→大阪と日本二大都市に異動があり、いい経験ができたと感謝している。特に食べ物については勉強になった。何事も本場で食べると違うということだ。よく、漫画などでは東京の真っ黒のつゆのうどんがバカにされる。たしかにうどんには塩辛い。しかし、東京に異動して、あれは蕎麦を食べるためのつゆなのだとわかった。蕎麦と合う。蕎麦の香りに負けない。引き立つ。逆に関西以西の蕎麦は、たしかに上品だし、うまいといえばうまいのだが、どうもつゆが蕎麦に負けるというか、蕎麦と一緒に食べると、微妙に生臭さすら感じるようになった(ここでの蕎麦の話は、かけそばのような汁をはった蕎麦の話です。そして西でも蕎麦専門のお店とか、出雲そばとか、越前そばとかはうまい所はうまい)。というか、関西以西のつゆはうどんで食べた方がうまいのだ。うどんなら素直につゆと馴染む。そもそもうどん用のつゆだ。「うどん・そば」両方出す店も多いが、やっぱりうどん優位のところはうどんで食ったがうまい。リピートするのはうどんだ。やみつきになる。逆に蕎麦は東京の方がやみつきになる味だ。大阪に異動した後、東京出張の際は、駅そばですら楽しみにしていた。

あとつゆつながりで言えば、醤油の違いも勉強になった。福岡から東京に異動した後、社食で天ぷらを食べたが、九州でのノリで、天ぷらに醤油をドバッと掛けたところ、前に座った上司が、「あっ!」と声を出した。最初何のことがわからず食べ続けたが、天ぷらをあらかた食ったところでその声の意味を理解した。塩辛かった。でも東京の蕎麦のつゆはこの醤油でなければダメだろう。対して九州の醤油はよく甘いと言われる。九州で生まれ育ったので、九州の醤油が甘いものという感覚は全くなく、あくまで醤油はからいものの範疇だったが、東京と比較すれば明らかに甘いとわかった。ただし九州の甘い醤油は天ぷらによく合う。それは天丼のたれが甘いことを思い出して頂ければご理解いただけると思う。あとやはり九州の醤油でないと作れない料理というのがあって、がめ煮がそうだ。これは九州北部(主に福岡と、佐賀の一部らしい)で正月などハレの日に作られる料理だ。材料が多くて下ごしらえが大変なので特別な日に作られるのだと思う。Wikiを見ると、筑前煮はがめ煮の、九州地方以外での呼称とされているが、全く別の料理だと思っていた。がめ煮と比べると筑前煮はかなり上品で、京都あたりの家庭料理かと思い込んでいた。醤油の濃さが全然違う。もちろん筑前煮もうまいのだが、小鉢で食べれば十分だ。しかしがめ煮はやみつきになる味だ。正月に大量に作っても、みんなガンガン食べるし、もらって帰る人もいて、すぐに残り少なくなる。そして残ったやつを翌日に食べるのも、カレーと同じ原理でうまいのだ。使う鶏肉は骨付きがうまい。

今は九州にいるので九州の醤油も楽に手に入る。が、醤油は地産地消の傾向が強いので、一番好きな銘柄はその地元のスーパーに足を運んだりしないと買えなかったりする。あと、最近は健康にも気を使い始めたので、醤油の糖分が気になるようになった。意外と九州の醤油は、果糖ぶどう糖液糖を使っているものが多い。果糖ぶどう糖液糖はソフトドリンクとかによく入っているやつで、甘みが強く、コストも安いため使われているが、今はその健康への影響が取りざたされている。自分は健康に問題がないとされていれば人工甘味料でもかまわないのだが、そういった醤油は近くのスーパーには置いていない。そこで残る選択肢として、砂糖を使用している醤油を普段使いにしている。砂糖も健康に良いわけではないのだが、量の問題だし、果糖ぶどう糖液糖よりはましだろうと思った。そして意外なことに、砂糖を使っているものの方が果糖ぶどう糖液糖を使っているものより安かったりする。今使っているのは以下だが、200円ちょいだし、別の銘柄だと、税抜きで200円切っているのも見たことがある。

f:id:eiji-kb:20161120235837p:plain

ちなみに、今使っているものの特級というのもあって、アマゾンでは評判もいいようだ。

この九州の醤油で食べる天ぷらで一番好きなのは、ちくわの天ぷらだ。チープだが、これがなかなかのライスキラーだ。ただ、天ぷらを作るのは油が大変なので、今回は半分に切ったものに小麦粉を付けて、シャローフライにしてみた。

f:id:eiji-kb:20161120235718p:plain

ちょいとした酒のツマミにもいい。

 

マウス肩かと思っていたら、肩が石灰化していた件

マウス肩が慢性化して、五十肩(四十肩ともいう)でもなったかな?と思っていたら、肩が石灰化していた。肩をやられたらコンピュータが使えないのであかんがな。
肩が痛ければ、自分で勝手に判断しないで、ちゃんと整形外科に行って、医師の診察を受けましょうという当たり前の話です。さっさと行かないとこんな痛い目に遭うという話。

f:id:eiji-kb:20161119012100p:plain

痛みの始まり

今回の激痛が、いつから始まったのか、はっきり覚えていない。ただ、10月の月末にかなり冷え込んだ日があって、朝起きたら右肩にかなり痛みがあった。10月は月初は気温が30℃越える日もあり、寝るときも布団を掛けない癖が抜けなくて、その痛みが出た日も、布団を掛けて寝ていなかった。あと、その日か前の日が忘れたが、前腕の内側に痙攣が2度ほど発生した。今まで経験したことが無かったため気味悪く、その事自体は覚えていた。ただ別にそのままにしていた。というのも、そもそも右肩は20代前半から痛むことが多かったので気にしなかった。マウスの位置や操作に悪い癖があったのだと思う。一般的にマウスはキーボードの右側に置くが、PCを置いたサイドテーブルの空間に限りがあったので、キーボードより奥にマウスを置いて、腕を伸ばしきってマウスを操作する癖があった。それで傷んだんだと思う。でもまあ、コンピュータ使うし、しょうがないくらいに思っていた。痛いが、我慢できないような痛みでもなかったし。

強まる痛み

ところが今回は腕を上げてマウスを操作しようとしても、かなり痛くて出来なかった。ネットで調べるとマウスは体の前に置いて操作するのが負担がかからないとあったので、その体勢でちまちまとマウスを操作した。痛みが強かったので、ネットで四十肩とか五十肩とか検索して、最初痛いがそのうち痛みは弱くなるという記事も見て、まあしばらく辛抱だろうと勝手に判断した。この時、記事をキチンと読めば、石灰化とかの可能性もあることが分かったのだが、自分がまさかという思いもあって、斜め読みしてしまった。それも良くなかった。

そのうちどんどん痛みが強くなってきた。腕を上げて机の上のキーボードが打てなくなった。膝の上にキーボードを置くと、まだ打てる。運良く安物のメンブレンキーボードがあり、これが軽量だったので、それを膝の上に置いてタイプしていた。そのうち、それも辛くなってきた。そこで、立って腕をぶらんと下げて、手首だけ起こすとキーボードが打てたのでそうした。まあ、この時までは、痛みは生きてる証拠だぜというギャグを思い起こすくらいの余裕があったのだが...。

金属片を埋め込んだような激痛

数日過ぎて週末の土日になると、痛みがさらに増した。どれくらい痛いか例えると、鈍い鋭さの金属片を3枚くらい、肩の筋肉に埋め込まれたような痛さだった(もちろんそんな経験はないが)。あまりに痛いと本当に何もできない。痛みに耐えてじっと過ごすしかない。夜も眠れなかった。起きているときは腕をだらんと下げることができて少し負担が減るが、横になると、重力で少し腕がずれるというのか、腕を筋肉で保持できず、さらに痛みが増した。常備薬の市販の痛み止めがあり、それを飲んで痛みを散らせた。しかし寝る前に飲んでも長くて3時間くらい、短いと数十分で肩の激痛とともに目が覚めるのだ。安物のベットだが電動で背もたれが起こせるのでそれで寝てみた。しかし電車では座っていても熟睡できるのに、心地よい揺れが無いためか、ベットでは深く眠れない。本当に睡眠の質が劇的に悪くなった。眠りたいのに痛くて横になれない。これはとてもつらい。

収まらない痛み

開けて月曜日、朝起きたら相変わらず痛いが、我慢できないことはない。ついに峠を超えたかと勝手に解釈した。しかし甘かった。昼飯を食った後に激痛が来た。痛みが移動する。肩の前の方に、金属片を埋め込んで肉がちぎられるような痛みがあったが、それが知らぬうちに、ジャンプしながら上にゆっくりと移動していき、最後にはぐるっとまわって肩の後ろ側まで来た。呼吸は浅くなり、椅子から立ち上がろうとしても、腰を浮かした瞬間に痛さで引っ繰り返りそうで、ほんとギャーと叫びたくなるくらい、我慢できない痛さだった。さすがに観念して、痛み止めを飲んで病院に行った。

病院へ

病院に行ってレントゲン撮ったら、石灰化が見つかった。いやこれは大きい。と感心された。先生に診てもらって、病状の説明を受けて、注射を打つかどうか聞かれた。レントゲンを見せられた後で、あんな奥まで針を通すのか?この痛いところに注射を打つなど、超激痛ではないのか?と恐れたが、かなり効くということで、そして痛みをどうにかしたかったので、打ってもらった。注射は痛い瞬間もあったが、激痛自体に比べればはるかにましだった。おかげさまで注射がよく効いて、その晩(と次の日)は、数日ぶりにじっくり眠ることができた。これは有り難かった。そして久しぶりに夢を見ることができた。なぜか、非常に事務的な夢だったので目が覚めて笑えたが。

薬で治療

治療は薬で対処することになった。痛み止めと、石灰をなくす効果のある薬をもらった。これは8割の人には効果があるということだった。一ヶ月服用して、またレントゲンを取って効果を見ることになる。

経過(途中)

注射を打って、2日くらいは眠れたが、その後はやはり寝ると肩が痛い。横になって腕が楽なポジションがない。右腕で布団をぐるっと巻き込んで少し浮かすと楽になった。しかし目が覚めたら相変わらず激痛だ。やはり、3時間くらいで目が覚めたりする。だいたい、十日少しはそんな感じで過ごした。睡眠の質が悪いと辛い。しかし十日ほど過ぎたら、ぐっすり眠れるようになった。目が覚めたら相変わらず重い痛みはあるが。腕も少しずつ動かせるようになった。キーボードも、膝の上にキーボードを置いて、両手でタイプできるようになった。

あたりまえだが、片手が使えないと日常生活が大変だ。ベットから起きるのも、服を着るのも、歯磨きも、風呂も、ドライヤーを掛けるのも、トイレも。ほとんどの日常生活が。腕が上がらないので、脇の下も不快になる。ただ、コンタクトを入れるのは、片手でも入れやすいと発見した。左手ばかり使うことになるので、負担がかかリ過ぎないように注意した。左肩も痛んだらたまらない。

ストレッチは大事

VDT作業指針で、1時間作業したら、10〜15分の作業休息(別の作業をするなど)を取るという指針がある。いままで、現実にそんなことできるかと無視していたが、それは間違いだったと、痛い目にあってはじめて分かった。特にここ数年は椅子に座ってぶっ続けで作業することが多かったので、ずいぶんマズイことをしていたと反省した。仕事でパソコン使う人は、肩に負担を掛けることが多いと思います。みなさんもご注意ください。

 

 

UbuntuへのUnity (game engineの方)インストール

Unity(ゲームエンジンの方だよ)の、Ubuntuへのインストールについてメモ。


インストールしても、
・背景が紫一色 (地面と空に別れていない)
になったり、バージョンアップしても、
・動作がハングアップしたように異常に遅い。
というトラブルに見舞われた。

オフィシャルのサイトでは、インストーラーはWindowsやMac用は前面に出てるのですぐ見つかるが、Ubuntu版は見つからない。

色々探したら、
以下のオフィシャルの掲示板にダウンロードリンク先の履歴があった。
https://forum.unity3d.com/threads/unity-on-linux-release-notes-and-known-issues.350256/

Linux用のUnityインストーラは、
Ubuntu専用と、Linux汎用のものが用意されていた。
なお、上でトラブルが発生したのは汎用だった。

上の掲示板の下の方にある下記の専用インストーラから再導入したら解消した。
Official Installers for 64-bit Ubuntu Linux:
5.4.1f1: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.1f1+20160913_amd64.deb

(前編)マハリクmahalita 白黒アニメよ色よ付け えいっ! (ディープラーニングによる白黒アニメの自動彩色実験)

白黒映像をカラーで見たい...。

 

  f:id:eiji-kb:20161125214435p:plain     (C)光プロダクション・東映アニメーション/魔法使いサリーより引用。右は自動彩色。


 おおげさかもしれませんが、それは空を飛びたいとかと同じ種類の欲求ではないかと思います。自分も惹き付けられますが、かなり昔にもそれに挑戦した人がいました。以前図書館で、古い1960〜70年代くらいの技術雑誌でしたが、白黒TVの前でカラーフィルタを高速で回転させることでカラーTVにするという記事が載っていました。しかし情熱には感心しましたが、そんな単純な仕組みでまともな色が付くとは思えませんでした。

以下はカラー(RGB)から白黒(グレースケール)へ変換する式ですが、

 白黒(グレースケール)*1 = 0.299×R + 0.587×G + 0.114×B

白黒(グレースケール)からカラーに戻そうにも、RGBの値の組み合わせはいくつも存在するため値が特定できません。ある白黒(グレースケール)の値が青みがかった色なのか、緑がかった色なのか特定できない...。
 ところが人間なら、ある程度は特定することができます。上の白黒の絵なら、木は緑、空は青、顔は肌色と、特に意識せずにできます。上の式の係数は、カラーを、人間が自然に感じられる白黒の輝度に変換する値となっていて、その結果の値も、色を特定する手がかりとなります。しかしそれに加えて、人間は絵の中の物体が何か認識してその色を知っているから色を特定できます(人間は、さらに品質の悪いグレースケールでも、そしてグレースケール無しの輪郭線だけでも特定できます)。
 正確には、特定というよりも、頭の中の記憶から色を決めていますので、それらしい色(もっともらしい色)を想像しているといった方がより適切なようです。たとえば白黒のドラえもんを見せられたらほとんどの人はあの青や赤や黄を想像できます。しかし、鳥や花や蝶など見せられたらどうでしょうか。それらに詳しくなければ、正しい色ではなく、それらしい色で想像しているはずです。自然の風景なども、人によって想像する色が微妙に違ってきます。
そういった意味では、冒頭のカラーフィルタの仕組みも、カラーTVにするというよりは、見る側の想像力を補って脳内補完で色を付けるためだけの装置だったのかもしれません。

自動彩色ネットワークの概要

 さて先に述べたような、もっともらしい色を想像して色を付けるという処理を、機械で実現するには、

 ① 画像から物体を認識
 ② データベースから物体の色を検索
 ③ 物体の領域に色を塗る

とすれば実現できそうです。しかし、現実には画像の認識や領域の特定は機械にとっては難しい問題でした。このあたりの話は画像処理の教科書やディープラーニングの記事でよく出てきますので簡単に述べますが、研究は進み、21世紀に入ってからは画像の明暗の方向や量などから画像の特徴量を取り出し、それを識別器で学習して画像を認識することができるようになりました。そして、2012年にディープラーニングが、それらの手法をかなり上回る精度での認識を実現しました。このとき用いられた手法のCNN(Conventional Neural Network:畳み込みニューラルネットワーク)は、実は以前から存在していたものだったのですが、以前と比べより高速な計算機と大量のデータ処理ができるようになり画像認識に適用したところ、最高の認識精度が達成されました。この最高の精度という事実は圧倒的な力をもちます。そしてディープラーニングが急速に広まって現在に至るのは多くの方がご存知のとおりです。

 ディープラーニングによる自動彩色は、2015年の末くらいから出てきました。手法はいくつかありますが、以降では、今回実験で用いた手法の概要を、キーワードを元に説明していきます。これは、Ryan Dahl氏によるAutomatic Colorizationサイト*2をベースとしていますが、文章と図は独自に作成しています。この手法(この手法に参照された手法も含む)は、上の①〜③に相当する処理が、ディープラーニングのネットワーク内だけで完結します。そして、訓練後はあたかもカラーフィルタのように、白黒画像をネットワークに流すだけで色を付けて出力するところがシンプルで感心するところです。なおCNNに関する基礎知識があればより理解しやすいと思います。数多くの良解説サイトがありますので、知りたい方はそちらをご覧ください。

CNNの基本

 CNNは画像認識によく用いられます。学習済みのCNNは、画像が何であるかを予測します。下の図では、画像が「傘」「クラゲ」「こども」であることを予測しています。(クラゲは明らかに勘違いですが)

 

f:id:eiji-kb:20161125222153p:plain(注:上図のCNNは4層ですが、これは簡略化して描いており、実際はまだ多層です)

意味論的情報と空間情報

  一番右側の、線の形の層(全結合層)から「傘」の確率が何%、「くらげ」の確率が何%などといった確率を取り出すようにしますが*3、言い換えるとこの層は、その画像は何か、という意味的な情報(ここでは以降、意味論的情報と書きます)を持つと考えられます。この層は1次元です。
 他方、四角で表した畳み込み層は、縦、横からなる2次元の空間を持ちます。まず一番左側の層に画像が入力されますが、ここでは入力画像と同じ解像度を持ちます。つまり元の画像のディテールがわかる情報を持ちます。右の層に進むにつれ、プーリング層というものを通して縦横のサイズは小さくなっていき、解像度は低下していきます。一番左側の畳み込み層がもっとも大きな空間情報をもち、右に進むにつれて空間情報は小さくなります。

まとめると、CNNの層は、
 ・右に行くほど、意味論的情報が増大します。(左に行くほど、意味論的情報は減少します)
 ・左に行くほど、空間情報が大きくなります。(右に行くほど、空間情報が小さくなります)

大域的な空間情報

右に行くほど空間情報が小さくなるということは、
・右に行くほど、大域的な空間情報を捉えている。
とも言えます。

下図は、各畳み込み層のあるチャネル(プレーン)を、拡大して大きさを揃えてみたものです。一番右のチャネルでは、1画素が画像をより大域的に捉えていることがわかるかと思います。 

 

f:id:eiji-kb:20161130055548p:plain

 以下の絵の方が分かりやすいでしょうか。太陽など、右の層の方がより大域的に捉えているのがわかると思います。(注:色は便宜的に塗ったものです。)

  f:id:eiji-kb:20161202100716p:plain

 なお、このような考え方は、CNNだけということではなく、従来手法でも画像ピラミッドという同様の考え方が存在します。

ハイパーコラム

 CNNに入力された画像の、1画素分のデータを、CNNの層の間で串刺しで見たものが、ハイパーコラム*4
です。画像を入力して各層で活性化したデータ*5を全て結合します。
上の2つの図で言えば、赤線でつないだデータを結合するイメージです。下図で言えば、すべての層の活性化したデータを結合するイメージです。

      f:id:eiji-kb:20161125221551p:plain

      

 このハイパーコラムには、単に画像の各画素の明暗や色の情報だけではなく、CNNで物体の認識や領域検出に使われる情報も、含まれることになります。

(メモ:このハイパーコラムは、脳の第一次視覚野のハイパーコラムから名前を借用しています。視覚野については画像処理分野でもよく触れられますので、簡単に説明します。第一次視覚野などの脳の新皮質は、6層の神経細胞層を持ちます。そして第一次視覚野の細胞には特定の方位の線分に好んで反応するものがあります。この同じ方位に反応する細胞を縦に6層にまとめたものが、方位コラムと呼ばれるものです。方位コラムは、少しずつ違う方位に反応し、それらが集合しています。この集合の内部には、色や明暗に反応する部位が存在し、これらはブロブと呼ばれます。また両眼からの情報は第4層に入力されますが、ここでは左右両眼どちらの入力が優位か明瞭に分かれます。この部位が眼球優位コラムと呼ばれます。これら両眼に対応する眼球優位コラムとブロブと一周期分の方位コラムの集まりをワンセットにしたものがハイパーコラムと呼ばれるものです。これは、視覚情報分析の最小単位と考えられています。
つまり、ディープラーニングでいうハイパーコラムと第一次視覚野のハイパーコラムは同じものではありません。ディープラーニングでいうハイパーコラムも、方位選択性は存在しますが、ある1点の情報を中心に一周期分が集合しているわけではありません。また意味論的にはより多くの情報を含んでいます。後者は第二次、第三次視覚野といった上位の視覚野との連携を連想させます。)    

          f:id:eiji-kb:20161119230847p:plain

 (引用 https://grey.colorado.edu/CompCogNeuro/index.php/CCNBook/Perception、一部加筆)

セグメンテーション

 ハイパーコラムのデータを利用することで、領域の検出(セグメンテーション)が可能です。

f:id:eiji-kb:20161125221943p:plain


 左下のオレンジ枠は、各層から印象的なチャネルを選択して可視化したものです。3列目では、顔のパーツ(目と口のセット)に反応したり、頭髪に反応したりするチャネルが出現しているのが興味深いところです。そしてこの複数の層のチャネルを、ハイパーコラム的にいくつか重ねあわせたものが、図右上になります。もっとも右の図では、顔の領域によく反応しています。これらは単に重ね合わせただけですが、セグメンテーションの手法を適用すれば、もっときれいに領域の検出が可能です。 

(データ作成サイト Christian S. Perone,"Convolutional hypercolumns in Python",http://blog.christianperone.com/2016/01/convolutional-hypercolumns-in-python/ ,2016)

ハイパーコラムを使った彩色

 以上がハイパーコラムの概要の説明でした。そして、この色情報の他に物体の認識や領域検出に使われるデータを含んだハイパーコラムを、特徴量として使用するのが、ハイパーコラムを使った自動彩色の基本コンセプトになります。つまりハイパーコラムのデータを特徴量として、任意の関数の万能近似器であるフィードフォワード型の多層ニューラルネットワークに入力して、そのニューラルネットワークに正解データとしてカラー画像を与え学習させるというコンセプトです。
 

f:id:eiji-kb:20161130054322p:plain

 a.カラー放送から白黒画像に変換したデータをCNNに入力
 b.ハイパーコラムのデータを特徴量として、c.カラーを学習するニューラルネットワークに入力
 c.カラーを学習するニューラルネットワークは、
  自身の出力が正解のd.カラー画像との誤差が小さくなるよう学習

 

f:id:eiji-kb:20161130054342p:plain

 訓練済みのネットワークに白黒画像を入力すると、カラー画像を出力
 

 さて、この手法により彩色は可能となります。しかし、この手法ではハイパーコラムのデータサイズが巨大になりますので、マシンのリソースによってはメモリ不足が発生するという問題があります。

残差エンコーダ

 Ryan Dahl氏は当初ハイパーコラムを使った彩色ネットワークを試していましたが、ILSVRC2015のクラス分類エントリで優勝したマイクロソフト研究所のResidual Network(ResNet)という、人間の認識精度を超えたとされる手法からひらめきを得て、残差エンコーダなる彩色ネットワークを発案しました。

 

 f:id:eiji-kb:20161123070635p:plain
引用(左):Kaiming He他,Deep Residual Learning for Image Recognition,https://arxiv.org/pdf/1512.03385v1.pdf 

 

 ResNetは、最大152もの層をもったネットワークです。通常、ネットワークは多層になると訓練時の誤差が増大し精度が上がらないことが知られています。そこでResNetでは、データの流れをショートカットしたブロックを導入することで、多層であっても高い精度での訓練ができるようにしました。ショートカットすることで、ショートカットされた中の層は、ショートカットされたデータとの残差を学習すればよいことになります。ResNetでは、上図のようなボトルネックブロックも提案されました。これは3層をショートカットする接続ですが、中間層で次元圧縮を行います。これはオートエンコーダと同様の考え方です。オートエンコーダは、入力層と出力層が同じ次元を持ち、入力層からのデータを中間層で次元圧縮して、出力層で復元するニューラルネットワークです。そして彩色ネットワークは、入力が白黒情報で、出力がそのカラー情報である、ほぼオートエンコーダのようなものと考えられます。そこで、Ryan Dahl氏はResNetの考えを取り入れて、以下のような構造の彩色ネットワーク、残差エンコーダを発想しました。これは、ハイパーコラムを使用した彩色ネットワークと比べ、省メモリ、かつ訓練の高速化と精度の向上を実現しています。


   f:id:eiji-kb:20161125223257p:plain

補足

 少し細かい補足ですので、興味のない方は飛ばしてください。上で説明してきた彩色ネットワークは、実際はカラー情報としてRGBではなく、別の色空間(YUVなど)を使用しています。今回作成したモデルでは、Lab色空間を使用しました。Lab色空間は、Lとaとbの3チャネルで色を表現します。

 

f:id:eiji-kb:20161125223753p:plain

先に説明した訓練と検証も正確には、下図のようになります。

 

f:id:eiji-kb:20161130071902p:plain

 

 もうひとつ補足しておきます。彩色のために、果たしてハイパーコラム各層の全データが必要なのか、不明なところがあります。情報は多ければ良いというものでなく、本来は彩色に必要なデータのみあればいいはずです(もっとも、その必要なデータを自動的に取り出すのが、ディープラーニングのいいところなのですが)。実際に実験したところ、以下のように残差エンコーダーからショートカットをなくし、彩色ネットワークへ入力するデータも最終層(赤部分)のみにしても、色の学習は可能でした。

 

    f:id:eiji-kb:20161125224434p:plain

 ただし、訓練速度は落ちました。訓練時の品質も良くはありませんでした。このことは最終的な訓練結果による精度を予測するものではありませんが、筋が良いとは思えなかったため自分は簡単なテストで留めています。

後編につづく:実験結果

 

 

(2015/12/5 分割・修正)

*1:正確には輝度

*2:Ryan Dahl, "Automatic Colorization", http://tinyclouds.org/colorize/, 2016

*3:ソフトマックス関数を用いる

*4:Bharath Hariharan, Pablo Arbeláez, Ross Girshick, Jitendra Malik,"Hypercolumns for Object Segmentation and Fine-grained Localization",2015,https://arxiv.org/abs/1411.5752

*5:活性化関数適用後のデータ