ディープラーニング(Convolutional Neural Networks(畳み込みニューラルネットワーク))を使ってモノクロ写真を自動でカラー化するよ、という面白そうなプロジェクトAutomatic Colorizationがあったので試してみた。

Rather than reconstructing the entire color RGB image, I trained models to produce two color channels which I concatenate with the grayscale input channel to produce a YUV image. The Y channel is intensity. This ensures that the intensity of the output will always be the same as the input.
輝度信号Yと色差信号のYUVを使うところがポイントで、グレースケールの入力から2つの色差信号を取り出すようにトレーニングされたモデル、とのことです。

Models were trained on the ILSVRC 2012 classification training dataset. The same training set used for the pretrained VGG16. It's 147GB and over 1.2 million images!
ImageNet LSVRC 2012の学習済みモデルが配布されていて、TensorFlow環境さえあればスクリプトの実行だけで動かせるのでいくつかやってみると、

まじか!?というくらい、草原、空など最も上手くカラー復元できた写真がこれ。教師データに多かったであろう自然の風景は、驚くほど再現されている。モノクロ画像の情報だけからここまで色彩を復元できるのは驚き。 m-c
ゴダール「勝手にしやがれ」のジャンポールベルモント。 m2-c
フリー素材の女子高生 m3-c
「ローマの休日」のオードリー・ヘップバーン m4-c

静止画でできるのであれば動画もできるはずということで、ffmpegで切り出して処理して結合という定番の方法でやってみました。

ゾンビ映画の名作、ジョージ・A・ロメロのNight of the Living Dead(ナイト・オブ・ザ・リビングデッド)をカラーにしてみたもの。やっぱり、冒頭の墓地の風景などは、とても上手くカラーになっています。



How to

TensorFlowの学習済みモデルをAutomatic Colorizationからダウンロードしておきます。torrent形式なのでクライアントソフトが必要です。

まず、GoogleのTensorFlowが動く環境を作ります。TensorFlowは2015年11月に無償公開されたばかりのライブラリです。(参考 グーグル、重要な「ヒトの数百万倍の能力」技術を無償公開 革新的分野で圧倒的主導権)

tensorflowのインストールガイドに従って、virtualenv環境でインストールします。
# Mac OS X
$ sudo easy_install pip
$ sudo pip install --upgrade virtualenv

tensorflowをアクティベート
$ virtualenv --system-site-packages ~/tensorflow
$ source ~/tensorflow/bin/activate  # If using bash

tensorflowをpipでインストール。Macで動かしたので、今回はCPUベースで。
# Mac OS X, CPU only:
(tensorflow)$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.6.0-py2-none-any.whl

tensorflowの環境が出来たので、画像単体のカラー復元処理は実行できます。モデルと一緒にforward.pyがあるので、
(tensorflow)$ python forward.py

これだけでOK。

動画のカラー化

動画の場合は、前後にffmpegでの処理を行って、Automatic Colorizationをフォルダ内の画像に対してループするだけです。

動画を画像として切り出します。予め、framesフォルダの中に対象となる動画を入れておきます。1秒あたりの枚数が、あまり多くても処理時間がかかるのでとりあえず30フレームで。
(tensorflow)$ mkdir frames
(tensorflow)$ mkdir -p out/frames
(tensorflow)$ cd ./frames
(tensorflow)$ ffmpeg -i f1.mp4 -r 30 -f image2 %06d.jpg

Automatic Colorizationは画像サイズが224となっているので、リサイズしておきます。
(tensorflow)$ mogrify -resize 224x224 *.jpg
(tensorflow)$ mogrify -gravity center -background black -extent 224x224 *.jpg
(tensorflow)$ mogrify -colorspace sRGB -type TrueColor *.jpg
(tensorflow)$ cd ..

forward.pyをフォルダの中の画像に対して行うようにしたスクリプト(forward_movie.py)を実行します。
import tensorflow as tf
import skimage.transform
from skimage.io import imsave, imread
import os
from os import listdir, path
from os.path import isfile, join

def get_directory(folder):
    foundfile = []

    for path, subdirs, files in os.walk(folder):
        for name in files:
            found = os.path.join(path, name)
            if name.endswith('.jpg'):
                foundfile.append(found)
        break

    foundfile.sort()
    return foundfile

def load_image(path):
    img = imread(path)
    # crop image from center
    short_edge = min(img.shape[:2])
    yy = int((img.shape[0] - short_edge) / 2)
    xx = int((img.shape[1] - short_edge) / 2)
    crop_img = img[yy : yy + short_edge, xx : xx + short_edge]
    # resize to 224, 224
    img = skimage.transform.resize(crop_img, (224, 224))
    # desaturate image
    return (img[:,:,0] + img[:,:,1] + img[:,:,2]) / 3.0

with open("colorize.tfmodel", mode='rb') as f:
    fileContent = f.read()

    graph_def = tf.GraphDef()
    graph_def.ParseFromString(fileContent)
    grayscale = tf.placeholder("float", [1, 224, 224, 1])
    tf.import_graph_def(graph_def, input_map={ "grayscale": grayscale }, name='')

images = get_directory("frames")

for image in images:
    print image
    shark_gray = load_image(image).reshape(1, 224, 224, 1)

    with tf.Session() as sess:
        inferred_rgb = sess.graph.get_tensor_by_name("inferred_rgb:0")
        inferred_batch = sess.run(inferred_rgb, feed_dict={ grayscale: shark_gray })
        filename = "out/"+image
        imsave(filename, inferred_batch[0])
        print "saved " + filename
(tensorflow)$ python forward_movie.py

最後に、できあがった画像を結合して動画を作成します。
(tensorflow)$ cd out/frames
(tensorflow)$ cat *.jpg | ffmpeg -f image2pipe -r 30 -vcodec mjpeg -i - -vcodec libx264 out.mp4

昨年末に撮影したエンジニアインタビュー動画がようやく完成しました。

クライアントワークだったりすると出せない情報も多いので、どういう仕事か伝えるために採用動画を作ろうということで制作開始。撮影は社員が進めてくれて、編集は「僕がやるから任せとけ」と言ったものの途中、仕事が忙しすぎてしばらく間があいて、やっと先週から。

撮りおわった動画を全部確認して使えそうなところをピックアップ。長い動画だとPremiereで切り出して、最終的にAfter Effectsで編集、色合い、デザイン、Lower Thirdを入れて書き出すということの繰り返し。

社員インタビューもみんな自由に話してるから、これはさすがに使えないだろあの野郎、とか思いつつ、最後は編集で上手くまとまった感じです。

レンダリングは、一番スペック良さそうだったのがごみ箱みたいなデザインで有名なMac Proだったので、それを使っても6時間。夜まで編集して、レンダリングスタートしておいて翌朝に確認するという状態なので、ちょっとミスった時の絶望感が半端ない。

なるべく手軽に見れる動画と思いながら、最終的に8分の動画。長いけど、ぜひ(インタビューなので音ありで)ご覧ください!





P1000018_2
P1000056_2

2015年は良い一年だった。

クライアントのiOS, Androidアプリ、ウェアラブルデバイスのアプリを次々と開発してリリースする一方で、毎月入社するくらいの勢いで採用した社員にSwift, Ruby on Railsなんかの研修を徹底的に教え込む「創る」と「育てる」がテーマだったと思う。

ミーティング、クライアント訪問、営業ディレクション、開発ディレクション、研修のチェックと、ほとんど1日中喋ってばかりの日々。いつもオフィスで流してるJ-waveも今年はほとんど聞いてなかった。時々、じっと黙ってデスクに座って、プログラミングしたり研修課題をつくったりという日があると微妙に嬉しい、というくらい、まさかの体力勝負な1年だった。

まあ、なによりQ3半ばで早くも今年度の予算達成が見えてきているのが素晴らしいところ。酒が美味い。積めるだけ積んで来期はいろいろサービスをリリースしていきたい。

カラーズも、キッズラインをリリースして大きな反響を頂き、社内では強力なエンジニアが育っていいチームが出来た。毎日のように状況が変わり、またプレッシャーも多いベンチャー環境で、フットワーク軽く開発を進められるエンジニアというのは世の中でもあまり多くない。そういうエンジニアが集まり、チーム文化が出来たのは何より良かった。


 
企業は人だというけど、まさにそれ。人が全て。

ただ実は、人がいれば誰でもいいわけではない。当然ながら優秀な人間が何人いるかでその組織の未来が変わる。優秀な人というのは、飛び抜けた天才的な能力を持っているというわけではなく、ある程度のビジネス能力と人格を備えているというだけだ。

個人の成長は大切。ただ、個人で戦える分野というのは思っているほど多くない。何かちょっとした仕事をしようと思えば、相手がいて周囲の仲間がいて、人の中で仕事は進んでいく。

イーロン・マスクも「才能より人格を重視する」と言うように、
知的能力ばかりを重視してしまって、その人物が周りにどのような影響を与えるか考えなかったわけです。企業への貢献において鍵となるのは、人柄であり、周囲の人たちに与えられる影響です。 ( http://logmi.jp/69117)
どれだけ実務能力が高くても、周囲に与える影響を計算できない人が多いとレベルの低い組織になる。

あと1つ付け加えるとすれば、結果に責任を持つ人かどうかがポイント。言われた仕事を真面目にするが結果に責任を持つ意識が薄いという人は、組織にいない方がいいタイプで、自覚があってもなくてもその無責任さからチームを簡単に崩壊させる。

という3点に気をつけて、何人もエンジニアを面接して採用してという2015年だった。



これからの社会はエンジニアがより必要になる、エンジニアがもっと活躍する社会になると言い続けていて、2016年はもっと大きな声で言おうと思う。それは、いま起こっている数々の社会的な問題に対して、エンジニアならもっと上手く解決できるんじゃないか、という意味がある。

機械学習、AIというのはバズワードになってしまって玉石混淆だけど、本質的には人間が気づかない洞察を得られるとか、より便利になるための道具だ。ECというベーシックな仕組みでさえも、スマホやレコメンドという道具で発展の余地はいくらでもある。ElasticsearchでMahout Tasteを噛ませてみるとか、いまだったらMicrosoft Azure MLにデータ投げてモデルを構築するとか、優れたオープンソースやサービスも数多くある。

日本が競争力や生産性を上げていくには、エンジニアが新しい価値や競争力を生み出せるかにかかっている。マーケットに素早く投入してフィードバックを得てプロダクトのサイクルを回していくべきで、企画や書類を練り回してても答えは出ない。それくらいのスピードが求められる時代なので、創れるエンジニア(エンジニアって創れる人ばかりではないので)をもっともっと増やしていきたい。

2016年は、プログラミング教育や、もっと人を笑顔にするサービスや機能のリリースをどんどんしていきたいと思います。

 
 
 
IMG_1812_2
IMG_0354_2
IMG_1765_2
IMG_0899_2
IMG_1803_2
IMG_2079_2
IMG_1739_2
IMG_1268_2
IMG_0895_2
 

↑このページのトップヘ