« RenderScript + Java で waifu2x を実装した | メイン | カラー絵文字 »

2015年06月18日

Android:: Android で waifu2x 分割処理などに対応

    

2次元超解像拡大(waifu2x)

メモリ制限から 512x512 辺りが拡大の限度となっていたが、メモリに入りきりそうにない場合は分割すると良いと言うアドバイスを受け、分割して境界をオーバーラップさせる形で処理するようにした。
これにより読み込んだ画像と拡大(orノイズ除去)後の画像サイズ4枚分、分割処理用のメモリ4MB以上があれば処理できるように。
これでかなり大きな画像まで処理できるようになったはず。
ただ、処理時間が大変なことになるけど。
分割サイズは、512、256、128、64 の内メモリに乗る最大サイズで行う形。

アプリ切り替えなどで処理が終了してしまっていたのを、プログレスダイアログのキャンセルボタンが押されるまで継続するようにした。
処理中は端末の発熱に注意する必要がある。

アルファチャンネルも引き継ぐようにした。
ただ、拡大の場合は境界部分はあまり綺麗ではない。
処理前に境界色を透明部分へ数ピクセル引き延ばす処理をすればそこそこ綺麗になると思うが、アルファはとりあえず入れておいた感じ。

プログレスダイアログの進捗更新を1%以上変化がある場合のみ呼び出すように修正した。
プログレスダイアログの更新処理には意外と CPU パワー持って行かれていて処理速度が半分以下になったりするようなので、更新頻度を少なくするのはある程度効果ある。
後、広告表示にも CPU パワーを持って行かれている感じだったので、バナー広告からインタースティシャル広告をたまに出す形に変更した。


他に互換性の問題などを修正した。
4.0 で ProgressDialog の show 後に setMax を呼ぶと落ちていたので修正。
例外吐いて落ちるのでわかりやすい互換性問題。

4.0 や 4.1 の場合 ScriptIntrinsicConvolve3x3 で Element の型が float(F32) だと RSIllegalArgumentException 例外で落ちる。
互換性の観点から support library の使用が推奨されているけど、support library 使っていても落ちる。
support library ではなく、組み込みの機能が使用されるのだろうか?
android.support.v8.renderscript.ScriptIntrinsic 系のクラスは同じような互換性の問題があるかもしれない。
同じ処理を RenderScript で書き直したものを使うと互換性の問題は回避できる。
事前に自前実装のものと速度比較して、ScriptIntrinsicConvolve3x3 の方が少し速かったので使っていたが、RSIllegalArgumentException 例外が出る環境では、自前実装のものを使用する形にした。


投稿者 Takenori : 2015年06月18日 01:37




comments powered by Disqus
Total : Today : Yesterday : なかのひと