So-net無料ブログ作成
超解像プログラム ブログトップ

超解像ネットワークを微分の差の絶対値で学習してみました。 [超解像プログラム]

色々と実験をして遊んでいるSuper-Resolution Neural Netowrk (超解像ニューラル ネットワーク)ですが、今回はGANではなく、Autoencoder出力も使わず、単純にGenerator出力と正解の高解像度画像に "Sobel フィルター" を適用して微分した出力の差の絶対値と、Generatorの出力画像と正解の高解像度画像の差の絶対値(MAE)を損失関数にして学習させてみました。

今回のものは処理が単純なので非常に軽快に学習が進みます。

因みに、Sobel フィルターを適用すると画像が微分されて輪郭抽出が出来ます。
処理はとても軽量で、AWS (Amazon Web Services)のEC2 (Amazon Elastic Compute Cloud)の " p3.2xlarge " GPU インスタンスである "p3.2xlarge" (NVIDIA Tesla V100-SXM2-16GB)で6,632枚の画像につき、1 epoch当たり1,130秒ほどで処理出来ました。

尚、前回同様に学習時に入力の低解像度画像にWebP圧縮を掛けてJPEGなどの圧縮ノイズ除去性能を付加しております。

超解像処理結果の画像です。
SRNet-D_Comparison_3_label_1 無補間の4倍拡大と改造SRNet-Dによる超解像との比較画像。 左右に同じ画像を拡大したものが配置されており、左半分が無補間で右半分がSRNet-Dである。 若い女子の顔が写っている。
左は無補間、右はSRNet-Dで4倍に拡大した画像です。
SRNet-Dでは圧縮ノイズが綺麗に除去されています。
但し、これはGANではない為、ランダムなパターンである毛髪などは復元されていない事が分かります。

SRNet-D_Comparison_2_label_1 無補間の4倍拡大と改造SRNet-Dによる超解像との比較画像。 左右に同じ画像を拡大したものが配置されており、左半分が無補間で右半分がSRNet-Dである。 ジーンズ パンツのポケットに親指を掛けた手が写っている。

SRNet-D_Comparison_1_label_1 無補間の4倍拡大と改造SRNet-Dによる超解像との比較画像。 左右に同じ画像を拡大したものが配置されており、左半分が無補間で右半分がSRNet-Dである。 ジーンズ パンツを履いた若いモデルの女子が微笑んでいる。

これらの画像はSRNet-Dには学習させていない未学習の画像です。
加えて、人間の全身像については全く学習していないモデルでの超解像の結果です。
元の画像はiStockより使用ライセンスを購入致しました。


尚、このスクリプトは、董豪(Hao Dong)様のsrganのコードを元に私が改造致したものです。


[GitHub リポジトリー]
この " SRNet-D " はTensorFlowTensorLayerによる実装となっています。
以下に私のSRNet-DのGitHub リポジトリーへのリンクを載せます。

" SRNet-D " の "GitHub" リポジトリーのURL:
https://github.com/ImpactCrater/SRNet-D


[学習済みモデル データ]
私がAWSのEC2のp3.2xlarge GPU インスタンスを用いて学習させた学習済みモデル データを公開致します。
" Yahoo!ボックス " サーヴィスからZIP ファイルをダウンロードして解凍し、 " ./SRNet-D/checkpoint/ " に g.npz " のファイルを入れます。
学習用の大量のPNG画像を " ./SRNet-D/HRImage_Training " に用意し、 " python ./SRNet-D/main.py " のようにして続きから再学習させる事が可能です。
もちろん拡大だけの実行も可能です。

もし動画を超解像する際は、ffmpegなどで0埋めの連番の静止画に変換し、 " ./SRNet-D/LRImage_Enlargement/ " に0埋めの連番画像を入れて、 " python main.py --mode=enlarge " とすると、 " ./SRNet-D/samples/enlarged/ "に超解像処理された連番画像が出力されます。
これを再びffmpegで動画に変換します。

学習済みモデル データのURL (Yahoo!ボックス):
https://yahoo.jp/box/ULWJdj



[SRNet-Dの特徴]
以前の記事とも重複しますが、改めて概要を記載致します。


[1: Residual of Residual Network]
勾配消失に強い、残差学習を行います。
Residual Blockで、shortcutに対して全てのConvolution層の出力との要素和を取っております。


[2: Generator loss]
Generatorが生成した画像と正解の高解像度画像との "生のRGB値" の差の絶対値(MAE / Mean Absolute Error)に加えて、生成画像と正解画像それぞれに "Sobel フィルター" を適用して微分値を取り、輪郭抽出した画像同士の値の差の絶対値を損失値として学習させました。


[3: Data Augmentation & Noise Reduction]
学習時のデータ拡張として、高解像度画像をランダムな位置ランダムな大きさにクロップします。
続いて所定の大きさまで縮小し、RGB画像をHSV形式に変換し、色相環をランダムに少しだけ回転させます。
その後、ランダムな強さで圧縮を施して学習させます。
敢えて圧縮して画質を落とした後、これを正解の高解像度画像に近付けるように学習させる事で、JPEG画像や動画像のように圧縮ノイズが含まれた画像を拡大する際、ノイズを綺麗に除去出来るようになります。
JPEGでは固定の大きさのブロック単位で圧縮しますが、これがノイズ除去の柔軟性を失わせてしまうと考え、ブロックが目立ち難いWebP画像形式で圧縮を施しました。
WebPは不可逆圧縮でJPEGより軽量、高品質であり、可逆圧縮でもPNGよりもファイル サイズを小さく出来る優れた圧縮画像形式です。
結果は上出来で、強目の圧縮ノイズも綺麗に除去出来ます。


[4: Swish活性化関数]
活性化関数には性質の優れたSwish関数を用いております。

Swish(x)=x*Sigmoid(a*x)
Sigmoid(x)=1/(1+e^(-a*x))


[5: Group Normalization]
ミニバッチ サイズが少ない場合に問題が起こり易いBatch Normalizationではなく、channleをグループ化して正規化するGroup Normalization層を用いています。


[6: 画像の読み込み]
学習させる画像群について、指定したディレクトリー以下にあるサブディレクトリーまで再帰的に検索して読み込みます。
画像はepoch毎にランダムにシャッフルされ、データ拡張されます。
全画像ファイル数がミニバッチの数で割り切れない場合には、不足分は既存の学習用画像の中からランダムに再度読み込まれます。
また、学習中にも画像を次々に追加出来ます。
指定したディレクトリー以下に、画像ファイルもしくは画像ファイルが入ったフォルダーを放り込むだけで、次のepoch開始時に読み込まれます。



[プログラムの実行について]
このプログラムで学習を実行するには10GB以上のメモリーが必要です。
CPUまたはNVIDIAのGPUによるCUDAで実行出来ます。
低性能なCPUで実行する場合、充分な学習には数か月以上の時間が掛かります。

私は、AWSのEC2の " p3.2xlarge " GPU インスタンスをスポット リクエストで利用させて頂いております。
1時間当たり百数十円で一般的なPCのCPUより数十倍から100倍以上高速に処理が可能です。



前回の記事: 圧縮ノイズ除去機能付き超解像AIを作成しました。
https://crater.blog.so-net.ne.jp/2019-04-28

前々回のブログ記事: 超解像AIを改良しました。
https://crater.blog.so-net.ne.jp/2019-03-15

nice!(2)  コメント(0) 

圧縮ノイズ除去機能付き超解像AIを作成しました。 [超解像プログラム]

今回は、JPEGWebPなどの画像圧縮ノイズを除去する能力を備えた超解像AIGANで作成致しました。
" SRGAN-R " です。

因みに前回は、AutoencoderのEncoder出力を損失関数に組み込んだ人工ニューラル ネットワークの超解像AI(GANではない)を実験致しました。

以前のブログ記事: 超解像AIを改良しました。
https://crater.blog.so-net.ne.jp/2019-03-15

今回も董豪(Hao Dong)様のsrganのコードを元に私が改造致しました。

以下は私がAWS (Amazon Web Services)のEC2 (Amazon Elastic Compute Cloud)の " p3.2xlarge " GPU インスタンスとローカル PCで学習させたSRGAN-Rによるノイズ除去4倍超解像と無補間の4倍拡大とを比較した画像です。
SRGAN-R_Comparison_1_label_1 無補間の4倍拡大と改造SRGAN-Rによる超解像との比較画像。 左右に同じ画像を拡大したものが配置されており、左半分が無補間で右半分がSRGAN-Rである。 ジーンズ パンツを履いた若いモデルの女子が微笑んでいる。
左は無補間、右はSRGAN-Rで4倍に拡大した画像です。
SRGAN-Rでは圧縮ノイズが綺麗に除去されています。

SRGAN-R_Comparison_2_label_1 無補間の4倍拡大と改造SRGAN-Rによる超解像との比較画像。 左右に同じ画像を拡大したものが配置されており、左半分が無補間で右半分がSRGAN-Rである。 ジーンズ パンツのポケットに親指を掛けた手が写っている。

SRGAN-R_Comparison_3_label_1 無補間の4倍拡大と改造SRGAN-Rによる超解像との比較画像。 左右に同じ画像を拡大したものが配置されており、左半分が無補間で右半分がSRGAN-Rである。 若い女子の顔が写っている。
やや滑らかになり過ぎている感じも致しますが、ノイズはほとんど除去出来ており、拡大も綺麗です。

これらの画像はSRGAN-Rには学習させていない未学習の画像です。
加えて、人間の全身像については全く学習していないモデルでの超解像の結果です。
元の画像はiStockより使用ライセンスを購入致しました。


[GitHub リポジトリー]
この " SRGAN-R " はTensorFlowTensorLayerによる実装となっています。
以下に私のSRGAN-RのGitHub リポジトリーへのリンクを載せます。

" SRGAN-R " の "GitHub" リポジトリーのURL:
https://github.com/ImpactCrater/SRGAN-R


[学習済みモデル データ]
私がAWSのEC2のp3.2xlarge GPU インスタンスを用いて36時間ほど学習させ、60 epoch目の段階の学習済みモデル データを公開致します。
" Yahoo!ボックス " サーヴィスからZIP ファイルをダウンロードして解凍し、 " ./SRGAN-R/checkpoint/ " に " d.npz, g.npz " の2つのファイルを入れます。
学習用の大量のPNG画像を " ./SRGAN-R/HRImage_Training " に用意し、 " python ./SRGAN-R/main.py " のようにして続きから再学習させる事が可能です。
もちろん拡大だけの実行も可能です。

学習済みモデル データのURL (Yahoo!ボックス):
https://yahoo.jp/box/Ij7Goc



[SRGAN-Rの特徴]
各要素の詳細は前回の記事を参照下さい。

[1: Residual of Residual Network]
勾配消失に強い、残差学習を行います。
Residual Blockで、shortcutに対して全てのConvolution層の出力との要素和を取っております。


[2: Generator vs Discriminator]
今回はRelativistic LSGANで学習させました。


[3: Noise Reduction]
JPEG画像や動画像のように圧縮ノイズが含まれた画像を拡大する際、ノイズを綺麗に除去する為、敢えて画像の縮小時にランダムな強さで圧縮を施して学習させました。
JPEGでは固定の大きさのブロック単位で圧縮しますが、これがノイズ除去の柔軟性を失わせてしまうと考え、ブロックが目立ち難いWebP画像形式で圧縮を施しました。
WebPは不可逆圧縮でJPEGより軽量、高品質であり、可逆圧縮でもPNGよりもファイル サイズを小さく出来る優れた圧縮画像形式です。
TensorFlow, TensorLayer, Python 3, PillowでWebPを使用する際は、 " sudo apt install libwebp-dev " としてWebPのライブラリーをインストールした上で、Pillowを再インストールする必要があります。
尚、結果は上出来で、強目の圧縮ノイズも綺麗に除去出来るようになりました。


[4: Swish活性化関数]
活性化関数には性質の優れたSwish関数を用いております。

Swish(x)=x*Sigmoid(a*x)
Sigmoid(x)=1/(1+e^(-a*x))


[5: Group Normalization]
ミニバッチ サイズが少ない場合に問題が起こり易いBatch Normalizationではなく、channleをグループ化して正規化するGroup Normalization層を用いています。


[6: 画像の読み込み]
学習させる画像群について、指定したディレクトリー以下にあるサブディレクトリーまで再帰的に検索して読み込みます。
画像はepoch毎にランダムにシャッフルされ、ランダムな位置でクロップされます。
全画像ファイル数がミニバッチの数で割り切れない場合には、不足分は既存の学習用画像の中からランダムに再度読み込まれます。
また、学習中にも画像を次々に追加出来ます。
指定したディレクトリー以下に、画像ファイルもしくは画像ファイルが入ったフォルダーを放り込むだけで、次のepoch開始時に読み込まれます。



[プログラムの実行について]
このプログラムで学習を実行するには12GB以上のメモリーが必要です。
CPUまたはNVIDIAのGPUによるCUDAで実行出来ます。
低性能なCPUで実行する場合、充分な学習には数か月以上の時間が掛かります。

私は、AWSのEC2の " p3.2xlarge " GPU インスタンスをスポット リクエストで利用させて頂きました。
p3.2xlargeは1つのNVIDIA Tesla V100 GPUが利用可能です。
このGPUは64bit精度(倍精度)で7TFLOPS、詰まり最大で毎秒7兆回もの浮動小数点数演算が可能な性能を誇ります。
私の自宅のデスクトップ PCのIntel Core-i7 3770Tよりも約110倍高速に処理出来ました。

AWS EC2 p3.2xlarge GPU インスタンスはオンデマンド価格が私が実行終了した時点で $3.06 /1 時間でスポット価格が $1.0049 /1 時間 (US東部Virginia北部, Linux)でした。
スポット インスタンスの最高価格は初期設定であるオンデマンド価格とし、36時間ほど回しましたが、ほぼ最初の価格のまま最後まで停止無く使えました。
非常にお得です。

nice!(1)  コメント(0) 

超解像AIを改良しました。 [超解像プログラム]

->->
[追記]
後日、SRGAN-Rにて、画像の拡大と共に圧縮ノイズを除去する除去機能を実現致しました。
そちらも御覧下さい。

ブログ記事: 圧縮ノイズ除去機能付き超解像AIを作成しました。
https://crater.blog.so-net.ne.jp/2019-04-28
<-<-

董豪(Hao Dong)様のsrganのコードを元に、私が書いた " SRNet-R " という超解像AIについて。
SRNet-R_Comparison_1_label_1 Bicubic補間法による拡大と改造SRNet-Rによる超解像との比較画像。 左右に同じ画像を拡大したものが配置されており、左半分がBicubicで右半分がSRNet-Rである。 ジーンズ パンツを履いた若いモデルの女子が微笑んでいる。
SRNet-R_Comparison_2_label_1 Bicubic補間法による拡大と改造SRNet-Rによる超解像との比較画像。 左右に同じ画像を拡大したものが配置されており、左半分がBicubicで右半分がSRNet-Rである。 ジーンズ パンツのポケットに親指を掛けた手が写っている。
SRNet-R_Comparison_3_label_1 Bicubic補間法による拡大と改造SRNet-Rによる超解像との比較画像。 左右に同じ画像を拡大したものが配置されており、左半分がBicubicで右半分がSRNet-Rである。 若い女子の顔の右半分が写っている。
私がAWS (Amazon Web Services)のEC2 (Amazon Elastic Compute Cloud)の " p2.xlarge " GPU インスタンスとローカル PCで学習させたSRNet-Rによる4倍超解像と従来のBicubic補間法による4倍拡大とを比較した画像です。
この画像はSRNet-Rには学習させていない未学習の画像です。
加えて、人間の全身像については全く学習していないモデルでの超解像の結果です。
元の画像はiStockより使用ライセンスを購入致しました。


[GitHub リポジトリー]
この " SRNet-R " はTensorFlowTensorLayerによる実装となっています。
以下に私のSRNet-RのGitHub リポジトリーへのリンクを載せます。

" SRNet-R " の "GitHub" リポジトリーのURL:
https://github.com/ImpactCrater/SRNet-R


[学習済みモデル データ]
私がAWSのEC2のp2.xlarge GPU インスタンスを用いて1日弱ほど学習させ、28 epoch目の段階の学習済みモデル データを公開致します。
" Yahoo!ボックス " サーヴィスからZIP ファイルをダウンロードして解凍し、 " ./SRNet-R/checkpoint/ " に " ae.npz, g.npz " の2つのファイルを入れます。
学習用の大量のPNG画像を " ./SRNet-R/HRImage_Training " に用意し、 " python ./SRNet-R/main.py " のようにして続きから再学習させる事が可能です。

学習済みモデル データのURL (Yahoo!ボックス):
https://yahoo.jp/box/x9Zq_r



[前書き]
画像を綺麗に拡大する、解像度を向上させる取り組みは昔から沢山研究されて来ました。
Bicubic補間法Lanczos補間法など、内挿により " Nyquist–Shannon sampling theorem " (ナイキスト-シャノンの標本化定理)の制限内で綺麗に補間する事から始まりました。
ナイキスト-シャノンの標本化定理では、サンプリング周波数の1/2の周波数をナイキスト周波数と言い、これ以上の情報は折り返しノイズになる為、正確には復元出来ません。
これを超えた高解像度化の手法を、 " 超解像 " (Super-Resolution)と言います。

例えば、フラクタルの性質を利用した超解像があります。
フラクタルとは自己相似性の事であり、スケールを変えて見た時に前と同様の構造が見つかる図形を言います。
自然画像にはフラクタルな部分が多く含まれている事を利用して拡大後の画像を推定します。

他に、サブピクセル レヴェルでのブロック マッチング最小二乗誤差法で同一画像内もしくは連続撮影された複数画像(マルチフレーム)内からある注目領域に相同な部分を見つけ出して画素の隙間に当て嵌めて行く事で超解像を行う仕組みも登場しました。

人間が予め多数の、一辺が数画素程度の小さな画像断片を沢山用意して置き、これを用いて画像を再構成する再構成型超解像もあります。

補間法で拡大した画像にConvolution フィルターを掛け合わせて行く事で画像の暈けを取り除く手法を一般的にDeconvolutionと言います。

また、畳み込みのフィルターの値を人間が指定するのではなく、人工ニューラル ネットワークによって機械学習(ML)させる手法が研究されて来ました。
Convolutional Neural Network (CNN)です。
画像認識分野などで層数が多く深いネットワークが研究され、Deep CNN (DCNN)となりました。
" 深層学習 " (Deep Learning)は広く成果を上げ、大いに流行しました。
超解像分野ではSRCNNとして研究され、残差ネットワーク(Residual Network)を取り入れてSRResNetとなり、敵対的生成ネットワーク(Generative Adversarial Network / GAN)を取り入れ " SRGAN " となり、ESRGANWasserstein SRGANと派生型が幾つも生み出されました。
かつて流行した " Waifu2x " はSRCNNの一種であるようです。

私も当時Waifu2xを学習させてみたりしてその性能に驚かされました。
後にSRGANを試し、更なる視覚品質の向上にまた驚きました。

その後、SRGANを改造して実験を繰り返しました。
例えば、GANの損失関数の指標をJensen-Shannon divergenceからWasserstein distanceに変えてみましたが、Lipschitz連続な関数であるという拘束条件あり、これを守る為にweight clippingweight decaygradient clippingを試しましたが勾配爆発勾配消失などを防ぐのが難しく、断念しました。
因みにgradient penaltyはとても有効であるとの事です。

また、Relativistic GANという、GeneratorとDiscriminatorの関係を相対的にしたものも試しました。
こちらは学習が安定していました。
Least Square GAN (LSGAN)を取り入れたRelativistic LSGANは安定的に学習が出来て良かったです。

元のSRGANでは学習は2段階で行われます。
第1段階ではGenerator(生成器)のみをMSE Lossを用いて学習させます。
MSEはMean Square Error(誤差二乗平均)です。
その後、第2段階でDiscriminator(識別器)と競わせるようにしていました。
第2段階ではDiscriminatorによるGAN Loss、MSE Loss、それとVGG Lossが用いられました。
VGG Lossは昔のVGG16またはVGG19のネットワークの学習済みモデルを特徴抽出器として利用して算出した、特徴空間でのlossです。
MSE Loss及びVGG Lossは学習の収束を速くするのに貢献します。


[SRNet-Rの特徴]

[1: Residual of Residual Network]
SRGANと同じく、多段のResidual Unitを用いた残差学習を行います。
只のDCNNでは、学習が進むと入出力に於ける変換精度向上により、入力層から出力層へ向かって情報が伝播する際に出力側の層は入力と出力の差が小さくなって行きます。
その上、小さな値が層毎に繰り返し乗算される為、指数関数的に小さな値となる為、微分が困難になり、勾配消失が起こります。
Residual Networkでは入力画像から出力画像への写像を学習させるのではなく、入力と求める出力との残差を学習させます。
すると、各Residual Unitの出力に入力を足し合わせればよい事になり、値が小さくなってしまう事を防ぐ事が出来ます。
このResidual構造を入れ子状にしたのがResidual of Residual Networkで、32段から64段以上の深いネットワークでもかなり速く学習が進みます。
SRNet-RではこのResidual of Residual Network構造を採用しております。


[2: Autoencoderの利用]
私はこの度、GANによる学習ではなく、 " Convolutionla Autoencoder " のencoder出力のMAE (Mean Absolute Error / 誤差絶対平均)を特徴空間のlossとして評価させる事に致しました。
Convolutionla Autoencoderはencoder部で入力画像にconvolutionを施しつつ画像サイズやチャンネル数を削減して行き、decoder部では逆に徐々に元に戻して行き、入力画像と同等のものを復元させるもの(恒等写像)です。
これは途中の層で情報を絞らせる事で、巧く特徴を抽出するように学習させるのです。
Autoencoderはノイズ除去に使用されたりする他、特徴抽出器として使用されます。
これを超解像用のResidual Networkと同時に独立に学習させ、そのencoder出力を利用して特徴空間上の品質を高める事を考えました。

結果としては上出来で、学習はとても速く、メモリーの使用量は極少なく、高品質な結果となりました。


[3: Swish活性化関数]
活性化関数にはReLU (Rectified Linear Unit | ramp function)ではなく、Swish関数を用いております。

ReLU(x)=max(0, x)

Swish(x)=x*Sigmoid(a*x)
Sigmoid(x)=1/(1+e^(-a*x))

TensorFlowでは tf.nn.swish(x) が使えます。

Swish関数及びその導関数は、ReLUと異なり、原点に於いて連続で、非単調性の関数です。
また、Swish関数はReLUと異なり、負の値も出力されます。
Sigmoid関数はLogistic関数の特殊な場合です。
他の方の実験結果を見ると、LeakyReLUやELUなどと比べ、Swish関数の方が平均的に良い結果をもたらしているように見受けられます。
Swishは連続な関数ですので、関数の近似結果が滑らかになります。
ReLUでは負の値が無駄になってしまうところ、Swishでは有効に次の層に伝わります。
Swishは負の絶対値が大きな領域は0に漸近しますので発散し難くなります。


[4: Group Normalization]
SRGANではBatch Normalization層が使われていましたが、Batch Normalizationは各チャンネル間の関連性が無視されてしまいます。
すると複数のチャンネル間の関連性による特徴が損なわれてしまいます。
また、ミニバッチ単位で平均と標準偏差を取るので、ミニバッチ サイズが32未満など小さい場合には正規化が巧く作用しないという弱点があります。
結果として、出力画像に白色の靄のようなアーティファクトが出現してしまうという問題がありました。
これを避ける為、Group Normalization層を使用致しました。
Group Normalizationでは、ミニバッチ単位ではなく、チャンネルを幾つかのグループに分割し、チャンネルのグループ毎に正規化します。
これにより、ミニバッチ数が少なくても正規化が効きます。
また、各チャンネル間の関連性も保たれます。
因みに全チャンネルに跨って正規化するLayer Normalizationの場合は、余り役立たないにも関わらず大きな値を示すチャンネルがあった際に、他の全てのチャンネルの値を圧縮されてしまいます。
性能としては、ミニバッチ サイズが大きい場合のBNには敵いませんが、ミニバッチ サイズが小さい場合には差は縮まるようです。

参照:
"ニューラルネットの新しい正規化手法 Group Normalization の高速な実装と学習実験 | ALBERT Official Blog" のURL:
https://blog.albert2005.co.jp/2018/09/05/group_normalization/


[5: 画像の読み込み]
学習させる画像群について、指定したディレクトリー以下にあるサブディレクトリーまで再帰的に検索して読み込むようにしました。
画像はepoch毎にランダムにシャッフルされ、ランダムな位置でクロップされます。
全画像ファイル数がミニバッチの数で割り切れない場合には、不足分は既存の学習用画像の中からランダムに再度読み込まれます。
また、学習中にも画像を次々に追加出来るようにしました。
指定したディレクトリー以下に、画像ファイルもしくは画像ファイルが入ったフォルダーを放り込むだけで、次のepoch開始時に読み込まれます。



[更なる画質向上について]
JPEGなどの圧縮ノイズ低減の学習は行わせていません。
もし圧縮ノイズなどの画質劣化を除去させたい場合は、OpenCVを追加し、 " main.py " を編集して、学習用画像を縮小する際にランダムにJPEG圧縮させるコードを追加してみて下さい。
以下はJPEG圧縮するコードの例です。

encode_parameters = [int(cv2.IMWRITE_JPEG_QUALITY), quality]
result, encoded_image = cv2.imencode('.jpg', image, encode_parameters)


" quality " には圧縮の品質を1から100で入力します。数値が高いほど低圧縮、高品質、数値が低いほど高圧縮、低品質です。
" result " は成功の真偽値です。
これにより圧縮前後の対応関係を学習出来るようになる筈です。
加えて、ガウス暈しもランダムで加えると、シャープネスを上げる事も出来るでしょう。


[プログラムの実行について]
このプログラムで学習を実行するには6GB以上のメモリーが必要です。
CPUまたはNVIDIAのGPUによるCUDAで実行出来ます。
低性能なCPUで実行する場合、充分な学習には1週間以上の時間が掛かります。

私は途中までローカル PCのCPU処理を行って実験していましたが、それでは時間が掛り過ぎたので、AWSのEC2の " p2.xlarge " GPU インスタンスを利用させて頂きました。
p2.xlargeは1つのNVIDIA K80 GPU、4つのvCPU、61GiBのメモリーです。
画像枚数が8,000枚ほどの場合、このGPU インスタンスで処理を始めてから24時間以内に学習が収束しました。

約20倍高速であり、20日間掛かる処理が1日で終わりました。
初めての際は設定などで手間取りましたが、利用料金は数千円程度です。

因みに私のローカル PCの環境ではヴィデオ カードのVRAMの容量が足りないのでCPUだけで学習させます。
TensorFlowのバイナリーはSSE4.1, SSE4.2, AVXが利用できないので、TensorFlowをCPU拡張命令のSSE4.1, SSE4.2, AVXを使用するオプション付きでビルドしました。
" -march=native " の " --config=opt " なので自動的に拡張命令対応となります。

私のローカル PCの実行環境は、以下の通りです。

・CPU: Intel Core i7-3770T
・Memory: DDR3 SDRAM 8GB * 4 = 32[GB]
・Video Card: Palit GeForce GTX 750 KalmX (Fanless)
・HDD: 3[TB], 7200[rpm], Cache 64[MB]
・OS: Ubuntu 16.04 LTS

・CUDA 9.0.176
・Python 3.5
・OpenJDK 1.8.0_191
・Bazel 0.18.0
・TensorFlow 1.12.0-rc0 (build from source)
・TensorLayer 1.11.1
・easydict
・tkinter

nice!(0)  コメント(0) 
超解像プログラム ブログトップ