セーブポイント

特にジャンルの決まってない雑記です。

画像のモザイクを除去したりしてみる

DeepCreamPyという深層学習を利用したツールが面白いので紹介します。少し古いツールゆえ動かすための環境を整えるのに少し手こずったので、そのメモです。

ツールの名前からも分かる通り、まあ子どもには見せられないタイプのやつの話なので、そういったものが苦手ではない人だけどうぞ。

きっかけ

最近はDALL·E 2などから始まり、MidjourneyStableDiffusionといったText to Imageの画像生成モデルがインターネット上でブームになっています。もちろんまだ完璧でないとはいえ、既にかなりのクオリティでイラストなどが生成できるようになっており、その進化から目が離せません。加えてStableDiffusionなどはオープンソースでありコードを手元環境で動かすことが可能となっています。オンライン上で動かすサービスはその性質上、コンテンツのフィルタなどが入る可能性がありますが、ローカルで画像を生成する分には安全です。

話は少し変わって機械学習繋がりで気になったのが、GANとかでモザイク除去とかできないのかな、ということについてです。ありそうだよなあと思いつつ探してみると、オープンソースで公開されているものがいくつかありました。

DeepMosaicsは普通の写真とか向けっぽくて、DemosaicとDeepCreamPyが2次元のイラスト向けのやつです。全部動かしてみたんですが、DeepCreamPyが良さげな感じだったので今回はこれを共有します。

環境構築する

> pip install -r requirements-(cpu|gpu).txtだけで動いてくれたらいいんですが、まあ3年くらい前のものなのでそんなに上手くは行きません。とりあえず実行環境を構築していきます。

最近自分は普段の開発をWSLで動かしているUbuntu上でやることが多いのですが、DeepCreamPyがGUIを持つタイプのツールである都合上、少しめんどくさかったので普通にWindows 10上で作業しました。

Python

まずPython 3.6をインストールしましょう。マイナーバージョンはどれでも動くと思いますが、自分は公式で用意されているドキュメントに従ってPython 3.6.7で動作確認をしました。

www.python.org

別にパスは通さなくていいです。

仮想環境を作る

venvを使ってDeepCreamPy用に仮想環境を作ります。

> "x:\path\to\Python36\python.exe" -m venv env

仮想環境の名前はenvかvenvが一般的らしいです。以降のコマンドは全部仮想環境内で実行するものとします。

setuptoolsを更新しておく

あとでTensorFlowをインストールするときに怒られるので、setuptoolsをアップデートしておきます。
最新版にして動かなかったりすると面倒なので、適当なバージョンを選びました。

> pip install setuptools==49.6.0

pipは更新しなくて良かった気がします。

必要なパッケージを入れる

後は普通に必要なパッケージをインストールしましょう。

本当はGPU対応版のTensorFlowを動かせたらいいんですが、CUDAやcuDNNとのバージョンの兼ね合いなどで動かなそうなことが目に見えているので大人しくCPU版でセットアップします。自分はRTX 3070ユーザーなので、CUDAをダウングレードしたりしてもそれはそれで動かなくなりそうです。別にCPUで処理しても普通に速いです。

ただし、普通にrequirements-cpu.txtからパッケージをインストールしようとするとなぜかTensorFlowまわりの依存関係で怒られるので、tensorboardtensorflow-estimatorはテキストから削除しておきます(TensorFlowをインストールするとき一緒に正しいバージョンのものが勝手に入ります)。

> pip install -r requirements-cpu.txt

パッケージが正しくインストールされたら、> python main.pyで動かせるはずです。

DeepCreamPyについて

そもそもDeepCreamPyがどういうツールなのかという話ですが、モザイクやいわゆる海苔を取り除くことができるツールです。取り除くことができる、と断言してしまうと言葉が強いんですが、まあここは素材次第です。かなり自然に復元できるようなイラストもありますし、逆もまた然りという感じ(サンプルははてなの規約上載せられないので…)。今の質以上を求めるにはモデルを改善したりなんだりしないとだめですね。

先ほど名前を挙げたDemosaicやDeepMosaicsもモザイクの処理はできるんですが、海苔の処理もできるのがDeepCreamPyの面白いところです。海苔の処理もできる、というかこっちがメイン。基本はこの機能を活用していく感じです。

基本的な使い方

画像を投げたら勝手に処理をしてくれるわけではないので、画像の前処理が必要です。前処理しなきゃいけないのかと思うかもしれないんですけど、こっちの仕組みの方が逆に想定していた場所と異なる部分にもフィルタがかかってしまうことを防ぐことができます。例えばDemosaicやDeepMosaicsはモザイクの位置を自動判定する仕組みが備わっているのですが、副作用でモザイクじゃないところにも復元処理が入ってしまったりします。画像を分割したりすればいいのかもしれませんが、それこそめんどくさいですね…。

で、前処理で何をするのかという話なんですが、画像の中の復元したい部分を#00ff00(100%の緑色)で塗りつぶします。これだけです。

画像編集ソフトは別になんでもいいですが、例えばGIMPだったらファジー選択ツールで海苔を範囲選択して、2pxくらい選択範囲を拡大して塗りつぶしてやると簡単です。

編集した画像はDeepCreamPyのdecensor_inputディレクトリの中にpng形式で保存しておきます。

画像の準備ができたら> python main.pyGUIが起動します。

DeepCreamPyのGUI

塗りつぶした領域を復元するときは、Censor TypeをBar censorにしておきます。Bar censorという名称になっていますが、長方形の形状の塗りつぶしでなくとも対応しています。
右側のNumber of Decensor Variationsを1以外に設定すると、何パターンか復元を提案してくれます。基本2にしておくといい感じがします。

しばらくしたらモデルのロードが終わるので、そしたら真ん中のボタンを押すだけです。decensor_output内に復元された画像が出力されます。

これで機械学習の力で画像の復元ができました。やったね。

前処理やっぱりめんどいよね

DeepCreamPy、十分すごいんですけどやっぱり準備がちょっと手間ですよね。で、一応解決策があります。

GitHub - natethegreate/hent-AI: Automation of censor bar detection

画像処理パワーで自動で塗りつぶされた部分を検出して緑色に塗ってくれるやつです。ここがニコニコ動画だったらそろそろ「変態に技術を与えた結果がこれだよ!」のタグが付いてる。

こっちのツールはプリビルド済みのバイナリが公開されているので、それを使えば煩わしい環境構築の手間を省くことができます。

基本はこのツールを使うと非常に簡単なのですが、やはりたまに漏れがあったり誤検出があったりするので、そういうときは素直に自力で前処理しましょう。お前がOpenCVになるんだよ!

TensorFlow 2に移植したい

今回の主力ツールであるDeepCreamPyなんですが、やっぱりGPUを活用したいしPython 3.10でも動いて欲しいので、現在移植作業中です。

DeepCreamPyにはTensorFlow 1が使われているわけですが、有難いことにTensorFlow 1のコードって簡単にTensorFlow 2環境で動かせるようになっているんですよね。

www.tensorflow.org

ただし、tf.contribモジュールだけ例外でTensorFlow 2に対応するものが存在しません。
厄介なことにDeepCreamPyの内部でこのモジュールの畳み込み層を使用している箇所があり、困っています…。

TensorFlowの機能を直に使うの、よくないですよ。Kerasで書き直したりしたいですねえ…。