[MangaRestoration] 漫画のスクリーントーン特化型超解像AIを動かす

2022年8月16日火曜日

Artificial Intelligence

本記事では、漫画の超解像に特化した機械学習手法MangaRestorationを用いて超解像を行う方法をご紹介します。

アイキャッチ

MangaRestoration

概要

MangaRestorationは、劣化した低解像度のモノクロ漫画を復元する超解像技術です。

MangaRestorationは劣化したモノクロ漫画を復元するために以下の2段階の処理で構成されています。

1段階目では、Scale Estimation Network(SE-Net)を介して劣化した漫画画像から目標解像度を予測し、2段階目では、Manga Restoration Network(MR-Net)を使用して、領域ごとのモノクロスクリーントーンを区別して修復しています。

overview

結果、本手法は他の超解像手法と比較してスクリーントーンの復元に優れた結果を示しています。

compare

詳細はこちらの論文をご参照ください。

本記事では上記手法を用いて、モノクロ漫画を超解像していきます。

デモ(Colaboratory)

それでは、実際に動かしながらモノクロ漫画の超解像を行います。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

初めにGithubからソースコードを取得します。

%cd /content
!git clone https://github.com/msxie92/MangaRestoration.git

次にライブラリをインストールします。

%cd /content/MangaRestoration

!pip install --upgrade gdown

最後にライブラリをインポートします。

import os
import matplotlib.pyplot as plt
import cv2

以上で環境セットアップは完了です。

学習済みモデルのセットアップ

次に公開されている学習済みモデルをダウンロードします。

%cd /content/MangaRestoration
!mkdir -p release_model

if not os.path.exists('release_model/resattencv_manga_cons256.zip'):
  !gdown 'https://drive.google.com/uc?id=1sazt7jlvfR6KEjOp9Tq2GpjMe04uRgtn' \
    -O release_model/resattencv_manga_cons256.zip

!unzip release_model/resattencv_manga_cons256.zip -d release_model

テスト画像のセットアップ

次にモデルに入力する低解像度画像をダウンロードします。

%cd /content/MangaRestoration

!mkdir -p datazip/manga1/test flist/manga1

!wget -c https://github.com/msxie92/MangaRestoration/raw/main/examples/Akuhamu_020.jpg \
      -O datazip/manga1/test/test_01.jpg
!wget -c https://i.pinimg.com/736x/03/95/6b/03956bff323d9200a7e4d3b3020c5b58.jpg \
      -O datazip/manga1/test/test_02.jpg

2枚目の画像が大きいため縮小しておきます。

def imread(img_path):
  img = cv2.imread(img_path)
  img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  return img

img = imread('datazip/manga1/test/test_02.jpg')
dst = cv2.resize(img, dsize=None, fx=0.5, fy=0.5)
cv2.imwrite('datazip/manga1/test/test_02.jpg', dst)

最後に、入力画像のリストを生成しておきます。

!python scripts/flist.py \
  --path datazip/manga1/test \
  --output flist/manga1/test.flist

Manga Restoration

それでは、入力画像を超解像していきます。

!python testreal.py -c configs/manga.json -n resattencv -s 256

出力結果は以下の通りです。

in1 = 'datazip/manga1/test/test_01.jpg'
out1 = 'release_model/resattencv_manga_cons256/results_real_00400/test_01_pred.png'
in2 = 'datazip/manga1/test/test_02.jpg'
out2 = 'release_model/resattencv_manga_cons256/results_real_00400/test_02_pred.png'

fig = plt.figure(figsize=(20, 20))

ax1 = fig.add_subplot(2, 2, 1) 
plt.title('test01 before', fontsize=16)
ax1.axis('off')

ax2 = fig.add_subplot(2, 2, 2)
plt.title('test01 after', fontsize=16)
ax2.axis('off')

ax3 = fig.add_subplot(2, 2, 3)
plt.title('test02 before', fontsize=16)
ax3.axis('off')

ax4 = fig.add_subplot(2, 2, 4)
plt.title('test02 after', fontsize=16)
ax4.axis('off')

ax1.imshow(imread(in1))
ax2.imshow(imread(out1))
ax3.imshow(imread(in2))
ax4.imshow(imread(out2))
結果1

SRCNN

別の超解像手法SRCNNと超解像結果を比較してみます。

%cd /content

!git clone https://github.com/Mirwaisse/SRCNN.git
!curl https://raw.githubusercontent.com/chigozienri/SRCNN/master/models/model_4x.pth -o model_4x.pth

%cd /content/SRCNN
!cp /content/MangaRestoration/datazip/manga1/test/test_01.jpg test_01.jpg

!python run.py \
  --zoom_factor 4 \
  --model /content/model_4x.pth \
  --image test_01.jpg \
  --cuda
  
in1 = '/content/MangaRestoration/datazip/manga1/test/test_01.jpg'
out1 = '/content/MangaRestoration/release_model/resattencv_manga_cons256/results_real_00400/test_01_pred.png'
out2 = '/content/SRCNN/zoomed_test_01.jpg'

fig = plt.figure(figsize=(30, 10))

ax1 = fig.add_subplot(1, 3, 1) 
plt.title('test01', fontsize=16)
ax1.axis('off')

ax2 = fig.add_subplot(1, 3, 2)
plt.title('MangaRestoration', fontsize=16)
ax2.axis('off')

ax3 = fig.add_subplot(1, 3, 3)
plt.title('SRCNN', fontsize=16)
ax3.axis('off')

ax1.imshow(imread(in1))
ax2.imshow(imread(out1))
ax3.imshow(imread(out2))
結果2

MangaRestorationの方が、頭の部分のトーンがやや鮮明に超解像されている印象です。

まとめ

本記事では、MangaRestorationを用いて超解像を行う方法をご紹介しました。
論文に漫画がたくさん載っている様子が不思議な感覚です。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - Exploiting Aliasing for Manga Restoration

2. GitHub - msxie92/MangaRestoration

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology