tanimutomo / spectrum-inpainting

Resolution Invariant Image Inpainting using Frequency Space
2 stars 0 forks source link

Experiment #2

Open tanimutomo opened 4 years ago

tanimutomo commented 4 years ago

とりあえず,partial-convと全く同じパラメータで実験してみた python src/train.py experiment=new experiment.prefix=prestudy_spectrum=1.0 comet.use=True comet.tags=prestudy

ただのグレーにしか塗り潰されず,partial-convとはかけ離れた結果になった おそらくspecturmの制約を持って大きくする必要があるのかな? (かつ他のcoefを0にする) もしかしたら,holeがある時とないときで,spectrumにどのくらいの値の差が生じるのかというのは検証した方良さそう その次に,1つの画像に対して学習させてみて,できるか, その次に,10個の画像,という風にだんだん増やしていった方が良さそうだな. そのためのデータセットを構成するためのディレクトリを,repoの中に作成してしまって,experimentがprestudyのときは,そっちのdataを参照するようにした方が良いだろう

tanimutomo commented 4 years ago

一旦spectrum lossのみで学習させてみる python src/train.py experiment=new experiment.prefix=prestudy_spectrum=100.0_other=0.0 comet.use=True comet.tags=prestudy loss.spectrum=100.0 loss.valid=0.0 loss.hole=0.0 loss.tv=0.0 loss.perc=0.0 loss.style=0.0

tanimutomo commented 4 years ago

Experiment on a image

SpectrumUNet

  1. spec: norm:1, coef:100

    python src/train.py experiment=new data=1 loss.spec.norm=1 loss.spec.coef=100.0 loss.valid.coef=0.0 loss.hole.coef=0.0 loss.tv.coef=0.0 loss.perc.coef=0.0 loss.style.coef=0.0 optim.max_iter=5000 experiment.prefix=prestudy_1_spec_n1=100.0 comet.use=True comet.tags=prestudy

    image

  2. other = pconv

    python src/train.py experiment=new data=1 loss.spec=0.0 loss.valid=1.0 loss.hole=6.0 loss.tv=0.1 loss.perc=0.05 loss.style=120.0 optim.max_iter=5000 experiment.prefix=prestudy_1_other=pconv comet.use=True comet.tags=prestudy

    image

  3. valid=100 / hole = 100

    python src/train.py experiment=new data=1 loss.spec.coef=0.0 loss.valid.coef=100.0 loss.hole.coef=100.0 loss.tv.coef=0.0 loss.perc.coef=0.0 loss.style.coef=0.0 optim.max_iter=5000 experiment.prefix=prestudy_1_valid,hole=100.0 comet.use=True comet.tags=prestudy

    image

  4. spec: norm:2, coef:0.1

    python src/train.py experiment=new data=1 loss.spec.coef=0.1 loss.spec.norm=2 loss.valid.coef=0.0 loss.hole.coef=0.0 loss.tv.coef=0.0 loss.perc.coef=0.0 loss.style.coef=0.0 optim.max_iter=5000 experiment.prefix=prestudy_1_spec_n2=0.1 comet.use=True comet.tags=prestudy
  5. spec: norm:2, coef:100

    python src/train.py experiment=new data=1 loss.spec.coef=100.0 loss.spec.norm=2 loss.valid.coef=0.0 loss.hole.coef=0.0 loss.tv.coef=0.0 loss.perc.coef=0.0 loss.style.coef=0.0 optim.max_iter=5000 experiment.prefix=prestudy_1_spec_n2=100 comet.use=True comet.tags=prestudy

    image

  6. spec: norm:1, coef:1.0 / lr: 0.04 BEST

    python src/train.py experiment=new data=1 model.training=spec loss.spec.norm=1 optim.max_iter=3000 experiment.prefix=prestudy_1_spec_n1=1.0 comet.use=True comet.tags=prestudy

    image

  7. 7-based spec: norm:1, coef:1.0 / valid: coef:1.0 / hole: coef: 1.0

    python src/train.py experiment=new data=1 loss.spec.norm=1 loss.spec.coef=1.0 loss.valid.coef=1.0 loss.hole.coef=1.0 loss.tv.coef=0.0 loss.perc.coef=0.0 loss.style.coef=0.0 optim.max_iter=3000 experiment.prefix=prestudy_1_spec_n1=1.0_valid,hole=1.0 comet.use=True comet.tags=prestudy

    image

WNet (SpectrumUNet + RefinementUNet)

  1. spec.loss.coef: 1.0 / other: pconv/0.01

    python src/train.py experiment=new data=1 loss.spec.coef=1 loss.valid.coef=0.01 loss.hole.coef=0.06 loss.tv.coef=0.001 loss.perc.coef=0.0005 loss.style.coef=1.2 optim.max_iter=3000 model.refinement=True experiment.prefix=prestudy_1_wnet comet.use=True comet.tags=prestudy

    image

  2. spec.loss.coef: 1.0 -> FT) other: pconv

    python src/train.py experiment=new data=1 model.training=refine model.spec_weight=log/train/prestudy_1_spec_n1=1.0_2020-0523-2327-48/model.pth loss.valid.coef=1.0 loss.hole.coef=6.0 loss.tv.coef=0.1 loss.perc.coef=0.05 loss.style.coef=120 optim.lr=0.0004 optim.max_iter=3000 experiment.prefix=prestudy_1_refine_ft comet.use=True comet.tags=prestudy

    image

Low-Frequency Loss (with S-UNet)

  1. loss.spec.cut_idx: 32

    python src/train.py experiment=new data=1 loss.spec.coef=1 loss.spec.cut_idx=32 optim.max_iter=3000 experiment.prefix=prestudy_1_spec_ci=32 comet.use=True comet.tags=prestudy

    image

  2. loss.spec.cut_idx: 16

    python src/train.py experiment=new data=1 loss.spec.coef=1 loss.spec.cut_idx=16 optim.max_iter=3000 experiment.prefix=prestudy_1_spec_ci=16 comet.use=True comet.tags=prestudy

    image

discussion

tanimutomo commented 4 years ago

debug

python src/train.py experiment=debug data=1 loss.spec.coef=1.0 loss.valid.coef=0.0 loss.hole.coef=0.0 loss.tv.coef=0.0 loss.perc.coef=0.0 loss.style.coef=0.0 optim.max_iter=1000

tanimutomo commented 4 years ago

Best Model for an Image

Training SpectrumUNet

python src/train.py data=1 training=spec optim.max_iter=3000 experiment=new comet.use=True comet.tags=prestudy experiment.prefix=prestudy_1_spec

Training RefinementUNet

python src/train.py data=1 training=refine optim.max_iter=3000 model.spec_weight=log/train/prestudy_1_spec_n1=1.0_2020-0523-2327-48/model.pth experiment=new comet.use=True comet.tags=prestudy experiment.prefix=prestudy_1_refine
tanimutomo commented 4 years ago

Experiment for 10 images and masks

Training SpectrumUNet

python src/train.py data=10 training=spec optim.max_iter=10000 experiment=new comet.use=True comet.tags=prestudy experiment.prefix=prestudy_10_spec

Training RefinementUNet

python src/train.py data=10 training=refine optim.max_iter=10000 model.spec_weight=log/train/prestudy_10_spec_2020-0527-2149-59/model.pth experiment=new comet.use=True comet.tags=prestudy experiment.prefix=prestudy_10_refine
tanimutomo commented 4 years ago
tanimutomo commented 4 years ago

可能な実験設定

  1. マスクの解像度に対する汎化性能 学習は一定の解像度の画像と,様々な割合のマスクを利用 推論時は,より広い領域のマスクを作り出して推論 (人工的に中央にマスクを作り出すなど) -> もしかしたら,学習時においても様々な領域のマスクを利用した方がいいかもしれない -> モデルの構成とそれに対応する,対応可能なマスク領域の大きさを計算するのは,論文をより正確にするという意味合いで1つアリかも (これには大規模な実験が必要になる)

  2. 画像の解像度に対する汎化性能 上のモデルの構成とマスクの解像度の対応関係のように,モデルアーキテクチャと入力画像の解像度における関係性とかも調べて見た方がいいかも

tanimutomo commented 4 years ago

最初は,PConvと同じ実験設定で行って,精度比較 その後,Irregular Mask Datasetを利用して,割合の小さいマスクで学習したモデルに対して,より広域なマスクを使用した場合の精度評価をする

そもそも低周波成分に対してのみLossを計算して,Coarse Resultを計算するという方法を取ってしまうと,入力画像を低解像度して入力すればよくね?となってしまう可能性が高いので,それは微妙だな...

tanimutomo commented 4 years ago

Experiment for places2_256 and irregular_mask

Training SpectrumUNet

python src/train.py data=default training=spec optim.max_iter=200000 experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec

Training RefinementUNet

python src/train.py data=default training=refine optim.max_iter=200000 model.spec_weight=log/train/... experiment=new comet.use=True comet.tags=places_256 experiment.prefix=refine

with geometric_mask

spec lr = 0.01

python src/train.py data=default training=spec optim.max_iter=200000 model.use_image=True optim.lr=0.01 experiment=new comet.use=True comet.tags=[places_256,geometric_mask] experiment.prefix=spec_geomask_lr=0.01

spec lr = 0.001

python src/train.py data=default training=spec optim.max_iter=200000 model.use_image=True optim.lr=0.001 experiment=new comet.use=True comet.tags=[places_256,geometric_mask] experiment.prefix=spec_geomask_lr=0.001
tanimutomo commented 4 years ago

PConvでは,サンプリングしたマスクに対して,random dilation, rotation, croppingをしてから利用している

tanimutomo commented 4 years ago

featureのconcatをいろいろ試すのは大事だけど,spectrum lossだけを用いてinpaintingするのには限界がある気がするので,lossの方も大規模なデータにした上での実験をしてみた方がいい気がする マスクの 利用シーンに合わせて,マスクを作った方がいいのではないか

tanimutomo commented 4 years ago

Experiment of Feature Concatenate

Training SpectrumUNet

# cat
python src/train.py data=default training=spec optim.max_iter=200000 model.use_image=True model.unite_method=cat experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec_cat

# pool_cat
python src/train.py data=default training=spec optim.max_iter=200000 model.use_image=True model.unite_method=pool_cat experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec_pool_cat

# pool_prod
python src/train.py data=default training=spec optim.max_iter=200000 model.use_image=True model.unite_method=pool_prod experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec_pool_prod

# prod
python src/train.py data=default training=spec optim.max_iter=200000 model.use_image=True model.unite_method=prod experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec_prod

# ft_cat
python src/train.py data=default training=spec optim.max_iter=200000 model.use_image=True model.unite_method=ft_cat experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec_ft_cat

# ft_prod
python src/train.py data=default training=spec optim.max_iter=200000 model.use_image=True model.unite_method=ft_prod experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec_ft_prod

Result Image

Result Test Loss (Spec)

tanimutomo commented 4 years ago

Experiment of Small LR (pool_cat, ft_prod)

# 0.0001
# pool_cat
python src/train.py data=default training=spec optim.max_iter=200000 optim.lr=0.0001 model.use_image=True model.unite_method=pool_cat experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec_pool_cat_lr=0.0001

# ft_prod
python src/train.py data=default training=spec optim.max_iter=200000 optim.lr=0.0001 model.use_image=True model.unite_method=ft_prod experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec_ft_prod_lr=0.0001

# 0.00001
# pool_cat
python src/train.py data=default training=spec optim.max_iter=200000 optim.lr=0.00001 model.use_image=True model.unite_method=pool_cat experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec_pool_cat_lr=0.00001

# ft_prod
python src/train.py data=default training=spec optim.max_iter=200000 optim.lr=0.00001 model.use_image=True model.unite_method=ft_prod experiment=new comet.use=True comet.tags=places_256 experiment.prefix=spec_ft_prod_lr=0.00001
tanimutomo commented 4 years ago

マスク画像を中央の長方形だけの画像にしたら,ぼやけたコンテンツの生成はできた -> 空間的な情報の考慮が,必須ではなくなったために,周波数空間と解くタスクとしての難易度が圧倒的に下がったと考えられる. image

これで学習したモデルに対して,異なるサイズのマスク画像でテストしてみる(いずれも形は正方形) 左から,64 (same as training), 72, 80, 96, 128

やはり,マスクのサイズを大きくすると,生成結果がぼやけてしまうことがわかる 小さくした場合はどうなるんだろう?(これによって,空間情報起因か,Spectrumのスケール起因かがわかる) 左から,64 (same as training), 56, 48, 32

小さくしても,予測ができていないことを考えると,おそらく原因はSpectrumのスケール or/and 学習時のマスクが固定であるため

tanimutomo commented 4 years ago

python src/train.py data=default training=spec optim.max_iter=200000 data.mask_dir=rect_c64_mask experiment=new comet.use=True comet.tags=[places2_256,rect,c64] experiment.prefix=rect_c64

tanimutomo commented 4 years ago

python src/train.py experiment=new training=mlp data=1 data.resol=64 optim.max_iter=30000 comet.use=True comet.tags=[data1,64,gray,mlp] experiment.prefix=mlp_64_gray_data1

python src/train.py experiment=new training=mlp data=default data.mask_dir=rect_mask data.resol=64 optim.lr=0.001 comet.use=True comet.tags=[places2,64,gray,mlp] experiment.prefix=mlp_64_gray_lr=0.001 gpu_ids=[0]

python src/train.py experiment=new training=mlp data=default data.mask_dir=rect_mask data.resol=64 optim.lr=0.01 comet.use=True comet.tags=[places2,64,gray,mlp] experiment.prefix=mlp_64_gray_lr=0.01 gpu_ids=[3]

tanimutomo commented 4 years ago

python src/train.py experiment=new training=mlp data=default data.mask_dir=rect_mask data.resol=64 optim.lr=0.001 optim.max_iter=1000000 experiment.prefix=mlp_64_gray_lr=0.001 gpuids=[0] data.root=/home/tanimu/data