今回は、モノクロ画像をカラー画像に変換してくれる Self-Attention GAN「DeOldify」のコードを使って遊んでみたいと思います。
こんにちは cedro です。
100年以上前の写真を見ると、それは確実にモノクロで、場合によってはセピア調に変色していたりします。
写真を見る時は、自分の頭の中で彩色して、遠い過去の一場面を想像するしかない訳で、そこに強いリアリティはありません。
もし、100年以上前のモノクロ写真が鮮やかなカラー写真に変換出来たらどうでしょう。
時の流れを一気に飛び越え、強いリアリティを持ってその場面が目の前に現れる訳で、これはかなり魅力的な事だと思います。
ということで、今回は、モノクロ画像をカラー画像に変換してくれる Self-Attention GAN「DeOldify」のコードを使って遊んでみたいと思います。
明治時代の美人の写真をカラーに変換する
「DeOldify」は、Jason Antic氏が GitHub に公開していますが、これをクローンあるいはダウンロードするより、Google colab でそのまま動かせる Jupiter Notebook の方が便利ですので、「DeOldify on Colab」を起動して下さい。
DeOldify on Colab の起動画面です。頭から順番に動かして、モノクロ画像がカラーになることをいくつか確認したら、以下のステップに移ります。
DeOldify on Colab は google drive をマウントして使っていますので、画像の入出力はgoogle drive を使います。
google drive にログインし、My Drive / deOldifyImages の下に、input フォルダー を追加します(results フォルダーは既に出来ています)。input フォルダーにはカラーに変換したいモノクロ画像をドラッグ&ドロップで格納します。
今回、input フォルダーに格納するのは、明治時代の美人の写真です。たぶん、色付きの女になることで魅力が確実に上がるのではないかと期待しています。なお、Colabのインライン画像表示の制約から、20枚以下にして下さい。
1 2 3 4 5 6 |
import glob files = sorted(glob.glob('../drive/My Drive/deOldifyImages/input/*.jpg')) for i, file in enumerate (files): image = cv2.imread(file, cv2.IMREAD_COLOR) vis.plot_transformed_image(file, render_factor=41) print(i+1) |
input フォルダーのモノクロ画像(jpg)をカラー画像(png)に変換しresultsフォルダーに格納すると共に、変換前後の画像をGoogle Colabのインラインに表示するコードです。
カラー化した時の配色や濃さを調整する必要がある場合は、6行目のrender_factor の数値を調整します。
早速、Google Colab の+コードボタンを押し、このコードをコピペして実行してみましょう。
これは絵葉書に印刷されている女性で名前は不明ですが、長身のすらっとしたイイ女です。鮮やかな青いストライプの着物が似合っていますね。render_factor = 20 です。
良いところのお嬢さんというより、活発でお転婆な性格が伝わって来ます。それもそのはず、彼女は全日本テニス選手権女子ダブルスを優勝しているんです。render_factor = 20 です。
お人形の様に可愛い方ですね。深窓のお嬢様という感じでしょうか。ちなみにこの方は、ミスコンの石川県代表だそうです。render_factor = 20 です。
この方も、ミスコンの愛知県代表。正統派美人という感じでしょうか。なんとなく、石原さとみさんに似てるいる気がします。render_factor = 41 です。
明治時代なので、多少ズングリムックリな感じかなと思いましたが、そんなことは無く、スラっとした現代でもそのまま通用する美人ばかりですね。
100年前の東京の風景動画をカラー化してみる
静止画で白黒からカラーへの変換が出来るなら、当然動画でも出来るわけです。Youtube から100年以上前のモノクロ動画をダウンロードして来て、カラー動画(GIF)に変換してみましょう。
まず、input フォルダーと results フォルダーの中身をクリアし、deOldifyImages フォルダーにカラーに変換したいモノクロ動画(mp4)を格納します。
今回使ったモノクロ動画は Youtube にある Views of Tokyo, 1913-1915 という100年前の東京の風景を撮影したものです。
格納した tokyo1.mp4 は、Youtube からダウンロード(640×360ピクセル)して、冒頭の15秒くらいを編集で取り出したものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import cv2 def video_2_frames(video_file='../drive/My Drive/deOldifyImages/tokyo1.mp4', image_dir='../drive/My Drive/deOldifyImages/input/', image_file='img_%s.png'): # Initial setting i = 0 interval = 6 length = 60 cap = cv2.VideoCapture(video_file) while(cap.isOpened()): flag, frame = cap.read() if flag == False: break if i == length*interval: break if i % interval == 0: cv2.imwrite(image_dir+image_file % str(i).zfill(6), frame) print('Save', image_dir+image_file % str(i).zfill(6)) i += 1 cap.release() def main(): video_2_frames() if __name__ == '__main__': main() |
deOldifyImages の中にある、動画 tokyo1.mp4 から静止画を切り出して、input フォルダーに格納するコードです。
interval = 6 は6フレーム毎(0.2秒毎)に1枚静止画を切り出し、length = 60は切り出す静止画の合計が60枚という設定です。
Google Colab の+コードボタンを押し、このコードをコピペして実行します。コードを実行すると、input フォルダーに動画から切り出したモノクロ画像が格納されます。
1 2 3 4 5 6 7 |
import glob files = sorted(glob.glob('../drive/My Drive/deOldifyImages/input/*.png')) # jpg → png for i, file in enumerate (files): image = cv2.imread(file, cv2.IMREAD_COLOR) vis.plot_transformed_image(file, render_factor=41) plt.close() # 追加 print(i+1) |
input フォルダーのモノクロ画像をカラーに変換しresults フォルダーに格納するコードです。先程とほとんど同じですが、モノクロ画像が png になっているのと、いちいち変換前後の画像をインライン表示させないように、7行目に plt.close() を追加しています。
Google Colab の+コードボタンを押し、このコードをコピペして実行します。コードを実行すると、results フォルダーにカラー画像(png)が格納されます。
1 2 3 4 5 6 7 8 |
from PIL import Image import glob files = sorted(glob.glob('../drive/My Drive/deOldifyImages/results/*.png')) images = list(map(lambda file: Image.open(file), files)) images[0].save('../drive/My Drive/deOldifyImages/tokyo1_ssd.gif', save_all=True, append_images=images[1:], duration=200, loop=0) |
results フォルダーのカラー画像(png)をGIF動画に変換するコードです。duration =200 は画像切り替えが0.2秒、loop=0 は繰り返し再生する設定です。
Google Colab の+コードボタンを押し、このコードをコピペして実行します。
コードを実行すると google drive のMy Drive/deOldifyImages にGIF動画が出来ていますので、右クリックでダウンロードすればOKです。
甦ったカラー動画です。多少、彩色が安定していない部分もありますが、概ね良好です。100年の時を超えて、当時の様子が強いリアリティを持って伝わって来ますね。
いやー、色が付くということが、こんなにもリアリティを生むものだとは思いませんでした。「DeOldify」おすすめです。
では、また。