Skip to content

ka10ryu1/jpegcomp

Repository files navigation

概要

圧縮されたJpeg画像の復元

学習結果その1(5%に圧縮した画像を復元)

学習結果その2(20%に圧縮した画像を復元)

  • 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はチュートリアル用のデータセットとテスト用の画像しかない。完全版データは非常に重いので別リポジトリにて管理している。

チュートリアル

0. 学習済みモデルを利用する

以下を実行すれば学習済みモデルを利用できるが、CPUだと数分かかるので-g GPU_ID推奨。

$ ./predict.py Model/*model Model/*json FontData/The_Night*

1. 学習する

実行

$ ./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

2. 学習で作成されたモデルを使用する

実行

$  $ ./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-*.jpgconcat-*.jpgが生成されていればOK。

その他の機能

生成されたデータの削除

$ ./clean_all.sh

ハイパーパラメータを変更して自動実行

デフォルトではバッチサイズだけを変更した学習を複数回繰り返す。-cオプションを付けることでネットワークの中間層の数などを可視化もできる。

$ ./auto_train.sh

Dotファイルの画像化

学習を実行すると*graph.dotというファイルが生成されるので、それを画像化する。

$ ./Tools/dot2png.py ./result/*.dot

以下のような画像が生成される(例はMNISTのネットワーク層)。

NPZデータセットの中身をランダム表示

学習用の画像を確認する。

$ ./Tools/npz2jpg.py ./FontData/test_32x32_000800.npz

以下のような画像が生成される。上段が圧縮画像、下段が無圧縮画像

lossの比較をする

学習を複数回実行する

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*

以下のような画像が生成される。