post Image
iOSで超解像 – その2:waifu2x-metalをiOSに移植する

その1」では、超解像とは、waifu2xとはなんぞや、という話から、そのMetal実装であるwaifu2x-metalでその威力について試してみました。

簡単におさらいすると、超解像とは、画像の解像度を高める技術のことで、100×100ピクセルの画像から200×200ピクセルの画像を生成する、というようなものです。

そしてwaifu2xは深層畳み込みニューラルネットワークを用いた超解像システムで、従来の補間処理によるリサイズとはまったく別次元の効果を発揮します。前回記事ではそのMetal実装であるwaifu2x-metalを手元の画像で試し、実際に効果があることを確認しました。

(左)従来法による拡大、(右)waifu2xによる拡大

(写真はitSnap様より特別に許可をいただき使用させていただきました1

waifu2x-metalはmacOSで動くように実装されていますが、MetalなのでiOSでも動作するはずです。

これをiOSでオンデバイスで利用できれば、アプリのUX改善にとってその効果は絶大です。たとえば、サーバーからは非Retinaサイズで取得しておいて、デバイス側でRetinaサイズに拡大して表示、ということが考えられます。画像のクオリティは維持しつつ通信量が4分の1になれば、通信速度というUXにおける大きなボトルネックが改善し、ネットのインフラが十分でない環境でもサクサク画像が表示されるようになる、というような効果が期待されます。

というわけで本記事「その2」では、waifu2x-metalをiOSに移植してみます。

修正点

  • ベースとなるアプリを作成
    • MTKViewでMTKTextureを表示する
    • 記事末尾の「iOS 11 Programming」にこのへんの基礎的な話を書いてます。
  • waifu2x-metalから必要なクラス・リソースファイルを持ってきてプロジェクトに追加する
    • main.swift(waifu2xの実装)
    • functions.metal(コンピュートシェーダ)
    • scaale2.0x_model.json(CNNのパラメータが入ってる)
  • main.swiftをiOSで使えるよう修正
    • 本質的な処理は修正不要だが、修正点自体はわりと多い

実行結果

まず、おなじみのmacOS High Sierraの画像を500×500に縮小し、実行してみました。

highsierra.jpg

以下その際のログ:

32
32
64
64
Message from debugger: Terminated due to memory issue

最後のログに”Terminated due to memory issue”とある通り、GPU側のメモリ不足でクラッシュしました(iPhone X利用)。前回記事で試した通り、macOSで実行した際には540×810の画像でいけたのですが、iOSデバイスではこのサイズは(少なくとも現実装では)厳しいようです。

ちなみに以前に別記事に書いた方法でGPU側のメモリ使用量を見てみたところ、こんな感じでした。

32
allocated size: 159907840
32
allocated size: 436830208
64
allocated size: 856391680
64
allocated size: 1410334720
Message from debugger: Terminated due to memory issue

途中のCNNレイヤでメモリ使用量が約1.4Gに達し、果てています。このあともう3レイヤあるので、全然ダメなようです。

メモリ使用量を減らすといった処理の最適化は今回は置いておいて、もっと小さい画像で試してみます。

comic_half.png

サイズは220×220です。以下のように、無事最後までiOSデバイス上で処理できました。

32
allocated size: 48332800
32
allocated size: 108101632
64
allocated size: 202080256
64
allocated size: 321912832
128
allocated size: 510001152
128
allocated size: 749895680
3
allocated size: 855851008

結果的にはmacOSと試したときと同じですが、iOSデバイス上で動いたよということで、処理前後のスクショを載せておきます。

ios copy.png

気になるパフォーマンス

「その3」で、気になるパフォーマンスについて書きます。

しかし、もったいぶっても仕方ないので現状について書きますと、リアルタイム処理には程遠いです。リアルタイム処理ができないのであれば、前記事や冒頭で書いたようなUX改善のメリットは得られません2

しかし、処理速度の問題、メモリ使用量の問題、どちらも改善の展望がいくつかあります。waifu2x-metalを実装された方の元記事で書かれているような点もありますし、もっと別の点でも改善が見込まれると考えています。

そのための要素技術もあるので、いったん他のMetalの記事を書いた後に、「その3」を書く予定です。

Metalアドベントカレンダーのいち記事として書くので、興味のある方はぜひ購読してみてください。

Metalの参考書籍

技術書「iOS 11 Programming」の、「第13章 Metal」を執筆しました。

書籍のタイトルにはiOS 11とありますが、Metalについては新機能の紹介だけではなくて、基礎からじっくり解説しています。Metalの章だけで37ページもあり、日本語ではこれだけのまとまったMetalの解説はレアかと思います。

  • 13.1 はじめに
  • 13.2 Metalの概要
  • 13.3 Metalの基礎
  • 13.4 MetalKit
  • 13.5 Metal入門その1 – 画像を描画する
  • 13.6 Metal入門その2 – シェーダを利用する
  • 13.7 Metal入門その3 – シェーダでテクスチャを描画する
  • 13.8 ARKit+Metalその1 – マテリアルをMetalで描画する
  • 13.9 ARKit+Metalその2 – MetalによるARKitのカスタムレンダリング
  • 13.10 Metal 2
  • 13.11 Metalを動作させるためのハードウェア要件

他の章も他著やネットではなかなか得られない濃い情報が詰まっているので、気になった方はぜひサンプルPDFもあるので見てみてください。

  • 第1章 iOS 11 概要
  • 第2章 ARKit
  • 第3章 Core ML
  • 第4章 Swift 4の新機能とアップデート
  • 第5章 Xcode 9 の新機能
  • 第6章 Drag and Drop
  • 第7章 FilesとDocument Based Application
  • 第8章 レイアウト関連の新機能及び変更点
  • 第9章 Core NFC
  • 第10章 PDF Kit
  • 第11章 SiriKit
  • 第12章 HomeKit入門とiOS 11のアップデート
  • 第13章 Metal
  • 第14章 Audio関連アップデート

PEAKSのサイトにて電子書籍・紙の書籍ともに販売されています。

iOS 11 Programming

iOS 11 Programming

  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川克己,所 友太,永野 哲久,加藤 寛人,
  • 発行日:2017年11月16日
  • 対応フォーマット:製本版,PDF
  • PEAKSで購入する

執筆を担当したARKit、Metalの章の詳細、あるいは全体的なおすすめポイントは以下の記事にも書きました。


  1. dealforestさんありがとうございます! 

  2. とはいえ「画像をiOSアプリ上できれいに拡大できる」という機能は、リアルタイム性がなくても現状でも活用ケースは十分にあると思っています。 


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。