圧縮されたJpeg画像の復元
- Original : 圧縮なしの画像
- Compression : Originalを圧縮した画像
- Restoration : Compressionを学習によって復元した画像
- Ubuntu 16.04.4 LTS ($ cat /etc/issue)
- Python 3.5.2 ($ python3 -V)
- chainer 4.0.0 ($ pip3 show chainer | grep Ver)
- numpy 1.14.2 ($ pip3 show numpy | grep Ver)
- cupy 4.0.0 ($ pip3 show cupy | grep Ver)
- opencv-python 3.4.0.12 ($ pip3 show opencv-python | grep Ver)
$ ls `find ./ -maxdepth 3 -type f -print` | xargs grep 'help = ' --include=*.py >& log.txt
$ tree >& log.txt
.
├── FontData
│ ├── The_Night_of_the_Milky_Way_Train_ch2.PNG > predict用画像
│ ├── The_Nighthawk_Star_op.PNG > predict用画像
│ ├── test_32x32_001200.npz > テスト用データセットサンプル
│ └── train_32x32_010800.npz > 学習用データセットサンプル
├── LICENSE
├── Lib
│ ├── concat_3_images.py > 3枚の画像を連結する(org, comp, restration)
│ ├── network.py > jpegcompのネットワーク部分
│ ├── network2.py > jpegcompのネットワーク部分その2
│ └── plot_report_log.py
├── README.md
├── Tools
│ ├── LICENSE
│ ├── README.md
│ ├── Tests
│ │ ├── Lenna.bmp > テスト用画像
│ │ ├── Mandrill.bmp > テスト用画像
│ │ ├── test_getfunc.py > getfuncのテスト用コード
│ │ └── test_imgfunc.py > imgfuncのテスト用コード
│ ├── concat.py > 複数の画像を任意の行列で結合する
│ ├── dot2png.py > dot言語で記述されたファイルをPNG形式に変換する
│ ├── func.py > 便利機能
│ ├── getfunc.py > 各種パラメータ取得に関する便利機能
│ ├── imgfunc.py > 画像処理に関する便利機能
│ ├── npz2jpg.py > 作成したデータセット(.npz)の中身を画像として出力する
│ ├── plot_diff.py > logファイルの複数比較
│ ├── png_monitoring.py > 任意のフォルダの監視
│ └── pruning.py > モデルの枝刈をする
├── auto_train.sh
├── clean_all.sh
├── create_dataset.py > 画像を読み込んでデータセットを作成する
├── predict.py > モデルとモデルパラメータを利用して推論実行する
├── predict_some_snapshot.py > 複数のsnapshotoとひとつのモデルパラメータを利用してsnapshotの推移を可視化する
└── train.py > 学習メイン部
FontDataはチュートリアル用のデータセットとテスト用の画像しかない。完全版データは非常に重いので別リポジトリにて管理している。
以下を実行すれば学習済みモデルを利用できるが、CPUだと数分かかるので-g GPU_ID
推奨。
$ ./predict.py Model/*model Model/*json FontData/The_Night*
$ ./train.py -i FontData/
not import cupy
------------------------------
actfun1: relu
actfun2: sigmoid
batchsize: 100
dropout: 0.0
epoch: 10
frequency: -1
gpu_id: -1
in_path: FontData/
layer_num: 2
lossfun: mse
network: 0
only_check: False
optimizer: adam
out_path: ./result/
plot: True
pruning: 0.33
resume:
shuffle_rate: 2
unit: 2
------------------------------
[Network info] JC_DDUU
Unit: 2
Out: 1
Drop out: 0.0
Act Func: relu, sigmoid
train_32x32_010800.npz: x(10800, 1, 32, 32) y(10800, 1, 32, 32)
test_32x32_001200.npz: x(1200, 1, 32, 32) y(1200, 1, 32, 32)
epoch main/loss validation/main/loss elapsed_time
1 0.178574 0.118308 21.8139
2 0.122758 0.106808 42.2861
3 0.100306 0.0958555 63.4293
4 0.0860537 0.0730734 83.896
5 0.0748337 0.067583 104.49
6 0.0656855 0.0533111 125.249
7 0.0582015 0.0502309 146.267
8 0.0518079 0.0466047 167.007
9 0.0465706 0.0416385 187.949
10 0.0422393 0.0357869 208.614
not import cupy
はcupyをインストールしていない場合に表示される
resultフォルダ中に以下が生成されていればOK。先頭の文字列は日付と時間から算出された値であるため実行ごとに異なる。
*.log
*.model
*_10.snapshot
*_graph.dot
*_train.json
loss.png
$ $ ./predict.py result/*model result/*json FontData/The_Night*
not import cupy
not import cupy
------------------------------
batch: 20
gpu: -1
jpeg[2]:
FontData/The_Night_of_the_Milky_Way_Train_ch2.PNG
FontData/The_Nighthawk_Star_op.PNG
model: result/1d88bd71.model
out_path: ./result/
param: result/1d88bd71_train.json
quality: 5
------------------------------
[Network info] JC_DDUU
Unit: 2
Out: 1
Drop out: 0.0
Act Func: relu, sigmoid
exec time: 0.54[s]
save: ./result/comp-001.jpg
exec time: 0.44[s]
save: ./result/comp-011.jpg
resultフォルダ中にcomp-*.jpg
とconcat-*.jpg
が生成されていればOK。
$ ./clean_all.sh
デフォルトではバッチサイズだけを変更した学習を複数回繰り返す。-c
オプションを付けることでネットワークの中間層の数などを可視化もできる。
$ ./auto_train.sh
学習を実行すると*graph.dot
というファイルが生成されるので、それを画像化する。
$ ./Tools/dot2png.py ./result/*.dot
以下のような画像が生成される(例はMNISTのネットワーク層)。
学習用の画像を確認する。
$ ./Tools/npz2jpg.py ./FontData/test_32x32_000800.npz
以下のような画像が生成される。上段が圧縮画像、下段が無圧縮画像
auto_train.sh
等で複数回学習させておく。以下はデフォルトのauto_train.sh
を実行した前提である。
$ ./Tools/plot_diff.py ./result/001 -l all
以下のような画像が生成される。
※ファイルの作成日時順でソートされる。 ※lrの計算は現在していない(train.pyにてコメントアウト中)
学習が更新されたら(loss.pngまたはlr.pngが更新されたら)Dropboxにコピーする場合
$ ./Tools/png_monitoring.py ./result/ ~/Dropbox/temp/
以下が表示される。Ctrl-c
連打すると監視を終了する。
Monitoring : ./result/
Copy to : /home/aaaa/Dropbox/temp/
Exit: Ctrl-c
jpegcompにあるデータセットは最小構成であるため、完全版データを作成するためにはFontDataAllリポジトリを持ってくる必要がある。 以下ではFontDataAllとjpegcompを同じフォルダー内にcloneし、jpegcomp直下にいるものとする。
├── FontDataAll
│ ├── README.md
│ ├── The_Night_of_the_Milky_Way_Train_ch2.PNG
│ ├── The_Nighthawk_Star_op.PNG
│ ├── font_00.bmp
│ ├── font_01.bmp
│ ├──
│ ├──
│ └── font_3f.bmp
└── jpegcomp
├── FontData
├── Lib
└── Tools
$ ./create_dataset.py ../FontDataAll/font_* -s 128 -r 2000 -t 0.95
resultフォルダが作成され、その中に以下のファイルが生成されていればOK
test_128x128_******.npz
train_128x128_******.npz
※READMEの最上部にある結果は、このデータを使用している。
各スナップショットで推論実行したものを比較することで学習がどれだけ進んでいるかを可視化する。
1エポックずつスナップショットを保存する設定で学習を実行する。
$ ./train.py -i FontData/ -f 1
$ ./predict_some_snapshot.py ./result/ ./FontData/The_Night_of_the_Milky_Way_Train_ch2.PNG -r 3 -n 8 -rs 8
以下のような画像が生成される。一番左が正解画像で、右に行くほど新しいスナップショットの結果になる。
train.py
実行時に--only_check
フラグを入れるとネットワーク層の確認ができる。
$ ./train.py --only_check
そうすると以下のようにブロック名、実行時間(累計)、ネットワーク層の数が表示される。ネットワーク層のパラメータを修正した時などに利用すると便利。
:
省略
:
train_32x32_010800.npz: x(10800, 1, 32, 32) y(10800, 1, 32, 32)
test_32x32_001200.npz: x(1200, 1, 32, 32) y(1200, 1, 32, 32)
0: DownSampleBlock 0.000 s (100, 1, 32, 32)
1: DownSampleBlock 0.008 s (100, 2, 16, 16)
2: DownSampleBlock 0.012 s (100, 4, 8, 8)
3: DownSampleBlock 0.015 s (100, 8, 4, 4)
4: DownSampleBlock 0.016 s (100, 16, 2, 2)
5: UpSampleBlock 0.018 s (100, 32, 2, 2)
6: UpSampleBlock 0.022 s (100, 10, 4, 4)
7: UpSampleBlock 0.026 s (100, 6, 8, 8)
8: UpSampleBlock 0.035 s (100, 4, 16, 16)
9: UpSampleBlock 0.059 s (100, 2, 32, 32)
Output 0.148 s: (100, 1, 64, 64)
concat_3_images.py
を利用することで、predict.py
と同様のconcat-*.jpg
を生成できる。推論実行したくない時やその環境でない時に使用する。以下のように実行する。
$ ./Lib/concat_3_images.py ./FontData/The_Night_of_the_Milky_Way_Train_ch2.PNG ./result/comp-00*
以下のような画像が生成される。
$ ./Lib/concat_3_images.py ./FontData/The_Nighthawk_Star_op.PNG ./result/comp-01*
以下のような画像が生成される。