diff --git a/.buildinfo b/.buildinfo old mode 100644 new mode 100755 index e7de7600..e36e089a --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 50b186beaede5bc0e46b0844d2d6c023 -tags: 645f666f9bcd5a90fca523b33c5a78b7 +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 7a570c7311dc2186e91a2205d9086bd6 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_images/00.png b/_images/00.png old mode 100644 new mode 100755 diff --git a/_images/001.png b/_images/001.png old mode 100644 new mode 100755 diff --git a/_images/01.png b/_images/01.png old mode 100644 new mode 100755 diff --git a/_images/010.png b/_images/010.png old mode 100644 new mode 100755 diff --git a/_images/011.png b/_images/011.png old mode 100644 new mode 100755 diff --git a/_images/012.png b/_images/012.png old mode 100644 new mode 100755 diff --git a/_images/02.png b/_images/02.png old mode 100644 new mode 100755 diff --git a/_images/021.png b/_images/021.png old mode 100644 new mode 100755 diff --git a/_images/03.png b/_images/03.png old mode 100644 new mode 100755 diff --git a/_images/031.png b/_images/031.png old mode 100644 new mode 100755 diff --git a/_images/04.png b/_images/04.png old mode 100644 new mode 100755 diff --git a/_images/041.png b/_images/041.png old mode 100644 new mode 100755 diff --git a/_images/05.png b/_images/05.png old mode 100644 new mode 100755 diff --git a/_images/051.png b/_images/051.png old mode 100644 new mode 100755 diff --git a/_images/06.png b/_images/06.png old mode 100644 new mode 100755 diff --git a/_images/061.png b/_images/061.png old mode 100644 new mode 100755 diff --git a/_images/07.png b/_images/07.png old mode 100644 new mode 100755 diff --git a/_images/071.png b/_images/071.png old mode 100644 new mode 100755 diff --git a/_images/08.png b/_images/08.png old mode 100644 new mode 100755 diff --git a/_images/081.png b/_images/081.png old mode 100644 new mode 100755 diff --git a/_images/09.png b/_images/09.png old mode 100644 new mode 100755 diff --git a/_images/091.png b/_images/091.png old mode 100644 new mode 100755 diff --git a/_images/1.png b/_images/1.png old mode 100644 new mode 100755 diff --git a/_images/10.png b/_images/10.png old mode 100644 new mode 100755 diff --git a/_images/101.png b/_images/101.png old mode 100644 new mode 100755 diff --git a/_images/102.png b/_images/102.png old mode 100644 new mode 100755 diff --git a/_images/11.png b/_images/11.png old mode 100644 new mode 100755 diff --git a/_images/12.png b/_images/12.png old mode 100644 new mode 100755 diff --git a/_images/13.png b/_images/13.png old mode 100644 new mode 100755 diff --git a/_images/14.png b/_images/14.png old mode 100644 new mode 100755 diff --git a/_images/2.png b/_images/2.png old mode 100644 new mode 100755 diff --git a/_images/21.png b/_images/21.png old mode 100644 new mode 100755 diff --git a/_images/3.png b/_images/3.png old mode 100644 new mode 100755 diff --git a/_images/31.png b/_images/31.png old mode 100644 new mode 100755 diff --git a/_images/4.png b/_images/4.png old mode 100644 new mode 100755 diff --git a/_images/41.png b/_images/41.png old mode 100644 new mode 100755 diff --git a/_images/4classes.png b/_images/4classes.png old mode 100644 new mode 100755 diff --git a/_images/5.png b/_images/5.png old mode 100644 new mode 100755 diff --git a/_images/51.png b/_images/51.png old mode 100644 new mode 100755 diff --git a/_images/6.png b/_images/6.png old mode 100644 new mode 100755 diff --git a/_images/61.png b/_images/61.png old mode 100644 new mode 100755 diff --git a/_images/7.png b/_images/7.png old mode 100644 new mode 100755 diff --git a/_images/71.png b/_images/71.png old mode 100644 new mode 100755 diff --git a/_images/8.png b/_images/8.png old mode 100644 new mode 100755 diff --git a/_images/81.png b/_images/81.png old mode 100644 new mode 100755 diff --git a/_images/9.png b/_images/9.png old mode 100644 new mode 100755 diff --git a/_images/91.png b/_images/91.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab01.png b/_images/ConceptLab01.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab02.png b/_images/ConceptLab02.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab03.png b/_images/ConceptLab03.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab04.png b/_images/ConceptLab04.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab05.png b/_images/ConceptLab05.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab06.png b/_images/ConceptLab06.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab07.png b/_images/ConceptLab07.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab08.png b/_images/ConceptLab08.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab09.png b/_images/ConceptLab09.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab10.png b/_images/ConceptLab10.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab11.png b/_images/ConceptLab11.png old mode 100644 new mode 100755 diff --git a/_images/ConceptLab12.png b/_images/ConceptLab12.png old mode 100644 new mode 100755 diff --git a/_images/DDIM_pic.png b/_images/DDIM_pic.png old mode 100644 new mode 100755 diff --git a/_images/DDPM_eq.png b/_images/DDPM_eq.png old mode 100644 new mode 100755 diff --git a/_images/Unet.png b/_images/Unet.png old mode 100644 new mode 100755 diff --git a/_images/Untitled.png b/_images/Untitled.png old mode 100644 new mode 100755 diff --git a/_images/Untitled1.png b/_images/Untitled1.png old mode 100644 new mode 100755 diff --git a/_images/adagn_table.png b/_images/adagn_table.png old mode 100644 new mode 100755 diff --git a/_images/algorithm.png b/_images/algorithm.png old mode 100644 new mode 100755 diff --git a/_images/animation.png b/_images/animation.png old mode 100644 new mode 100755 diff --git a/_images/architect_1.png b/_images/architect_1.png old mode 100644 new mode 100755 diff --git a/_images/architect_2.png b/_images/architect_2.png old mode 100644 new mode 100755 diff --git a/_images/architect_3.png b/_images/architect_3.png old mode 100644 new mode 100755 diff --git a/_images/attention3d.png b/_images/attention3d.png old mode 100644 new mode 100755 diff --git a/_images/block.png b/_images/block.png old mode 100644 new mode 100755 diff --git a/_images/cascaded_dms.png b/_images/cascaded_dms.png old mode 100644 new mode 100755 diff --git a/_images/cat.png b/_images/cat.png old mode 100644 new mode 100755 diff --git a/_images/class_eq1.png b/_images/class_eq1.png old mode 100644 new mode 100755 diff --git a/_images/class_eq2.png b/_images/class_eq2.png old mode 100644 new mode 100755 diff --git a/_images/classifier_guidance_vis.png b/_images/classifier_guidance_vis.png old mode 100644 new mode 100755 diff --git a/_images/cm3leon_result.png b/_images/cm3leon_result.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_01.png b/_images/consistency_models_01.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_02.png b/_images/consistency_models_02.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_03.png b/_images/consistency_models_03.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_04.png b/_images/consistency_models_04.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_05.png b/_images/consistency_models_05.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_06.png b/_images/consistency_models_06.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_07.png b/_images/consistency_models_07.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_08.png b/_images/consistency_models_08.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_09.png b/_images/consistency_models_09.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_10.png b/_images/consistency_models_10.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_11.png b/_images/consistency_models_11.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_12.png b/_images/consistency_models_12.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_13.png b/_images/consistency_models_13.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_14.png b/_images/consistency_models_14.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_15.png b/_images/consistency_models_15.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_16.png b/_images/consistency_models_16.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_17.png b/_images/consistency_models_17.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_18.png b/_images/consistency_models_18.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_19.png b/_images/consistency_models_19.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_20.png b/_images/consistency_models_20.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_21.png b/_images/consistency_models_21.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_22.png b/_images/consistency_models_22.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_23.png b/_images/consistency_models_23.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_24.png b/_images/consistency_models_24.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_25.png b/_images/consistency_models_25.png old mode 100644 new mode 100755 diff --git a/_images/consistency_models_26.png b/_images/consistency_models_26.png old mode 100644 new mode 100755 diff --git a/_images/conv3d.png b/_images/conv3d.png old mode 100644 new mode 100755 diff --git a/_images/ddim_pipe.png b/_images/ddim_pipe.png old mode 100644 new mode 100755 diff --git a/_images/ddpm_pipeline.png b/_images/ddpm_pipeline.png old mode 100644 new mode 100755 diff --git a/_images/deer.png b/_images/deer.png old mode 100644 new mode 100755 diff --git a/_images/dreambooth_01.png b/_images/dreambooth_01.png old mode 100644 new mode 100755 diff --git a/_images/dreambooth_02.png b/_images/dreambooth_02.png old mode 100644 new mode 100755 diff --git a/_images/dreambooth_03.png b/_images/dreambooth_03.png old mode 100644 new mode 100755 diff --git a/_images/dreambooth_04.png b/_images/dreambooth_04.png old mode 100644 new mode 100755 diff --git a/_images/dreambooth_05.png b/_images/dreambooth_05.png old mode 100644 new mode 100755 diff --git a/_images/dreambooth_06.png b/_images/dreambooth_06.png old mode 100644 new mode 100755 diff --git a/_images/dreambooth_07.png b/_images/dreambooth_07.png old mode 100644 new mode 100755 diff --git a/_images/dreambooth_08.png b/_images/dreambooth_08.png old mode 100644 new mode 100755 diff --git a/_images/dreambooth_09.png b/_images/dreambooth_09.png old mode 100644 new mode 100755 diff --git a/_images/efficiency.png b/_images/efficiency.png old mode 100644 new mode 100755 diff --git a/_images/einops.png b/_images/einops.png old mode 100644 new mode 100755 diff --git a/_images/eq_1.png b/_images/eq_1.png old mode 100644 new mode 100755 diff --git a/_images/eq_11.png b/_images/eq_11.png old mode 100644 new mode 100755 diff --git a/_images/evalution.png b/_images/evalution.png old mode 100644 new mode 100755 diff --git a/_images/experiment1.png b/_images/experiment1.png old mode 100644 new mode 100755 diff --git a/_images/fig1.png b/_images/fig1.png old mode 100644 new mode 100755 diff --git a/_images/fig10.png b/_images/fig10.png old mode 100644 new mode 100755 diff --git a/_images/fig11.png b/_images/fig11.png old mode 100644 new mode 100755 diff --git a/_images/fig12.png b/_images/fig12.png old mode 100644 new mode 100755 diff --git a/_images/fig13.png b/_images/fig13.png old mode 100644 new mode 100755 diff --git a/_images/fig14.png b/_images/fig14.png old mode 100644 new mode 100755 diff --git a/_images/fig15.png b/_images/fig15.png old mode 100644 new mode 100755 diff --git a/_images/fig16.png b/_images/fig16.png old mode 100644 new mode 100755 diff --git a/_images/fig2.png b/_images/fig2.png old mode 100644 new mode 100755 diff --git a/_images/fig21.png b/_images/fig21.png old mode 100644 new mode 100755 diff --git a/_images/fig3.png b/_images/fig3.png old mode 100644 new mode 100755 diff --git a/_images/fig4.gif b/_images/fig4.gif old mode 100644 new mode 100755 diff --git a/_images/fig5.png b/_images/fig5.png old mode 100644 new mode 100755 diff --git a/_images/fig6.png b/_images/fig6.png old mode 100644 new mode 100755 diff --git a/_images/fig7.png b/_images/fig7.png old mode 100644 new mode 100755 diff --git a/_images/fig8.png b/_images/fig8.png old mode 100644 new mode 100755 diff --git a/_images/fig9.png b/_images/fig9.png old mode 100644 new mode 100755 diff --git a/_images/fig_1.png b/_images/fig_1.png old mode 100644 new mode 100755 diff --git a/_images/fig_10.png b/_images/fig_10.png old mode 100644 new mode 100755 diff --git a/_images/fig_11.png b/_images/fig_11.png old mode 100644 new mode 100755 diff --git a/_images/fig_13.png b/_images/fig_13.png old mode 100644 new mode 100755 diff --git a/_images/fig_131.png b/_images/fig_131.png old mode 100644 new mode 100755 diff --git a/_images/fig_2.png b/_images/fig_2.png old mode 100644 new mode 100755 diff --git a/_images/fig_3.png b/_images/fig_3.png old mode 100644 new mode 100755 diff --git a/_images/fig_31.png b/_images/fig_31.png old mode 100644 new mode 100755 diff --git a/_images/fig_4.png b/_images/fig_4.png old mode 100644 new mode 100755 diff --git a/_images/fig_41.png b/_images/fig_41.png old mode 100644 new mode 100755 diff --git a/_images/fig_5.png b/_images/fig_5.png old mode 100644 new mode 100755 diff --git a/_images/fig_6.png b/_images/fig_6.png old mode 100644 new mode 100755 diff --git a/_images/fig_61.png b/_images/fig_61.png old mode 100644 new mode 100755 diff --git a/_images/fig_7.png b/_images/fig_7.png old mode 100644 new mode 100755 diff --git a/_images/fig_8.png b/_images/fig_8.png old mode 100644 new mode 100755 diff --git a/_images/figure1.1.png b/_images/figure1.1.png old mode 100644 new mode 100755 diff --git a/_images/figure1.png b/_images/figure1.png old mode 100644 new mode 100755 diff --git a/_images/figure2.png b/_images/figure2.png old mode 100644 new mode 100755 diff --git a/_images/figure3.10.png b/_images/figure3.10.png old mode 100644 new mode 100755 diff --git a/_images/figure3.3.png b/_images/figure3.3.png old mode 100644 new mode 100755 diff --git a/_images/figure3.8.png b/_images/figure3.8.png old mode 100644 new mode 100755 diff --git a/_images/figure3.9.png b/_images/figure3.9.png old mode 100644 new mode 100755 diff --git a/_images/figure3.png b/_images/figure3.png old mode 100644 new mode 100755 diff --git a/_images/figure4.1.png b/_images/figure4.1.png old mode 100644 new mode 100755 diff --git a/_images/figure4.10.png b/_images/figure4.10.png old mode 100644 new mode 100755 diff --git a/_images/figure4.11.png b/_images/figure4.11.png old mode 100644 new mode 100755 diff --git a/_images/figure4.12.png b/_images/figure4.12.png old mode 100644 new mode 100755 diff --git a/_images/figure4.6.png b/_images/figure4.6.png old mode 100644 new mode 100755 diff --git a/_images/figure4.7.png b/_images/figure4.7.png old mode 100644 new mode 100755 diff --git a/_images/figure4.8.png b/_images/figure4.8.png old mode 100644 new mode 100755 diff --git a/_images/figure4.9.png b/_images/figure4.9.png old mode 100644 new mode 100755 diff --git a/_images/figure4.png b/_images/figure4.png old mode 100644 new mode 100755 diff --git a/_images/figure5.1.png b/_images/figure5.1.png old mode 100644 new mode 100755 diff --git a/_images/figure5.2.png b/_images/figure5.2.png old mode 100644 new mode 100755 diff --git a/_images/figure5.3.png b/_images/figure5.3.png old mode 100644 new mode 100755 diff --git a/_images/figure5.4.png b/_images/figure5.4.png old mode 100644 new mode 100755 diff --git a/_images/figure5.5.png b/_images/figure5.5.png old mode 100644 new mode 100755 diff --git a/_images/figure5.6.png b/_images/figure5.6.png old mode 100644 new mode 100755 diff --git a/_images/figure5.7.png b/_images/figure5.7.png old mode 100644 new mode 100755 diff --git a/_images/figure6.png b/_images/figure6.png old mode 100644 new mode 100755 diff --git a/_images/figure7.png b/_images/figure7.png old mode 100644 new mode 100755 diff --git a/_images/figure8.png b/_images/figure8.png old mode 100644 new mode 100755 diff --git a/_images/figure_1.png b/_images/figure_1.png old mode 100644 new mode 100755 diff --git a/_images/figure_16.png b/_images/figure_16.png old mode 100644 new mode 100755 diff --git a/_images/figure_2.png b/_images/figure_2.png old mode 100644 new mode 100755 diff --git a/_images/figure_21.png b/_images/figure_21.png old mode 100644 new mode 100755 diff --git a/_images/figure_3.png b/_images/figure_3.png old mode 100644 new mode 100755 diff --git a/_images/figure_31.png b/_images/figure_31.png old mode 100644 new mode 100755 diff --git a/_images/figure_4.png b/_images/figure_4.png old mode 100644 new mode 100755 diff --git a/_images/figure_41.png b/_images/figure_41.png old mode 100644 new mode 100755 diff --git a/_images/figure_5.png b/_images/figure_5.png old mode 100644 new mode 100755 diff --git a/_images/figure_51.png b/_images/figure_51.png old mode 100644 new mode 100755 diff --git a/_images/figure_52.png b/_images/figure_52.png old mode 100644 new mode 100755 diff --git a/_images/figure_6.png b/_images/figure_6.png old mode 100644 new mode 100755 diff --git a/_images/figure_61.png b/_images/figure_61.png old mode 100644 new mode 100755 diff --git a/_images/figure_6_1.png b/_images/figure_6_1.png old mode 100644 new mode 100755 diff --git a/_images/figure_7.png b/_images/figure_7.png old mode 100644 new mode 100755 diff --git a/_images/figure_8_9.png b/_images/figure_8_9.png old mode 100644 new mode 100755 diff --git a/_images/gan_01.png b/_images/gan_01.png old mode 100644 new mode 100755 diff --git a/_images/gan_02.png b/_images/gan_02.png old mode 100644 new mode 100755 diff --git a/_images/gan_03.png b/_images/gan_03.png old mode 100644 new mode 100755 diff --git a/_images/gan_04.png b/_images/gan_04.png old mode 100644 new mode 100755 diff --git a/_images/gan_05.png b/_images/gan_05.png old mode 100644 new mode 100755 diff --git a/_images/glide1.png b/_images/glide1.png old mode 100644 new mode 100755 diff --git a/_images/glide10.png b/_images/glide10.png old mode 100644 new mode 100755 diff --git a/_images/glide12.png b/_images/glide12.png old mode 100644 new mode 100755 diff --git a/_images/glide13.png b/_images/glide13.png old mode 100644 new mode 100755 diff --git a/_images/glide14.png b/_images/glide14.png old mode 100644 new mode 100755 diff --git a/_images/glide15.png b/_images/glide15.png old mode 100644 new mode 100755 diff --git a/_images/glide2.png b/_images/glide2.png old mode 100644 new mode 100755 diff --git a/_images/glide5.png b/_images/glide5.png old mode 100644 new mode 100755 diff --git a/_images/glide6.png b/_images/glide6.png old mode 100644 new mode 100755 diff --git a/_images/glide7.png b/_images/glide7.png old mode 100644 new mode 100755 diff --git a/_images/glide8.png b/_images/glide8.png old mode 100644 new mode 100755 diff --git a/_images/glide9.png b/_images/glide9.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_01.png b/_images/hyperdreambooth_01.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_02.png b/_images/hyperdreambooth_02.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_03.png b/_images/hyperdreambooth_03.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_04.png b/_images/hyperdreambooth_04.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_05.png b/_images/hyperdreambooth_05.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_06.png b/_images/hyperdreambooth_06.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_07.png b/_images/hyperdreambooth_07.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_08.png b/_images/hyperdreambooth_08.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_09.png b/_images/hyperdreambooth_09.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_10.png b/_images/hyperdreambooth_10.png old mode 100644 new mode 100755 diff --git a/_images/hyperdreambooth_11.png b/_images/hyperdreambooth_11.png old mode 100644 new mode 100755 diff --git a/_images/illustration.png b/_images/illustration.png old mode 100644 new mode 100755 diff --git a/_images/image(0).png b/_images/image(0).png old mode 100644 new mode 100755 diff --git a/_images/image(1).png b/_images/image(1).png old mode 100644 new mode 100755 diff --git a/_images/image(2).png b/_images/image(2).png old mode 100644 new mode 100755 diff --git a/_images/image(3).png b/_images/image(3).png old mode 100644 new mode 100755 diff --git a/_images/image(4).png b/_images/image(4).png old mode 100644 new mode 100755 diff --git a/_images/image(5).png b/_images/image(5).png old mode 100644 new mode 100755 diff --git a/_images/image(6).png b/_images/image(6).png old mode 100644 new mode 100755 diff --git a/_images/image(7).png b/_images/image(7).png old mode 100644 new mode 100755 diff --git a/_images/image(8).png b/_images/image(8).png old mode 100644 new mode 100755 diff --git a/_images/imagen_1.png b/_images/imagen_1.png old mode 100644 new mode 100755 diff --git a/_images/imagen_10.png b/_images/imagen_10.png old mode 100644 new mode 100755 diff --git a/_images/imagen_11.png b/_images/imagen_11.png old mode 100644 new mode 100755 diff --git a/_images/imagen_12.png b/_images/imagen_12.png old mode 100644 new mode 100755 diff --git a/_images/imagen_13.png b/_images/imagen_13.png old mode 100644 new mode 100755 diff --git a/_images/imagen_2.png b/_images/imagen_2.png old mode 100644 new mode 100755 diff --git a/_images/imagen_3.png b/_images/imagen_3.png old mode 100644 new mode 100755 diff --git a/_images/imagen_5.png b/_images/imagen_5.png old mode 100644 new mode 100755 diff --git a/_images/imagen_6.png b/_images/imagen_6.png old mode 100644 new mode 100755 diff --git a/_images/imagen_7.png b/_images/imagen_7.png old mode 100644 new mode 100755 diff --git a/_images/imagen_8.png b/_images/imagen_8.png old mode 100644 new mode 100755 diff --git a/_images/imagen_9.png b/_images/imagen_9.png old mode 100644 new mode 100755 diff --git a/_images/imagen_editor_01.png b/_images/imagen_editor_01.png old mode 100644 new mode 100755 diff --git a/_images/imagen_editor_02.png b/_images/imagen_editor_02.png old mode 100644 new mode 100755 diff --git a/_images/imagen_editor_03.png b/_images/imagen_editor_03.png old mode 100644 new mode 100755 diff --git a/_images/imagen_editor_04.png b/_images/imagen_editor_04.png old mode 100644 new mode 100755 diff --git a/_images/imagen_editor_05.png b/_images/imagen_editor_05.png old mode 100644 new mode 100755 diff --git a/_images/imagen_editor_06.png b/_images/imagen_editor_06.png old mode 100644 new mode 100755 diff --git a/_images/img.png b/_images/img.png old mode 100644 new mode 100755 diff --git a/_images/img0.png b/_images/img0.png old mode 100644 new mode 100755 diff --git a/_images/img01.png b/_images/img01.png old mode 100644 new mode 100755 diff --git a/_images/img02.png b/_images/img02.png old mode 100644 new mode 100755 diff --git a/_images/img03.png b/_images/img03.png old mode 100644 new mode 100755 diff --git a/_images/img04.png b/_images/img04.png old mode 100644 new mode 100755 diff --git a/_images/img1.png b/_images/img1.png old mode 100644 new mode 100755 diff --git a/_images/img10.png b/_images/img10.png old mode 100644 new mode 100755 diff --git a/_images/img101.png b/_images/img101.png old mode 100644 new mode 100755 diff --git a/_images/img102.png b/_images/img102.png old mode 100644 new mode 100755 diff --git a/_images/img103.png b/_images/img103.png old mode 100644 new mode 100755 diff --git a/_images/img11.png b/_images/img11.png old mode 100644 new mode 100755 diff --git a/_images/img110.png b/_images/img110.png old mode 100644 new mode 100755 diff --git a/_images/img111.png b/_images/img111.png old mode 100644 new mode 100755 diff --git a/_images/img112.png b/_images/img112.png old mode 100644 new mode 100755 diff --git a/_images/img113.png b/_images/img113.png old mode 100644 new mode 100755 diff --git a/_images/img114.png b/_images/img114.png old mode 100644 new mode 100755 diff --git a/_images/img12.png b/_images/img12.png old mode 100644 new mode 100755 diff --git a/_images/img121.png b/_images/img121.png old mode 100644 new mode 100755 diff --git a/_images/img122.png b/_images/img122.png old mode 100644 new mode 100755 diff --git a/_images/img123.png b/_images/img123.png old mode 100644 new mode 100755 diff --git a/_images/img13.png b/_images/img13.png old mode 100644 new mode 100755 diff --git a/_images/img131.png b/_images/img131.png old mode 100644 new mode 100755 diff --git a/_images/img132.png b/_images/img132.png old mode 100644 new mode 100755 diff --git a/_images/img14.png b/_images/img14.png old mode 100644 new mode 100755 diff --git a/_images/img141.png b/_images/img141.png old mode 100644 new mode 100755 diff --git a/_images/img15.png b/_images/img15.png old mode 100644 new mode 100755 diff --git a/_images/img151.png b/_images/img151.png old mode 100644 new mode 100755 diff --git a/_images/img16.png b/_images/img16.png old mode 100644 new mode 100755 diff --git a/_images/img161.png b/_images/img161.png old mode 100644 new mode 100755 diff --git a/_images/img17.png b/_images/img17.png old mode 100644 new mode 100755 diff --git a/_images/img171.png b/_images/img171.png old mode 100644 new mode 100755 diff --git a/_images/img18.png b/_images/img18.png old mode 100644 new mode 100755 diff --git a/_images/img181.png b/_images/img181.png old mode 100644 new mode 100755 diff --git a/_images/img19.png b/_images/img19.png old mode 100644 new mode 100755 diff --git a/_images/img2.png b/_images/img2.png old mode 100644 new mode 100755 diff --git a/_images/img21.png b/_images/img21.png old mode 100644 new mode 100755 diff --git a/_images/img22.png b/_images/img22.png old mode 100644 new mode 100755 diff --git a/_images/img23.png b/_images/img23.png old mode 100644 new mode 100755 diff --git a/_images/img24.png b/_images/img24.png old mode 100644 new mode 100755 diff --git a/_images/img25.png b/_images/img25.png old mode 100644 new mode 100755 diff --git a/_images/img26.png b/_images/img26.png old mode 100644 new mode 100755 diff --git a/_images/img3.png b/_images/img3.png old mode 100644 new mode 100755 diff --git a/_images/img31.png b/_images/img31.png old mode 100644 new mode 100755 diff --git a/_images/img32.png b/_images/img32.png old mode 100644 new mode 100755 diff --git a/_images/img33.png b/_images/img33.png old mode 100644 new mode 100755 diff --git a/_images/img34.png b/_images/img34.png old mode 100644 new mode 100755 diff --git a/_images/img35.png b/_images/img35.png old mode 100644 new mode 100755 diff --git a/_images/img36.png b/_images/img36.png old mode 100644 new mode 100755 diff --git a/_images/img4.png b/_images/img4.png old mode 100644 new mode 100755 diff --git a/_images/img41.png b/_images/img41.png old mode 100644 new mode 100755 diff --git a/_images/img42.png b/_images/img42.png old mode 100644 new mode 100755 diff --git a/_images/img43.png b/_images/img43.png old mode 100644 new mode 100755 diff --git a/_images/img44.png b/_images/img44.png old mode 100644 new mode 100755 diff --git a/_images/img45.png b/_images/img45.png old mode 100644 new mode 100755 diff --git a/_images/img5.png b/_images/img5.png old mode 100644 new mode 100755 diff --git a/_images/img51.png b/_images/img51.png old mode 100644 new mode 100755 diff --git a/_images/img52.png b/_images/img52.png old mode 100644 new mode 100755 diff --git a/_images/img53.png b/_images/img53.png old mode 100644 new mode 100755 diff --git a/_images/img54.png b/_images/img54.png old mode 100644 new mode 100755 diff --git a/_images/img55.png b/_images/img55.png old mode 100644 new mode 100755 diff --git a/_images/img6.png b/_images/img6.png old mode 100644 new mode 100755 diff --git a/_images/img61.png b/_images/img61.png old mode 100644 new mode 100755 diff --git a/_images/img62.png b/_images/img62.png old mode 100644 new mode 100755 diff --git a/_images/img63.png b/_images/img63.png old mode 100644 new mode 100755 diff --git a/_images/img64.png b/_images/img64.png old mode 100644 new mode 100755 diff --git a/_images/img65.png b/_images/img65.png old mode 100644 new mode 100755 diff --git a/_images/img7.png b/_images/img7.png old mode 100644 new mode 100755 diff --git a/_images/img71.png b/_images/img71.png old mode 100644 new mode 100755 diff --git a/_images/img72.png b/_images/img72.png old mode 100644 new mode 100755 diff --git a/_images/img73.png b/_images/img73.png old mode 100644 new mode 100755 diff --git a/_images/img74.png b/_images/img74.png old mode 100644 new mode 100755 diff --git a/_images/img75.png b/_images/img75.png old mode 100644 new mode 100755 diff --git a/_images/img8.png b/_images/img8.png old mode 100644 new mode 100755 diff --git a/_images/img81.png b/_images/img81.png old mode 100644 new mode 100755 diff --git a/_images/img82.png b/_images/img82.png old mode 100644 new mode 100755 diff --git a/_images/img83.png b/_images/img83.png old mode 100644 new mode 100755 diff --git a/_images/img84.png b/_images/img84.png old mode 100644 new mode 100755 diff --git a/_images/img85.png b/_images/img85.png old mode 100644 new mode 100755 diff --git a/_images/img9.png b/_images/img9.png old mode 100644 new mode 100755 diff --git a/_images/img91.png b/_images/img91.png old mode 100644 new mode 100755 diff --git a/_images/img92.png b/_images/img92.png old mode 100644 new mode 100755 diff --git a/_images/img93.png b/_images/img93.png old mode 100644 new mode 100755 diff --git a/_images/img94.png b/_images/img94.png old mode 100644 new mode 100755 diff --git a/_images/img_00.png b/_images/img_00.png old mode 100644 new mode 100755 diff --git a/_images/img_001.png b/_images/img_001.png old mode 100644 new mode 100755 diff --git a/_images/img_002.png b/_images/img_002.png old mode 100644 new mode 100755 diff --git a/_images/img_01.png b/_images/img_01.png old mode 100644 new mode 100755 diff --git a/_images/img_011.png b/_images/img_011.png old mode 100644 new mode 100755 diff --git a/_images/img_012.png b/_images/img_012.png old mode 100644 new mode 100755 diff --git a/_images/img_02.png b/_images/img_02.png old mode 100644 new mode 100755 diff --git a/_images/img_021.png b/_images/img_021.png old mode 100644 new mode 100755 diff --git a/_images/img_022.png b/_images/img_022.png old mode 100644 new mode 100755 diff --git a/_images/img_03.png b/_images/img_03.png old mode 100644 new mode 100755 diff --git a/_images/img_031.png b/_images/img_031.png old mode 100644 new mode 100755 diff --git a/_images/img_032.png b/_images/img_032.png old mode 100644 new mode 100755 diff --git a/_images/img_04.png b/_images/img_04.png old mode 100644 new mode 100755 diff --git a/_images/img_041.png b/_images/img_041.png old mode 100644 new mode 100755 diff --git a/_images/img_05.png b/_images/img_05.png old mode 100644 new mode 100755 diff --git a/_images/img_051.png b/_images/img_051.png old mode 100644 new mode 100755 diff --git a/_images/img_06.png b/_images/img_06.png old mode 100644 new mode 100755 diff --git a/_images/img_061.png b/_images/img_061.png old mode 100644 new mode 100755 diff --git a/_images/img_062.png b/_images/img_062.png old mode 100644 new mode 100755 diff --git a/_images/img_07.png b/_images/img_07.png old mode 100644 new mode 100755 diff --git a/_images/img_071.png b/_images/img_071.png old mode 100644 new mode 100755 diff --git a/_images/img_08.png b/_images/img_08.png old mode 100644 new mode 100755 diff --git a/_images/img_081.png b/_images/img_081.png old mode 100644 new mode 100755 diff --git a/_images/img_082.png b/_images/img_082.png old mode 100644 new mode 100755 diff --git a/_images/img_09.png b/_images/img_09.png old mode 100644 new mode 100755 diff --git a/_images/img_091.png b/_images/img_091.png old mode 100644 new mode 100755 diff --git a/_images/img_092.png b/_images/img_092.png old mode 100644 new mode 100755 diff --git a/_images/img_10.png b/_images/img_10.png old mode 100644 new mode 100755 diff --git a/_images/img_101.png b/_images/img_101.png old mode 100644 new mode 100755 diff --git a/_images/img_102.png b/_images/img_102.png old mode 100644 new mode 100755 diff --git a/_images/img_11.png b/_images/img_11.png old mode 100644 new mode 100755 diff --git a/_images/img_111.png b/_images/img_111.png old mode 100644 new mode 100755 diff --git a/_images/img_112.png b/_images/img_112.png old mode 100644 new mode 100755 diff --git a/_images/img_12.png b/_images/img_12.png old mode 100644 new mode 100755 diff --git a/_images/img_121.png b/_images/img_121.png old mode 100644 new mode 100755 diff --git a/_images/img_13.png b/_images/img_13.png old mode 100644 new mode 100755 diff --git a/_images/img_131.png b/_images/img_131.png old mode 100644 new mode 100755 diff --git a/_images/img_14.png b/_images/img_14.png old mode 100644 new mode 100755 diff --git a/_images/img_141.png b/_images/img_141.png old mode 100644 new mode 100755 diff --git a/_images/img_15.png b/_images/img_15.png old mode 100644 new mode 100755 diff --git a/_images/img_151.png b/_images/img_151.png old mode 100644 new mode 100755 diff --git a/_images/img_16.png b/_images/img_16.png old mode 100644 new mode 100755 diff --git a/_images/img_161.png b/_images/img_161.png old mode 100644 new mode 100755 diff --git a/_images/img_17.png b/_images/img_17.png old mode 100644 new mode 100755 diff --git a/_images/img_171.png b/_images/img_171.png old mode 100644 new mode 100755 diff --git a/_images/img_18.png b/_images/img_18.png old mode 100644 new mode 100755 diff --git a/_images/img_181.png b/_images/img_181.png old mode 100644 new mode 100755 diff --git a/_images/img_19.png b/_images/img_19.png old mode 100644 new mode 100755 diff --git a/_images/img_191.png b/_images/img_191.png old mode 100644 new mode 100755 diff --git a/_images/img_19_2.png b/_images/img_19_2.png old mode 100644 new mode 100755 diff --git a/_images/img_20.png b/_images/img_20.png old mode 100644 new mode 100755 diff --git a/_images/img_201.png b/_images/img_201.png old mode 100644 new mode 100755 diff --git a/_images/img_21.png b/_images/img_21.png old mode 100644 new mode 100755 diff --git a/_images/img_211.png b/_images/img_211.png old mode 100644 new mode 100755 diff --git a/_images/img_22.png b/_images/img_22.png old mode 100644 new mode 100755 diff --git a/_images/img_221.png b/_images/img_221.png old mode 100644 new mode 100755 diff --git a/_images/img_23.png b/_images/img_23.png old mode 100644 new mode 100755 diff --git a/_images/img_231.png b/_images/img_231.png old mode 100644 new mode 100755 diff --git a/_images/img_24.png b/_images/img_24.png old mode 100644 new mode 100755 diff --git a/_images/img_241.png b/_images/img_241.png old mode 100644 new mode 100755 diff --git a/_images/img_25.png b/_images/img_25.png old mode 100644 new mode 100755 diff --git a/_images/img_26.png b/_images/img_26.png old mode 100644 new mode 100755 diff --git a/_images/img_261.png b/_images/img_261.png old mode 100644 new mode 100755 diff --git a/_images/img_27.png b/_images/img_27.png old mode 100644 new mode 100755 diff --git a/_images/img_271.png b/_images/img_271.png old mode 100644 new mode 100755 diff --git a/_images/img_28.png b/_images/img_28.png old mode 100644 new mode 100755 diff --git a/_images/img_281.png b/_images/img_281.png old mode 100644 new mode 100755 diff --git a/_images/img_29.png b/_images/img_29.png old mode 100644 new mode 100755 diff --git a/_images/img_291.png b/_images/img_291.png old mode 100644 new mode 100755 diff --git a/_images/img_30.png b/_images/img_30.png old mode 100644 new mode 100755 diff --git a/_images/img_301.png b/_images/img_301.png old mode 100644 new mode 100755 diff --git a/_images/img_31.png b/_images/img_31.png old mode 100644 new mode 100755 diff --git a/_images/img_32.png b/_images/img_32.png old mode 100644 new mode 100755 diff --git a/_images/img_33.png b/_images/img_33.png old mode 100644 new mode 100755 diff --git a/_images/img_34.png b/_images/img_34.png old mode 100644 new mode 100755 diff --git a/_images/img_35.png b/_images/img_35.png old mode 100644 new mode 100755 diff --git a/_images/img_36.png b/_images/img_36.png old mode 100644 new mode 100755 diff --git a/_images/img_37.png b/_images/img_37.png old mode 100644 new mode 100755 diff --git a/_images/img_38.png b/_images/img_38.png old mode 100644 new mode 100755 diff --git a/_images/img_39.png b/_images/img_39.png old mode 100644 new mode 100755 diff --git a/_images/img_40.png b/_images/img_40.png old mode 100644 new mode 100755 diff --git a/_images/img_41.png b/_images/img_41.png old mode 100644 new mode 100755 diff --git a/_images/img_42.png b/_images/img_42.png old mode 100644 new mode 100755 diff --git a/_images/img_43.png b/_images/img_43.png old mode 100644 new mode 100755 diff --git a/_images/img_44.png b/_images/img_44.png old mode 100644 new mode 100755 diff --git a/_images/img_results.png b/_images/img_results.png old mode 100644 new mode 100755 diff --git a/_images/improved_ddpm_eq.png b/_images/improved_ddpm_eq.png old mode 100644 new mode 100755 diff --git a/_images/improved_ddpm_pic.png b/_images/improved_ddpm_pic.png old mode 100644 new mode 100755 diff --git a/_images/interpolation.png b/_images/interpolation.png old mode 100644 new mode 100755 diff --git a/_images/layout_to_image.png b/_images/layout_to_image.png old mode 100644 new mode 100755 diff --git a/_images/ldm_01.png b/_images/ldm_01.png old mode 100644 new mode 100755 diff --git a/_images/ldm_02.png b/_images/ldm_02.png old mode 100644 new mode 100755 diff --git a/_images/ldm_03.png b/_images/ldm_03.png old mode 100644 new mode 100755 diff --git a/_images/ldm_04.png b/_images/ldm_04.png old mode 100644 new mode 100755 diff --git a/_images/ldm_05.png b/_images/ldm_05.png old mode 100644 new mode 100755 diff --git a/_images/ldm_06.png b/_images/ldm_06.png old mode 100644 new mode 100755 diff --git a/_images/ldm_07.png b/_images/ldm_07.png old mode 100644 new mode 100755 diff --git a/_images/ldm_08.png b/_images/ldm_08.png old mode 100644 new mode 100755 diff --git a/_images/ldm_09.png b/_images/ldm_09.png old mode 100644 new mode 100755 diff --git a/_images/leaf_db.png b/_images/leaf_db.png old mode 100644 new mode 100755 diff --git a/_images/leaf_pp.png b/_images/leaf_pp.png old mode 100644 new mode 100755 diff --git a/_images/leaf_sd.png b/_images/leaf_sd.png old mode 100644 new mode 100755 diff --git a/_images/limit.png b/_images/limit.png old mode 100644 new mode 100755 diff --git a/_images/loss.png b/_images/loss.png old mode 100644 new mode 100755 diff --git a/_images/maskgit_1.png b/_images/maskgit_1.png old mode 100644 new mode 100755 diff --git a/_images/maskgit_2.png b/_images/maskgit_2.png old mode 100644 new mode 100755 diff --git a/_images/multi_aspect_ratio.png b/_images/multi_aspect_ratio.png old mode 100644 new mode 100755 diff --git a/_images/multiple_db.png b/_images/multiple_db.png old mode 100644 new mode 100755 diff --git a/_images/multiple_ex.png b/_images/multiple_ex.png old mode 100644 new mode 100755 diff --git a/_images/multiple_pp.png b/_images/multiple_pp.png old mode 100644 new mode 100755 diff --git a/_images/multiple_sd.png b/_images/multiple_sd.png old mode 100644 new mode 100755 diff --git a/_images/notebook-example_2_1.png b/_images/notebook-example_2_1.png old mode 100644 new mode 100755 diff --git a/_images/photo_db.png b/_images/photo_db.png old mode 100644 new mode 100755 diff --git a/_images/photo_pp.png b/_images/photo_pp.png old mode 100644 new mode 100755 diff --git a/_images/photo_sd.png b/_images/photo_sd.png old mode 100644 new mode 100755 diff --git a/_images/pirate.png b/_images/pirate.png old mode 100644 new mode 100755 diff --git a/_images/plot_result.png b/_images/plot_result.png old mode 100644 new mode 100755 diff --git a/_images/pose.png b/_images/pose.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_01.png b/_images/progressive_distillation_01.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_02.png b/_images/progressive_distillation_02.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_03.png b/_images/progressive_distillation_03.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_04.png b/_images/progressive_distillation_04.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_05.png b/_images/progressive_distillation_05.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_06.png b/_images/progressive_distillation_06.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_07.png b/_images/progressive_distillation_07.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_08.png b/_images/progressive_distillation_08.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_09.png b/_images/progressive_distillation_09.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_10.png b/_images/progressive_distillation_10.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_11.png b/_images/progressive_distillation_11.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_12.png b/_images/progressive_distillation_12.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_13.png b/_images/progressive_distillation_13.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_14.png b/_images/progressive_distillation_14.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_15.png b/_images/progressive_distillation_15.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_16.png b/_images/progressive_distillation_16.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_17.png b/_images/progressive_distillation_17.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_18.png b/_images/progressive_distillation_18.png old mode 100644 new mode 100755 diff --git a/_images/progressive_distillation_19.png b/_images/progressive_distillation_19.png old mode 100644 new mode 100755 diff --git a/_images/result_base.png b/_images/result_base.png old mode 100644 new mode 100755 diff --git a/_images/result_new.png b/_images/result_new.png old mode 100644 new mode 100755 diff --git a/_images/sdxl_result.png b/_images/sdxl_result.png old mode 100644 new mode 100755 diff --git a/_images/sea.png b/_images/sea.png old mode 100644 new mode 100755 diff --git a/_images/seg.png b/_images/seg.png old mode 100644 new mode 100755 diff --git a/_images/structure.png b/_images/structure.png old mode 100644 new mode 100755 diff --git a/_images/StyleGAN_fig1.png b/_images/styleGAN_fig1.png old mode 100644 new mode 100755 similarity index 100% rename from _images/StyleGAN_fig1.png rename to _images/styleGAN_fig1.png diff --git a/_images/StyleGAN_fig2.png b/_images/styleGAN_fig2.png old mode 100644 new mode 100755 similarity index 100% rename from _images/StyleGAN_fig2.png rename to _images/styleGAN_fig2.png diff --git a/_images/StyleGAN_fig3.png b/_images/styleGAN_fig3.png old mode 100644 new mode 100755 similarity index 100% rename from _images/StyleGAN_fig3.png rename to _images/styleGAN_fig3.png diff --git a/_images/StyleGAN_fig4.png b/_images/styleGAN_fig4.png old mode 100644 new mode 100755 similarity index 100% rename from _images/StyleGAN_fig4.png rename to _images/styleGAN_fig4.png diff --git a/_images/StyleGAN_fig5.png b/_images/styleGAN_fig5.png old mode 100644 new mode 100755 similarity index 100% rename from _images/StyleGAN_fig5.png rename to _images/styleGAN_fig5.png diff --git a/_images/StyleGAN_fig6.png b/_images/styleGAN_fig6.png old mode 100644 new mode 100755 similarity index 100% rename from _images/StyleGAN_fig6.png rename to _images/styleGAN_fig6.png diff --git a/_images/StyleGAN_fig7.png b/_images/styleGAN_fig7.png old mode 100644 new mode 100755 similarity index 100% rename from _images/StyleGAN_fig7.png rename to _images/styleGAN_fig7.png diff --git a/_images/StyleGAN_fig8.png b/_images/styleGAN_fig8.png old mode 100644 new mode 100755 similarity index 100% rename from _images/StyleGAN_fig8.png rename to _images/styleGAN_fig8.png diff --git a/_images/swjo_exp_01.png b/_images/swjo_exp_01.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_02.png b/_images/swjo_exp_02.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_03.png b/_images/swjo_exp_03.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_04.png b/_images/swjo_exp_04.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_05.png b/_images/swjo_exp_05.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_06.png b/_images/swjo_exp_06.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_07.png b/_images/swjo_exp_07.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_08.png b/_images/swjo_exp_08.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_09.png b/_images/swjo_exp_09.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_10.png b/_images/swjo_exp_10.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_11.png b/_images/swjo_exp_11.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_12.png b/_images/swjo_exp_12.png old mode 100644 new mode 100755 diff --git a/_images/swjo_exp_13.png b/_images/swjo_exp_13.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_01.png b/_images/t2i_adapter_01.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_02.png b/_images/t2i_adapter_02.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_03.png b/_images/t2i_adapter_03.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_04.png b/_images/t2i_adapter_04.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_05.png b/_images/t2i_adapter_05.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_06.png b/_images/t2i_adapter_06.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_07.png b/_images/t2i_adapter_07.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_08.png b/_images/t2i_adapter_08.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_09.png b/_images/t2i_adapter_09.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_10.png b/_images/t2i_adapter_10.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_11.png b/_images/t2i_adapter_11.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_12.png b/_images/t2i_adapter_12.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_13.png b/_images/t2i_adapter_13.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_14.png b/_images/t2i_adapter_14.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_15.png b/_images/t2i_adapter_15.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_16.png b/_images/t2i_adapter_16.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_17.png b/_images/t2i_adapter_17.png old mode 100644 new mode 100755 diff --git a/_images/t2i_adapter_18.png b/_images/t2i_adapter_18.png old mode 100644 new mode 100755 diff --git a/_images/table1.png b/_images/table1.png old mode 100644 new mode 100755 diff --git a/_images/table2.png b/_images/table2.png old mode 100644 new mode 100755 diff --git a/_images/table4_5.png b/_images/table4_5.png old mode 100644 new mode 100755 diff --git a/_images/table_1.png b/_images/table_1.png old mode 100644 new mode 100755 diff --git a/_images/table_2.png b/_images/table_2.png old mode 100644 new mode 100755 diff --git a/_images/table_3.png b/_images/table_3.png old mode 100644 new mode 100755 diff --git a/_images/table_31.png b/_images/table_31.png old mode 100644 new mode 100755 diff --git a/_images/table_6.png b/_images/table_6.png old mode 100644 new mode 100755 diff --git a/_images/text_to_image.png b/_images/text_to_image.png old mode 100644 new mode 100755 diff --git a/_images/title_fig.png b/_images/title_fig.png old mode 100644 new mode 100755 diff --git a/_images/trade_off.png b/_images/trade_off.png old mode 100644 new mode 100755 diff --git a/_images/training_result.png b/_images/training_result.png old mode 100644 new mode 100755 diff --git a/_images/vae_01.png b/_images/vae_01.png old mode 100644 new mode 100755 diff --git a/_images/vae_05.png b/_images/vae_05.png old mode 100644 new mode 100755 diff --git a/_images/vae_07.png b/_images/vae_07.png old mode 100644 new mode 100755 diff --git a/_images/vae_08.png b/_images/vae_08.png old mode 100644 new mode 100755 diff --git a/_images/vae_09.png b/_images/vae_09.png old mode 100644 new mode 100755 diff --git a/_images/vae_10.png b/_images/vae_10.png old mode 100644 new mode 100755 diff --git a/_images/vae_11.png b/_images/vae_11.png old mode 100644 new mode 100755 diff --git a/_images/wallpaper.png b/_images/wallpaper.png old mode 100644 new mode 100755 diff --git a/_panels_static/panels-main.c949a650a448cc0ae9fd3441c0e17fb0.css b/_panels_static/panels-main.c949a650a448cc0ae9fd3441c0e17fb0.css old mode 100644 new mode 100755 index fc14abc8..6556403c --- a/_panels_static/panels-main.c949a650a448cc0ae9fd3441c0e17fb0.css +++ b/_panels_static/panels-main.c949a650a448cc0ae9fd3441c0e17fb0.css @@ -1 +1 @@ -details.dropdown .summary-title{padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.dropdown:hover{cursor:pointer}details.dropdown .summary-content{cursor:default}details.dropdown summary{list-style:none;padding:1em}details.dropdown summary .octicon.no-title{vertical-align:middle}details.dropdown[open] summary .octicon.no-title{visibility:hidden}details.dropdown summary::-webkit-details-marker{display:none}details.dropdown summary:focus{outline:none}details.dropdown summary:hover .summary-up svg,details.dropdown summary:hover .summary-down svg{opacity:1}details.dropdown .summary-up svg,details.dropdown .summary-down svg{display:block;opacity:.6}details.dropdown .summary-up,details.dropdown .summary-down{pointer-events:none;position:absolute;right:1em;top:.75em}details.dropdown[open] .summary-down{visibility:hidden}details.dropdown:not([open]) .summary-up{visibility:hidden}details.dropdown.fade-in[open] summary~*{-moz-animation:panels-fade-in .5s ease-in-out;-webkit-animation:panels-fade-in .5s ease-in-out;animation:panels-fade-in .5s ease-in-out}details.dropdown.fade-in-slide-down[open] summary~*{-moz-animation:panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out;-webkit-animation:panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out;animation:panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out}@keyframes panels-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes panels-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.octicon{display:inline-block;fill:currentColor;vertical-align:text-top}.tabbed-content{box-shadow:0 -.0625rem var(--tabs-color-overline),0 .0625rem var(--tabs-color-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.tabbed-content>:first-child{margin-top:0 !important}.tabbed-content>:last-child{margin-bottom:0 !important}.tabbed-content>.tabbed-set{margin:0}.tabbed-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.tabbed-set>input{opacity:0;position:absolute}.tabbed-set>input:checked+label{border-color:var(--tabs-color-label-active);color:var(--tabs-color-label-active)}.tabbed-set>input:checked+label+.tabbed-content{display:block}.tabbed-set>input:focus+label{outline-style:auto}.tabbed-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.tabbed-set>label{border-bottom:.125rem solid transparent;color:var(--tabs-color-label-inactive);cursor:pointer;font-size:var(--tabs-size-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .tabbed-set>label:hover{color:var(--tabs-color-label-active)} +details.dropdown .summary-title{padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.dropdown:hover{cursor:pointer}details.dropdown .summary-content{cursor:default}details.dropdown summary{list-style:none;padding:1em}details.dropdown summary .octicon.no-title{vertical-align:middle}details.dropdown[open] summary .octicon.no-title{visibility:hidden}details.dropdown summary::-webkit-details-marker{display:none}details.dropdown summary:focus{outline:none}details.dropdown summary:hover .summary-up svg,details.dropdown summary:hover .summary-down svg{opacity:1}details.dropdown .summary-up svg,details.dropdown .summary-down svg{display:block;opacity:.6}details.dropdown .summary-up,details.dropdown .summary-down{pointer-events:none;position:absolute;right:1em;top:.75em}details.dropdown[open] .summary-down{visibility:hidden}details.dropdown:not([open]) .summary-up{visibility:hidden}details.dropdown.fade-in[open] summary~*{-moz-animation:panels-fade-in .5s ease-in-out;-webkit-animation:panels-fade-in .5s ease-in-out;animation:panels-fade-in .5s ease-in-out}details.dropdown.fade-in-slide-down[open] summary~*{-moz-animation:panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out;-webkit-animation:panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out;animation:panels-fade-in .5s ease-in-out, panels-slide-down .5s ease-in-out}@keyframes panels-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes panels-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.octicon{display:inline-block;fill:currentColor;vertical-align:text-top}.tabbed-content{box-shadow:0 -.0625rem var(--tabs-color-overline),0 .0625rem var(--tabs-color-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.tabbed-content>:first-child{margin-top:0 !important}.tabbed-content>:last-child{margin-bottom:0 !important}.tabbed-content>.tabbed-set{margin:0}.tabbed-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.tabbed-set>input{opacity:0;position:absolute}.tabbed-set>input:checked+label{border-color:var(--tabs-color-label-active);color:var(--tabs-color-label-active)}.tabbed-set>input:checked+label+.tabbed-content{display:block}.tabbed-set>input:focus+label{outline-style:auto}.tabbed-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.tabbed-set>label{border-bottom:.125rem solid transparent;color:var(--tabs-color-label-inactive);cursor:pointer;font-size:var(--tabs-size-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .tabbed-set>label:hover{color:var(--tabs-color-label-active)} diff --git a/_panels_static/panels-variables.06eb56fa6e07937060861dad626602ad.css b/_panels_static/panels-variables.06eb56fa6e07937060861dad626602ad.css old mode 100644 new mode 100755 index adc61662..83fb209c --- a/_panels_static/panels-variables.06eb56fa6e07937060861dad626602ad.css +++ b/_panels_static/panels-variables.06eb56fa6e07937060861dad626602ad.css @@ -1,7 +1,7 @@ -:root { ---tabs-color-label-active: hsla(231, 99%, 66%, 1); ---tabs-color-label-inactive: rgba(178, 206, 245, 0.62); ---tabs-color-overline: rgb(207, 236, 238); ---tabs-color-underline: rgb(207, 236, 238); ---tabs-size-label: 1rem; +:root { +--tabs-color-label-active: hsla(231, 99%, 66%, 1); +--tabs-color-label-inactive: rgba(178, 206, 245, 0.62); +--tabs-color-overline: rgb(207, 236, 238); +--tabs-color-underline: rgb(207, 236, 238); +--tabs-size-label: 1rem; } \ No newline at end of file diff --git a/_sources/docs/experiments/js_exp.md b/_sources/docs/experiments/js_exp.md old mode 100644 new mode 100755 index 734763b3..62df547d --- a/_sources/docs/experiments/js_exp.md +++ b/_sources/docs/experiments/js_exp.md @@ -1,188 +1,188 @@ -``` {admonition} Information -- **Title:** Synthetic Data with Stable Diffusion for Foliar Disease Classification - -- **Author:** Jisu Kim - -- **Last updated on Jul. 05, 2023** -``` - -# Synthetic Data with Stable Diffusion for Foliar Disease Classification - -## 1. 개요 - -- 사과 나무의 잎에 생기는 질병을 이미지로 판별하는 Kaggle competition ([링크](https://www.kaggle.com/competitions/plant-pathology-2020-fgvc7))에서 아이디어를 얻어서 진행한 프로젝트입니다. -- 해당 competition은 사과나무 잎에 걸린 질병에 따라 잎 이미지를 4개의 class로 분류하는 task입니다. - -:::{figure-md} -4classes - -4 classes of leaves -::: -- competition을 설명한 article ([링크](https://bsapubs.onlinelibrary.wiley.com/doi/10.1002/aps3.11390))에서 전체적인 accuracy는 97%이지만 multiple diseases class의 경우 accuracy가 51%에 불과했다고 언급합니다. -- multiple diseases class의 이미지 개수가 다른 class에 비해 적은 점에 주목했고, stable diffusion을 사용하여 해당 클래스의 데이터 개수를 늘려서 classifier 학습에 사용하면 더 좋은 성능의 classifier를 얻을 수 있을 것으로 기대했습니다. - - -## 2. Baseline 구축 - -- 문제 상황을 재현하기 위해 기존 데이터로 image classifier를 학습하여 baseline으로 잡았습니다. -- 모델은 pretrained된 ResNet18에 linear layer를 붙여서 사용했습니다. -- 전체 accuracy는 97.7%, class별 accuracy는 healthy: 99.6%, multiple diseases: 73.6%, rust: 99.2%, scab: 98.1% -- multiple diseases class는 이미지 개수 91개로 다른 클래스들에 비해서 개수가 적습니다. -- class별 data imbalance가 성능을 낮추는 원인일 것이라 가정하고 stable diffusion으로 multiple diseases class의 data를 추가로 생성해보기로 했습니다. -- multiple diseases class 예시 - -:::{figure-md} -multiple_ex - -4 classes of leaves -::: - -## 3. Stable diffusion fine tuning - -- pretraned stable diffusion의 경우 multiple diseases class에 대한 정보가 없어서 이미지를 생성할 경우 아래와 같이 관련없는 이미지가 생성됩니다. - -:::{figure-md} -multiple_sd - -prompt: “a photo of leaves with multiple diseases -::: - -- 따라서 stable diffusion model ([링크](https://huggingface.co/runwayml/stable-diffusion-v1-5))에 해당 class에 대한 정보를 넣어주기 위해 dreambooth ([링크](https://arxiv.org/abs/2208.12242))를 사용하여 stable diffusion을 fine tuning했습니다. -- training에 사용한 prompt는 “a photo of a \ leaf”이며, 생성한 이미지의 예시는 아래와 같습니다. -- 생성 이미지 예시 - -:::{figure-md} -multiple_db - -prompt: “a photo of a \ leaf” -::: -- prompt engineering을 수행하던 중 의도하지않은 결과를 발견했습니다. -- 아래는 이에 대한 예시로 fine tuning 전의 stable diffusion model의 결과와 비교입니다. -- 상황1 (prompt: “a photo of a leaf”) - -:::{figure-md} -leaf_sd - -fine tuning 전 -::: - -:::{figure-md} -leaf_db - -fine tuning 후 -::: - -- 상황1을 보면 multiple diseases class 정보를 담은 unique identifier \가 없음에도 multiple diseases의 정보를 담은 잎들만 생성됩니다. 이는 같은 class (leaf)에 속하는 다른 이미지들을 생성해내지 못하고 있다는 것입니다. 이 현상을 language drift라고 하며, 모델이 multiple diseases class의 leaf가 아닌 일반적인 leaf class에 관한 정보를 잊어버렸기 때문입니다. -- 상황2 (prompt: “a photo”) - -:::{figure-md} -photo_sd - -fine tuning 전 -::: - -:::{figure-md} -photo_db - -fine tuning 후 -::: - -- 상황2를 보면 photo라는 prompt만 사용하였는데도 생성한 이미지들에 multiple diseases class의 특징들이 나타납니다. -- dreambooth에서는 language drift를 prior preservation loss를 사용해서 해결하였으므로 같은 방법을 사용했습니다. 상황2를 해결하기 위해 training prompt에서 “photo”를 제외하고 최대한 단순한 prompt “\ leaf”를 사용하여 stable diffusion model을 다시 fine tuning했습니다. - -:::{figure-md} -multiple_pp - -multiple diseases class 이미지 생성 결과, prompt: “\ leaf” -::: - -:::{figure-md} -leaf_pp - -leaf 생성 결과, prompt: “leaf” -::: - -- 재훈련 결과, fine tuning 이후에도 기존 stable diffusion model로 “leaf”를 생성하였을 때와 비슷한 이미지가 생성됩니다. - -:::{figure-md} -photo_pp - -photo 생성 결과, prompt: “photo” -::: - -- “photo”의 경우에는 여전히 multiple diseases class의 영향을 받은 것같은 이미지들이 생성됩니다. photo의 경우에는 여러 대상들과 사용되는 일반적인 특성을 가지고있어서 그런 것이라는 생각이 들었고, 이를 체크해보기 위해 특정한 대상들과 photo와 비슷한 용도로 사용되는 다른 prompt들로 이미지들을 생성보았습니다. -- 특정한 대상 세가지로는 cat, sea, pirate을 사용했고, photo와 비슷하게 사용되는 텍스트 세가지는 illustration, animation, wallpaper를 사용했습니다. (이미지는 글 마지막 부분의 appendix에 있습니다.) -- 이미지 생성 결과, 특정한 대상을 지칭하는 텍스트의 경우 대상의 특징이 잘 드러나는 이미지가 생성되었지만, 여러 대상과 함께 쓰이는 텍스트의 경우 잎사귀의 특징을 가지는 이미지들이 일부 생성되었습니다. - - -## 4. 성능 비교 -- fine tuning한 stable diffusion model로 multiple diseases class의 이미지를 400장 생성하여 classifier를 다시 훈련했습니다. - -baseline -- 전체 accuracy는 97.7%, class별 accuracy는 healthy: 99.6%, multiple diseases: 73.6%, rust: 99.2%, scab: 98.1% - -:::{figure-md} -result_base - -result_base -::: - -생성한 이미지를 추가 데이터로 활용한 경우 -- 전체 accuracy는 97.9%, class별 accuracy는 healthy: 98.1%, multiple diseases: 84.6%, rust: 98.2%, scab: 99.3% - -:::{figure-md} -result_new - -result_now -::: - -- kaggle에서 제공하는 test set에 적용했을 때는 baseline이 94.6%, stable diffusion으로 생성한 이미지들을 사용한 경우가 93.7%여서 baseline보다 좋은 성능을 얻지는 못 했습니다. - -## 5. Discussion - -- stable diffusion 훈련 중간중간에 일정 step마다 이미지를 생성하게해서 훈련에 대한 모니터링이 있으면 좋겠다는 생각을 했습니다. -- stable diffusion 훈련시 hyperparameter tuning을 좀 더 철저하게 해야겠다는 생각을 했습니다. -- stable diffusion으로 생성한 이미지가 실제로 multiple diseases class 조건을 만족하는지 검수할 방안이 필요합니다. -- multiple diseases 내에서도 카테고리를 나눌 수 있다면 나눠서 각각에 대한 stable diffusion model을 fine tuning할 수도 있을 것입니다. -- 다른 diffusion model fine tuning 방법을 활용해볼 수도 있을 것입니다. -- submission score에서 baseline을 이기지 못 했지만 text-to-image model을 이용한 synthetic data의 가능성을 볼 수 있었다고 생각합니다. - -## 6. Appendix - -- 앞에서 언급한 prompt에 대한 이미지 생성 예시입니다. 일부 이미지는 NSFW로 판단되어 검은색으로 나왔습니다. - -:::{figure-md} -cat - -cat 생성 결과, prompt: “cat” -::: - -:::{figure-md} -sea - -sea 생성 결과, prompt: “sea” -::: - -:::{figure-md} -pirate - -pirate 생성 결과, prompt: “pirate” -::: - -:::{figure-md} -illustration - -illustration 생성 결과, prompt: “illustration” -::: - -:::{figure-md} -animation - -animation 생성 결과, prompt: “animation” -::: - -:::{figure-md} -wallpaper - -wallpaper 생성 결과, prompt: “wallpaper” -::: +``` {admonition} Information +- **Title:** Synthetic Data with Stable Diffusion for Foliar Disease Classification + +- **Author:** Jisu Kim + +- **Last updated on Jul. 05, 2023** +``` + +# Synthetic Data with Stable Diffusion for Foliar Disease Classification + +## 1. 개요 + +- 사과 나무의 잎에 생기는 질병을 이미지로 판별하는 Kaggle competition ([링크](https://www.kaggle.com/competitions/plant-pathology-2020-fgvc7))에서 아이디어를 얻어서 진행한 프로젝트입니다. +- 해당 competition은 사과나무 잎에 걸린 질병에 따라 잎 이미지를 4개의 class로 분류하는 task입니다. + +:::{figure-md} +4classes + +4 classes of leaves +::: +- competition을 설명한 article ([링크](https://bsapubs.onlinelibrary.wiley.com/doi/10.1002/aps3.11390))에서 전체적인 accuracy는 97%이지만 multiple diseases class의 경우 accuracy가 51%에 불과했다고 언급합니다. +- multiple diseases class의 이미지 개수가 다른 class에 비해 적은 점에 주목했고, stable diffusion을 사용하여 해당 클래스의 데이터 개수를 늘려서 classifier 학습에 사용하면 더 좋은 성능의 classifier를 얻을 수 있을 것으로 기대했습니다. + + +## 2. Baseline 구축 + +- 문제 상황을 재현하기 위해 기존 데이터로 image classifier를 학습하여 baseline으로 잡았습니다. +- 모델은 pretrained된 ResNet18에 linear layer를 붙여서 사용했습니다. +- 전체 accuracy는 97.7%, class별 accuracy는 healthy: 99.6%, multiple diseases: 73.6%, rust: 99.2%, scab: 98.1% +- multiple diseases class는 이미지 개수 91개로 다른 클래스들에 비해서 개수가 적습니다. +- class별 data imbalance가 성능을 낮추는 원인일 것이라 가정하고 stable diffusion으로 multiple diseases class의 data를 추가로 생성해보기로 했습니다. +- multiple diseases class 예시 + +:::{figure-md} +multiple_ex + +4 classes of leaves +::: + +## 3. Stable diffusion fine tuning + +- pretraned stable diffusion의 경우 multiple diseases class에 대한 정보가 없어서 이미지를 생성할 경우 아래와 같이 관련없는 이미지가 생성됩니다. + +:::{figure-md} +multiple_sd + +prompt: “a photo of leaves with multiple diseases +::: + +- 따라서 stable diffusion model ([링크](https://huggingface.co/runwayml/stable-diffusion-v1-5))에 해당 class에 대한 정보를 넣어주기 위해 dreambooth ([링크](https://arxiv.org/abs/2208.12242))를 사용하여 stable diffusion을 fine tuning했습니다. +- training에 사용한 prompt는 “a photo of a \ leaf”이며, 생성한 이미지의 예시는 아래와 같습니다. +- 생성 이미지 예시 + +:::{figure-md} +multiple_db + +prompt: “a photo of a \ leaf” +::: +- prompt engineering을 수행하던 중 의도하지않은 결과를 발견했습니다. +- 아래는 이에 대한 예시로 fine tuning 전의 stable diffusion model의 결과와 비교입니다. +- 상황1 (prompt: “a photo of a leaf”) + +:::{figure-md} +leaf_sd + +fine tuning 전 +::: + +:::{figure-md} +leaf_db + +fine tuning 후 +::: + +- 상황1을 보면 multiple diseases class 정보를 담은 unique identifier \가 없음에도 multiple diseases의 정보를 담은 잎들만 생성됩니다. 이는 같은 class (leaf)에 속하는 다른 이미지들을 생성해내지 못하고 있다는 것입니다. 이 현상을 language drift라고 하며, 모델이 multiple diseases class의 leaf가 아닌 일반적인 leaf class에 관한 정보를 잊어버렸기 때문입니다. +- 상황2 (prompt: “a photo”) + +:::{figure-md} +photo_sd + +fine tuning 전 +::: + +:::{figure-md} +photo_db + +fine tuning 후 +::: + +- 상황2를 보면 photo라는 prompt만 사용하였는데도 생성한 이미지들에 multiple diseases class의 특징들이 나타납니다. +- dreambooth에서는 language drift를 prior preservation loss를 사용해서 해결하였으므로 같은 방법을 사용했습니다. 상황2를 해결하기 위해 training prompt에서 “photo”를 제외하고 최대한 단순한 prompt “\ leaf”를 사용하여 stable diffusion model을 다시 fine tuning했습니다. + +:::{figure-md} +multiple_pp + +multiple diseases class 이미지 생성 결과, prompt: “\ leaf” +::: + +:::{figure-md} +leaf_pp + +leaf 생성 결과, prompt: “leaf” +::: + +- 재훈련 결과, fine tuning 이후에도 기존 stable diffusion model로 “leaf”를 생성하였을 때와 비슷한 이미지가 생성됩니다. + +:::{figure-md} +photo_pp + +photo 생성 결과, prompt: “photo” +::: + +- “photo”의 경우에는 여전히 multiple diseases class의 영향을 받은 것같은 이미지들이 생성됩니다. photo의 경우에는 여러 대상들과 사용되는 일반적인 특성을 가지고있어서 그런 것이라는 생각이 들었고, 이를 체크해보기 위해 특정한 대상들과 photo와 비슷한 용도로 사용되는 다른 prompt들로 이미지들을 생성보았습니다. +- 특정한 대상 세가지로는 cat, sea, pirate을 사용했고, photo와 비슷하게 사용되는 텍스트 세가지는 illustration, animation, wallpaper를 사용했습니다. (이미지는 글 마지막 부분의 appendix에 있습니다.) +- 이미지 생성 결과, 특정한 대상을 지칭하는 텍스트의 경우 대상의 특징이 잘 드러나는 이미지가 생성되었지만, 여러 대상과 함께 쓰이는 텍스트의 경우 잎사귀의 특징을 가지는 이미지들이 일부 생성되었습니다. + + +## 4. 성능 비교 +- fine tuning한 stable diffusion model로 multiple diseases class의 이미지를 400장 생성하여 classifier를 다시 훈련했습니다. + +baseline +- 전체 accuracy는 97.7%, class별 accuracy는 healthy: 99.6%, multiple diseases: 73.6%, rust: 99.2%, scab: 98.1% + +:::{figure-md} +result_base + +result_base +::: + +생성한 이미지를 추가 데이터로 활용한 경우 +- 전체 accuracy는 97.9%, class별 accuracy는 healthy: 98.1%, multiple diseases: 84.6%, rust: 98.2%, scab: 99.3% + +:::{figure-md} +result_new + +result_now +::: + +- kaggle에서 제공하는 test set에 적용했을 때는 baseline이 94.6%, stable diffusion으로 생성한 이미지들을 사용한 경우가 93.7%여서 baseline보다 좋은 성능을 얻지는 못 했습니다. + +## 5. Discussion + +- stable diffusion 훈련 중간중간에 일정 step마다 이미지를 생성하게해서 훈련에 대한 모니터링이 있으면 좋겠다는 생각을 했습니다. +- stable diffusion 훈련시 hyperparameter tuning을 좀 더 철저하게 해야겠다는 생각을 했습니다. +- stable diffusion으로 생성한 이미지가 실제로 multiple diseases class 조건을 만족하는지 검수할 방안이 필요합니다. +- multiple diseases 내에서도 카테고리를 나눌 수 있다면 나눠서 각각에 대한 stable diffusion model을 fine tuning할 수도 있을 것입니다. +- 다른 diffusion model fine tuning 방법을 활용해볼 수도 있을 것입니다. +- submission score에서 baseline을 이기지 못 했지만 text-to-image model을 이용한 synthetic data의 가능성을 볼 수 있었다고 생각합니다. + +## 6. Appendix + +- 앞에서 언급한 prompt에 대한 이미지 생성 예시입니다. 일부 이미지는 NSFW로 판단되어 검은색으로 나왔습니다. + +:::{figure-md} +cat + +cat 생성 결과, prompt: “cat” +::: + +:::{figure-md} +sea + +sea 생성 결과, prompt: “sea” +::: + +:::{figure-md} +pirate + +pirate 생성 결과, prompt: “pirate” +::: + +:::{figure-md} +illustration + +illustration 생성 결과, prompt: “illustration” +::: + +:::{figure-md} +animation + +animation 생성 결과, prompt: “animation” +::: + +:::{figure-md} +wallpaper + +wallpaper 생성 결과, prompt: “wallpaper” +::: diff --git a/_sources/docs/experiments/swjo_exp.md b/_sources/docs/experiments/swjo_exp.md old mode 100644 new mode 100755 index e272a78b..8699276b --- a/_sources/docs/experiments/swjo_exp.md +++ b/_sources/docs/experiments/swjo_exp.md @@ -1,293 +1,293 @@ -``` {admonition} Information -- **Title:** Training DreamBooth on Naver Webtoon Face Dataset - -- **Author:** Sangwoo Jo - -- **Last updated on Jul. 09, 2023** -``` - -# Training DreamBooth on Naver Webtoon Face Dataset - -## Introduction - -이번 포스팅에서는 DreamBooth 를 직접 학습해보고 실험한 결과들을 공유할려고 합니다. - -우선적으로 학습데이터는 [https://github.com/bryandlee/naver-webtoon-data](https://github.com/bryandlee/naver-webtoon-data) 에 공개된 YOLOv5 모델 및 Waifu2x 후처리 기법을 활용하여 프리드로우에 등장하는 인물 사진들을 수집했습니다. 논문에서는 3-5 장으로 fine-tuning 이 가능하다고 제시되어있지만, 인물 사진 같은 경우 더 많은 데이터로 학습하면 성능이 더 좋아져서 15-20 장의 이미지로 학습하였습니다. 학습한 이미지들 예시입니다. - -:::{figure-md} -swjo_exp_01 - -Training Data -::: - -DreamBooth 를 실험하면서 대표적으로 instance prompt, guidance scale, negative prompt, 그리고 마지막으로 prior preservation loss 를 반영하는 정도를 조절하는 prior_loss_weight 를 바꿔가면서 학습해보았습니다. 사전학습된 text-to-image 모델로 처음에는 *hakurei/waifu-diffusion* 모델을 시도해봤지만 결과가 만족스럽지 못해 *runwayml/stable-diffusion-v1-5* 모델로 fine-tuning 작업을 진행했습니다. - -## Ablation Studies - -### Prior Preservation Loss - -Prior Preservation Loss 를 제외한 동일한 configuration 으로 모델 학습한 결과입니다. - -``` -# with prior-preservation loss -MODEL_NAME = “runwayml/stable-diffusion-v1-5” -instance_prompt = "A photo of sks girl" -class_prompt = "A photo of a girl" - -python3 train_dreambooth.py \ - --pretrained_model_name_or_path=$MODEL_NAME \ - --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \ - --output_dir=$OUTPUT_DIR \ - --revision="fp16" \ - --with_prior_preservation --prior_loss_weight=1.0 \ - --seed=1337 \ - --resolution=512 \ - --train_batch_size=1 \ - --train_text_encoder \ - --mixed_precision="fp16" \ - --use_8bit_adam \ - --gradient_accumulation_steps=1 --gradient_checkpointing \ - --learning_rate=1e-6 \ - --lr_scheduler="constant" \ - --lr_warmup_steps=0 \ - --num_class_images=200 \ - --sample_batch_size=4 \ - --max_train_steps=800 \ - --save_interval=100 \ - --save_sample_prompt="A photo of sks girl" \ - --concepts_list="concepts_list.json" -``` - -``` -# w/o prior-preservation loss -MODEL_NAME = “runwayml/stable-diffusion-v1-5” -instance_prompt = "A photo of sks girl" -class_prompt = "A photo of a girl" - -python3 train_dreambooth.py \ - --pretrained_model_name_or_path=$MODEL_NAME \ - --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \ - --output_dir=$OUTPUT_DIR \ - --revision="fp16" \ - --with_prior_preservation --prior_loss_weight=0.0 \ - --seed=1337 \ - --resolution=512 \ - --train_batch_size=1 \ - --train_text_encoder \ - --mixed_precision="fp16" \ - --use_8bit_adam \ - --gradient_accumulation_steps=1 --gradient_checkpointing \ - --learning_rate=1e-6 \ - --lr_scheduler="constant" \ - --lr_warmup_steps=0 \ - --num_class_images=200 \ - --sample_batch_size=4 \ - --max_train_steps=800 \ - --save_interval=100 \ - --save_sample_prompt="A photo of sks girl" \ - --concepts_list="concepts_list.json" -``` - -아래 그림처럼 동일한 inference prompt 를 입력했을 때, prior preservation loss 를 제외함으로써 input images 에 더 가까운 웹툰 사진들을 생성할 수 있었습니다. 또한, 핑크색 머리를 한 이민지 캐릭터를 어느 정도 잘 생성하는 부분도 확인할 수 있습니다. - -- **Inference Prompt: "A photo of *sks* girl with pink hair” (with prior-preservation loss)** - -:::{figure-md} -swjo_exp_02 - -With Prior Preservation Loss -::: - -- **Inference Prompt: " A photo of *sks* girl with pink hair” (w/o prior-preservation loss)** - -:::{figure-md} -swjo_exp_03 - -Without Prior Preservation Loss -::: - -### Negative Prompt - -Negative Prompt 에 대한 Ablation Study 도 진행했습니다. 캐릭터의 부자연스러운 부분이나 저해상도 이미지들을 생성하는 경우들이 종종 발생했는데, negative prompt 를 통해 더 좋은 퀄리티의 웹툰 캐릭터를 생성할 수 있었습니다. - -- **Inference Prompt: " A photo of *sks* girl with pink hair” (w/o negative prompt)** - -:::{figure-md} -swjo_exp_03 - -Without Negative Prompt -::: - -- **Inference Prompt: " A photo of *sks* girl with pink hair”** - - **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** - -:::{figure-md} -swjo_exp_04 - -With Negative Prompt -::: - -### Instance Prompt / Guidance Scale - -DreamBooth 논문에서 제시한 instance prompt 외에 “A photo of a girl in the style of *sks*” 라는 prompt 로 학습을 시도해보기도 했습니다. *sks* 라는 unique identifier 에 특정 여자 캐릭터에 대한 정보뿐만 아니라 프리드로우 그림체 자체를 담아내기 위한 목적이였습니다. - -``` -# different instance prompt with prior-preservation loss -MODEL_NAME = “runwayml/stable-diffusion-v1-5” -instance_prompt = "A photo of a girl in the style of sks" -class_prompt = "A photo of a girl" - -python3 train_dreambooth.py \ - --pretrained_model_name_or_path=$MODEL_NAME \ - --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \ - --output_dir=$OUTPUT_DIR \ - --revision="fp16" \ - --with_prior_preservation --prior_loss_weight=1.0 \ - --seed=1337 \ - --resolution=512 \ - --train_batch_size=1 \ - --train_text_encoder \ - --mixed_precision="fp16" \ - --use_8bit_adam \ - --gradient_accumulation_steps=1 --gradient_checkpointing \ - --learning_rate=1e-6 \ - --lr_scheduler="constant" \ - --lr_warmup_steps=0 \ - --num_class_images=200 \ - --sample_batch_size=4 \ - --max_train_steps=800 \ - --save_interval=100 \ - --save_sample_prompt="A photo of sks girl" \ - --concepts_list="concepts_list.json" -``` - -``` -# different instance prompt w/o prior-preservation loss -MODEL_NAME = “runwayml/stable-diffusion-v1-5” -instance_prompt = "A photo of a girl in the style of sks" -class_prompt = "A photo of a girl" - -python3 train_dreambooth.py \ - --pretrained_model_name_or_path=$MODEL_NAME \ - --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \ - --output_dir=$OUTPUT_DIR \ - --revision="fp16" \ - --with_prior_preservation --prior_loss_weight=0.0 \ - --seed=1337 \ - --resolution=512 \ - --train_batch_size=1 \ - --train_text_encoder \ - --mixed_precision="fp16" \ - --use_8bit_adam \ - --gradient_accumulation_steps=1 --gradient_checkpointing \ - --learning_rate=1e-6 \ - --lr_scheduler="constant" \ - --lr_warmup_steps=0 \ - --num_class_images=200 \ - --sample_batch_size=4 \ - --max_train_steps=800 \ - --save_interval=100 \ - --save_sample_prompt="A photo of sks girl" \ - --concepts_list="concepts_list.json" -``` - -Inference 시, 프리드로우의 그림체가 반영된 남자가 생성되도록 prompt 를 “A photo of a boy in the style of *sks*” 로 입력했을때의 결과입니다. DreamBooth 혹은 사전학습된 text-to-image 모델을 프리드로우 작가님의 웹툰 장면들로 전체적으로 학습하게 된다면 더 다양한 inference 결과들을 볼 수 있을 것 같습니다. - -- **Inference Prompt: “A photo of a boy in the style of *sks*” (num_inference_steps = 24 / with prior-preservation loss)** - - **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** - -:::{figure-md} -swjo_exp_05 - -Instance Prompt -::: - -Inference step 을 늘려가면서 추론된 인물 이미지의 퀄리티가 상승하는 부분도 확인할 수 있었습니다. 또한, guidance scale 에 대한 실험도 진행했는데 guidance scale 이 작을수록 prompt 와 무관한 random 한 이미지들을 생성하게 됩니다. 최종적으로 num_inference steps 와 guidance scale 의 값은 각각 100 과 7.5 로 설정하였습니다. - -- **Inference Prompt: “A photo of a boy in the style of *sks*” (num_inference_steps=100 / with prior-preservation loss)** - -:::{figure-md} -swjo_exp_06 - -Increasing Number of Inference Steps -::: - -- **Inference Prompt: “A photo of a boy in the style of *sks*” (num_inference_steps = 100 / with prior-preservation loss)** - - **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** - -:::{figure-md} -swjo_exp_07 - -Increasing Number of Inference Steps / Negative Prompt -::: - -- **Inference Prompt: “A photo of a boy in the style of *sks*” (num_inference_steps = 100 / with prior-preservation loss)** - - **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** - - **+ guidance_scale = 4** - -:::{figure-md} -swjo_exp_08 - -Guidance Scale -::: - -동일한 inference prompt 로 prior-preservation loss 를 제외해본 결과, 생성된 남자의 머리카락이 더 길어지고 더 여성스러운 생김새를 가지는 놀라운 사실도 발견했습니다. - -- **Inference Prompt: “A photo of a boy in the style of *sks*” (num_inference_steps = 100 / w/o prior-preservation loss)** - - **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** - -:::{figure-md} -swjo_exp_09 - -Without Prior Preservation Loss -::: - -## Appendix - -그 외 다양한 inference prompt 에 따른 재미있는 실험결과들을 공유합니다. 아직 손의 모양을 text-to-image 모델이 생성하지 못하는 부분도 재차 확인할 수 있었습니다. - -- **Inference Prompt: “A photo of a boy climbing up the mountain in the style of *sks*” (num_inference_steps = 100 / w/o prior-preservation loss)** - - **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** - -:::{figure-md} -swjo_exp_10 - -Appendix 1 -::: - -- **Inference Prompt: “A painting of a boy in the style of *sks*” (num_inference_steps = 100 / w/o prior-preservation loss)** - - **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** - -:::{figure-md} -swjo_exp_11 - -Appendix 2 -::: - -- **Inference Prompt: “A hand drawing of a boy in the style of *sks*” (num_inference_steps = 100 / w/o prior-preservation loss)** - - **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** - -:::{figure-md} -swjo_exp_12 - -Appendix 3 -::: - -마지막으로 하단의 좌측과 우측 사진은 각각 “A photo of *sks* girl” 그리고 “A photo of a girl in the style of *sks*” 이라는 prompt 로 DreamBooth 모델을 각각 학습한 후, 나비를 생성하라는 동일한 prompt 로 추론해본 결과입니다. *sks* 가 수식하는 명사가 girl 이 아닌 style 이도록 prompt 를 수정함으로써, butterfly 사진을 생성할때 조금이나마 더 프리드로우 웹툰의 그림체를 반영할 수 있었던 부분도 확인할 수 있었습니다. - -- **Inference Prompt: “A photo of a butterfly in the style of *sks*” (num_inference_steps = 100 / with prior-preservation loss)** - -:::{figure-md} -swjo_exp_13 - -Appendix 4 -::: +``` {admonition} Information +- **Title:** Training DreamBooth on Naver Webtoon Face Dataset + +- **Author:** Sangwoo Jo + +- **Last updated on Jul. 09, 2023** +``` + +# Training DreamBooth on Naver Webtoon Face Dataset + +## Introduction + +이번 포스팅에서는 DreamBooth 를 직접 학습해보고 실험한 결과들을 공유할려고 합니다. + +우선적으로 학습데이터는 [https://github.com/bryandlee/naver-webtoon-data](https://github.com/bryandlee/naver-webtoon-data) 에 공개된 YOLOv5 모델 및 Waifu2x 후처리 기법을 활용하여 프리드로우에 등장하는 인물 사진들을 수집했습니다. 논문에서는 3-5 장으로 fine-tuning 이 가능하다고 제시되어있지만, 인물 사진 같은 경우 더 많은 데이터로 학습하면 성능이 더 좋아져서 15-20 장의 이미지로 학습하였습니다. 학습한 이미지들 예시입니다. + +:::{figure-md} +swjo_exp_01 + +Training Data +::: + +DreamBooth 를 실험하면서 대표적으로 instance prompt, guidance scale, negative prompt, 그리고 마지막으로 prior preservation loss 를 반영하는 정도를 조절하는 prior_loss_weight 를 바꿔가면서 학습해보았습니다. 사전학습된 text-to-image 모델로 처음에는 *hakurei/waifu-diffusion* 모델을 시도해봤지만 결과가 만족스럽지 못해 *runwayml/stable-diffusion-v1-5* 모델로 fine-tuning 작업을 진행했습니다. + +## Ablation Studies + +### Prior Preservation Loss + +Prior Preservation Loss 를 제외한 동일한 configuration 으로 모델 학습한 결과입니다. + +``` +# with prior-preservation loss +MODEL_NAME = “runwayml/stable-diffusion-v1-5” +instance_prompt = "A photo of sks girl" +class_prompt = "A photo of a girl" + +python3 train_dreambooth.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \ + --output_dir=$OUTPUT_DIR \ + --revision="fp16" \ + --with_prior_preservation --prior_loss_weight=1.0 \ + --seed=1337 \ + --resolution=512 \ + --train_batch_size=1 \ + --train_text_encoder \ + --mixed_precision="fp16" \ + --use_8bit_adam \ + --gradient_accumulation_steps=1 --gradient_checkpointing \ + --learning_rate=1e-6 \ + --lr_scheduler="constant" \ + --lr_warmup_steps=0 \ + --num_class_images=200 \ + --sample_batch_size=4 \ + --max_train_steps=800 \ + --save_interval=100 \ + --save_sample_prompt="A photo of sks girl" \ + --concepts_list="concepts_list.json" +``` + +``` +# w/o prior-preservation loss +MODEL_NAME = “runwayml/stable-diffusion-v1-5” +instance_prompt = "A photo of sks girl" +class_prompt = "A photo of a girl" + +python3 train_dreambooth.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \ + --output_dir=$OUTPUT_DIR \ + --revision="fp16" \ + --with_prior_preservation --prior_loss_weight=0.0 \ + --seed=1337 \ + --resolution=512 \ + --train_batch_size=1 \ + --train_text_encoder \ + --mixed_precision="fp16" \ + --use_8bit_adam \ + --gradient_accumulation_steps=1 --gradient_checkpointing \ + --learning_rate=1e-6 \ + --lr_scheduler="constant" \ + --lr_warmup_steps=0 \ + --num_class_images=200 \ + --sample_batch_size=4 \ + --max_train_steps=800 \ + --save_interval=100 \ + --save_sample_prompt="A photo of sks girl" \ + --concepts_list="concepts_list.json" +``` + +아래 그림처럼 동일한 inference prompt 를 입력했을 때, prior preservation loss 를 제외함으로써 input images 에 더 가까운 웹툰 사진들을 생성할 수 있었습니다. 또한, 핑크색 머리를 한 이민지 캐릭터를 어느 정도 잘 생성하는 부분도 확인할 수 있습니다. + +- **Inference Prompt: "A photo of *sks* girl with pink hair” (with prior-preservation loss)** + +:::{figure-md} +swjo_exp_02 + +With Prior Preservation Loss +::: + +- **Inference Prompt: " A photo of *sks* girl with pink hair” (w/o prior-preservation loss)** + +:::{figure-md} +swjo_exp_03 + +Without Prior Preservation Loss +::: + +### Negative Prompt + +Negative Prompt 에 대한 Ablation Study 도 진행했습니다. 캐릭터의 부자연스러운 부분이나 저해상도 이미지들을 생성하는 경우들이 종종 발생했는데, negative prompt 를 통해 더 좋은 퀄리티의 웹툰 캐릭터를 생성할 수 있었습니다. + +- **Inference Prompt: " A photo of *sks* girl with pink hair” (w/o negative prompt)** + +:::{figure-md} +swjo_exp_03 + +Without Negative Prompt +::: + +- **Inference Prompt: " A photo of *sks* girl with pink hair”** + + **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** + +:::{figure-md} +swjo_exp_04 + +With Negative Prompt +::: + +### Instance Prompt / Guidance Scale + +DreamBooth 논문에서 제시한 instance prompt 외에 “A photo of a girl in the style of *sks*” 라는 prompt 로 학습을 시도해보기도 했습니다. *sks* 라는 unique identifier 에 특정 여자 캐릭터에 대한 정보뿐만 아니라 프리드로우 그림체 자체를 담아내기 위한 목적이였습니다. + +``` +# different instance prompt with prior-preservation loss +MODEL_NAME = “runwayml/stable-diffusion-v1-5” +instance_prompt = "A photo of a girl in the style of sks" +class_prompt = "A photo of a girl" + +python3 train_dreambooth.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \ + --output_dir=$OUTPUT_DIR \ + --revision="fp16" \ + --with_prior_preservation --prior_loss_weight=1.0 \ + --seed=1337 \ + --resolution=512 \ + --train_batch_size=1 \ + --train_text_encoder \ + --mixed_precision="fp16" \ + --use_8bit_adam \ + --gradient_accumulation_steps=1 --gradient_checkpointing \ + --learning_rate=1e-6 \ + --lr_scheduler="constant" \ + --lr_warmup_steps=0 \ + --num_class_images=200 \ + --sample_batch_size=4 \ + --max_train_steps=800 \ + --save_interval=100 \ + --save_sample_prompt="A photo of sks girl" \ + --concepts_list="concepts_list.json" +``` + +``` +# different instance prompt w/o prior-preservation loss +MODEL_NAME = “runwayml/stable-diffusion-v1-5” +instance_prompt = "A photo of a girl in the style of sks" +class_prompt = "A photo of a girl" + +python3 train_dreambooth.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \ + --output_dir=$OUTPUT_DIR \ + --revision="fp16" \ + --with_prior_preservation --prior_loss_weight=0.0 \ + --seed=1337 \ + --resolution=512 \ + --train_batch_size=1 \ + --train_text_encoder \ + --mixed_precision="fp16" \ + --use_8bit_adam \ + --gradient_accumulation_steps=1 --gradient_checkpointing \ + --learning_rate=1e-6 \ + --lr_scheduler="constant" \ + --lr_warmup_steps=0 \ + --num_class_images=200 \ + --sample_batch_size=4 \ + --max_train_steps=800 \ + --save_interval=100 \ + --save_sample_prompt="A photo of sks girl" \ + --concepts_list="concepts_list.json" +``` + +Inference 시, 프리드로우의 그림체가 반영된 남자가 생성되도록 prompt 를 “A photo of a boy in the style of *sks*” 로 입력했을때의 결과입니다. DreamBooth 혹은 사전학습된 text-to-image 모델을 프리드로우 작가님의 웹툰 장면들로 전체적으로 학습하게 된다면 더 다양한 inference 결과들을 볼 수 있을 것 같습니다. + +- **Inference Prompt: “A photo of a boy in the style of *sks*” (num_inference_steps = 24 / with prior-preservation loss)** + + **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** + +:::{figure-md} +swjo_exp_05 + +Instance Prompt +::: + +Inference step 을 늘려가면서 추론된 인물 이미지의 퀄리티가 상승하는 부분도 확인할 수 있었습니다. 또한, guidance scale 에 대한 실험도 진행했는데 guidance scale 이 작을수록 prompt 와 무관한 random 한 이미지들을 생성하게 됩니다. 최종적으로 num_inference steps 와 guidance scale 의 값은 각각 100 과 7.5 로 설정하였습니다. + +- **Inference Prompt: “A photo of a boy in the style of *sks*” (num_inference_steps=100 / with prior-preservation loss)** + +:::{figure-md} +swjo_exp_06 + +Increasing Number of Inference Steps +::: + +- **Inference Prompt: “A photo of a boy in the style of *sks*” (num_inference_steps = 100 / with prior-preservation loss)** + + **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** + +:::{figure-md} +swjo_exp_07 + +Increasing Number of Inference Steps / Negative Prompt +::: + +- **Inference Prompt: “A photo of a boy in the style of *sks*” (num_inference_steps = 100 / with prior-preservation loss)** + + **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** + + **+ guidance_scale = 4** + +:::{figure-md} +swjo_exp_08 + +Guidance Scale +::: + +동일한 inference prompt 로 prior-preservation loss 를 제외해본 결과, 생성된 남자의 머리카락이 더 길어지고 더 여성스러운 생김새를 가지는 놀라운 사실도 발견했습니다. + +- **Inference Prompt: “A photo of a boy in the style of *sks*” (num_inference_steps = 100 / w/o prior-preservation loss)** + + **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** + +:::{figure-md} +swjo_exp_09 + +Without Prior Preservation Loss +::: + +## Appendix + +그 외 다양한 inference prompt 에 따른 재미있는 실험결과들을 공유합니다. 아직 손의 모양을 text-to-image 모델이 생성하지 못하는 부분도 재차 확인할 수 있었습니다. + +- **Inference Prompt: “A photo of a boy climbing up the mountain in the style of *sks*” (num_inference_steps = 100 / w/o prior-preservation loss)** + + **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** + +:::{figure-md} +swjo_exp_10 + +Appendix 1 +::: + +- **Inference Prompt: “A painting of a boy in the style of *sks*” (num_inference_steps = 100 / w/o prior-preservation loss)** + + **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** + +:::{figure-md} +swjo_exp_11 + +Appendix 2 +::: + +- **Inference Prompt: “A hand drawing of a boy in the style of *sks*” (num_inference_steps = 100 / w/o prior-preservation loss)** + + **+** **Negative Prompt: “ugly, disfigured, deformed, low resolution”** + +:::{figure-md} +swjo_exp_12 + +Appendix 3 +::: + +마지막으로 하단의 좌측과 우측 사진은 각각 “A photo of *sks* girl” 그리고 “A photo of a girl in the style of *sks*” 이라는 prompt 로 DreamBooth 모델을 각각 학습한 후, 나비를 생성하라는 동일한 prompt 로 추론해본 결과입니다. *sks* 가 수식하는 명사가 girl 이 아닌 style 이도록 prompt 를 수정함으로써, butterfly 사진을 생성할때 조금이나마 더 프리드로우 웹툰의 그림체를 반영할 수 있었던 부분도 확인할 수 있었습니다. + +- **Inference Prompt: “A photo of a butterfly in the style of *sks*” (num_inference_steps = 100 / with prior-preservation loss)** + +:::{figure-md} +swjo_exp_13 + +Appendix 4 +::: diff --git a/_sources/docs/markdown-example.md b/_sources/docs/markdown-example.md old mode 100644 new mode 100755 index 573e35f9..ed5b4329 --- a/_sources/docs/markdown-example.md +++ b/_sources/docs/markdown-example.md @@ -1,53 +1,53 @@ -Jupyter Book은 markdown 문서를 지원합니다. - -아래와 같은 예시 코드를 입력하면 markdown 문법이 적용됩니다. - -``` -# This is an h1 tag -## This is an h2 tag -###### This is an h6 tag - -*This text will be italic* -_This will also be italic_ - -**This text will be bold** -__This will also be bold__ - -_You **can** combine them_ - -* Item 1 -* Item 2 - * Item 2a - * Item 2b - -1. Item 1 -1. Item 2 -1. Item 3 - 1. Item 3a - 1. Item 3b -``` - -입력 결과 - -# This is an h1 tag -## This is an h2 tag -###### This is an h6 tag - -*This text will be italic* -_This will also be italic_ - -**This text will be bold** -__This will also be bold__ - -_You **can** combine them_ - -* Item 1 -* Item 2 - * Item 2a - * Item 2b - -1. Item 1 -1. Item 2 -1. Item 3 - 1. Item 3a +Jupyter Book은 markdown 문서를 지원합니다. + +아래와 같은 예시 코드를 입력하면 markdown 문법이 적용됩니다. + +``` +# This is an h1 tag +## This is an h2 tag +###### This is an h6 tag + +*This text will be italic* +_This will also be italic_ + +**This text will be bold** +__This will also be bold__ + +_You **can** combine them_ + +* Item 1 +* Item 2 + * Item 2a + * Item 2b + +1. Item 1 +1. Item 2 +1. Item 3 + 1. Item 3a + 1. Item 3b +``` + +입력 결과 + +# This is an h1 tag +## This is an h2 tag +###### This is an h6 tag + +*This text will be italic* +_This will also be italic_ + +**This text will be bold** +__This will also be bold__ + +_You **can** combine them_ + +* Item 1 +* Item 2 + * Item 2a + * Item 2b + +1. Item 1 +1. Item 2 +1. Item 3 + 1. Item 3a 1. Item 3b \ No newline at end of file diff --git a/_sources/docs/notebook-example.ipynb b/_sources/docs/notebook-example.ipynb old mode 100644 new mode 100755 index e2da265e..0f6326c3 --- a/_sources/docs/notebook-example.ipynb +++ b/_sources/docs/notebook-example.ipynb @@ -1,80 +1,80 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# .ipynb 파일 활용" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jupyter Book에선 .ipynb파일 또한 지원합니다. 아래와 같이 코드를 입력하고, 그에 대응하는 출력물을 함께 웹페이지로 구성 가능합니다. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAA0BklEQVR4nO3deXxU9b3/8dcnG2EJCZCQkGSQfYdsE8SlrhURN1RIUOxtfw/786LYau2ibW/trV67X9u6X3/V29sLKkFAUXEtVMWNTELCvsk2WSBhSVhDtu/vj5nQNEzIJMzMmeXzfDzmwXDOmTmfHJhPzpzzPe8jxhiUUkqFryirC1BKKeVf2uiVUirMaaNXSqkwp41eKaXCnDZ6pZQKczFWF+BJcnKyGTZsmNVlKKVUyCgpKTlojEnxNC8oG/2wYcNwOBxWl6GUUiFDRPZ2Nk8P3SilVJjTRq+UUmFOG71SSoU5bfRKKRXmtNErpVSY67LRi0i8iKwVkXIR2SQiv/CwTC8RWSwiO0XkSxEZ1m7ej93Tt4nItT6uXymlVBe82aM/DVxljMkCsoEZIjKtwzJ3AUeMMaOAPwC/ARCRCcBcYCIwA3hWRKJ9VLtSSikvdNnojctx919j3Y+O2cY3A//jfv4acLWIiHv6q8aY08aY3cBOYKpPKu+goamFFz7+is++OuiPt1dKKb9avbWGl9bsprG51efv7dUxehGJFpEyoAb4wBjzZYdFMgAngDGmGagHBrWf7lbhnuZpHXeLiENEHLW1td36IQBiooQ/f7Kbl9bs7vZrlVLKas9/9BV//XwPsdHi8/f2qtEbY1qMMdlAJjBVRCb5uhBjzAvGGLsxxp6S4vEq3nOKiY7itrxMVm+rpeZog6/LU0opv9lz8ARf7j7MHLsN18EQ3+rWqBtjTB2wGtfx9vYqARuAiMQAicCh9tPdMt3T/GJOXiYtrYalpX5bhVJK+dySEidRArflZvrl/b0ZdZMiIknu572Ba4CtHRZbAXzT/Xw2sMq47lG4ApjrHpUzHBgNrPVR7WcZkdKPqcMGssThRG+RqJQKBS2thtdKKrhi7GDSEuP9sg5v9uiHAKtFZD1QjOsY/Vsi8qiI3ORe5kVgkIjsBB4EHgYwxmwCioDNwLvAAmNMi69/iPbm2DPZdfAEjr1H/LkapZTyiY+313Lg6GkK7P7Zmwcv0iuNMeuBHA/TH2n3vAGY08nrHwceP48au+X6KUP49xWbKCp2kj9sYKBWq5RSPVLkcDKobxxXjUv12zrC7srYPnEx3JiVztsbqjl+utnqcpRSqlOHjp/mwy0HuCUng7gY/7XjsGv0AAX5Nk42tvD2+iqrS1FKqU4tX1dJU4uhIN/W9cLnISwbfY4tiVGD+7G42Nn1wkopZQFjDEUOJ9m2JMakJvh1XWHZ6EWEQruN0n117Kw5ZnU5Sil1ljJnHdsPHKfQz3vzEKaNHuCW3AxiooQiR4XVpSil1FmKHBX0jo3mhilD/L6usG30yf16cfX4wSwrraCpxffZEUop1VMnG5t5s7yKmZOHkBAf6/f1hW2jByiw2zh4vJFVW2usLkUppc54Z8N+jp9u9uvY+fbCutFfPiaFwQm9KNKTskqpILLY4WR4cl+mDg/MtT5h3ehjoqOYnZfJ6m01HNCgM6VUENh98ARrdx9mjj3TLwFmnoR1oweYY7fRamBpqZ6UVUpZb4nDvwFmnoR9o2/7erTEUaFBZ0opSzW3tLK0tIIrxw4mtb9/Asw8CftGD66TsrsPnqB4jwadKaWs8/EOV4DZHLv/x863FxGNfubkNPr1iqHIoSdllVLWKSquILlfHFePHxzQ9UZEo3cFnQ3h7fXVHGtosrocpVQEOtguwCw2OrCtNyIaPbgO35xqauGt9dVWl6KUikDLSytpbjUUBPiwDURQo8+2JTF6cD89fKOUCri2ALOcoUmM9nOAmSfe3ErQJiKrRWSziGwSkfs9LPNDESlzPzaKSIuIDHTP2yMiG9zzHP74IbwhIhTm21i3r44dBzToTCkVOOucdeyoOU6hBXvz4N0efTPwfWPMBGAasEBEJrRfwBjzO2NMtjEmG/gx8JEx5nC7Ra50z7f7qvCemJXTFnSme/VKqcBZ4nDSOzaa6wMQYOZJl43eGFNtjCl1Pz8GbAEyzvGS24FXfFOebyX368XXx6eyrLSSxmYNOlNK+Z8rwKya66cEJsDMk24doxeRYbjuH/tlJ/P7ADOApe0mG+B9ESkRkbvP8d53i4hDRBy1tbXdKatbCvIzOXRCg86UUoGx8kyAmTWHbaAbjV5E+uFq4A8YY452stiNwKcdDttcaozJBa7DddjnMk8vNMa8YIyxG2PsKSkp3pbVbZeNTiG1fy89fKOUCoiiYicjkvuSP2yAZTV41ehFJBZXk19kjFl2jkXn0uGwjTGm0v1nDbAcmNqzUn2jLejs7xp0ppTys121x1m75zBz7LaABZh54s2oGwFeBLYYY544x3KJwOXAG+2m9RWRhLbnwHRg4/kWfb7m5LmCzl4r0aAzpZT/LCmpIDpKuC33XKc1/c+bPfpLgG8AV7UbQjlTROaLyPx2y90CvG+MOdFuWiqwRkTKgbXA28aYd31WfQ8NS+7LhcMHssTh1KAzpZRfNLe0srSkgivHpjA4gAFmnsR0tYAxZg3Q5XcOY8xfgL90mLYLyOphbX5VYLfx/SXlrN19mAtHDLK6HKVUmPloey01xwIfYOZJxFwZ29HMyUPo1yuGxXpSVinlB4uLnST3i+OqcYENMPMkYht977hobsxKZ+UGDTpTSvlW7bHTrNpaw625mQEPMPPE+gosVJhvo6GplTfLNehMKeU7y9dVuAPMAncXqXOJ6EaflZnImFQNOlNK+Y4rwKyC3KFJjBoc+AAzTyK60YsIBXYbZc46tmvQmVLKB0r31bGz5jiF+dafhG0T0Y0ecN8EQCgq1r16pdT5W+Jw0icumuunpFtdyhkR3+gHtQWdrdOgM6XU+Tlxupk3y6u43j2qL1hEfKMHKMi3cfhEI6u2HrC6FKVUCFu5oZoTjS1BddgGtNEDrqCztP7xLNbDN0qp81DkcDIipS95F1gXYOaJNnogOkqYnZfJR9tr2V+vQWdKqe7bVXuc4j1HKLA4wMwTbfRuc+yZtBpYWqpBZ0qp7ityuALMbrU4wMwTbfRuFwzqy7QRAylyOGlt1aAzpZT3mltaWVpawZVjBzM4wdoAM0+00bdTYLex99BJ1u453PXCSinl9vdttdQeOx00V8J2pI2+nesmDSGhV4yOqVdKdctih5Pkfr24MggCzDzRRt9O77hobsxOZ+XGao5q0JlSygs1xxpYtbWG23IzgiLAzJPgrMpChfa2oLMqq0tRSoWA5aWVtLSaoMid74w3txK0ichqEdksIptE5H4Py1whIvXt7kD1SLt5M0Rkm4jsFJGHff0D+NqUzETGpiZQ5NDRN0qpc3MFmDnJu2AAowb3s7qcTnmzR98MfN8YMwGYBiwQkQkelvvEGJPtfjwKICLRwDPAdcAE4PZOXhs0RISCfBvlzjq27degM6VU50r3HeGr2hMUBvHePHjR6I0x1caYUvfzY8AWwNuBolOBncaYXcaYRuBV4OaeFhsoZ4LONL5YKXUORcUV9ImLZuaUIVaXck7dOkYvIsOAHOBLD7MvEpFyEXlHRCa6p2UA7btlBZ38khCRu0XEISKO2tra7pTlcwP7xnHNhFSWa9CZUqoTJ04389b6Km6YElwBZp543ehFpB+wFHjAGHO0w+xS4AJjTBbwFPB6dwsxxrxgjLEbY+wpKSndfbnPFdhdQWd/26JBZ0qps70dpAFmnnjV6EUkFleTX2SMWdZxvjHmqDHmuPv5SiBWRJKBSqD9Vsh0Twt6XxudwpDEeL15uFLKo6JiV4BZ7tDgCjDzxJtRNwK8CGwxxjzRyTJp7uUQkanu9z0EFAOjRWS4iMQBc4EVviren9qCzj7eXkt1/Smry1FKBZGdNcdx7D1CYRAGmHnizR79JcA3gKvaDZ+cKSLzRWS+e5nZwEYRKQeeBOYal2bgPuA9XCdxi4wxm/zwc/jFnDybK+isRIdaKqX+YUmJk+go4ZYgDDDzpMszCMaYNcA5f2UZY54Gnu5k3kpgZY+qs9jQQX24aMQgihwV3HvFKKKigv83t1LKv5paWllaUslV44IzwMwTvTK2CwX5mew7fJIvd2vQmVLKFWB28PhpCoJ87Hx72ui7cN2kISTEx+iYeqUUAIuLnaQk9OLKsdaPDvSWNvouxMdGc1NWOis3aNCZUpGu5lgDq7fVcGtuBjFBGmDmSehUaqHCfBunm1tZUaZBZ0pFsmXuALNQOmwD2ui9MjkjkXFpCSzRwzdKRay2ADP7BQMYmRK8AWaeaKP3gohQYLdRXlHP1v0dLwpWSkWCkr1H2FV7goIQuBK2I230XprVFnRWrGPqlYpERQ4nfeOiuX5ycAeYeaKN3ksD+8YxfUIay9dVcLq5xepylFIBdPx0M2+tr+aGKen0DfIAM0+00XdDQb6NIyeb+HBzjdWlKKUC6O31VZxsbAnJwzagjb5bLh2VTHpivI6pVyrCFDkqGJnSl9yhSVaX0iPa6LvhTNDZjlqq6jToTKlIsLPmGCV7j1CYHxoBZp5oo++m2Xk2jAadKRUxljgqiIkSbsnJtLqUHtNG301DB/Xh4pGDKCpx0tpqrC5HKeVHTS2tLC2t4Kpxg0lJ6GV1OT2mjb4HCuw2nIdP8cXuQ1aXopTyo9Vbazh4vDHkroTtSBt9D8yYlOYKOivWk7JKhbMihyvA7IoQCjDzxJs7TNlEZLWIbBaRTSJyv4dl5onIehHZICKfiUhWu3l73NPLRMTh6x/ACvGx0dycnc47G/dTf0qDzpQKRzVHG1i9rZbbcjNDKsDME2+qbwa+b4yZAEwDFojIhA7L7AYuN8ZMBh4DXugw/0pjTLYxxn7eFQeJQvtQV9BZuQadKRWOlp4JMAvdk7Btumz0xphqY0yp+/kxXLcEzOiwzGfGmCPuv36B6ybgYW1SRn8NOlMqTBljWOJwkj9sACNCLMDMk259HxGRYUAO8OU5FrsLeKfd3w3wvoiUiMjd53jvu0XEISKO2tra7pRlCRGhMN/G+op6tlRr0JlS4cSx9wi7Dp4I+ZOwbbxu9CLSD1gKPGCM8djZRORKXI3+oXaTLzXG5ALX4Trsc5mn1xpjXjDG2I0x9pSU0DjxMSs7g7joKL1SVqkwU1TsDjCbEnoBZp541ehFJBZXk19kjFnWyTJTgD8DNxtjzow7NMZUuv+sAZYDU8+36GAxoG8c10xMZfm6Sg06UypMHD/dzNsbqrkxK50+caEXYOaJN6NuBHgR2GKMeaKTZYYCy4BvGGO2t5veV0QS2p4D04GNvig8WBTabdSdbOKDzQesLkUp5QNvlYd2gJkn3vy6ugT4BrBBRMrc034CDAUwxjwPPAIMAp51Z0E0u0fYpALL3dNigJeNMe/68gew2iVngs4quGFKutXlKKXOU5HDyajB/cixJVldis902eiNMWuAcyb5GGO+DXzbw/RdQNbZrwgf0VHCbLuNp1btoLLuFBlJva0uSSnVQztrjlG6r46fzhwfsgFmnoT2VQBBYk5epgadKRUGitoCzHIzul44hGij9wHbwD5cMmoQRQ4NOlMqVDW1tLKstIKrxw8muV/oBph5oo3eRwrsNiqOnOKLXRp0plQoWhUmAWaeaKP3kWsnptE/PobFOqZeqZBUVOxkcEIvLh8TGtfxdIc2eh9xBZ1luILOTmrQmVKh5MDRBlZvq+G2vNAPMPMk/H4iCxXm22hsbmVFeaXVpSilumFpaQWthrA8bAPa6H1qYnp/xg/pT5FDR98oFSpcAWYVTB02kOHJfa0uxy+00fuQiFBoz2RDZT2bqzToTKlQULznCLsPngirK2E70kbvY7NyNOhMqVCyuNhJv14xzJycZnUpfqON3seS+sQx3R101tCkQWdKBbNjDU2s3FDNjVlDwibAzBNt9H5QmG+j/pQGnSkV7N5aX82pppawPQnbRhu9H1wyMpmMpN56+EapIFfkcDJ6cD+ywyjAzBNt9H4QFSXMzstkzc6DVBw5aXU5SikPdhw4xrp9dRTm28IqwMwTbfR+MjvPddvcpSU6pl6pYFTkcBITJczKCa8AM0+00fuJbWAfLhmZzJISDTpTKtg0NreyrLSSr49PDbsAM0+00fvRHHsmFUdO8bkGnSkVVFZtreHQiUYK8jOtLiUgvLmVoE1EVovIZhHZJCL3e1hGRORJEdkpIutFJLfdvG+KyA7345u+/gGC2Zmgs2I9KatUMClyOEnt34vLRodfgJkn3uzRNwPfN8ZMAKYBC0RkQodlrgNGux93A88BiMhA4OfAhbhuCv5zERngo9qDXnxsNLNyMnh3kwadKRUsDhxt4O/bargtNzwDzDzp8qc0xlQbY0rdz48BW4COZy9uBv5qXL4AkkRkCHAt8IEx5rAx5gjwATDDpz9BkCuwu4LO3tCgs5C3uHgfr6/Tf8dQ91pJeAeYedKtS8FEZBiQA3zZYVYG0P74RIV7WmfTPb333bi+DTB06NDulBXUJmUkMjG9P4uLnfzLRcOsLkf10AebD/DQ0g1ECaQk9OKSUclWl6R6wBVg5mTq8IEMC9MAM0+8/t4iIv2ApcADxhifJ3YZY14wxtiNMfaUlPA6blZgt7Gp6igbK+utLkX1wN5DJ3iwqIxJGf0ZmdKP776yjv31DVaXpXpg7e7D7Dl0ksII2psHLxu9iMTiavKLjDHLPCxSCbTfcpnuaZ1Njyg3Z6cTFxPFEr1SNuQ0NLVwz8JSokR4bl4ez92Zy6mmFu57uZSmllary1PdtNjRFmA2xOpSAsqbUTcCvAhsMcY80cliK4B/cY++mQbUG2OqgfeA6SIywH0Sdrp7WkRJ6hPHtRPTeL2sSoPOQszP39jE5uqj/KEwC9vAPowanMBvbpuCY+8Rfv3OVqvLU93wjwCzdHrHRVtdTkB5s0d/CfAN4CoRKXM/ZorIfBGZ715mJbAL2An8P+BeAGPMYeAxoNj9eNQ9LeIU2l1BZ+9r0FnIKCp2stjhZMGVI7lqXOqZ6TdmpfOti4fx4prdrNxQbWGFqjveLK+moamVwjDOne9MlydjjTFrgHMGQRhjDLCgk3kvAS/1qLowcvHIQWQk9WaJw8lNWelWl6O6sKmqnp+9sZGLRw7iwWvGnjX/JzPHU15Rxw+XlDM2LYGRKf0sqFJ1R5HDyZjUfmRlJlpdSsBFxiDSIBAVJcyxa9BZKKg/1cQ9C0tJ6hPLk7fnEB119n5OXEwUz9yRS6/YaO5ZWMLJxmYLKlXe2n7gGGXOOgrs4R9g5ok2+gBqCzp7rUTvKRusjDH8YEk5VXWneOaO3HPmoKQn9eZPc7PZUXOcny7fiOuLrQpGRcVOYqOFWyIgwMwTbfQBlDmgD5eOSmaJo0KDzoLUf328iw82H+Dh68ZhHzawy+W/NjqFB64ew/J1lSz6cl8AKlTd1djcyrJ1rgCzQREQYOaJNvoAm2O3UVl3is++0qCzYPPFrkP89t2tzJycxl2XDvf6dd+5ahSXj0nh0Tc3s76izn8Fqh5ZtfUAh080RtSVsB1pow+w6RNSSewdy2IdUx9Uao42cN/L6xg2qC+/uW1Kt47jRkUJfyzMJiWhF/csLOXIiUY/Vqq6a3Gxk7T+8Vw2JrwuxOwObfQBFh8bzazsdN7btJ+6k9oQgkFzSyv3vbKOE6ebee7OPBLiY7v9HgP6xvHsvFxqj53me0VlemguSOyvb+Cj7bXclpfh8aR6pNBGb4GCfHfQWVmV1aUo4HfvbWPt7sP88tZJjE1L6PH7ZNmS+NmNE/j7tlqeWb3ThxWqnlpaGnkBZp5oo7fAxPREJmX015z6IPDepv3818e7mHfhUG7JOf+bUNx54VBmZafzxIfbWbPjoA8qVD3V2moocjiZNmIgFwyKnAAzT7TRW6TAbmNztQadWWnPwRP8oKicKZmJPHJjx1ss9IyI8MtbJzN6cD++++o6qutP+eR9Vfet3XOYvYdORvzePGijt8zNWRnExURRpCdlLdHQ1MI9i0qJihLXhU8xvss+6RMXw3N35nG6qYUFi0ppbNbwMysUFTtJ6BXDdZMiK8DME230FknsE8uMiWm8vq5Sg84s8LPXN7Kl+ih/LMzGNrCPz99/ZEo/fjs7i9J9dfzqnS0+f391bkcbmli5sZobsyMvwMwTbfQWKsy3cbShmfc27be6lIiyuHgfS0oq+M5Vo7hy3GC/ref6KUP4P5cM478/3cNb6/XEeyC9WV7lCjDTwzaANnpLXTRiEJkDerPEoZEIgbKxsp6fvbGJS0cl88DXx/h9fT++bjy5Q5N46LX17Kw57vf1KZciRwVjUxOYEoEBZp5oo7dQVJQwJ8/Gmp0HcR7WoDN/qz/ZxD2LShjYJ44/zc0OyLjquJgonpn3j/CzE6c1/Mzftu0/RrmzjoL8yAww80QbvcVm2zMR0aAzf2ttNXx/SRnVdQ08My83oJknQxJ78+TcHHbWHucnyzdo+JmfFTkiO8DME230FstI6s2lo5J5raSCFr2a0m+e//grPtxSw0+vH0/eBQMCvv5LRyfz4NfH8EZZFQu/2Bvw9UeKxuZWlq+r5JoJqQzsG2d1OUHDm1sJviQiNSKysZP5P2x356mNItIiIgPd8/aIyAb3PIeviw8XBe6gs0936gU2/vDZVwf5/XvbuH7KEL518TDL6lhw5SiuHJvCo29tpsxZZ1kd4ezDLa4Aszl6EvafeLNH/xdgRmczjTG/M8ZkG2OygR8DH3W4XeCV7vn286o0jE2fmEpSn1gdU+8HB4428N1X1jE8ufthZb4WFSX8oTCbwQnxLFik4Wf+UORwB5iNjtwAM0+6bPTGmI8Bb+/zejvwynlVFIF6xUQzKzuD9zcd0A+/DzW1tHLfy6WcON3Cc3fm0a9Xl3fO9LukPnE8d6cr/OyBxRp+5kvV9af4eHsts/MyIzrAzBOfHaMXkT649vyXtptsgPdFpERE7u7i9XeLiENEHLW1tb4qK2QU2G00trTyRlml1aWEjd++u5XiPUf49W2TGZPa87AyX5uSmcTPb5rAR9treWqVhp/5ytISDTDrjC9Pxt4IfNrhsM2lxphc4DpggYhc1tmLjTEvGGPsxhh7Skrkfe2akN6fyRmJLHZU6KgMH3h3YzX/75PdfGPaBdycHXyjL+6YOpRbczL449+28/H2yNux8TVXgFkFF40YxNBBvr/SOdT5stHPpcNhG2NMpfvPGmA5MNWH6ws7BfZMtlQfZVPVUatLCWm7D57gh0vWk2VL4t9uGG91OR6JCI/fMpkxgxO4/9V1VNVp+Nn5+HL3YfYdPklB/vknkIYjnzR6EUkELgfeaDetr4gktD0HpgMeR+4ol5uyM+gVE6XxxefhVGML9ywsITpaeOaOHJ+Glfla77honrszl6YWw70afnZeihxOEuI1wKwz3gyvfAX4HBgrIhUicpeIzBeR+e0WuwV43xhzot20VGCNiJQDa4G3jTHv+rL4cJPYO5YZk9J4o0yDznrCGMO/vb6RbQeO8cfCbDIHBP9X+BEp/fjt7CmUOev45UoNP+uJow1NrNxQzU1Z6cTHBu8vdit1OQzBGHO7F8v8BdcwzPbTdgFZPS0sUhXabbxRVsV7m/YH5bHlYPZqsZOlpRV89+rRXDHWf2FlvjZz8hDuunQ4L67ZTe4FA7gpK93qkkLKirIqTje3UpivJ2E7o1fGBplpIwZhG9hbx9R308bKen6+YhNfG53M/VePtrqcbnv4unHYLxjAw0vXs7PmmNXlhJQlDifj0hKYnKEBZp3RRh9k2oLOPt15SIPOvFR3spH5C0tI7hvHn+bmhOQY6tjoKJ6+I5c+cdHMX1iq4Wde2rr/KOUV9RTYNcDsXLTRB6Hb8lxBZ0t0r75Lra2GB4vKOXDUFVYWyvkmaYnxPDk3h121x3l4mYafeWNxsSvAbJYGmJ2TNvoglJHUm6+NTtGgMy8899FXrNpaw79dP4GcoYEPK/O1i0cl8/3pY3mzvIq/fq7hZ+dyurmF19dVMn1CWkj/gg8EbfRBqsCeSVV9A2s06KxTn+48yH++v40bs9L5l4susLocn7nn8pFcPW4w//H2Zkr3HbG6nKD14eYajpxsYo5dx853RRt9kLpmQioDNOisU/vrXWFlI1L68etbJ4fV8dmoKOGJgmzSEuO5b1EphzX/yKMih5P0xHi+pgFmXdJGH6R6xUQzKyeDDzTo7CxtYWWnmlp4/s5c+gZBWJmvJfaJ5bl5eRw80cj9r67TQ3gdVNWd4uMdGmDmLW30Qawt6Ox1DTr7J79+ZyuOvUf49W1TGDU4eMLKfG1SRiK/uGkin+w4yJN/22F1OUFlaUkFxsDsPB077w1t9EFs/JD+TMlMZHGxU0dguK3cUM2La3bzzYsuiIgLi+bm27gtN5MnV+3g79tqrC4nKLS2GopKnFw8UgPMvKWNPsjNsdvYuv8YGys16GxX7XF+9Np6sm1J/PT6CVaXExAiwn/MmsTY1AQeWFxGpYaf8cXuQzgPn9I44m7QRh/kbspKdwWdOfZZXYqlTjY2c8/CUmKjhWfm5RIXEzn/dV3hZ3m0uMPPTjdHdg5SUbErwGzGpDSrSwkZkfNpCVGJvWO5blIab5RVRWzQmTGGf1u+ke01x/jT3BwyknpbXVLADU/uy+/mTKHcWcfjb0du+Fn9qSbe2bifm7M1wKw7tNGHgIJ8G8camnl3436rS7HEy2v3sWxdJQ9cPYbLxkTuULoZk4bwf782nL9+vjdi70S2otwdYGYfanUpIUUbfQiYNtwVdBaJOfXrK+r4xYrNXD4mhe9cNcrqciz3oxnjyB82gIeXbmDHgcgLPysqdgWYTcrob3UpIUUbfQiIihIK8mx8vusQ+w5FTtBZ3clG7llYSkpCL/5YmE2Ujpc+E37Wt1cM8xeWcDyCws82Vx1lQ2U9hfkaYNZd3tx45CURqRERj3eHEpErRKReRMrcj0fazZshIttEZKeIPOzLwiPNmaCzksjYq29tNTywuIyaY66wsgGaZXJGav94nro9h90HT/DQ0vURM/S2yOEkLjqKWXqfhm7zZo/+L8CMLpb5xBiT7X48CiAi0cAzuG4MPgG4XUQiY0ycH6Qn9eayCAo6e2b1Tv6+rZZHbphAti3J6nKCzkUjB/GDa8fy9vpq/vLZHqvL8bvTzS28XlbJNRNT9Zd+D3TZ6I0xHwOHe/DeU4GdxphdxphG4FXg5h68j3IrsNuorm/gkx21VpfiV2t2HOSJD7dzc3Y6d04Ln7AyX5t/2Ui+Pj6Vx9/eQsne8A4/+2DzAepONunY+R7y1TH6i0SkXETeEZGJ7mkZQPvjDBXuaR6JyN0i4hARR21teDeynvr6hMEM6BPLEkeF1aX4TXX9Kb776jpGpfTjV2EWVuZrUVHCfxZkkZ7Um/teLuXQ8dNWl+Q3RY4K0hPjuXRUstWlhCRfNPpS4AJjTBbwFPB6T97EGPOCMcZujLGnpETuELpz6RUTzS05mby/eX9YJho2NreyYFEpp5taeO7OPPrEhV9Yma8l9o7l2Xm5HDrRyP2vloXlYb3KulN8sqOW2XabBpj10Hk3emPMUWPMcffzlUCsiCQDlUD771mZ7mnqPBTkZ9LUYnh9Xfhtyl+9s4XSfXX8ZvYURg3uZ3U5IWNSRiKP3TyRNTsP8qcPt1tdjs+1BZjNydPc+Z4670YvImni/n4tIlPd73kIKAZGi8hwEYkD5gIrznd9kW5cWn+yMhMpcoRX0Nlb66v470/38K2Lh3HDlPAPK/O1wvyhzMnL5MlVO1kdRuFnra2GIoeTS0YNwjZQA8x6ypvhla8AnwNjRaRCRO4SkfkiMt+9yGxgo4iUA08Cc41LM3Af8B6wBSgyxmzyz48RWdqCzjZU1ltdik/srDnOQ6+tJ3doEj+ZOd7qckLWY7MmMX5If763uIyKI+FxvcUXuw5RcUQDzM6XN6NubjfGDDHGxBpjMo0xLxpjnjfGPO+e/7QxZqIxJssYM80Y81m71640xowxxow0xjzuzx8kktyU7Q46C4MrZU82NnPvohJ6xUZHXFiZr8XHRvPcvNywCj9b7HDSPz6GaydqgNn50E9VCOofH8vMyUNYUVbFqcbQ/TAbY/jJsg3sqDnOk3NzGJIYeWFlvjYsuS+/L8hifUU9j7212epyzkv9ybYAswwNMDtP2uhDVIHdxrHTzby7qdrqUnps4Zf7eL2sige/PoZLR+uwOV+5dmIa/3rZCBZ+sS+kT9qvKK+ksbmVwnw9bHO+tNGHqAuHD2TowD4he/im3FnHY29u5sqxKSy4UsPKfO2H145l6vCB/HjZBraHaPjZYoeT8UP6MzFdA8zOlzb6EBUVJRTYM/li12H2HjphdTndcuREI/cucoWV/UHDyvwiJjqKp2/PCdnws01V9WysPEqhPVMvmvMBbfQh7La8TKKEkLpSti2srPbYaZ67M5ekPppb4i+D+8fz9B057D10kodeC63wsyWOCuKio7hZA8x8Qht9CBuS2JvLxoRW0NlTq3by0fZaHrlxAlMyk6wuJ+xNGzGIH107lrc3VPPSp3usLscrDU0tLF9XyXQNMPMZbfQhrsBuY//RBj4OgaCzj7fX8se/beeWnAzmXah3CAqUuy8bwfQJqfxq5RYce3qSTxhYH2w+QP0pDTDzJW30Ie7r41MZ2DeOJY7gPilbVXeK+19dx+jB/Xj8lkl63DWARITfzckiY0BvFrxcysEgDz8rcjjJSOqtAWY+pI0+xMXFRHFLTgYfbD4QtOmFjc2t3LuolKYWo2FlFknsHctz8/KoO9nE/a+uC9pDfRVHTrJm50Fm52XqSXof0kYfBgrsNlfQWVmV1aV49MuVWyhz1vHb2VMYmaJhZVaZkN6fx2ZN4tOdh/jDB8EZfra0xDXuf7YGmPmUNvowMDYtgSxbEkXFwRd0tqK8ir98toe7Lh3OzMlDrC4n4hXYbRTabTy9eierth6wupx/0tpqWFLi5JKRyRpg5mPa6MNEgT2TbQeOUV4RPEFnO2uO8fDS9dgvGMDD142zuhzl9oubJzJhSH++t7gc5+HgCT/77CtXgNkcu+7N+5o2+jBxY1Y68bFRFAXJSdkTp5uZv7CUPnHRPH1HLrHR+l8tWMTHRvP8nXm0Glf4WUNTcOQlFWmAmd/opy9M9I+PZeakIbwZBEFnxhh+vGwDu2pdYWVpifGW1qPONnRQH54oyGZDZT2PBkH4Wf3JJt7dtJ9ZORpg5g/a6MNIQb4r6OydjdYGnf3vF3tZUV7F96eP5WIdIhe0rpmQyvzLR/Lyl/tYVmrt1dVvuAPMdOy8f2ijDyMXDh/IBYOsDTpbt+8Ij721mavHDeaey0daVofyzg+mj2HaiIH8ZPkGtu4/alkdi4udTBjSn0kZiZbVEM68ucPUSyJSIyIbO5k/T0TWi8gGEflMRLLazdvjnl4mIg5fFq7OJiIU2G18ufswew4GPujs8IlGFiwqJbV/PE8UaFhZKIiJjuLJ23PoHx/LPQtLOdbQFPAaNlbWs6nqqMYR+5E3e/R/AWacY/5u4HJjzGTgMeCFDvOvNMZkG2PsPStRdcdtue6gs5LA7tW3uMPKDh5v5Ll5eST2iQ3o+lXPDU6I5+k7ctl3+CQ/siD8bInDSVxMFDdn672C/cWbWwl+DHQakGGM+cwYc8T91y8AHRtlobTEeC63IOjsqVU7+Hh7Lf9+00QmZ+rX71AzdfhAHp4xjnc27ufFNbsDtt6GphZeL6vi2olpmmTqR74+Rn8X8E67vxvgfREpEZG7z/VCEblbRBwi4qitDf6ArmBWmG/jwNHTfLw9MNvx79tq+NPfdnBrbga3T9Wv36Hq218bzoyJafzqna0UByj87H13gFmhnoT1K581ehG5Elejf6jd5EuNMbnAdcACEbmss9cbY14wxtiNMfaUlBRflRWRrhqXyqC+cQEZU19Zd4oHFpcxNjWBx2dN1rCyECYi/HbOFGwDerNgUSm1x/yfnbTEHWB28chBfl9XJPNJoxeRKcCfgZuNMYfaphtjKt1/1gDLgam+WJ86t7agsw+3+Dfo7HRzC/cuKqXFHVbWO07HP4e6/vGxPHdnHkcbmvjuK+tobmn127raAszm2DXAzN/Ou9GLyFBgGfANY8z2dtP7ikhC23NgOuBx5I7yvYJ8V9DZcj/eHPrxt7dQ7qzjd3OmMDy5r9/WowJr/JD+/MesyXy+6xBP+DH8rO3OaBpg5n/eDK98BfgcGCsiFSJyl4jMF5H57kUeAQYBz3YYRpkKrBGRcmAt8LYx5l0//AzKgzGpCWTbkljsp6CzN8oq+evne/m/XxvOjEkaVhZuZudlcvtUG8/+/Ss+3Oz78LPWVsNrJRVcOiqZzAEaYOZvXQaDG2Nu72L+t4Fve5i+C8g6+xUqUArsNn6yfANlzjpyhg7w2fvuOHCMh5duIH/YAH40Q8PKwtXPb5zIhsp6Hiwq463vfI2hg3zXkD/96iCVdad4SMPuAkKvjA1jN2YNcQed+e7y9uOnm5m/sIS+vWI0rCzMxcdG89y8PADufbnEp+FnRY4KEnvHMn1Cqs/eU3VOP6VhLCE+lpmTh/BmeRUnG5vP+/2MMTy8dD27D57gqdtzSO2vYWXhzjawD38ozGZj5VF+8eYmn7xn3clG3tu0n1nZ6RpgFiDa6MNcod3G8dPNvLNh/3m/1/98toe31lfzg2vHcpEOh4sYV49P5d4rRvLKWievlZz/t8M3yqpcAWYaeRAw2ujD3NThAxk2qA+Lz3NMfem+Izy+cgtfHz+Y+ZdpWFmkefCaMVw0YhA/Xb6BLdXnF362uNjJxPT+TEzXK6gDRRt9mBMR5thtrN19mN09DDo7dPw0CxaVkpYYz3/O0bCySNQWfpbYO5Z7FpZwtIfhZxsr69lcrQFmgaaNPgKcCTrrwV59W1jZoRMaVhbpUhJ68ey8XCqOnOJHS3oWflbUFmCWleGHClVntNFHgLTEeK4YO5ilpRXdvtLxT3/bwSc7DvLoTRM1K1xhHzaQh68bx7ub9vPnT7oXftbQ1MLr6yqZMTFNdxgCTBt9hCiwu4POdngfdLZ6Ww1PrdrBnLxM/aqtzrjr0uHMnJzGr9/dytrd3oefvbdpP0cbmvX/kgW00UeIq8YNdgWdFXs3aqLiyEm+t7iMcWn9eWzWJA0rU2eICL+5bQoXDOzDgpdLqTnW4NXrljgqyBzQm4tG6IitQNNGHyHiYqK4NdcVdHawi6Czfworm5erY53VWRLiY3n2zlyONTTxnZe7Dj9zHnYHmOXZ9GS+BbTRR5ACu43mVsPy0nMHnT321mbWV9Tz+4IshmlYmerEuLT+/PKWyXy5+zC/f//c4WdLSioQgdl2DTCzgjb6CDI6NYGcoUkUOToPOnt9XSULv9jHv142gmsnpgW4QhVqbs3N5I4Lh/L8R1/xQSfhZy2thtccTi4dlUxGUu8AV6hAG33EKbDb2FFznHXOurPmbT9wjB8v28DU4QP54bVjA1+cCkmP3DCByRmJPFhUxt5DZ1+r8enOg1TVN1Cgd5GyjDb6CHPDlCH0jo0+a0z9P4WV3Z5DjIaVKS/Fx0bz7LxcokS4Z2HpWeFnRQ4nSX1imT5RA8ysop/mCPOPoLPqM0Fnxhgeem09ew+d5Ok7chisYWWqm1zhZ1lsrj7Kz9/4R/jZkRONvL/pALOyM+gVoyf1raKNPgIV5ruCzla6g87++9M9vL2hmh9eO5ZpOvRN9dBV41K578pRLHY4z9yv+I2yShpbWvWwjcW8avQi8pKI1IiIx1sBisuTIrJTRNaLSG67ed8UkR3uxzd9VbjqufxhAxie3JeiYiclew/zy5VbuGZCKv962QirS1Mh7nvXjOGSUYP42esb2VRVz2JHBZMy+jMhvb/VpUU0b/fo/wLMOMf864DR7sfdwHMAIjIQ+DlwIa4bg/9cRHx3qyPVI66gs0zW7jnMv/5vCRkDevP7OVl6UZQ6b9FRwp/m5jCgTxzffGktW6qPUqh785bzqtEbYz4GznWt883AX43LF0CSiAwBrgU+MMYcNsYcAT7g3L8wVIC0BZ0da2jm2Xm5JPbW7BHlG8n9evHMvFzqTjYRFxPFTRpgZrku7xnrpQyg/TCOCve0zqafRUTuxvVtgKFDh/qoLNWZ1P7x/MesyaQnxWsuuPK5vAsG8My8XI43NGuAWRDwVaM/b8aYF4AXAOx2e/fzT1W33XGh/kJV/qMX3AUPX426qQTaH4jLdE/rbLpSSqkA8VWjXwH8i3v0zTSg3hhTDbwHTBeRAe6TsNPd05RSSgWIV4duROQV4AogWUQqcI2kiQUwxjwPrARmAjuBk8D/cc87LCKPAcXut3rUGON9gLVSSqnz5lWjN8bc3sV8AyzoZN5LwEvdL00ppZQv6JWxSikV5rTRK6VUmNNGr5RSYU4bvVJKhTnp7E5DVhKRWmBvD1+eDBz0YTm+onV1j9bVPVpX94RjXRcYY1I8zQjKRn8+RMRhjLFbXUdHWlf3aF3do3V1T6TVpYdulFIqzGmjV0qpMBeOjf4FqwvohNbVPVpX92hd3RNRdYXdMXqllFL/LBz36JVSSrWjjV4ppcJcyDZ6EZkhItvcNyR/2MP8XiKy2D3/SxEZFiR1fUtEakWkzP34dgBq6vHN3S2u6woRqW+3rR4JUF02EVktIptFZJOI3O9hmYBvMy/rCvg2E5F4EVkrIuXuun7hYZmAfx69rCvgn8d2644WkXUi8paHeb7dXsaYkHsA0cBXwAggDigHJnRY5l7geffzucDiIKnrW8DTAd5elwG5wMZO5s8E3gEEmAZ8GSR1XQG8ZcH/ryFArvt5ArDdw79jwLeZl3UFfJu5t0E/9/NY4EtgWodlrPg8elNXwD+P7db9IPCyp38vX2+vUN2jnwrsNMbsMsY0Aq/iukF5ezcD/+N+/hpwtYhIENQVcKbnN3e3ui5LGGOqjTGl7ufHgC2cfa/jgG8zL+sKOPc2OO7+a6z70XGUR8A/j17WZQkRyQSuB/7cySI+3V6h2ui9uen4mWWMMc1APTAoCOoCuM39df81EbF5mB9oXt/E3QIXub96vyMiEwO9cvdX5hxce4PtWbrNzlEXWLDN3IchyoAa4ANjTKfbK4CfR2/qAms+j38EfgS0djLfp9srVBt9KHsTGGaMmQJ8wD9+a6uzleLK78gCngJeD+TKRaQfsBR4wBhzNJDrPpcu6rJkmxljWowx2bjuCz1VRCYFYr1d8aKugH8eReQGoMYYU+LvdbUJ1UbvzU3HzywjIjFAInDI6rqMMYeMMafdf/0zkOfnmrwRlDdxN8YcbfvqbYxZCcSKSHIg1i0isbia6SJjzDIPi1iyzbqqy8pt5l5nHbAamNFhlhWfxy7rsujzeAlwk4jswXV49yoRWdhhGZ9ur1Bt9MXAaBEZLiJxuE5WrOiwzArgm+7ns4FVxn1mw8q6OhzHvQnXcVardXZzd0uJSFrbcUkRmYrr/6vfm4N7nS8CW4wxT3SyWMC3mTd1WbHNRCRFRJLcz3sD1wBbOywW8M+jN3VZ8Xk0xvzYGJNpjBmGq0esMsbc2WExn24vr+4ZG2yMMc0ich/wHq6RLi8ZYzaJyKOAwxizAtcH4n9FZCeuE35zg6Su74rITUCzu65v+bsu6eHN3YOgrtnAPSLSDJwC5gbglzW49ri+AWxwH98F+AkwtF1tVmwzb+qyYpsNAf5HRKJx/WIpMsa8ZfXn0cu6Av557Iw/t5dGICilVJgL1UM3SimlvKSNXimlwpw2eqWUCnPa6JVSKsxpo1dKqTCnjV4ppcKcNnqllApz/x/DWDiRyii/5AAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "plt.plot([3,1,2,1,3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[공식 홈페이지](https://jupyterbook.org/interactive/interactive.html#plotly)를 참고하여 interactive한 시각화도 가능합니다. " - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# .ipynb 파일 활용" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jupyter Book에선 .ipynb파일 또한 지원합니다. 아래와 같이 코드를 입력하고, 그에 대응하는 출력물을 함께 웹페이지로 구성 가능합니다. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAA0BklEQVR4nO3deXxU9b3/8dcnG2EJCZCQkGSQfYdsE8SlrhURN1RIUOxtfw/786LYau2ibW/trV67X9u6X3/V29sLKkFAUXEtVMWNTELCvsk2WSBhSVhDtu/vj5nQNEzIJMzMmeXzfDzmwXDOmTmfHJhPzpzzPe8jxhiUUkqFryirC1BKKeVf2uiVUirMaaNXSqkwp41eKaXCnDZ6pZQKczFWF+BJcnKyGTZsmNVlKKVUyCgpKTlojEnxNC8oG/2wYcNwOBxWl6GUUiFDRPZ2Nk8P3SilVJjTRq+UUmFOG71SSoU5bfRKKRXmtNErpVSY67LRi0i8iKwVkXIR2SQiv/CwTC8RWSwiO0XkSxEZ1m7ej93Tt4nItT6uXymlVBe82aM/DVxljMkCsoEZIjKtwzJ3AUeMMaOAPwC/ARCRCcBcYCIwA3hWRKJ9VLtSSikvdNnojctx919j3Y+O2cY3A//jfv4acLWIiHv6q8aY08aY3cBOYKpPKu+goamFFz7+is++OuiPt1dKKb9avbWGl9bsprG51efv7dUxehGJFpEyoAb4wBjzZYdFMgAngDGmGagHBrWf7lbhnuZpHXeLiENEHLW1td36IQBiooQ/f7Kbl9bs7vZrlVLKas9/9BV//XwPsdHi8/f2qtEbY1qMMdlAJjBVRCb5uhBjzAvGGLsxxp6S4vEq3nOKiY7itrxMVm+rpeZog6/LU0opv9lz8ARf7j7MHLsN18EQ3+rWqBtjTB2wGtfx9vYqARuAiMQAicCh9tPdMt3T/GJOXiYtrYalpX5bhVJK+dySEidRArflZvrl/b0ZdZMiIknu572Ba4CtHRZbAXzT/Xw2sMq47lG4ApjrHpUzHBgNrPVR7WcZkdKPqcMGssThRG+RqJQKBS2thtdKKrhi7GDSEuP9sg5v9uiHAKtFZD1QjOsY/Vsi8qiI3ORe5kVgkIjsBB4EHgYwxmwCioDNwLvAAmNMi69/iPbm2DPZdfAEjr1H/LkapZTyiY+313Lg6GkK7P7Zmwcv0iuNMeuBHA/TH2n3vAGY08nrHwceP48au+X6KUP49xWbKCp2kj9sYKBWq5RSPVLkcDKobxxXjUv12zrC7srYPnEx3JiVztsbqjl+utnqcpRSqlOHjp/mwy0HuCUng7gY/7XjsGv0AAX5Nk42tvD2+iqrS1FKqU4tX1dJU4uhIN/W9cLnISwbfY4tiVGD+7G42Nn1wkopZQFjDEUOJ9m2JMakJvh1XWHZ6EWEQruN0n117Kw5ZnU5Sil1ljJnHdsPHKfQz3vzEKaNHuCW3AxiooQiR4XVpSil1FmKHBX0jo3mhilD/L6usG30yf16cfX4wSwrraCpxffZEUop1VMnG5t5s7yKmZOHkBAf6/f1hW2jByiw2zh4vJFVW2usLkUppc54Z8N+jp9u9uvY+fbCutFfPiaFwQm9KNKTskqpILLY4WR4cl+mDg/MtT5h3ehjoqOYnZfJ6m01HNCgM6VUENh98ARrdx9mjj3TLwFmnoR1oweYY7fRamBpqZ6UVUpZb4nDvwFmnoR9o2/7erTEUaFBZ0opSzW3tLK0tIIrxw4mtb9/Asw8CftGD66TsrsPnqB4jwadKaWs8/EOV4DZHLv/x863FxGNfubkNPr1iqHIoSdllVLWKSquILlfHFePHxzQ9UZEo3cFnQ3h7fXVHGtosrocpVQEOtguwCw2OrCtNyIaPbgO35xqauGt9dVWl6KUikDLSytpbjUUBPiwDURQo8+2JTF6cD89fKOUCri2ALOcoUmM9nOAmSfe3ErQJiKrRWSziGwSkfs9LPNDESlzPzaKSIuIDHTP2yMiG9zzHP74IbwhIhTm21i3r44dBzToTCkVOOucdeyoOU6hBXvz4N0efTPwfWPMBGAasEBEJrRfwBjzO2NMtjEmG/gx8JEx5nC7Ra50z7f7qvCemJXTFnSme/VKqcBZ4nDSOzaa6wMQYOZJl43eGFNtjCl1Pz8GbAEyzvGS24FXfFOebyX368XXx6eyrLSSxmYNOlNK+Z8rwKya66cEJsDMk24doxeRYbjuH/tlJ/P7ADOApe0mG+B9ESkRkbvP8d53i4hDRBy1tbXdKatbCvIzOXRCg86UUoGx8kyAmTWHbaAbjV5E+uFq4A8YY452stiNwKcdDttcaozJBa7DddjnMk8vNMa8YIyxG2PsKSkp3pbVbZeNTiG1fy89fKOUCoiiYicjkvuSP2yAZTV41ehFJBZXk19kjFl2jkXn0uGwjTGm0v1nDbAcmNqzUn2jLejs7xp0ppTys121x1m75zBz7LaABZh54s2oGwFeBLYYY544x3KJwOXAG+2m9RWRhLbnwHRg4/kWfb7m5LmCzl4r0aAzpZT/LCmpIDpKuC33XKc1/c+bPfpLgG8AV7UbQjlTROaLyPx2y90CvG+MOdFuWiqwRkTKgbXA28aYd31WfQ8NS+7LhcMHssTh1KAzpZRfNLe0srSkgivHpjA4gAFmnsR0tYAxZg3Q5XcOY8xfgL90mLYLyOphbX5VYLfx/SXlrN19mAtHDLK6HKVUmPloey01xwIfYOZJxFwZ29HMyUPo1yuGxXpSVinlB4uLnST3i+OqcYENMPMkYht977hobsxKZ+UGDTpTSvlW7bHTrNpaw625mQEPMPPE+gosVJhvo6GplTfLNehMKeU7y9dVuAPMAncXqXOJ6EaflZnImFQNOlNK+Y4rwKyC3KFJjBoc+AAzTyK60YsIBXYbZc46tmvQmVLKB0r31bGz5jiF+dafhG0T0Y0ecN8EQCgq1r16pdT5W+Jw0icumuunpFtdyhkR3+gHtQWdrdOgM6XU+Tlxupk3y6u43j2qL1hEfKMHKMi3cfhEI6u2HrC6FKVUCFu5oZoTjS1BddgGtNEDrqCztP7xLNbDN0qp81DkcDIipS95F1gXYOaJNnogOkqYnZfJR9tr2V+vQWdKqe7bVXuc4j1HKLA4wMwTbfRuc+yZtBpYWqpBZ0qp7ityuALMbrU4wMwTbfRuFwzqy7QRAylyOGlt1aAzpZT3mltaWVpawZVjBzM4wdoAM0+00bdTYLex99BJ1u453PXCSinl9vdttdQeOx00V8J2pI2+nesmDSGhV4yOqVdKdctih5Pkfr24MggCzDzRRt9O77hobsxOZ+XGao5q0JlSygs1xxpYtbWG23IzgiLAzJPgrMpChfa2oLMqq0tRSoWA5aWVtLSaoMid74w3txK0ichqEdksIptE5H4Py1whIvXt7kD1SLt5M0Rkm4jsFJGHff0D+NqUzETGpiZQ5NDRN0qpc3MFmDnJu2AAowb3s7qcTnmzR98MfN8YMwGYBiwQkQkelvvEGJPtfjwKICLRwDPAdcAE4PZOXhs0RISCfBvlzjq27degM6VU50r3HeGr2hMUBvHePHjR6I0x1caYUvfzY8AWwNuBolOBncaYXcaYRuBV4OaeFhsoZ4LONL5YKXUORcUV9ImLZuaUIVaXck7dOkYvIsOAHOBLD7MvEpFyEXlHRCa6p2UA7btlBZ38khCRu0XEISKO2tra7pTlcwP7xnHNhFSWa9CZUqoTJ04389b6Km6YElwBZp543ehFpB+wFHjAGHO0w+xS4AJjTBbwFPB6dwsxxrxgjLEbY+wpKSndfbnPFdhdQWd/26JBZ0qps70dpAFmnnjV6EUkFleTX2SMWdZxvjHmqDHmuPv5SiBWRJKBSqD9Vsh0Twt6XxudwpDEeL15uFLKo6JiV4BZ7tDgCjDzxJtRNwK8CGwxxjzRyTJp7uUQkanu9z0EFAOjRWS4iMQBc4EVviren9qCzj7eXkt1/Smry1FKBZGdNcdx7D1CYRAGmHnizR79JcA3gKvaDZ+cKSLzRWS+e5nZwEYRKQeeBOYal2bgPuA9XCdxi4wxm/zwc/jFnDybK+isRIdaKqX+YUmJk+go4ZYgDDDzpMszCMaYNcA5f2UZY54Gnu5k3kpgZY+qs9jQQX24aMQgihwV3HvFKKKigv83t1LKv5paWllaUslV44IzwMwTvTK2CwX5mew7fJIvd2vQmVLKFWB28PhpCoJ87Hx72ui7cN2kISTEx+iYeqUUAIuLnaQk9OLKsdaPDvSWNvouxMdGc1NWOis3aNCZUpGu5lgDq7fVcGtuBjFBGmDmSehUaqHCfBunm1tZUaZBZ0pFsmXuALNQOmwD2ui9MjkjkXFpCSzRwzdKRay2ADP7BQMYmRK8AWaeaKP3gohQYLdRXlHP1v0dLwpWSkWCkr1H2FV7goIQuBK2I230XprVFnRWrGPqlYpERQ4nfeOiuX5ycAeYeaKN3ksD+8YxfUIay9dVcLq5xepylFIBdPx0M2+tr+aGKen0DfIAM0+00XdDQb6NIyeb+HBzjdWlKKUC6O31VZxsbAnJwzagjb5bLh2VTHpivI6pVyrCFDkqGJnSl9yhSVaX0iPa6LvhTNDZjlqq6jToTKlIsLPmGCV7j1CYHxoBZp5oo++m2Xk2jAadKRUxljgqiIkSbsnJtLqUHtNG301DB/Xh4pGDKCpx0tpqrC5HKeVHTS2tLC2t4Kpxg0lJ6GV1OT2mjb4HCuw2nIdP8cXuQ1aXopTyo9Vbazh4vDHkroTtSBt9D8yYlOYKOivWk7JKhbMihyvA7IoQCjDzxJs7TNlEZLWIbBaRTSJyv4dl5onIehHZICKfiUhWu3l73NPLRMTh6x/ACvGx0dycnc47G/dTf0qDzpQKRzVHG1i9rZbbcjNDKsDME2+qbwa+b4yZAEwDFojIhA7L7AYuN8ZMBh4DXugw/0pjTLYxxn7eFQeJQvtQV9BZuQadKRWOlp4JMAvdk7Btumz0xphqY0yp+/kxXLcEzOiwzGfGmCPuv36B6ybgYW1SRn8NOlMqTBljWOJwkj9sACNCLMDMk259HxGRYUAO8OU5FrsLeKfd3w3wvoiUiMjd53jvu0XEISKO2tra7pRlCRGhMN/G+op6tlRr0JlS4cSx9wi7Dp4I+ZOwbbxu9CLSD1gKPGCM8djZRORKXI3+oXaTLzXG5ALX4Trsc5mn1xpjXjDG2I0x9pSU0DjxMSs7g7joKL1SVqkwU1TsDjCbEnoBZp541ehFJBZXk19kjFnWyTJTgD8DNxtjzow7NMZUuv+sAZYDU8+36GAxoG8c10xMZfm6Sg06UypMHD/dzNsbqrkxK50+caEXYOaJN6NuBHgR2GKMeaKTZYYCy4BvGGO2t5veV0QS2p4D04GNvig8WBTabdSdbOKDzQesLkUp5QNvlYd2gJkn3vy6ugT4BrBBRMrc034CDAUwxjwPPAIMAp51Z0E0u0fYpALL3dNigJeNMe/68gew2iVngs4quGFKutXlKKXOU5HDyajB/cixJVldis902eiNMWuAcyb5GGO+DXzbw/RdQNbZrwgf0VHCbLuNp1btoLLuFBlJva0uSSnVQztrjlG6r46fzhwfsgFmnoT2VQBBYk5epgadKRUGitoCzHIzul44hGij9wHbwD5cMmoQRQ4NOlMqVDW1tLKstIKrxw8muV/oBph5oo3eRwrsNiqOnOKLXRp0plQoWhUmAWaeaKP3kWsnptE/PobFOqZeqZBUVOxkcEIvLh8TGtfxdIc2eh9xBZ1luILOTmrQmVKh5MDRBlZvq+G2vNAPMPMk/H4iCxXm22hsbmVFeaXVpSilumFpaQWthrA8bAPa6H1qYnp/xg/pT5FDR98oFSpcAWYVTB02kOHJfa0uxy+00fuQiFBoz2RDZT2bqzToTKlQULznCLsPngirK2E70kbvY7NyNOhMqVCyuNhJv14xzJycZnUpfqON3seS+sQx3R101tCkQWdKBbNjDU2s3FDNjVlDwibAzBNt9H5QmG+j/pQGnSkV7N5aX82pppawPQnbRhu9H1wyMpmMpN56+EapIFfkcDJ6cD+ywyjAzBNt9H4QFSXMzstkzc6DVBw5aXU5SikPdhw4xrp9dRTm28IqwMwTbfR+MjvPddvcpSU6pl6pYFTkcBITJczKCa8AM0+00fuJbWAfLhmZzJISDTpTKtg0NreyrLSSr49PDbsAM0+00fvRHHsmFUdO8bkGnSkVVFZtreHQiUYK8jOtLiUgvLmVoE1EVovIZhHZJCL3e1hGRORJEdkpIutFJLfdvG+KyA7345u+/gGC2Zmgs2I9KatUMClyOEnt34vLRodfgJkn3uzRNwPfN8ZMAKYBC0RkQodlrgNGux93A88BiMhA4OfAhbhuCv5zERngo9qDXnxsNLNyMnh3kwadKRUsDhxt4O/bargtNzwDzDzp8qc0xlQbY0rdz48BW4COZy9uBv5qXL4AkkRkCHAt8IEx5rAx5gjwATDDpz9BkCuwu4LO3tCgs5C3uHgfr6/Tf8dQ91pJeAeYedKtS8FEZBiQA3zZYVYG0P74RIV7WmfTPb333bi+DTB06NDulBXUJmUkMjG9P4uLnfzLRcOsLkf10AebD/DQ0g1ECaQk9OKSUclWl6R6wBVg5mTq8IEMC9MAM0+8/t4iIv2ApcADxhifJ3YZY14wxtiNMfaUlPA6blZgt7Gp6igbK+utLkX1wN5DJ3iwqIxJGf0ZmdKP776yjv31DVaXpXpg7e7D7Dl0ksII2psHLxu9iMTiavKLjDHLPCxSCbTfcpnuaZ1Njyg3Z6cTFxPFEr1SNuQ0NLVwz8JSokR4bl4ez92Zy6mmFu57uZSmllary1PdtNjRFmA2xOpSAsqbUTcCvAhsMcY80cliK4B/cY++mQbUG2OqgfeA6SIywH0Sdrp7WkRJ6hPHtRPTeL2sSoPOQszP39jE5uqj/KEwC9vAPowanMBvbpuCY+8Rfv3OVqvLU93wjwCzdHrHRVtdTkB5s0d/CfAN4CoRKXM/ZorIfBGZ715mJbAL2An8P+BeAGPMYeAxoNj9eNQ9LeIU2l1BZ+9r0FnIKCp2stjhZMGVI7lqXOqZ6TdmpfOti4fx4prdrNxQbWGFqjveLK+moamVwjDOne9MlydjjTFrgHMGQRhjDLCgk3kvAS/1qLowcvHIQWQk9WaJw8lNWelWl6O6sKmqnp+9sZGLRw7iwWvGnjX/JzPHU15Rxw+XlDM2LYGRKf0sqFJ1R5HDyZjUfmRlJlpdSsBFxiDSIBAVJcyxa9BZKKg/1cQ9C0tJ6hPLk7fnEB119n5OXEwUz9yRS6/YaO5ZWMLJxmYLKlXe2n7gGGXOOgrs4R9g5ok2+gBqCzp7rUTvKRusjDH8YEk5VXWneOaO3HPmoKQn9eZPc7PZUXOcny7fiOuLrQpGRcVOYqOFWyIgwMwTbfQBlDmgD5eOSmaJo0KDzoLUf328iw82H+Dh68ZhHzawy+W/NjqFB64ew/J1lSz6cl8AKlTd1djcyrJ1rgCzQREQYOaJNvoAm2O3UVl3is++0qCzYPPFrkP89t2tzJycxl2XDvf6dd+5ahSXj0nh0Tc3s76izn8Fqh5ZtfUAh080RtSVsB1pow+w6RNSSewdy2IdUx9Uao42cN/L6xg2qC+/uW1Kt47jRkUJfyzMJiWhF/csLOXIiUY/Vqq6a3Gxk7T+8Vw2JrwuxOwObfQBFh8bzazsdN7btJ+6k9oQgkFzSyv3vbKOE6ebee7OPBLiY7v9HgP6xvHsvFxqj53me0VlemguSOyvb+Cj7bXclpfh8aR6pNBGb4GCfHfQWVmV1aUo4HfvbWPt7sP88tZJjE1L6PH7ZNmS+NmNE/j7tlqeWb3ThxWqnlpaGnkBZp5oo7fAxPREJmX015z6IPDepv3818e7mHfhUG7JOf+bUNx54VBmZafzxIfbWbPjoA8qVD3V2moocjiZNmIgFwyKnAAzT7TRW6TAbmNztQadWWnPwRP8oKicKZmJPHJjx1ss9IyI8MtbJzN6cD++++o6qutP+eR9Vfet3XOYvYdORvzePGijt8zNWRnExURRpCdlLdHQ1MI9i0qJihLXhU8xvss+6RMXw3N35nG6qYUFi0ppbNbwMysUFTtJ6BXDdZMiK8DME230FknsE8uMiWm8vq5Sg84s8LPXN7Kl+ih/LMzGNrCPz99/ZEo/fjs7i9J9dfzqnS0+f391bkcbmli5sZobsyMvwMwTbfQWKsy3cbShmfc27be6lIiyuHgfS0oq+M5Vo7hy3GC/ref6KUP4P5cM478/3cNb6/XEeyC9WV7lCjDTwzaANnpLXTRiEJkDerPEoZEIgbKxsp6fvbGJS0cl88DXx/h9fT++bjy5Q5N46LX17Kw57vf1KZciRwVjUxOYEoEBZp5oo7dQVJQwJ8/Gmp0HcR7WoDN/qz/ZxD2LShjYJ44/zc0OyLjquJgonpn3j/CzE6c1/Mzftu0/RrmzjoL8yAww80QbvcVm2zMR0aAzf2ttNXx/SRnVdQ08My83oJknQxJ78+TcHHbWHucnyzdo+JmfFTkiO8DME230FstI6s2lo5J5raSCFr2a0m+e//grPtxSw0+vH0/eBQMCvv5LRyfz4NfH8EZZFQu/2Bvw9UeKxuZWlq+r5JoJqQzsG2d1OUHDm1sJviQiNSKysZP5P2x356mNItIiIgPd8/aIyAb3PIeviw8XBe6gs0936gU2/vDZVwf5/XvbuH7KEL518TDL6lhw5SiuHJvCo29tpsxZZ1kd4ezDLa4Aszl6EvafeLNH/xdgRmczjTG/M8ZkG2OygR8DH3W4XeCV7vn286o0jE2fmEpSn1gdU+8HB4428N1X1jE8ufthZb4WFSX8oTCbwQnxLFik4Wf+UORwB5iNjtwAM0+6bPTGmI8Bb+/zejvwynlVFIF6xUQzKzuD9zcd0A+/DzW1tHLfy6WcON3Cc3fm0a9Xl3fO9LukPnE8d6cr/OyBxRp+5kvV9af4eHsts/MyIzrAzBOfHaMXkT649vyXtptsgPdFpERE7u7i9XeLiENEHLW1tb4qK2QU2G00trTyRlml1aWEjd++u5XiPUf49W2TGZPa87AyX5uSmcTPb5rAR9treWqVhp/5ytISDTDrjC9Pxt4IfNrhsM2lxphc4DpggYhc1tmLjTEvGGPsxhh7Skrkfe2akN6fyRmJLHZU6KgMH3h3YzX/75PdfGPaBdycHXyjL+6YOpRbczL449+28/H2yNux8TVXgFkFF40YxNBBvr/SOdT5stHPpcNhG2NMpfvPGmA5MNWH6ws7BfZMtlQfZVPVUatLCWm7D57gh0vWk2VL4t9uGG91OR6JCI/fMpkxgxO4/9V1VNVp+Nn5+HL3YfYdPklB/vknkIYjnzR6EUkELgfeaDetr4gktD0HpgMeR+4ol5uyM+gVE6XxxefhVGML9ywsITpaeOaOHJ+Glfla77honrszl6YWw70afnZeihxOEuI1wKwz3gyvfAX4HBgrIhUicpeIzBeR+e0WuwV43xhzot20VGCNiJQDa4G3jTHv+rL4cJPYO5YZk9J4o0yDznrCGMO/vb6RbQeO8cfCbDIHBP9X+BEp/fjt7CmUOev45UoNP+uJow1NrNxQzU1Z6cTHBu8vdit1OQzBGHO7F8v8BdcwzPbTdgFZPS0sUhXabbxRVsV7m/YH5bHlYPZqsZOlpRV89+rRXDHWf2FlvjZz8hDuunQ4L67ZTe4FA7gpK93qkkLKirIqTje3UpivJ2E7o1fGBplpIwZhG9hbx9R308bKen6+YhNfG53M/VePtrqcbnv4unHYLxjAw0vXs7PmmNXlhJQlDifj0hKYnKEBZp3RRh9k2oLOPt15SIPOvFR3spH5C0tI7hvHn+bmhOQY6tjoKJ6+I5c+cdHMX1iq4Wde2rr/KOUV9RTYNcDsXLTRB6Hb8lxBZ0t0r75Lra2GB4vKOXDUFVYWyvkmaYnxPDk3h121x3l4mYafeWNxsSvAbJYGmJ2TNvoglJHUm6+NTtGgMy8899FXrNpaw79dP4GcoYEPK/O1i0cl8/3pY3mzvIq/fq7hZ+dyurmF19dVMn1CWkj/gg8EbfRBqsCeSVV9A2s06KxTn+48yH++v40bs9L5l4susLocn7nn8pFcPW4w//H2Zkr3HbG6nKD14eYajpxsYo5dx853RRt9kLpmQioDNOisU/vrXWFlI1L68etbJ4fV8dmoKOGJgmzSEuO5b1EphzX/yKMih5P0xHi+pgFmXdJGH6R6xUQzKyeDDzTo7CxtYWWnmlp4/s5c+gZBWJmvJfaJ5bl5eRw80cj9r67TQ3gdVNWd4uMdGmDmLW30Qawt6Ox1DTr7J79+ZyuOvUf49W1TGDU4eMLKfG1SRiK/uGkin+w4yJN/22F1OUFlaUkFxsDsPB077w1t9EFs/JD+TMlMZHGxU0dguK3cUM2La3bzzYsuiIgLi+bm27gtN5MnV+3g79tqrC4nKLS2GopKnFw8UgPMvKWNPsjNsdvYuv8YGys16GxX7XF+9Np6sm1J/PT6CVaXExAiwn/MmsTY1AQeWFxGpYaf8cXuQzgPn9I44m7QRh/kbspKdwWdOfZZXYqlTjY2c8/CUmKjhWfm5RIXEzn/dV3hZ3m0uMPPTjdHdg5SUbErwGzGpDSrSwkZkfNpCVGJvWO5blIab5RVRWzQmTGGf1u+ke01x/jT3BwyknpbXVLADU/uy+/mTKHcWcfjb0du+Fn9qSbe2bifm7M1wKw7tNGHgIJ8G8camnl3436rS7HEy2v3sWxdJQ9cPYbLxkTuULoZk4bwf782nL9+vjdi70S2otwdYGYfanUpIUUbfQiYNtwVdBaJOfXrK+r4xYrNXD4mhe9cNcrqciz3oxnjyB82gIeXbmDHgcgLPysqdgWYTcrob3UpIUUbfQiIihIK8mx8vusQ+w5FTtBZ3clG7llYSkpCL/5YmE2Ujpc+E37Wt1cM8xeWcDyCws82Vx1lQ2U9hfkaYNZd3tx45CURqRERj3eHEpErRKReRMrcj0fazZshIttEZKeIPOzLwiPNmaCzksjYq29tNTywuIyaY66wsgGaZXJGav94nro9h90HT/DQ0vURM/S2yOEkLjqKWXqfhm7zZo/+L8CMLpb5xBiT7X48CiAi0cAzuG4MPgG4XUQiY0ycH6Qn9eayCAo6e2b1Tv6+rZZHbphAti3J6nKCzkUjB/GDa8fy9vpq/vLZHqvL8bvTzS28XlbJNRNT9Zd+D3TZ6I0xHwOHe/DeU4GdxphdxphG4FXg5h68j3IrsNuorm/gkx21VpfiV2t2HOSJD7dzc3Y6d04Ln7AyX5t/2Ui+Pj6Vx9/eQsne8A4/+2DzAepONunY+R7y1TH6i0SkXETeEZGJ7mkZQPvjDBXuaR6JyN0i4hARR21teDeynvr6hMEM6BPLEkeF1aX4TXX9Kb776jpGpfTjV2EWVuZrUVHCfxZkkZ7Um/teLuXQ8dNWl+Q3RY4K0hPjuXRUstWlhCRfNPpS4AJjTBbwFPB6T97EGPOCMcZujLGnpETuELpz6RUTzS05mby/eX9YJho2NreyYFEpp5taeO7OPPrEhV9Yma8l9o7l2Xm5HDrRyP2vloXlYb3KulN8sqOW2XabBpj10Hk3emPMUWPMcffzlUCsiCQDlUD771mZ7mnqPBTkZ9LUYnh9Xfhtyl+9s4XSfXX8ZvYURg3uZ3U5IWNSRiKP3TyRNTsP8qcPt1tdjs+1BZjNydPc+Z4670YvImni/n4tIlPd73kIKAZGi8hwEYkD5gIrznd9kW5cWn+yMhMpcoRX0Nlb66v470/38K2Lh3HDlPAPK/O1wvyhzMnL5MlVO1kdRuFnra2GIoeTS0YNwjZQA8x6ypvhla8AnwNjRaRCRO4SkfkiMt+9yGxgo4iUA08Cc41LM3Af8B6wBSgyxmzyz48RWdqCzjZU1ltdik/srDnOQ6+tJ3doEj+ZOd7qckLWY7MmMX5If763uIyKI+FxvcUXuw5RcUQDzM6XN6NubjfGDDHGxBpjMo0xLxpjnjfGPO+e/7QxZqIxJssYM80Y81m71640xowxxow0xjzuzx8kktyU7Q46C4MrZU82NnPvohJ6xUZHXFiZr8XHRvPcvNywCj9b7HDSPz6GaydqgNn50E9VCOofH8vMyUNYUVbFqcbQ/TAbY/jJsg3sqDnOk3NzGJIYeWFlvjYsuS+/L8hifUU9j7212epyzkv9ybYAswwNMDtP2uhDVIHdxrHTzby7qdrqUnps4Zf7eL2sige/PoZLR+uwOV+5dmIa/3rZCBZ+sS+kT9qvKK+ksbmVwnw9bHO+tNGHqAuHD2TowD4he/im3FnHY29u5sqxKSy4UsPKfO2H145l6vCB/HjZBraHaPjZYoeT8UP6MzFdA8zOlzb6EBUVJRTYM/li12H2HjphdTndcuREI/cucoWV/UHDyvwiJjqKp2/PCdnws01V9WysPEqhPVMvmvMBbfQh7La8TKKEkLpSti2srPbYaZ67M5ekPppb4i+D+8fz9B057D10kodeC63wsyWOCuKio7hZA8x8Qht9CBuS2JvLxoRW0NlTq3by0fZaHrlxAlMyk6wuJ+xNGzGIH107lrc3VPPSp3usLscrDU0tLF9XyXQNMPMZbfQhrsBuY//RBj4OgaCzj7fX8se/beeWnAzmXah3CAqUuy8bwfQJqfxq5RYce3qSTxhYH2w+QP0pDTDzJW30Ie7r41MZ2DeOJY7gPilbVXeK+19dx+jB/Xj8lkl63DWARITfzckiY0BvFrxcysEgDz8rcjjJSOqtAWY+pI0+xMXFRHFLTgYfbD4QtOmFjc2t3LuolKYWo2FlFknsHctz8/KoO9nE/a+uC9pDfRVHTrJm50Fm52XqSXof0kYfBgrsNlfQWVmV1aV49MuVWyhz1vHb2VMYmaJhZVaZkN6fx2ZN4tOdh/jDB8EZfra0xDXuf7YGmPmUNvowMDYtgSxbEkXFwRd0tqK8ir98toe7Lh3OzMlDrC4n4hXYbRTabTy9eierth6wupx/0tpqWFLi5JKRyRpg5mPa6MNEgT2TbQeOUV4RPEFnO2uO8fDS9dgvGMDD142zuhzl9oubJzJhSH++t7gc5+HgCT/77CtXgNkcu+7N+5o2+jBxY1Y68bFRFAXJSdkTp5uZv7CUPnHRPH1HLrHR+l8tWMTHRvP8nXm0Glf4WUNTcOQlFWmAmd/opy9M9I+PZeakIbwZBEFnxhh+vGwDu2pdYWVpifGW1qPONnRQH54oyGZDZT2PBkH4Wf3JJt7dtJ9ZORpg5g/a6MNIQb4r6OydjdYGnf3vF3tZUV7F96eP5WIdIhe0rpmQyvzLR/Lyl/tYVmrt1dVvuAPMdOy8f2ijDyMXDh/IBYOsDTpbt+8Ij721mavHDeaey0daVofyzg+mj2HaiIH8ZPkGtu4/alkdi4udTBjSn0kZiZbVEM68ucPUSyJSIyIbO5k/T0TWi8gGEflMRLLazdvjnl4mIg5fFq7OJiIU2G18ufswew4GPujs8IlGFiwqJbV/PE8UaFhZKIiJjuLJ23PoHx/LPQtLOdbQFPAaNlbWs6nqqMYR+5E3e/R/AWacY/5u4HJjzGTgMeCFDvOvNMZkG2PsPStRdcdtue6gs5LA7tW3uMPKDh5v5Ll5eST2iQ3o+lXPDU6I5+k7ctl3+CQ/siD8bInDSVxMFDdn672C/cWbWwl+DHQakGGM+cwYc8T91y8AHRtlobTEeC63IOjsqVU7+Hh7Lf9+00QmZ+rX71AzdfhAHp4xjnc27ufFNbsDtt6GphZeL6vi2olpmmTqR74+Rn8X8E67vxvgfREpEZG7z/VCEblbRBwi4qitDf6ArmBWmG/jwNHTfLw9MNvx79tq+NPfdnBrbga3T9Wv36Hq218bzoyJafzqna0UByj87H13gFmhnoT1K581ehG5Elejf6jd5EuNMbnAdcACEbmss9cbY14wxtiNMfaUlBRflRWRrhqXyqC+cQEZU19Zd4oHFpcxNjWBx2dN1rCyECYi/HbOFGwDerNgUSm1x/yfnbTEHWB28chBfl9XJPNJoxeRKcCfgZuNMYfaphtjKt1/1gDLgam+WJ86t7agsw+3+Dfo7HRzC/cuKqXFHVbWO07HP4e6/vGxPHdnHkcbmvjuK+tobmn127raAszm2DXAzN/Ou9GLyFBgGfANY8z2dtP7ikhC23NgOuBx5I7yvYJ8V9DZcj/eHPrxt7dQ7qzjd3OmMDy5r9/WowJr/JD+/MesyXy+6xBP+DH8rO3OaBpg5n/eDK98BfgcGCsiFSJyl4jMF5H57kUeAQYBz3YYRpkKrBGRcmAt8LYx5l0//AzKgzGpCWTbkljsp6CzN8oq+evne/m/XxvOjEkaVhZuZudlcvtUG8/+/Ss+3Oz78LPWVsNrJRVcOiqZzAEaYOZvXQaDG2Nu72L+t4Fve5i+C8g6+xUqUArsNn6yfANlzjpyhg7w2fvuOHCMh5duIH/YAH40Q8PKwtXPb5zIhsp6Hiwq463vfI2hg3zXkD/96iCVdad4SMPuAkKvjA1jN2YNcQed+e7y9uOnm5m/sIS+vWI0rCzMxcdG89y8PADufbnEp+FnRY4KEnvHMn1Cqs/eU3VOP6VhLCE+lpmTh/BmeRUnG5vP+/2MMTy8dD27D57gqdtzSO2vYWXhzjawD38ozGZj5VF+8eYmn7xn3clG3tu0n1nZ6RpgFiDa6MNcod3G8dPNvLNh/3m/1/98toe31lfzg2vHcpEOh4sYV49P5d4rRvLKWievlZz/t8M3yqpcAWYaeRAw2ujD3NThAxk2qA+Lz3NMfem+Izy+cgtfHz+Y+ZdpWFmkefCaMVw0YhA/Xb6BLdXnF362uNjJxPT+TEzXK6gDRRt9mBMR5thtrN19mN09DDo7dPw0CxaVkpYYz3/O0bCySNQWfpbYO5Z7FpZwtIfhZxsr69lcrQFmgaaNPgKcCTrrwV59W1jZoRMaVhbpUhJ68ey8XCqOnOJHS3oWflbUFmCWleGHClVntNFHgLTEeK4YO5ilpRXdvtLxT3/bwSc7DvLoTRM1K1xhHzaQh68bx7ub9vPnT7oXftbQ1MLr6yqZMTFNdxgCTBt9hCiwu4POdngfdLZ6Ww1PrdrBnLxM/aqtzrjr0uHMnJzGr9/dytrd3oefvbdpP0cbmvX/kgW00UeIq8YNdgWdFXs3aqLiyEm+t7iMcWn9eWzWJA0rU2eICL+5bQoXDOzDgpdLqTnW4NXrljgqyBzQm4tG6IitQNNGHyHiYqK4NdcVdHawi6Czfworm5erY53VWRLiY3n2zlyONTTxnZe7Dj9zHnYHmOXZ9GS+BbTRR5ACu43mVsPy0nMHnT321mbWV9Tz+4IshmlYmerEuLT+/PKWyXy5+zC/f//c4WdLSioQgdl2DTCzgjb6CDI6NYGcoUkUOToPOnt9XSULv9jHv142gmsnpgW4QhVqbs3N5I4Lh/L8R1/xQSfhZy2thtccTi4dlUxGUu8AV6hAG33EKbDb2FFznHXOurPmbT9wjB8v28DU4QP54bVjA1+cCkmP3DCByRmJPFhUxt5DZ1+r8enOg1TVN1Cgd5GyjDb6CHPDlCH0jo0+a0z9P4WV3Z5DjIaVKS/Fx0bz7LxcokS4Z2HpWeFnRQ4nSX1imT5RA8ysop/mCPOPoLPqM0Fnxhgeem09ew+d5Ok7chisYWWqm1zhZ1lsrj7Kz9/4R/jZkRONvL/pALOyM+gVoyf1raKNPgIV5ruCzla6g87++9M9vL2hmh9eO5ZpOvRN9dBV41K578pRLHY4z9yv+I2yShpbWvWwjcW8avQi8pKI1IiIx1sBisuTIrJTRNaLSG67ed8UkR3uxzd9VbjqufxhAxie3JeiYiclew/zy5VbuGZCKv962QirS1Mh7nvXjOGSUYP42esb2VRVz2JHBZMy+jMhvb/VpUU0b/fo/wLMOMf864DR7sfdwHMAIjIQ+DlwIa4bg/9cRHx3qyPVI66gs0zW7jnMv/5vCRkDevP7OVl6UZQ6b9FRwp/m5jCgTxzffGktW6qPUqh785bzqtEbYz4GznWt883AX43LF0CSiAwBrgU+MMYcNsYcAT7g3L8wVIC0BZ0da2jm2Xm5JPbW7BHlG8n9evHMvFzqTjYRFxPFTRpgZrku7xnrpQyg/TCOCve0zqafRUTuxvVtgKFDh/qoLNWZ1P7x/MesyaQnxWsuuPK5vAsG8My8XI43NGuAWRDwVaM/b8aYF4AXAOx2e/fzT1W33XGh/kJV/qMX3AUPX426qQTaH4jLdE/rbLpSSqkA8VWjXwH8i3v0zTSg3hhTDbwHTBeRAe6TsNPd05RSSgWIV4duROQV4AogWUQqcI2kiQUwxjwPrARmAjuBk8D/cc87LCKPAcXut3rUGON9gLVSSqnz5lWjN8bc3sV8AyzoZN5LwEvdL00ppZQv6JWxSikV5rTRK6VUmNNGr5RSYU4bvVJKhTnp7E5DVhKRWmBvD1+eDBz0YTm+onV1j9bVPVpX94RjXRcYY1I8zQjKRn8+RMRhjLFbXUdHWlf3aF3do3V1T6TVpYdulFIqzGmjV0qpMBeOjf4FqwvohNbVPVpX92hd3RNRdYXdMXqllFL/LBz36JVSSrWjjV4ppcJcyDZ6EZkhItvcNyR/2MP8XiKy2D3/SxEZFiR1fUtEakWkzP34dgBq6vHN3S2u6woRqW+3rR4JUF02EVktIptFZJOI3O9hmYBvMy/rCvg2E5F4EVkrIuXuun7hYZmAfx69rCvgn8d2644WkXUi8paHeb7dXsaYkHsA0cBXwAggDigHJnRY5l7geffzucDiIKnrW8DTAd5elwG5wMZO5s8E3gEEmAZ8GSR1XQG8ZcH/ryFArvt5ArDdw79jwLeZl3UFfJu5t0E/9/NY4EtgWodlrPg8elNXwD+P7db9IPCyp38vX2+vUN2jnwrsNMbsMsY0Aq/iukF5ezcD/+N+/hpwtYhIENQVcKbnN3e3ui5LGGOqjTGl7ufHgC2cfa/jgG8zL+sKOPc2OO7+a6z70XGUR8A/j17WZQkRyQSuB/7cySI+3V6h2ui9uen4mWWMMc1APTAoCOoCuM39df81EbF5mB9oXt/E3QIXub96vyMiEwO9cvdX5hxce4PtWbrNzlEXWLDN3IchyoAa4ANjTKfbK4CfR2/qAms+j38EfgS0djLfp9srVBt9KHsTGGaMmQJ8wD9+a6uzleLK78gCngJeD+TKRaQfsBR4wBhzNJDrPpcu6rJkmxljWowx2bjuCz1VRCYFYr1d8aKugH8eReQGoMYYU+LvdbUJ1UbvzU3HzywjIjFAInDI6rqMMYeMMafdf/0zkOfnmrwRlDdxN8YcbfvqbYxZCcSKSHIg1i0isbia6SJjzDIPi1iyzbqqy8pt5l5nHbAamNFhlhWfxy7rsujzeAlwk4jswXV49yoRWdhhGZ9ur1Bt9MXAaBEZLiJxuE5WrOiwzArgm+7ns4FVxn1mw8q6OhzHvQnXcVardXZzd0uJSFrbcUkRmYrr/6vfm4N7nS8CW4wxT3SyWMC3mTd1WbHNRCRFRJLcz3sD1wBbOywW8M+jN3VZ8Xk0xvzYGJNpjBmGq0esMsbc2WExn24vr+4ZG2yMMc0ich/wHq6RLi8ZYzaJyKOAwxizAtcH4n9FZCeuE35zg6Su74rITUCzu65v+bsu6eHN3YOgrtnAPSLSDJwC5gbglzW49ri+AWxwH98F+AkwtF1tVmwzb+qyYpsNAf5HRKJx/WIpMsa8ZfXn0cu6Av557Iw/t5dGICilVJgL1UM3SimlvKSNXimlwpw2eqWUCnPa6JVSKsxpo1dKqTCnjV4ppcKcNnqllApz/x/DWDiRyii/5AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.plot([3,1,2,1,3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[공식 홈페이지](https://jupyterbook.org/interactive/interactive.html#plotly)를 참고하여 interactive한 시각화도 가능합니다. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/_sources/docs/review/A_Study_on_the_Evaluation_of_Generative_Models.md b/_sources/docs/review/A_Study_on_the_Evaluation_of_Generative_Models.md old mode 100644 new mode 100755 index 28ed11e0..101a1b17 --- a/_sources/docs/review/A_Study_on_the_Evaluation_of_Generative_Models.md +++ b/_sources/docs/review/A_Study_on_the_Evaluation_of_Generative_Models.md @@ -1,230 +1,230 @@ -# A Study on the Evaluation of Generative Models - -## 학습 자료 - -A Study on the Evaluation of Generative Models - -[https://arxiv.org/pdf/2206.10935.pdf](https://arxiv.org/pdf/2206.10935.pdf) - ---- - -## 0. Abstract - -- GAN, Diffusion등 생성 모델의 놀라운 발전이 이어지고있다. -- 다만 이러한 생성모델을 평가하는 척도(metric)의 선정은 아직 어려운 문제로 남아있다. -- 그나마 Inception Score(IS)나, FID Score를 통해 모델을 평가하고있지만 이 metric들도 완전하지 않음 -- 이 논문을 통해 - - 생성 평가의 지표에 대해 한번더 고찰하고 - - 현존하는 Metric에 대한 방향을 제시 - -## 1. Introduction - -- 최근 GAN, Diffusion 등 Implicit generative model들이 뛰어난 성능을 보여줌 -- 하지만 다른 task(classification, segmentation 등)와는 다르게 생성 모델의 metric을 정하는것은 challenging ( classification ; P&R, F1 score / segmentation ; IOU(Intersection Over Union) -- 그나마 이미지의 featue map이나 classfier score를 사용하는 FiD, Inception score가 잘 쓰이는 추세 -- 위 metric의 단점 - 1. real 이미지 분포의 space에서 해당 수치가 정말 유의미한 연관이 있는지 증명되지 않음 - 2. pretrained model의 거대한 train set이 specific 이미지의 feature에 얼마나 좋은 성능을 미치는지 알수 없음(inception net ; imagenet / ddpm ; face) -- Human study의 직관적인 방식도 있지만 time과 cost를 매우 필요로한다는 점과 model의 Diversity는 측정하기 어렵다는 단점 - - e.g ) 하나의 좋은 이미지만 생성해도 좋은 score를 받을 수 있음 -- 이 논문에서는 - 1. Image-GPT 모델을 통해 high quality의 new synthetic dataset을 생성 - 2. 여러 모델을 위의 데이터로 학습하고 FiD, IS등 다양한 metric을 측정 - 3. 이를 실제 KL Divergence, Reverse KL Divergence 값과 비교해서 metric의 유효성을 검증 - 4. FID, IS등 다양한 metric의 base model로 쓰이는 Inception-V3과 CLIP 의 비교를 통해 Inception-V3 모델의 적합성을 검증 - -## 2. BackGround - -### 2.1. KL-Divergence(Kullback-Leibler divergence) - -- 두 확률분포의 유사도를 측정하는 지표 - -$$ -KL(P || Q) = \sum_{x} P(x) \log\left(\frac{P(x)}{Q(x)}\right) -$$ - -- 특징 - - lower is better - - KL ≥ 0, (KL(p, q) = 0, if p ==q) - - KL(p, q) ≠ KL(q, p) // not symmetric - - Reverse Kullback-Leibler Divergence(RKL) = KL(q, p) - - 대부분 P가 True distribution, Q가 estimated distribution - -### 2.2. Inception Score(IS) - -- 생성된 이미지의 Fidelity와 Diversity를 측정 - - fidelity : 특정 Label의 이미지를 얼마나 잘 예측하는지 - - diversity : 다양한 class의 이미지들을 얼마나 고르게 생성해내는지 - - :::{figure-md} - A_Study_on_the_Evaluation_of_Generative_Models_01 - - Image 1 - ::: - - -$$ -\text{IS}(G) = \exp\left(\mathbb{E}_x \left[D_{\text{KL}}(P(y|x) \, || \, P(y))\right]\right) -$$ - -- 특징 - - $P(y|x)$ ; 모델의 Fidelity, $P(y)$; 모델의 Diversity - - higher is better - -### 2.3. FiD(Fréchet Inception Distance) - -- real 이미지와 generated 이미지의 Feature vector를 추출 후 평균과 공분산을 통해 계산(Frechet distance)하는 평가지표 - -$$ -FID = \lVert \mu_x - \mu_g \rVert^2 + \text{Tr}(\Sigma_x + \Sigma_g - 2(\Sigma_x\Sigma_g)^{1/2}) -$$ - -- 특징 - - Inception-V3의 마지막 pooling layer의 feature map을 사용 - - Lower is better - - $\mu_x - \mu_g$; 이미지의 Quality를 측정 - - $\text{Tr}(\Sigma_x + \Sigma_g - 2(\Sigma_x\Sigma_g)^{1/2}$; 모델의 Diversity를 측정 - -### 2.4. Kernel Inception Distance - -- FiD에서 Frechet distance를 사용하는 대신 kernel trick을 사용해 확률 분포의 유사도를 계산 -- 특징 - - 적은 데이터셋의 평가에 효과적임 - - FiD metric보다 속도가 오래걸림 (FiD : O(n), KiD : O(n^2)) - -### 2.5. FID∞ & IS∞ - -- [해당 논문](https://arxiv.org/pdf/1911.07023.pdf)에서 FiD와 IS metric에 bias가 있음을 증명하고 dataset의 sampling 기법을 변경(gaussian random sampling → sobol sequence sampling)하여 unbiased 한 metric을 제안 - - :::{figure-md} - A_Study_on_the_Evaluation_of_Generative_Models_02 - - Image 2 - ::: - - -### 2.5. Clean FiD - -- Inception-v3에 이미지를 통과하기위해 image resize 과정이 포함되는데 이는 score값에 영향을 줄수 있어 best percformance의 metric을 측정하기 위한 all in one process를 제안 - -## 3. Synthetic dataset as a benchmark - -:::{figure-md} -A_Study_on_the_Evaluation_of_Generative_Models_03 - -Image 3 -::: - -- imagenet의 데이터를 ImageGPT를 통해 재생성(a.k.a. NotImageNet) - - imageGPT - - vision 분야에 transformer(in gpt-2)를 사용 + labeling dataset이 필요없는 자기지도 학습 방식 - - :::{figure-md} - A_Study_on_the_Evaluation_of_Generative_Models_04 - - Image 4 - ::: - - - imagenet challenge에서도 상당한 score를 보임 -- 이를 생성모델에 통과한 $P_{2}(\hat{x})$과 $P_{1}(\hat{x})$ 두 분포를 비교 -- 한계 - - explicit model에만 적용 가능하고 implicit model에는 적용할 수 없음 - - explicit model : 생성되는 데이터의 분포를 명시적으로 모델링하여 학습하고 주로 Gaussian Noise로부터 이미지를 생성 (VAE …) - - implicit model : 데이터의 생성 과정에 대해 학습하고 주로 주어진 데이터 분포로부터 샘플링하여 학습 (GAN …) - -## 4. Comparison between evaluation metrics - -**4.1. Volatility** - -:::{figure-md} -A_Study_on_the_Evaluation_of_Generative_Models_05 - -Image 5 -::: - -- KL, RKL은 적은 양의 Epoch(15-20) 후에 바로 수렴하는 방면 FID와 IS는 큰 변동성을 보임 -- 모델의 Capacity가 증가할수록 KL과 RKL의 수치가 개선되는 것을 확인 -- FID나 IS가 KL, RKL의 그래프와 매우 다른 형태를 띄는것을 확인(특히 IS) - -:::{figure-md} -A_Study_on_the_Evaluation_of_Generative_Models_06 - -Image 6 -::: - -- FID나 (negative)IS가 KL과는 높은 colleration을 보이지만 RKL과는 높지 않은 colleration을 보인다. -- 모델의 Capacity에 따라 KL, RKL의 수치 변화는 크지 않은 데 반해 FID나 IS는 굉장히 큰 수치의 변화를 보여준다. - -**4.1. Ranking Colleration** - -- 여러 모델에 대해 metric 별로 순위를 매겨 순위의 유사도를 비교 -- Kendall’s τ - - ranking이 매겨진 수열 사이의 유사도를 측정 - - ```python - from scipy import stats - >>> h = [1, 2, 3, 4, 5] - >>> w = [1, 2, 3, 4, 5] - >>> z = [3, 4, 1, 2, 5] - >>> stats.kendalltau(h, w) - SignificanceResult(statistic=0.9999999999999999, pvalue=0.016666666666666666) - >>> stats.kendalltau(h, w) - SignificanceResult(statistic=0.19999999999999998, pvalue=0.8166666666666667) - ``` - -- Result - :::{figure-md} - A_Study_on_the_Evaluation_of_Generative_Models_07 - - Image 7 - ::: - - - KL - RKL의 유사도는 매우 높음(0.889) - - KL과의 유사도를 비교해보면 FID infinity > FID > IS - - CleanFID-KID(0.96)을 제외한 나머지 metric간 유사도는 굉장히 낮음 - - Inception network 기반의 metric 중에서는 FID infinity이 가장 높고, IS와 IS infinity score가 가장 낮음 - -## 5. Is Inception all we need? - -- FID, Inception Score 등 대부분의 metric이 이미지의 feature 혹은 score 측정을 위해 inception-v3를 사용하는데 과연 적절한가? -- 가정 - - FID, FID infinity는 feature space가 gaussian distribution을 따른다는 가정하에 측정되는 score -- 실험 - 1. 따라서 생성 모델을 통해 10K의 이미지를 생성하고 - 2. 원본의 20K의 이미지를 sampling - 3. 각각의 이미지를 Inception network와 CLIP network를 통해 feature vector를 추출 - 4. Gaussian model에 feature vector를 fitting - 5. 이때 gaussian model을 기반으로 각 샘플의 확률값을 계산한다. -- 결과 - - :::{figure-md} - A_Study_on_the_Evaluation_of_Generative_Models_08 - - Image 8 - ::: - - - 확률 값이 낮은 tail 부분의 feature vector의 원본 이미지들을 퀄리티가 낮아야함 - - 실제로 tail 부분의 확률을 갖는 이미지들을 확인해보면 CLIP을 보면 확실히 퀄리티가 떨어지는 반면 Inception의 이미지들은 좋은 퀄리티를 보이고 있음 → Gaussian 분포의 가정에 위배 - -**5.2 Normality test for latent representation** - -- 위의 feature vector들을 1 Dimension에 투영시켜 normal distribution을 따르는 지 확인한다. -- 실험 - 1. Inception, CLIP을 통해 feature vector를 추출한다. - 2. linear transformation 연산을 통해 각각 1-D로 투영시킨다. - 3. 각각의 p-value를 구한다. - 1. p-value : 어떠한 사건이 우연히 일어날 확률 - 2. if p-value < 0.05 ; 우연히 발생할 확률이 거의 없다. 인과관계가 있다. - 3. if p-value > 0.05 ; 우연히 발생할 확률이 크다. 인과관계가 없다. - 4. gaussian normal distribution은 random을 기반으로하기때문에 인과관계가 작아야한다. 즉, p-value가 커야한다. -- 결과 - - :::{figure-md} - A_Study_on_the_Evaluation_of_Generative_Models_09 - - Image 9 - ::: - - - 모든 test dataset에 대해 CLIP의 p-value값은 0.05를 넘어 random성을 유지하지만, Inception은 0.05보다 낮은 값을 보여 random성을 유지하지 못한다. - - 따라서, Inception net을 통한 metric 측정보다 CLIP을 통한 metric 측정을 제안한다. - +# A Study on the Evaluation of Generative Models + +## 학습 자료 + +A Study on the Evaluation of Generative Models + +[https://arxiv.org/pdf/2206.10935.pdf](https://arxiv.org/pdf/2206.10935.pdf) + +--- + +## 0. Abstract + +- GAN, Diffusion등 생성 모델의 놀라운 발전이 이어지고있다. +- 다만 이러한 생성모델을 평가하는 척도(metric)의 선정은 아직 어려운 문제로 남아있다. +- 그나마 Inception Score(IS)나, FID Score를 통해 모델을 평가하고있지만 이 metric들도 완전하지 않음 +- 이 논문을 통해 + - 생성 평가의 지표에 대해 한번더 고찰하고 + - 현존하는 Metric에 대한 방향을 제시 + +## 1. Introduction + +- 최근 GAN, Diffusion 등 Implicit generative model들이 뛰어난 성능을 보여줌 +- 하지만 다른 task(classification, segmentation 등)와는 다르게 생성 모델의 metric을 정하는것은 challenging ( classification ; P&R, F1 score / segmentation ; IOU(Intersection Over Union) +- 그나마 이미지의 featue map이나 classfier score를 사용하는 FiD, Inception score가 잘 쓰이는 추세 +- 위 metric의 단점 + 1. real 이미지 분포의 space에서 해당 수치가 정말 유의미한 연관이 있는지 증명되지 않음 + 2. pretrained model의 거대한 train set이 specific 이미지의 feature에 얼마나 좋은 성능을 미치는지 알수 없음(inception net ; imagenet / ddpm ; face) +- Human study의 직관적인 방식도 있지만 time과 cost를 매우 필요로한다는 점과 model의 Diversity는 측정하기 어렵다는 단점 + - e.g ) 하나의 좋은 이미지만 생성해도 좋은 score를 받을 수 있음 +- 이 논문에서는 + 1. Image-GPT 모델을 통해 high quality의 new synthetic dataset을 생성 + 2. 여러 모델을 위의 데이터로 학습하고 FiD, IS등 다양한 metric을 측정 + 3. 이를 실제 KL Divergence, Reverse KL Divergence 값과 비교해서 metric의 유효성을 검증 + 4. FID, IS등 다양한 metric의 base model로 쓰이는 Inception-V3과 CLIP 의 비교를 통해 Inception-V3 모델의 적합성을 검증 + +## 2. BackGround + +### 2.1. KL-Divergence(Kullback-Leibler divergence) + +- 두 확률분포의 유사도를 측정하는 지표 + +$$ +KL(P || Q) = \sum_{x} P(x) \log\left(\frac{P(x)}{Q(x)}\right) +$$ + +- 특징 + - lower is better + - KL ≥ 0, (KL(p, q) = 0, if p ==q) + - KL(p, q) ≠ KL(q, p) // not symmetric + - Reverse Kullback-Leibler Divergence(RKL) = KL(q, p) + - 대부분 P가 True distribution, Q가 estimated distribution + +### 2.2. Inception Score(IS) + +- 생성된 이미지의 Fidelity와 Diversity를 측정 + - fidelity : 특정 Label의 이미지를 얼마나 잘 예측하는지 + - diversity : 다양한 class의 이미지들을 얼마나 고르게 생성해내는지 + + :::{figure-md} + A_Study_on_the_Evaluation_of_Generative_Models_01 + + Image 1 + ::: + + +$$ +\text{IS}(G) = \exp\left(\mathbb{E}_x \left[D_{\text{KL}}(P(y|x) \, || \, P(y))\right]\right) +$$ + +- 특징 + - $P(y|x)$ ; 모델의 Fidelity, $P(y)$; 모델의 Diversity + - higher is better + +### 2.3. FiD(Fréchet Inception Distance) + +- real 이미지와 generated 이미지의 Feature vector를 추출 후 평균과 공분산을 통해 계산(Frechet distance)하는 평가지표 + +$$ +FID = \lVert \mu_x - \mu_g \rVert^2 + \text{Tr}(\Sigma_x + \Sigma_g - 2(\Sigma_x\Sigma_g)^{1/2}) +$$ + +- 특징 + - Inception-V3의 마지막 pooling layer의 feature map을 사용 + - Lower is better + - $\mu_x - \mu_g$; 이미지의 Quality를 측정 + - $\text{Tr}(\Sigma_x + \Sigma_g - 2(\Sigma_x\Sigma_g)^{1/2}$; 모델의 Diversity를 측정 + +### 2.4. Kernel Inception Distance + +- FiD에서 Frechet distance를 사용하는 대신 kernel trick을 사용해 확률 분포의 유사도를 계산 +- 특징 + - 적은 데이터셋의 평가에 효과적임 + - FiD metric보다 속도가 오래걸림 (FiD : O(n), KiD : O(n^2)) + +### 2.5. FID∞ & IS∞ + +- [해당 논문](https://arxiv.org/pdf/1911.07023.pdf)에서 FiD와 IS metric에 bias가 있음을 증명하고 dataset의 sampling 기법을 변경(gaussian random sampling → sobol sequence sampling)하여 unbiased 한 metric을 제안 + + :::{figure-md} + A_Study_on_the_Evaluation_of_Generative_Models_02 + + Image 2 + ::: + + +### 2.5. Clean FiD + +- Inception-v3에 이미지를 통과하기위해 image resize 과정이 포함되는데 이는 score값에 영향을 줄수 있어 best percformance의 metric을 측정하기 위한 all in one process를 제안 + +## 3. Synthetic dataset as a benchmark + +:::{figure-md} +A_Study_on_the_Evaluation_of_Generative_Models_03 + +Image 3 +::: + +- imagenet의 데이터를 ImageGPT를 통해 재생성(a.k.a. NotImageNet) + - imageGPT + - vision 분야에 transformer(in gpt-2)를 사용 + labeling dataset이 필요없는 자기지도 학습 방식 + + :::{figure-md} + A_Study_on_the_Evaluation_of_Generative_Models_04 + + Image 4 + ::: + + - imagenet challenge에서도 상당한 score를 보임 +- 이를 생성모델에 통과한 $P_{2}(\hat{x})$과 $P_{1}(\hat{x})$ 두 분포를 비교 +- 한계 + - explicit model에만 적용 가능하고 implicit model에는 적용할 수 없음 + - explicit model : 생성되는 데이터의 분포를 명시적으로 모델링하여 학습하고 주로 Gaussian Noise로부터 이미지를 생성 (VAE …) + - implicit model : 데이터의 생성 과정에 대해 학습하고 주로 주어진 데이터 분포로부터 샘플링하여 학습 (GAN …) + +## 4. Comparison between evaluation metrics + +**4.1. Volatility** + +:::{figure-md} +A_Study_on_the_Evaluation_of_Generative_Models_05 + +Image 5 +::: + +- KL, RKL은 적은 양의 Epoch(15-20) 후에 바로 수렴하는 방면 FID와 IS는 큰 변동성을 보임 +- 모델의 Capacity가 증가할수록 KL과 RKL의 수치가 개선되는 것을 확인 +- FID나 IS가 KL, RKL의 그래프와 매우 다른 형태를 띄는것을 확인(특히 IS) + +:::{figure-md} +A_Study_on_the_Evaluation_of_Generative_Models_06 + +Image 6 +::: + +- FID나 (negative)IS가 KL과는 높은 colleration을 보이지만 RKL과는 높지 않은 colleration을 보인다. +- 모델의 Capacity에 따라 KL, RKL의 수치 변화는 크지 않은 데 반해 FID나 IS는 굉장히 큰 수치의 변화를 보여준다. + +**4.1. Ranking Colleration** + +- 여러 모델에 대해 metric 별로 순위를 매겨 순위의 유사도를 비교 +- Kendall’s τ + - ranking이 매겨진 수열 사이의 유사도를 측정 + + ```python + from scipy import stats + >>> h = [1, 2, 3, 4, 5] + >>> w = [1, 2, 3, 4, 5] + >>> z = [3, 4, 1, 2, 5] + >>> stats.kendalltau(h, w) + SignificanceResult(statistic=0.9999999999999999, pvalue=0.016666666666666666) + >>> stats.kendalltau(h, w) + SignificanceResult(statistic=0.19999999999999998, pvalue=0.8166666666666667) + ``` + +- Result + :::{figure-md} + A_Study_on_the_Evaluation_of_Generative_Models_07 + + Image 7 + ::: + + - KL - RKL의 유사도는 매우 높음(0.889) + - KL과의 유사도를 비교해보면 FID infinity > FID > IS + - CleanFID-KID(0.96)을 제외한 나머지 metric간 유사도는 굉장히 낮음 + - Inception network 기반의 metric 중에서는 FID infinity이 가장 높고, IS와 IS infinity score가 가장 낮음 + +## 5. Is Inception all we need? + +- FID, Inception Score 등 대부분의 metric이 이미지의 feature 혹은 score 측정을 위해 inception-v3를 사용하는데 과연 적절한가? +- 가정 + - FID, FID infinity는 feature space가 gaussian distribution을 따른다는 가정하에 측정되는 score +- 실험 + 1. 따라서 생성 모델을 통해 10K의 이미지를 생성하고 + 2. 원본의 20K의 이미지를 sampling + 3. 각각의 이미지를 Inception network와 CLIP network를 통해 feature vector를 추출 + 4. Gaussian model에 feature vector를 fitting + 5. 이때 gaussian model을 기반으로 각 샘플의 확률값을 계산한다. +- 결과 + + :::{figure-md} + A_Study_on_the_Evaluation_of_Generative_Models_08 + + Image 8 + ::: + + - 확률 값이 낮은 tail 부분의 feature vector의 원본 이미지들을 퀄리티가 낮아야함 + - 실제로 tail 부분의 확률을 갖는 이미지들을 확인해보면 CLIP을 보면 확실히 퀄리티가 떨어지는 반면 Inception의 이미지들은 좋은 퀄리티를 보이고 있음 → Gaussian 분포의 가정에 위배 + +**5.2 Normality test for latent representation** + +- 위의 feature vector들을 1 Dimension에 투영시켜 normal distribution을 따르는 지 확인한다. +- 실험 + 1. Inception, CLIP을 통해 feature vector를 추출한다. + 2. linear transformation 연산을 통해 각각 1-D로 투영시킨다. + 3. 각각의 p-value를 구한다. + 1. p-value : 어떠한 사건이 우연히 일어날 확률 + 2. if p-value < 0.05 ; 우연히 발생할 확률이 거의 없다. 인과관계가 있다. + 3. if p-value > 0.05 ; 우연히 발생할 확률이 크다. 인과관계가 없다. + 4. gaussian normal distribution은 random을 기반으로하기때문에 인과관계가 작아야한다. 즉, p-value가 커야한다. +- 결과 + + :::{figure-md} + A_Study_on_the_Evaluation_of_Generative_Models_09 + + Image 9 + ::: + + - 모든 test dataset에 대해 CLIP의 p-value값은 0.05를 넘어 random성을 유지하지만, Inception은 0.05보다 낮은 값을 보여 random성을 유지하지 못한다. + - 따라서, Inception net을 통한 metric 측정보다 CLIP을 통한 metric 측정을 제안한다. + diff --git a/_sources/docs/review/Animate_Anyone.md b/_sources/docs/review/Animate_Anyone.md old mode 100644 new mode 100755 index f4034b84..86cdd74a --- a/_sources/docs/review/Animate_Anyone.md +++ b/_sources/docs/review/Animate_Anyone.md @@ -1,330 +1,330 @@ -``` {admonition} Information -- **Title:** Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation - -- **Reference** - - Paper: [https://arxiv.org/abs/2311.17117](https://arxiv.org/abs/2311.17117) - - Code: - - [Official](https://github.com/HumanAIGC/AnimateAnyone) - - [NonOfficial](https://github.com/guoqincode/Open-AnimateAnyone) - - Project Page : [https://humanaigc.github.io/animate-anyone/](https://humanaigc.github.io/animate-anyone/) - -- **Author:** Geonhak Song - -- **Last updated on {March. 13, 2024}** -``` - -# Animate Anyone - -:::{figure-md} -title_fig - -Animate Anyone Example Figure -::: - -## Abstract - -- Diffusion 모델들이 visual generation 연구에 주류가 되었지만, image-to-video 영역에서는 어려움이 있다. 특히, character animation에서 캐릭터의 상세 정보의 일관성을 유지하는 것은 큰 문제이다. -- reference image의 복잡한 appearance 특징의 일관성을 유지하기 위해서 spatial attention feature과 통합할 **ReferenceNet** 설계 -- controllability와 continuity을 위해서 효과적인 **pose guider** 도입. -- 비디오 프레임간 부드러운 전이를 위해 효과적인 effective **temporal modeling** 도입 -- 이를 통해 어떠한 임의의 캐릭터에 대해서도 animate할 수 있고 우월성을 보임 - -## 1. Introduction - -**Character Animation History** - -- Character Animation은 source character 이미지로부터 사실적인 비디오를 animate하는 작업으로 GAN을 시작으로 많은 연구가 진행되어왔다. -- 그러나 생성된 이미지 또는 비디오는 local distortion, blurred details, semantic inconsistency, temporal instability 문제가 있어 널리 사용되기에는 어려움이 있어왔다. - -**Diffusion 기반 image-to-video 예시** - -- 최근 diffusion model의 우수성에 따라 image-to-video task에 diffusion model을 활용하려는 연구들이 보였다. -- DreamPose (23.04) - - Stable Diffusion을 확장한 fashion image-to-video 합성을 가능하는데 초점을 맞췄다. - - 본 모델은 CLIP과 VAE feature를 통합한 adpatar module를 제안했다. - - 그러나 consistent 결과를 위해서 input sample에 대해 추가 finetuning이 필요하고 운용 효율이 떨어진다. -- DisCO (23.07) - - Stable Diffusion을 수정하여 human dance generation 진행 - - CLIP과 ControlNet을 활용한 통합 모델 구축 - - 그러나 character detail 보존에 어려움을 겪고 frame간 jittering issue 존재 - -**Character Animation 관점에서의 Text-to-image generation 한계** - -- text-to-image generation & video generation에 시각적 품질과 다양성에 큰 진전이 있어왔지만, 복잡한 detail을 잘 살리는 것이 어렵고 정확도 측면에서도 부정확한 부분이 있다. -- 더욱이, 실질적 character 움직임을 다룰 때, 일관성 측면에서 안정적이고 연속적인 영상을 만들어내는 것이 어렵다. -- 현재는 일반성과 일관성을 동시에 만족하는 character animation 방법을 찾을 수 없어 본 논문에서 Animate Anyone 방법을 제안한다. - -**Animate Anyone 모델 구조 요약** - -- appearance consistency를 위한 **ReferenceNet** 도입. - - spatial attention를 사용하는 UNet으로 ReferenceNet feature과 통합 - - 이는 모델로 하여금 일관된 feature space에서 reference image의 관계성을 종합적으로 학습하게 함 -- pose controllability를 위한 **lightweight pose guider** 도입. - - 효과적인 pose control signal을 denoising 절차에 통합함. -- temporal stability를 위한 **temporal layer** 도입 - - 연속적이고 부드러운 temporal motion process와 동시에 고해상도 detail quality 보존을 위한 frame간 관계성 학습 - -**제안 모델의 결과** - -- 5K character video clip 인터넷 데이터 세트로 훈련 -- 장점 1) character appearance의 spatial & temporal consistency을 효과적으로 유지 -- 장점 2) temporal jitter & flickering과 같은 문제 없는 높은 신뢰도의 비디오 생성 -- 장점 3) 어떠한 character image에도 animation video 생성 가능 -- benchmark에 대한 결과 또한 우수성 증명 - -## 2. Related Works - -### 2.1 Diffusion Model for Image Generation - -T2I model - -1) LDM : latent space에서의 denoising 진행. - -2) ControlNet, T2I-Adapter : pose, mask, edge, depth와 같은 추가 조건부 생성을 위한 추가 encoding layer 사용 - -IP-Adapter : image prompt 기반의 content 결과 생성 - -ObjectStitch, Paint-by-Example : CLIP을 활용한 image editing 방법 - -TryonDiffusion : virtual apparel try on을 위한 parallel u-net 구조 도입 - -### 2.2 Diffusion Model for Video Generation - -T2V Model : T2I 모델 기반 inter-frame attention modeling을 통한 연구가 많이 이뤄짐. - -Video LDM : temporal layer를 삽입한 T2I 모델 기반 video generation model - -AnimateDiff : personalized T2I model을 활용한 motion module을 많은 video data로 학습시킨 모델 - -→ Animate Anyone에서는 본 temporal modeling에 영향을 받아 해당 방법론 사용 - -I2V Model - -VideoComposer : conditional control - -AnimateDiff : image latent과 random noise 간 weight mixing - -VideoCrafter : CLIP의 textual & visual feature를 통합하여 cross-attention에 주입 - -그러나 해당 방법들 모두 안정적인 사람 video 생성에는 어려움이 존재. - -### 2.3 Diffusion Model for Human Image Animation - -Image Animation - -PIDM, LFDM, LEO, - -DreamPose, DisCo - -## 3. Methods - -목표 : character animation을 위한 pose-guided image-to-video 합성 - -### 3.1 Preliminary: Stable Diffusion - -:::{figure-md} -eq_1 - -Eq (1) Stable Diffusion Objective -::: - -$\epsilon_\theta$ : UNet func - -$c$ : conditional embedding - -$z$ : image latent - -$t$ : timestep - -$z_t$ : noise latent - -CLIP ViT-L/14 text encoder - -denoising UNet : 4 downsample layers , 1 middle layer, 4 upsample layers. - -각 Res-Trans block별 2D convolution, self-attention, cross-attention로 구성 - -### 3.2 Network Architecture - -**Overview** - -:::{figure-md} -figure_2 - -Figure 2 Animate Anyone Overview -::: - -3가지 중요 요소 통합 - -1) ReferenceNet : reference image로부터 character의 appearance features encoding - -2) Pose Guider : 제어가능한 character movements를 위한 motion control signal encoding - -3) Temporal layer : character motion 연속성을 위한 temporal relationship encoding - -**ReferenceNet** - -- text보다 image가 더 low-level detailed feature를 통한 일관성 유지 정보를 내포함. -- 이에 따라 최근 CLIP image encoder가 text encoder보다 많이 사용되었지만, detail consistency에는 역부족 - - 이유 1: CLIP image encoder는 224x224의 저해상도 이미지들로 구성되어 중요한 세부정보 손실이 있을 수 있다. - - 이유 2: CLIP은 text에 더욱 부합하게 훈련되어 high-level feature matching에 강조되고 이에 따라 feature encoding에 있어 detail feature에 부족함이 존재 - -- 이에 따라 reference image feature extraction network인 ReferenceNet 고안 (이때 temporal layer 제외) -- ReferenceNet은 SD로 초기화하고 각각 독립적으로 update 수행하고 UNet과 통합 -- self-attention layer를 spatial attention layer로 변경 -- Feature map : $x_1 \in \mathcal{R}^{t \times h \times w \times c }$ (UNet ), $x_2 \in \mathcal{R}^{h \times w \times c }$ (ReferenceNet) 이 주어졌을 때, $x_2$를 t번 곱해 w축에 따라 $x_1$과 concat -- self-attention을 수행하고 feature map의 반을 결과로 뽑음. -- 2가지 장점 - - 1) 사전 학습된 image feature model SD를 사용함에 따라 **초기값이 잘 정의**된 것 사용가능. - - 2) UNet과 ReferenceNet의 초기값이 공유되고 동일한 네트워크 구조를 가짐에 따라 UNet은 (동일한 feature space에 상관관계가 있는) ReferenceNet feature 중 선별적으로 feature 학습이 가능 -- CLIP image encoder를 cross-attention에 도입 - - reference image의 semantic feature를 제공함에 따라 신속한 전체 네트워크 훈련 초기값 설정 가능. - -- ControlNet은 target image와 공간적으로 align된 정보를 활용 → 부적합 -- 본 방법에서는 reference image와 target image가 공간적으로는 관계되어있지만, align되지 않음. - -- 타 diffusion 기반 video generation에서는 모든 video frame에 대해 denoising을 진행 -- ReferenceNet은 feature 추출할 때 한 번만 필요 -- 효과 : inference 단계에서 계산량이 증가하지 않는다. - -**Pose Guider** - -- ControlNet은 robust한 conditional 생성을 입증해왔지만, 추가 Fine-tuning이 필요했었다. -- 저자들은 추가적인 계산량 증가를 막기위해 추가적인 control network를 통합하지 않고 lightweight Pose Guider 도입 -- noise latent와 동일 해상도를 가지는 pose 이미지 align을 위해 four convolution layers (4×4 kernels, 2×2 strides, using 16,32,64,128 channels) 사용 -- Gaussian weights 초기화, final projection layer에서 zero convolution 도입. - -**Temporal Layer** - -- 이미 많은 곳에서 T2I 모델에 temporal layer를 통합했을 때 frame간 temporal dependency가 가능함을 보임. -- 본 방법에서는 U-Net 내 Res-Trans block 안에 있는 spatial-attention과 cross-attention 진행 후에 temporal layer 추가 -- 순서 1) reshape : $x \in \mathcal{R}^{b \times t \times h \times w \times c }$ → $x \in \mathcal{R}^{(b \times h \times w) \times t \times c }$ -- 순서 2) temporal attention 수행 → residual connection -- 효과 : appearance details에 대한 temporal smoothness & continuity - -### 3.3 Training Strategy - -- 훈련 두 단계 -- 첫 번째 단계 - - temporal layer를 제외한 single-frame noise를 입력으로 받는 모델 학습 - - ReferenceNet & Pose Guider - - reference 이미지는 전체 비디오 클립에서 랜덤으로 선택 - - 초기 weight는 사전학습된 SD weight - - Pose Guider는 마지막 projection layer를 제외한 모든 layer gaussian weight 초기화 - - VAE Encoder, Decoder, CLIP image encoder 는 그대로 -- 두 번째 단계 - - 첫 번째 단계에서 훈련한 모델 속 temporal layer만 훈련 - - temporal layer 초기값 : AnimateDiff pretrained weight - - 입력 : 24frame video clip - -## 4. Experiments - -### 4.1 Implementations - -- Data : 5K character video clips (2-10 seconds long) 인터넷에서 다운로드 -- Pose Estimation Model : DWPose(Distillation for Whole-body Pose estimator) (23.07) [https://github.com/IDEA-Research/DWPose](https://github.com/IDEA-Research/DWPose) -(the student’s head with only 20% training time as a plug-and-play training strategy) -- GPU : 4 NVIDIA A100 GPUs -- 첫 번째 훈련 단계 : 768×768 해상도 video frame sampled, resized, and center-cropped 30,000 steps, batch size 64. -- 두 번째 훈련 단계 : temporal layer 10,000 steps 24-frame video sequences, batch size 4. -- learning rates : 1e-5. -- Inference 단계 : reference image의 캐릭터 skeleton의 길이에 근사하기 위해서 유도된 pose skeleton의 길이 rescale -- DDIM sampler, 20 steps -- 긴 영상 생성을 위해 temporal aggregation method 채택 -- Evaluation : benchmark dataset 2개(UBC fashion video dataset, Tik-Tok dataset) 사용 - -### 4.2 Qualitative Results - -:::{figure-md} -figure_3 - -Figure 3 Qualitative Results -::: - -- 전신이 나오는 임의의 characters, 절반 길이의 portraits, cartoon characters, humanoid characters에 대해 animation -- reference image와 유사한 temporal consistency를 보이는 사실적인 결과 생성 - -### 4.3 Comparisons - -- SSIM, PSNR, LPIPS, FVD(Fréchet ***Video*** Distance) - -**Fashion Video Synthesis** - -:::{figure-md} -table1 - -Table 1 Quantitative Comparison for fashion video synthesis -::: - -- Quantitative comparison - Table 1 - - UBC fashion video dataset - (500 training & 100 testing videos로 구성, 각 video 약 500 frames) - -:::{figure-md} -figure_4 - -Figure 4 Qualitative comparison for fashion video synthesis -::: - -- DreamPose & BDMM은 옷의 일관성을 잃어버리는 문제. 색과 섬세한 구조적 요소에 대한 error 발생 -- 반면, 제안 방법은 옷의 세부 내용까지 일관성있게 보존됨. - -**Human Dance Generation** - -:::{figure-md} -table2 - -Table 2 Quantitative comparison for human dance generation -::: - -- Quantitative comparison - Table 2 - - TikTok dataset - (340 training & 100 testing single human dancing videos (10-15s)) - -:::{figure-md} -figure_5 - -Figure 5 Qualitative comparison between DisCo and Animate Anyone method -::: - -- DisCo에서는 인물 foreground mask를 위해 SAM 활용하는 pipeline 활용 -- 그러나 본 방법에서는 masking 없이 모델 자체가 subject motion으로부터 전경과 배경의 구분 가능 -- 복잡한 dance sequence에서도 시각적으로 연속적인 motion을 보여줌. robustness - -**General Image-to-Video Methods** - -:::{figure-md} -figure_6 - -Figure 6 Qualitative comparison with image-to-video methods -::: - -- 비교 모델 : AnimateDiff & Gen-2 -- reference image에 대한 외관 신뢰도만 비교 -- image-to-video 방법은 얼굴이 일관되게 유지되는 문제에 봉착된 상황 속에서 다른 모델 대비 제안 모델이 긴 시간동안 apperance consistency 유지 - -### 4.4 Ablation study - -:::{figure-md} -figure_7 - -Figure 7 Ablation study of different design -::: - -:::{figure-md} -table_3 - -Table 3 Quantitative comparison for ablation study -::: - -- ReferenceNet design 효과성 증명을 위한 Ablation study - - (1) CLIP image encoder만 사용 - - (2) 초기 finetuning SD 이후 reference image 기반 ControlNet training - - (3) 위 2 방법론 통합 -- 결론 : ReferenceNet를 사용하는 것이 모든 방법 대비 가장 좋았다. - -## 5. Limitations - -- 1) 손의 안정적인 움직임을 보이는 것에 어려움을 보임. 가끔 왜곡, motion blur 발생 -- 2) 제공하는 이미지는 한 측면만 보이기 때문에 보이지 않은 부분에 대해서는 ill-posed problem으로 불안정 +``` {admonition} Information +- **Title:** Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation + +- **Reference** + - Paper: [https://arxiv.org/abs/2311.17117](https://arxiv.org/abs/2311.17117) + - Code: + - [Official](https://github.com/HumanAIGC/AnimateAnyone) + - [NonOfficial](https://github.com/guoqincode/Open-AnimateAnyone) + - Project Page : [https://humanaigc.github.io/animate-anyone/](https://humanaigc.github.io/animate-anyone/) + +- **Author:** Geonhak Song + +- **Last updated on {March. 13, 2024}** +``` + +# Animate Anyone + +:::{figure-md} +title_fig + +Animate Anyone Example Figure +::: + +## Abstract + +- Diffusion 모델들이 visual generation 연구에 주류가 되었지만, image-to-video 영역에서는 어려움이 있다. 특히, character animation에서 캐릭터의 상세 정보의 일관성을 유지하는 것은 큰 문제이다. +- reference image의 복잡한 appearance 특징의 일관성을 유지하기 위해서 spatial attention feature과 통합할 **ReferenceNet** 설계 +- controllability와 continuity을 위해서 효과적인 **pose guider** 도입. +- 비디오 프레임간 부드러운 전이를 위해 효과적인 effective **temporal modeling** 도입 +- 이를 통해 어떠한 임의의 캐릭터에 대해서도 animate할 수 있고 우월성을 보임 + +## 1. Introduction + +**Character Animation History** + +- Character Animation은 source character 이미지로부터 사실적인 비디오를 animate하는 작업으로 GAN을 시작으로 많은 연구가 진행되어왔다. +- 그러나 생성된 이미지 또는 비디오는 local distortion, blurred details, semantic inconsistency, temporal instability 문제가 있어 널리 사용되기에는 어려움이 있어왔다. + +**Diffusion 기반 image-to-video 예시** + +- 최근 diffusion model의 우수성에 따라 image-to-video task에 diffusion model을 활용하려는 연구들이 보였다. +- DreamPose (23.04) + - Stable Diffusion을 확장한 fashion image-to-video 합성을 가능하는데 초점을 맞췄다. + - 본 모델은 CLIP과 VAE feature를 통합한 adpatar module를 제안했다. + - 그러나 consistent 결과를 위해서 input sample에 대해 추가 finetuning이 필요하고 운용 효율이 떨어진다. +- DisCO (23.07) + - Stable Diffusion을 수정하여 human dance generation 진행 + - CLIP과 ControlNet을 활용한 통합 모델 구축 + - 그러나 character detail 보존에 어려움을 겪고 frame간 jittering issue 존재 + +**Character Animation 관점에서의 Text-to-image generation 한계** + +- text-to-image generation & video generation에 시각적 품질과 다양성에 큰 진전이 있어왔지만, 복잡한 detail을 잘 살리는 것이 어렵고 정확도 측면에서도 부정확한 부분이 있다. +- 더욱이, 실질적 character 움직임을 다룰 때, 일관성 측면에서 안정적이고 연속적인 영상을 만들어내는 것이 어렵다. +- 현재는 일반성과 일관성을 동시에 만족하는 character animation 방법을 찾을 수 없어 본 논문에서 Animate Anyone 방법을 제안한다. + +**Animate Anyone 모델 구조 요약** + +- appearance consistency를 위한 **ReferenceNet** 도입. + - spatial attention를 사용하는 UNet으로 ReferenceNet feature과 통합 + - 이는 모델로 하여금 일관된 feature space에서 reference image의 관계성을 종합적으로 학습하게 함 +- pose controllability를 위한 **lightweight pose guider** 도입. + - 효과적인 pose control signal을 denoising 절차에 통합함. +- temporal stability를 위한 **temporal layer** 도입 + - 연속적이고 부드러운 temporal motion process와 동시에 고해상도 detail quality 보존을 위한 frame간 관계성 학습 + +**제안 모델의 결과** + +- 5K character video clip 인터넷 데이터 세트로 훈련 +- 장점 1) character appearance의 spatial & temporal consistency을 효과적으로 유지 +- 장점 2) temporal jitter & flickering과 같은 문제 없는 높은 신뢰도의 비디오 생성 +- 장점 3) 어떠한 character image에도 animation video 생성 가능 +- benchmark에 대한 결과 또한 우수성 증명 + +## 2. Related Works + +### 2.1 Diffusion Model for Image Generation + +T2I model + +1) LDM : latent space에서의 denoising 진행. + +2) ControlNet, T2I-Adapter : pose, mask, edge, depth와 같은 추가 조건부 생성을 위한 추가 encoding layer 사용 + +IP-Adapter : image prompt 기반의 content 결과 생성 + +ObjectStitch, Paint-by-Example : CLIP을 활용한 image editing 방법 + +TryonDiffusion : virtual apparel try on을 위한 parallel u-net 구조 도입 + +### 2.2 Diffusion Model for Video Generation + +T2V Model : T2I 모델 기반 inter-frame attention modeling을 통한 연구가 많이 이뤄짐. + +Video LDM : temporal layer를 삽입한 T2I 모델 기반 video generation model + +AnimateDiff : personalized T2I model을 활용한 motion module을 많은 video data로 학습시킨 모델 + +→ Animate Anyone에서는 본 temporal modeling에 영향을 받아 해당 방법론 사용 + +I2V Model + +VideoComposer : conditional control + +AnimateDiff : image latent과 random noise 간 weight mixing + +VideoCrafter : CLIP의 textual & visual feature를 통합하여 cross-attention에 주입 + +그러나 해당 방법들 모두 안정적인 사람 video 생성에는 어려움이 존재. + +### 2.3 Diffusion Model for Human Image Animation + +Image Animation + +PIDM, LFDM, LEO, + +DreamPose, DisCo + +## 3. Methods + +목표 : character animation을 위한 pose-guided image-to-video 합성 + +### 3.1 Preliminary: Stable Diffusion + +:::{figure-md} +eq_1 + +Eq (1) Stable Diffusion Objective +::: + +$\epsilon_\theta$ : UNet func + +$c$ : conditional embedding + +$z$ : image latent + +$t$ : timestep + +$z_t$ : noise latent + +CLIP ViT-L/14 text encoder + +denoising UNet : 4 downsample layers , 1 middle layer, 4 upsample layers. + +각 Res-Trans block별 2D convolution, self-attention, cross-attention로 구성 + +### 3.2 Network Architecture + +**Overview** + +:::{figure-md} +figure_2 + +Figure 2 Animate Anyone Overview +::: + +3가지 중요 요소 통합 + +1) ReferenceNet : reference image로부터 character의 appearance features encoding + +2) Pose Guider : 제어가능한 character movements를 위한 motion control signal encoding + +3) Temporal layer : character motion 연속성을 위한 temporal relationship encoding + +**ReferenceNet** + +- text보다 image가 더 low-level detailed feature를 통한 일관성 유지 정보를 내포함. +- 이에 따라 최근 CLIP image encoder가 text encoder보다 많이 사용되었지만, detail consistency에는 역부족 + - 이유 1: CLIP image encoder는 224x224의 저해상도 이미지들로 구성되어 중요한 세부정보 손실이 있을 수 있다. + - 이유 2: CLIP은 text에 더욱 부합하게 훈련되어 high-level feature matching에 강조되고 이에 따라 feature encoding에 있어 detail feature에 부족함이 존재 + +- 이에 따라 reference image feature extraction network인 ReferenceNet 고안 (이때 temporal layer 제외) +- ReferenceNet은 SD로 초기화하고 각각 독립적으로 update 수행하고 UNet과 통합 +- self-attention layer를 spatial attention layer로 변경 +- Feature map : $x_1 \in \mathcal{R}^{t \times h \times w \times c }$ (UNet ), $x_2 \in \mathcal{R}^{h \times w \times c }$ (ReferenceNet) 이 주어졌을 때, $x_2$를 t번 곱해 w축에 따라 $x_1$과 concat +- self-attention을 수행하고 feature map의 반을 결과로 뽑음. +- 2가지 장점 + - 1) 사전 학습된 image feature model SD를 사용함에 따라 **초기값이 잘 정의**된 것 사용가능. + - 2) UNet과 ReferenceNet의 초기값이 공유되고 동일한 네트워크 구조를 가짐에 따라 UNet은 (동일한 feature space에 상관관계가 있는) ReferenceNet feature 중 선별적으로 feature 학습이 가능 +- CLIP image encoder를 cross-attention에 도입 + - reference image의 semantic feature를 제공함에 따라 신속한 전체 네트워크 훈련 초기값 설정 가능. + +- ControlNet은 target image와 공간적으로 align된 정보를 활용 → 부적합 +- 본 방법에서는 reference image와 target image가 공간적으로는 관계되어있지만, align되지 않음. + +- 타 diffusion 기반 video generation에서는 모든 video frame에 대해 denoising을 진행 +- ReferenceNet은 feature 추출할 때 한 번만 필요 +- 효과 : inference 단계에서 계산량이 증가하지 않는다. + +**Pose Guider** + +- ControlNet은 robust한 conditional 생성을 입증해왔지만, 추가 Fine-tuning이 필요했었다. +- 저자들은 추가적인 계산량 증가를 막기위해 추가적인 control network를 통합하지 않고 lightweight Pose Guider 도입 +- noise latent와 동일 해상도를 가지는 pose 이미지 align을 위해 four convolution layers (4×4 kernels, 2×2 strides, using 16,32,64,128 channels) 사용 +- Gaussian weights 초기화, final projection layer에서 zero convolution 도입. + +**Temporal Layer** + +- 이미 많은 곳에서 T2I 모델에 temporal layer를 통합했을 때 frame간 temporal dependency가 가능함을 보임. +- 본 방법에서는 U-Net 내 Res-Trans block 안에 있는 spatial-attention과 cross-attention 진행 후에 temporal layer 추가 +- 순서 1) reshape : $x \in \mathcal{R}^{b \times t \times h \times w \times c }$ → $x \in \mathcal{R}^{(b \times h \times w) \times t \times c }$ +- 순서 2) temporal attention 수행 → residual connection +- 효과 : appearance details에 대한 temporal smoothness & continuity + +### 3.3 Training Strategy + +- 훈련 두 단계 +- 첫 번째 단계 + - temporal layer를 제외한 single-frame noise를 입력으로 받는 모델 학습 + - ReferenceNet & Pose Guider + - reference 이미지는 전체 비디오 클립에서 랜덤으로 선택 + - 초기 weight는 사전학습된 SD weight + - Pose Guider는 마지막 projection layer를 제외한 모든 layer gaussian weight 초기화 + - VAE Encoder, Decoder, CLIP image encoder 는 그대로 +- 두 번째 단계 + - 첫 번째 단계에서 훈련한 모델 속 temporal layer만 훈련 + - temporal layer 초기값 : AnimateDiff pretrained weight + - 입력 : 24frame video clip + +## 4. Experiments + +### 4.1 Implementations + +- Data : 5K character video clips (2-10 seconds long) 인터넷에서 다운로드 +- Pose Estimation Model : DWPose(Distillation for Whole-body Pose estimator) (23.07) [https://github.com/IDEA-Research/DWPose](https://github.com/IDEA-Research/DWPose) +(the student’s head with only 20% training time as a plug-and-play training strategy) +- GPU : 4 NVIDIA A100 GPUs +- 첫 번째 훈련 단계 : 768×768 해상도 video frame sampled, resized, and center-cropped 30,000 steps, batch size 64. +- 두 번째 훈련 단계 : temporal layer 10,000 steps 24-frame video sequences, batch size 4. +- learning rates : 1e-5. +- Inference 단계 : reference image의 캐릭터 skeleton의 길이에 근사하기 위해서 유도된 pose skeleton의 길이 rescale +- DDIM sampler, 20 steps +- 긴 영상 생성을 위해 temporal aggregation method 채택 +- Evaluation : benchmark dataset 2개(UBC fashion video dataset, Tik-Tok dataset) 사용 + +### 4.2 Qualitative Results + +:::{figure-md} +figure_3 + +Figure 3 Qualitative Results +::: + +- 전신이 나오는 임의의 characters, 절반 길이의 portraits, cartoon characters, humanoid characters에 대해 animation +- reference image와 유사한 temporal consistency를 보이는 사실적인 결과 생성 + +### 4.3 Comparisons + +- SSIM, PSNR, LPIPS, FVD(Fréchet ***Video*** Distance) + +**Fashion Video Synthesis** + +:::{figure-md} +table1 + +Table 1 Quantitative Comparison for fashion video synthesis +::: + +- Quantitative comparison - Table 1 + - UBC fashion video dataset + (500 training & 100 testing videos로 구성, 각 video 약 500 frames) + +:::{figure-md} +figure_4 + +Figure 4 Qualitative comparison for fashion video synthesis +::: + +- DreamPose & BDMM은 옷의 일관성을 잃어버리는 문제. 색과 섬세한 구조적 요소에 대한 error 발생 +- 반면, 제안 방법은 옷의 세부 내용까지 일관성있게 보존됨. + +**Human Dance Generation** + +:::{figure-md} +table2 + +Table 2 Quantitative comparison for human dance generation +::: + +- Quantitative comparison - Table 2 + - TikTok dataset + (340 training & 100 testing single human dancing videos (10-15s)) + +:::{figure-md} +figure_5 + +Figure 5 Qualitative comparison between DisCo and Animate Anyone method +::: + +- DisCo에서는 인물 foreground mask를 위해 SAM 활용하는 pipeline 활용 +- 그러나 본 방법에서는 masking 없이 모델 자체가 subject motion으로부터 전경과 배경의 구분 가능 +- 복잡한 dance sequence에서도 시각적으로 연속적인 motion을 보여줌. robustness + +**General Image-to-Video Methods** + +:::{figure-md} +figure_6 + +Figure 6 Qualitative comparison with image-to-video methods +::: + +- 비교 모델 : AnimateDiff & Gen-2 +- reference image에 대한 외관 신뢰도만 비교 +- image-to-video 방법은 얼굴이 일관되게 유지되는 문제에 봉착된 상황 속에서 다른 모델 대비 제안 모델이 긴 시간동안 apperance consistency 유지 + +### 4.4 Ablation study + +:::{figure-md} +figure_7 + +Figure 7 Ablation study of different design +::: + +:::{figure-md} +table_3 + +Table 3 Quantitative comparison for ablation study +::: + +- ReferenceNet design 효과성 증명을 위한 Ablation study + - (1) CLIP image encoder만 사용 + - (2) 초기 finetuning SD 이후 reference image 기반 ControlNet training + - (3) 위 2 방법론 통합 +- 결론 : ReferenceNet를 사용하는 것이 모든 방법 대비 가장 좋았다. + +## 5. Limitations + +- 1) 손의 안정적인 움직임을 보이는 것에 어려움을 보임. 가끔 왜곡, motion blur 발생 +- 2) 제공하는 이미지는 한 측면만 보이기 때문에 보이지 않은 부분에 대해서는 ill-posed problem으로 불안정 - 3) DDPM 활용에 따른 non-diffusion 기반 모델 대비 낮은 operational efficiency \ No newline at end of file diff --git a/_sources/docs/review/BBDM.md b/_sources/docs/review/BBDM.md old mode 100644 new mode 100755 index 1fefa405..227468ad --- a/_sources/docs/review/BBDM.md +++ b/_sources/docs/review/BBDM.md @@ -1,702 +1,702 @@ -``` {admonition} Information -- **Title:** {BBDM: Image-to-image Translation with Brownian Bridge Diffusion Models}, {CVPR 2023} - -- **Reference** - - Paper: [https://arxiv.org/abs/2205.07680](https://arxiv.org/abs/2205.07680) - - Code: [https://github.com/xuekt98/BBDM](https://github.com/xuekt98/BBDM) - -- **Author:** SeonHoon Kim -- **Edited by:** SeonHoon Kim - -- **Related Youtube:** Youtube video - -- **Last updated on Nov. 13, 2023** -``` - -# BBDM - -- **BBDM** - - BBDM 은 Brownian Bridge 를 Diffusion Model 에 도입한 최초의 모델 - - Image to Image Translation 분야에서 Conditional Diffusion Models 의 한계를 극복함 - -
BBDM 을 이해하기 위해서는 Brownian motion process 와 Brownian Bridge 를 이해해야함. Brownian motion process 는 stochastic process 에 해당함.
- -- **Stochastic Process** - - 시간의 흐름에 따라 불확실성을 가지고 변하는 확률 변수들의 집합 - - Stochastic process 는 $X_t$ 와 같이 나타낼 수 있는데,
- 여기서 X 는 확률 변수를,
- t 는 확률 변수가 관찰된 시간을 나타냄 - - X 와 t 는 각각 Discrete 혹은 Continuous 로 구분할 수 있음 - - Discrete RANDOM VARIABLE & Discrete TIME - - Discrete RANDOM VARIABLE & Continuous TIME - - **Continuous RANDOM VARIABLE & Discrete TIME** - - **Continuous RANDOM VARIABLE & Continuous TIME** -- **Brownian Motion Process (Wiener Process) 소개** - - **Brownian Motion** - - 유체의 미소입자가 불규칙하게 운동하는 현상 - - :::{figure-md} - img_00 - - 굴뚝에서 퍼져나간 연기 사진을 오른쪽으로 90도 회전시킨 사진 - ::: - -
위 사진으로부터 Brownian motion process 를 직관적으로 이해해볼 수 있음.
- - - **Brownian Motion Process (Wiener Process)** - - Brownian Motion 을 연속 시간 확률 과정으로 모델링한 것 - - :::{figure-md} - img_01 - - $W_0$ = 0 이고 max time T=1000 인 Wiener Process 를 100번 Sampling 한 결과 - ::: - - - **Brownian Motion Process (Wiener Process)** 는
- **Continuous RANDOM VARIABLE & Continuous TIME 를 갖는 Stochastic Process** 로,
- $W_t$ 와 같이 나타낸다. -- **Brownian Motion Process (Wiener Process) 를 이해해보자** - - **가정해보자** - 1. $t = 0 → W_t = W_0 = 0$ 이라고 하자. - 2. 쉽게 이해하기 위해, TIME t 가 Discrete 하다고 가정해보자.
- (BBDM 은 t 를 정수 0~1000 으로 설정) - - **Requirements** - 1. Brownian Motion Process 는 Stochastic Process 이다.
- **TIME t 마다 stochasticity 가 부여되어야** 한다. - 2. **시간 간격과 W 의 변화량이 비례해야 한다.**
- (즉, 더 오래 지났을수록 더 많이 변한다.) - - **Notation** - - :::{figure-md} - img_02 - - Source : [https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB](https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB) - ::: - - - $\Delta t$ = 시간 간격 - - n = 살펴보고자 하는 시간 간격의 수 - - $T = n * \Delta t$ - - i.i.d $\epsilon_t \sim N(0, 1)$ - - $\Delta W_t$ = t 시점에서 그 다음 시간 간격까지 증가한 W 의 값 - $= W_{t+\Delta t} - W_t$ - = $\epsilon_t \sqrt {\Delta t}$ - - **이해** - - $\Delta W_t = W_{t+\Delta t} - W_t = \epsilon_t \sqrt {\Delta t}$ 라고 정의해 본 근거를 - 위의 Requirements 에서 찾아보면.. - - **확률 변수 $\epsilon$ 를 도입함으로써 stochasticity 부여** - - $\Delta t$ 를 도입함으로써 **시간 간격도 고려 가능** - - **그렇다면 왜 하필 $\sqrt {\Delta t}$ 를 곱했을까?** - 1. $\Delta t$ 가 0 에 가까워질 때, $\sqrt{\Delta t}$ 는 천천히 0 에 수렴함. - **만약 TIME t 가 continuous 하다면, $\Delta t$ 는 매우 작은 값**이 됨. - **$\Delta W_t = \epsilon_t {\Delta t}$ 라면 $\Delta W_t$ 가 너무 작아짐.** - 2. $\Delta t$ 가 커질 때, $\sqrt{\Delta t}$ 는 천천히 커짐 - - **주의할 사항** - - i.i.d $\epsilon_t \sim N(0, 1)$ 이므로, - $\Delta W_t = \epsilon_t \sqrt {\Delta t}$ 에서 $\Delta W_0$ 와 $\Delta W_1$ 은 서로 독립인 것이 맞지만, - **$W_0$ 과 $W_1$ 이 독립이라는 말은 아님.** - - $\Delta W_0 = \epsilon_0 \sqrt {\Delta t}$ 이므로, - $W_{\Delta t} = W_0 + \epsilon_0 \sqrt {\Delta t} = 0 + \epsilon_0 \sqrt {\Delta t} = \epsilon_0 \sqrt {\Delta t}$ - - $\Delta W_{\Delta t} = \epsilon_{\Delta t} \sqrt {\Delta t}$ 이므로, - $W_{2\Delta t} = W_{\Delta t} + \epsilon_{\Delta t} \sqrt {\Delta t} = (\epsilon_0 + \epsilon_{\Delta t}) * \sqrt {\Delta t}$ - - $Var(\Delta W_{\Delta t}) = Var(\epsilon_{\Delta t} \sqrt {\Delta t}) = Var(\epsilon_{\Delta t}) * \sqrt {\Delta t}^2 = 1 * \sqrt {\Delta t}^2 = \Delta t$ - - $\mathbb{E}(\Delta W_{\Delta t}) = \mathbb{E}(\epsilon_{\Delta t} \sqrt {\Delta t}) = \mathbb{E}(\epsilon_{\Delta t}) * \sqrt {\Delta t} = 0 * \sqrt {\Delta t} = 0$ - - $\Delta W_{T-\Delta t} = \epsilon_{T-\Delta t} \sqrt {\Delta t}$ - $W_T = (\epsilon_0 + \epsilon_{\Delta t} + \epsilon_{2\Delta t} + ... + \epsilon_{T-\Delta t}) * \sqrt {\Delta t}$ - - $\mathbb{E}(W_T) = 0$ - - $Var(W_T) = n * \Delta t = T$ (각각의 $\epsilon$ 은 서로 i.i.d 이므로 공분산은 0) - - 즉, $W_T \sim N(0,T)$ - - :::{figure-md} - img_03 - - Source : [https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB](https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB) - ::: - - 파란색 점들은, Brownian Motion Process 를 1번 Sampling 한 결과임 (one representation) 를 나타냄
- - :::{figure-md} - img_04 - - Source : [https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB](https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB) - ::: - - - t=0 부터 t=T 까지 Wiener Process 를 수행하면,
- $W_t$ 는 $W_T - W_0$ 만큼 변한다. - - $(W_T - W_0) \sim N(0, T-0)$ - - $(W_{t_2}-W_{t_1}) \sim N(0,t_2-t_1)$ - - ex. 5분 에서 10분으로 Wiener Process 를 진행하면, $W_5$ 는 0 이 아닐 수 있으나, 그 변화량 $(W_{t_{10}}-W_{t_5})$ 은 N(0, 10 - 5) 를 따른다. - -- **Brownian Bridge** - - X 가 Standard Wiener Process 라고 하자.
- 0 시점과 T 시점의 X 값을 알고,
- 0 - - Brownian Bridge 이해를 위한 Linear Bridge - ::: - - Brownian Bridge 는 Standard Wiener Process 의 Conditional Probability Distribution 이다.
- Starting state W(0) 과 Ending state W(T) 의 값에 Conditioned 되어 있다.
- 아래와 같이 정의될 수 있다. - - :::{figure-md} - img_06 - - Brownian Bridge - ::: - -
아래의 그림을 보면, 0 이라는 시작값과 123 이라는 마지막 값에 conditioned 되어 있는 것을 확인할 수 있다.
Brownian Bridge 의 분산은 0 에서 시작해서 증가하다가, T/2 시점에서 최대가 되었다가, 이후로는 감소하여 마지막엔 0 에 수렴하게된다. - - :::{figure-md} - img_08 - - $W_0$ = 0 에서 $W_1000$ = 123 까지 100개의 Brownian Bridge 를 샘플링한 결과 - ::: - -- **Abstrcat** - - :::{figure-md} - img_09 - - Conditional Diffusion Models 와 BBDM 의 비교 - ::: - - - **기존의 Diffusion 모델**들은,
- Image-to-Image 변환을 **Conditional generation process** 로 다룸.
- 이로 인해, **매우 상이한 도메인 사이의 변환**에는 **어려움**이 있음. - - 이를 **해결하기 위해**,
- 본 논문은 **Brownian Bridge** **에 기반한 Image-to-Image 변환 방법을 제시**함 - - **BBDM** 은 Conditional generation process 가 아닌
- **Stochastic Brownian Bridge Process** 로 두 도메인 사이의 변환을 모델링하므로,
**Bidirectional Diffusion Process** 임. - - Brownian Bridge diffusion process 를 Image-to-Image 변환에 접목한 최초의 논문임 - - BBDM 모델의 훌륭한 성능을 실험적으로 증명함
-1. **Introduction** - - I2I 변환에서 **Non-diffusion models 의 한계** - - Pix2Pix 와 같은 **conditional GANs** 는 **fideltiy 가 높았으나,** - 학습이 어렵고, **DIversity 가 떨어진다.** - - Diversity 가 떨어지는 이유 : conditional GANs 는 input image 를 output image 에 one-to-one mapping 하는 방법을 학습하기 때문 - - **VAE** 같은 **생성형 모델**들은 GANs 만큼의 I2I 성능이 안나오고, - **Applicability** 가 GANs 보다 **떨어진다.** - - I2I 변환에서 **conditional diffusion models 의 한계** - - conditional diffusion models 는 **reference image** 의 encoded feature 를 **직접 U-Net 에 통합**시킴으로써 diffusion models 의 reverse process 를 guide 함 - - 하지만 이렇게 **생성된 결과가 desired conditional distribution 을 추론해낸다는 명료한 이론적 근거가 없음** - - 대부분의 **conditional diffusion models 는 generalization 이 잘 안되므로,** - conditional input domain 과 output domain 이 유사한 - 몇몇 applications 에서만 잘 활용될 수 있음 - - ex. inpainting 혹은 super-resolution - - **LDM** 이 latent space 에서 diffusion process 를 수행함으로써 - **generalization 을 개선**하긴 했으나 **여전히 conditional generation process** 임 - - **LDM** 의 경우, **복잡한 attention mechanism 으로 multi-modal condition** 이 주어지므로, **이론적 근거를 제시하기가 더 힘듦** - - **본 논문에서 제안하는 BBDM 모델** - - :::{figure-md} - img_10 - - BBDM 의 아키텍쳐 - ::: - - - **BBDM** 모델은 **input 과 output 도메인 간의 mapping** 을 - **Brownian Bridge stochastic process 를 통해 구축**함 - - 가속을 위해 Latent space 에서 diffusion process 를 수행함
- 1. **Related Work**
- - **2.1. Image-to-Image Translation** - - introduction 참고
- - **2,2. Duffusion Models**
- - **Diffusion Models** 의 simplified **objective** 를 잠깐 살펴보면, 다음과 같음. - - :::{figure-md} - img_11 - - Diffusion Models 의 Simplified objective - ::: - - - 대부분의 **conditional Diffusion Models** 는 **condition 을 objective 에 직접 “주입”**.
- 아래의 그림을 보면, conditional input image y 가 삽입된 것을 볼 수 있음. - - :::{figure-md} - img_12 - - Conditional Diffusion Models 의 Simplified objective - ::: - - - $p(x_t|y)$ 가 objective 에 드러나 있지 않으므로, - **desired conditional distribution 에 도달할 수 있을 것**이라는 **이론적 보장이 없음**
- - **2.3. Brownian Bridge**
- - **Brownian Bridge** 는 **diffusion process 동안의 확률 분포가** - **starting state (t=0)** 와 **ending state (t=T)** 에 **conditioned 되어 있는,** - **time stochastic model** 임 - - :::{figure-md} - img_13 - - 식(3) - ::: - - 앞서 보았던 Brownian Bridge 의 평균과 분산을 구해보자.
- 위의 식과 같은 의미임을 알 수 있다.
- - :::{figure-md} - img_06 - - Brownian Bridge - ::: -
- - 3. **Method**
- - **3.1. Brownian Bridge Diffusion Model (BBDM)**
- - - **Conditional diffusion models** : **Gaussian noise 를 향해 Forward process 진행** - - **BBDM : conditional input y 자체를 향해 Brownian Bridge process 진행**
- - :::{figure-md} - img_09 - - Conditional Diffusion Models 와 BBDM 의 비교 - ::: -
- - - VQGAN 의 latent space 에서 diffusion process 를 수행 - - **x** 가 **A 도메인 영상의 latent features** 이고,
- **y** 가 **B 도메인 영상의 latent features** 일 때,
- **Forward diffusion process 는 다음과 같이 정의**됨 - - :::{figure-md} - img_14 - - 식(4) - ::: - - - **T** 는 diffusion process 의 **total steps** 이다. - - $δ_t$ 는 **분산**이다. - - 식 (3) 에 나타난 분산 $δ_t={t(T −t)\over T}$ 를 사용하게 되면, - **가능한 최대 분산값**은, **middle step 인 $T\over 2$ 에서의 분산값인 $δ_{T\over 2} = {T \over 4}$ 가 됨** - - T 값이 커지면, 최대 분산값도 커지는데, **이 분산 값은 다루기에 너무 큼** - - $x_0,y \sim N(0,I)$ 이면서 서로 독립일 때, - Brownian Bridge diffusion process 를 위한 **분산 scheduling** 을 - 다음과 같이 해볼 수 있다. - - :::{figure-md} - img_15 - - Brownian Bridge diffusion process 를 위한 분산 Scheduling - ::: - - - 만약 t 는 양의 정수의 discrete time 이고, 그 최댓값인 T=1000 이라면 - $\delta_t$ 는 아래 그림과 같게 된다. - - :::{figure-md} - img_16 - - $\delta_t$ 를 시각화한 결과 - ::: -
- - $m_t = t\overT$ 이고, $\delta_t = 2(m_t - m_t^2)$ 이므로,
- - - diffusion process 가 시작하는 **t = 0 에서는, $m_0$ = 0** 이고, - **평균은 $x_0$** 이며 - **분산은 0** 이 된다.
- - diffusion process 가 끝나는 **t = T 에서는,** - $m_T$ **= 1** 이고, - **평균은 y** 이고, - **분산은 0** 이 된다.
- - **분산이,** - diffusion process 의 **중간 지점까지는 최대 0.5 까지 증가**하다가,
- 중간 지점부터 **끝나는 지점까지는 0 으로 감소** - - **Brownian Bridge diffusion process** 에서의 **sampling diversity** 는 - **최대 분산값,
즉 middle step 인 $t = {T\over 2}$ 에서의 분산값에 의해 결정**됨 - - **분산을 스케일링하는 변수 s** **를 두어** **sampling diversity 를 조절**할 수 있다. - - :::{figure-md} - img_17 - - 식(5) : sampling diversity 조절을 위한 계수 s 가 포함된 분산 scheduling - ::: - - - 이 논문에서 **s 의 디폴트 값은 1** -
- - **3.1.1 Forward Process**
- - **식 (4)** 에서는 **step t 에서의 marginal distribution 만 제공** - - **training 과 inference process 를 위해**서는 **forward transition probability** 인 $q_{BB}(x_t|x_{t-1}, y)$ 를 알아야함 - - **식 (4) 에 의해, $x_0$ 와 $y$ 가 주어졌을 때의 $x_t$ 와** $x_{t-1}$ 은 다음과 같이 쓸 수 있음 - - :::{figure-md} - img_14 - - 식(4) - ::: - - :::{figure-md} - img_18 - - 식(6) & 식(7) - ::: - - - 참고. 위 식 (7) 의 $m_ty$ 는 $m_{t-1}y$ 로 쓰는 것이 옳음 - - :::{figure-md} - img_19 - - $\epsilon$ 은 i.i.d 하게 N(0, I) 를 따른다 - ::: - - - **식 (6) 의 $x_0$ 를 식 (7) 의 $x_0$ 로 대체**하면, - **Forward transition probability $q_{BB}(x_t|x_{t-1}, y)$** 가 아래의 **식 (8)** 과 같이 유도됨 - - :::{figure-md} - img_20 - - 식(8) - ::: - - - 증명 - - 식(7) 을 다음과 같이 쓸 수 있음 - - $x_0 = {x_{t-1}-m_{t-1}y-\sqrt {\delta_{t-1}} \epsilon_{t-1} \over 1-m_{t-1}}$ - - 식(6) 의 $x_0$ 에 위의 $x_0$ 를 대입 - - $x_t = {(1-m_t)x_{t-1} \over (1-m_{t-1})} - {(1-m_t)m_{t-1}y \over (1-m_{t-1})} - {(1-m_t)\sqrt {\delta_{t-1}}\epsilon_{t-1} \over (1-m_{t-1})} + m_ty + \sqrt{\delta_t} \epsilon_t$ - - $= {(1-m_t)x_{t-1} \over (1-m_{t-1})} + y(m_t - {(1-m_t) \over (1-m_{t-1})}m_{t-1}) + \sqrt {\delta_t}\epsilon_t - {(1-m_t)\sqrt {\delta_{t-1}}\epsilon_{t-1} \over (1-m_{t-1})}$ - - 이후, $Var(x_t)$ 를 구하면, 아래의 $\delta_{t|t-1}$ 와 같이 유도됨 - - :::{figure-md} - img_21 - - $\delta_{t|t-1}$ 식 - ::: - - - t=T 가 될 때 $m_T = 1$ 인데, 이때 식(8) 에 의해 $x_T = y$ 임. - ↓ - ”아, Forward diffusion process 는 확실히.. - A 도메인으로부터 B 도메인으로의 fixed mapping 을 정의하는구나” - - - **3.1.2 Reverse Process**
- - **conditional diffusion models** 의 **reverse process** 는,
- **Gaussian noise 로부터 시작**하며,
- 매 스텝마다 조금씩 noise 를 제거해나감
- - 반면, **BBDM 의 Brownian Bridge process 는 $x_T = y$ 로 둠으로써,
- conditional input 그 자체에서 Reverse process 를 시작**함 - - :::{figure-md} - img_22 - - 식(9) - ::: - - - $\mu_\theta (x_t,t)$ 는 U-Net 에 의해 예측된 노이즈 평균값이며, $\tilde{\delta_t}$ 는 노이즈의 분산 - - DDPM 처럼, 임의의 parameters $\theta$ 를 갖는 신경망 **U-Net 은 $\mu_\theta (x_t,t)$ 를 학습** - - - **3.1.3. Training Objective** - - **참고.** - - 예전 **DDPM 의 Loss** 는 다음과 같았음. - - :::{figure-md} - img_23 - - DDPM 의 Loss - ::: - - - 그리고, 이로부터 simplified 된 **objective** 는 다음과 같음 - - :::{figure-md} - img_11 - - DDPM 의 simplified objective - ::: - - - **Brownian Bridge diffusion process** 의 **ELBO** - - :::{figure-md} - img_24 - - 식(10) : BBDM 의 ELBO - ::: - - - **첫 번째 term :** $x_T$ 가 곧 y 이므로 무시할 수 있음 - - **세 번째 term** : 매우 작은 값이 되므로 무시할 수 있음 - - **베이즈 이론과 Markov chain property 를 식 (4) 와 식 (8) 에 적용**하여, - 다음과 같이 **식 (11) 이 도출**된다. - - 참고. Markovian Chain - - $q(x_t|x_{t-1}) = q(x_t|x_{t-1}, x_{t-2}, … , x_0)$ - - Markov chain property 에 의해,
- $q_{BB}(x_t|x_{t-1},y) = q_{BB}(x_t|x_{t-1},x_0,y)$ 가 성립됨을 활용 - - 식(4) - - :::{figure-md} - img_14 - - 식(4) - ::: - - - 식(8) - - :::{figure-md} - img_20 - - 식(8) - ::: - - - 식(11) & 식(13) - - :::{figure-md} - img_25 - - 식(11) - ::: - - :::{figure-md} - img_26 - - 식(13) - ::: - - - 증명 - - ${q_{BB}(x_{t}|x_{t-1},y)q_{BB}(x_{t-1}|x_{0},y)\over q_{BB}(x_{t}|x_{0},y)}$ - - $= {{q_{BB}(x_{t},x_{t-1},y) \over q_{BB}(x_{t-1},y)} {q_{BB}(x_{t-1},x_{0},y) \over q_{BB}(x_{0},y)} \over {q_{BB}(x_{t},x_{0},y)\over q_{BB}(x_{0},y)}}$ - - $= q_{BB}(x_{t}|x_{t-1},y){q_{BB}(x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}$ - - $= q_{BB}(x_{t}|x_{t-1},x_{0},y){q_{BB}(x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}$ - - $= {q_{BB}(x_{t},x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}$ - - $= q_{BB}(x_{t-1}|x_{t},x_{0},y)$ - - - 위 식 (11) 의 평균은, 식 (12) 와 같이 정리됨 - - :::{figure-md} - img_27 - - 식(12) - ::: - - - 식(4) 와 식(12) 를 통합하고 Reparameterization method 를 사용해서 - $\tilde {\mu_t}$ 를 다음과 같이 변형할 수 있음 - - :::{figure-md} - img_28 - - 식(12) 의 변형 - ::: - - - 참고. 식(4) - - :::{figure-md} - img_14 - - 식(4) - ::: - - - - 하지만, 실제로 U-Net 은 전체 $\tilde {\mu_t}$ 를 예측하는 것이 아니라, - 노이즈를 예측하도록 학습됨. - - 이 내용을 식에 명시하기 위해, - **식(9) 에 명시된 $\mu_\theta$ 를 식(14) 와 같이 다시 써볼 수 있음.
- $x_t$ 와 y, 그리고 예측된 노이즈 $\epsilon_\theta$ 의 linear combination 으로 다시 써보는** 것임. - - :::{figure-md} - img_22 - - 식(9) - ::: - - :::{figure-md} - img_29 - - 식(14) - ::: - - - 그런데, 아래 그림을 참고해보면 우리는 $\tilde {\mu_t}$ 에 근사하도록 $\mu_\theta$ 를 학습시켜야함. - - :::{figure-md} - img_30 - - $\tilde {\mu}_t$ 의 정리된 식 - ::: - - - 즉, $\epsilon_\theta (x_t,t)$ 가 $m_t(y-x_0)+\sqrt {\delta_t}\epsilon$ 을 근사하도록 학습되어야하는 것임. - - - ELBO 의 두 번째 term 을 다시 살펴보면,
- - **두 번째 term** : $D_{KL}(q_{BB}(x_{t-1}|x_t, x_0, y)||p_\theta (x_{t-1}|x_t,y))$
- - - $arg \space min_\theta \space D_{KL}(q_{BB}(x_{t-1}|x_t, x_0, y)||p_\theta (x_{t-1}|x_t,y))$ - =$arg \space min_\theta \space (\tilde {\mu}_t(x_t,y) - \mu_\theta (x_t,y,t))$ - =$arg \space min_\theta \space (c_{\epsilon_t}(m_t(y-x_0) + \sqrt {\delta_t}\epsilon) - c_{\epsilon_t}\epsilon_\theta(x_t,t))$ - =$arg \space min_\theta \space (c_{\epsilon_t} (m_t(y-x_0) + \sqrt {\delta_t}\epsilon - \epsilon_\theta(x_t,t)))$
- - - 따라서, ELBO 는 다음과 같이 단순화될 수 있음 - - :::{figure-md} - img_31 - - BBDM 의 Simplified ELBO - ::: - - - - **Training Algorithm 정리** - - :::{figure-md} - img_32 - - Algorithm 1 : Training. 마치 DDPM 에서 그러했듯이, BBDM 도 실제 Loss 에는 Simplified ELBO 에서의 계수 $C_{\epsilon_t}$ 가 빠진 것을 확인할 수 있다. - ::: - - - - **3.2. Accelerated Sampling Processes**
- - **DDIM 과 비슷하게, BBDM 의 inference processes** 도 - **non-Markovian process 를 사용해서 가속시킬 수 있음** - - Sampling steps 의 길이를 S 라고 두었을 때, - **inference process** 는 **latent varibales $x_{1:T}$ 의 subset** 에 의해 다음과 같이 정의됨 - - **latent varibales $x_{1:T}$ 의 subset** - - :::{figure-md} - img_33 - - **latent varibales $x_{1:T}$ 의 subset** - ::: - - - **inference process** - - :::{figure-md} - img_34 - - inference process - ::: - - - **Sampling Algorithm** - - :::{figure-md} - img_35 - - Algorithm 2 : Sampling - ::: - - - 본 논문에서는 **S 값의 디폴트**를 **200** 으로 두었음
- 4. **Experiments**
- - **4.1. Experiment Setup**
- - **모델 & 하이퍼마라미터** - - BBDM 프레임워크는 pretrained VQGAN 과 BBDM 으로 이루어짐 - - **Latent Diffusion Model 에서 사용된 것과 같은 pretrained VQGAN 을 사용** - - training stage 에서의 time steps 는 1,000 - - inference stage 에서의 sampling steps 는 200
- - **Evaluation** - - FID 와 LPIPS 사용 - - 생성물의 diversity 를 평가하기 위해서, - 하나의 conditional input y 마다 5개의 샘플을 생성하고, - 각 픽셀 마다의 표준편차의 평균을 구함. - 그 후 전체 test 데이터셋에 대해서 평균 냄.
- - **Datasets** - - BBDM 의 I2I 변환 능력을 평가하기 위해서, 여러 task 로 실험함
- 1. **Semantic Synthesis 능력**을 CelebAMask-HQ dataset 으로 실험 - 1. semantic layout 만 주고 photorealistic 한 images 를 생성해내는 능력 평가
- 2. **sketch-to-photo 능력**을 edges2shoes 와 edges2handbags 로 실험 - 1. edges 만 주고 realistic images 생성해내는 능력 평가
- 3. **style transfer 능력**을 faces2comics 로 실험 - 1. 위 두 실험은 서로 상이한 domains 간의 변환 능력을 평가했다면, - Style transfer 실험에서는 서로 비슷한 domains 간의 I2I 변환 능력을 평가
- - **4.2. Qualitative Comparison**
- - :::{figure-md} - img_36 - - Figure 3. CelebAMask-HQ 데이터셋에 대한 추론 결과 - ::: - - :::{figure-md} - img_37 - - Figure 4. 다른 Image-to-Image 변환 task 에 대한 추론 결과 - ::: - - :::{figure-md} - img_38 - - Figure 5. 다른 Image-to-Image 변환 task 에 대한 추론 결과 - ::: - - - Pix2Pix 는 지도 학습 방식으로 학습하므로, 괜찮은 결과를 냄 - - 반면 **CycleGAN** 은 **작은 스케일의 데이터셋**에서는 **성능이 떨어짐** - - DRIT++ 은 GAN 기반 모델들 중에서는 좋은 성능을 냈으나, - 변환된 이미지들이 oversmoothed 되어 있었고, - ground truth distribution 과는 거리가 멀었음 - - conditional diffusion model 인 **CDE** 와 **LDM** 은 - GAN 기반 모델들보다는 **좋은 성능**을 냈으나, - **conditional information 에 큰 영향**을 받음 - - **Figure 3 의 첫 번째 줄**을 보면 i**rregular occlusions** 가 나타나는데, - **CDE 와 LDM 은 이에 큰 영향**을 받음 - - 반면 **BBDM 은 두 도메인 간의 직접적인 diffusion process 를 학습**하므로 - **이러한 문제로부터 자유로움** - - 또한 Brownian Bridge 의 stochastic 한 특성으로 인해 - fidelity 와 diversity 가 높은 이미지들을 생성해냄
- - **4.3. Quantitative Comparison**
- - Table 1 과 2 를 보면, BBDM 이 모든 실험에서 가장 좋은 FID 값을 기록했으며, 훌륭한 LPIPS 값을 기록함 - - :::{figure-md} - img_39 - - Table 1. CelebAMask-HQ 데이터셋에 대한 FID, LPIPS 성능은 BBDM 이 가장 뛰어남 - ::: - - :::{figure-md} - img_40 - - Table 2. BBDM 은 FID, LPIPS 점수가 매우 뛰어났음 - ::: - - - - **4.4. 다른 Translation Tasks**
- - **BBDM 의 generalization 성능을 검증**하기 위해서, 다른 tasks 에 대해서도 실험했음 - - 아래 그림과 같이, **다른 tasks 에서도 camparable 한 성능을 기**록함 - - :::{figure-md} - img_41 - - Figure 6. Face-to-label, 색상화, inpainting 등의 다른 tasks 에서도 뛰어난 성능을 기록함 - ::: - - - - **4.5. Ablation Study**
- - **pre-trained latent space 의 영향** - - :::{figure-md} - img_42 - - Table 3. BBDM 은 LDM 에 비해 Downsampling factor 에 대해 robust 했음 - ::: - - - **BBDM 과 LDM** 에 대해서, - **VQGAN downsampling factor** 를 **각각 4, 8, 16 으로 두고 성능 비교 실험 수행** - - **BBDM 은 down sampling factor 에 robust** 했음
- - **Sampling steps 의 영향** - - **Sampling steps 가 작을 때 (200 이하) 는, 조금만 늘려도 성능이 크게 증가**
- :::{figure-md} - img_43 - - Table 4. 200 이상의 Sampling Steps 에서는 Steps 를 키워도 성능 변화가 미미함 - ::: -
- - **Brownian Bridge 의 maximum variance 의 영향** - - :::{figure-md} - img_44 - - Table 5. Sampling diversity 조절 계수에 의해 실제로 Diversity 가 조절 되었음 - ::: - - - 식 (5) 에 나타난 것처럼, **scaling factor s 의 값을 변경**함으로써, - **Brownian Bridge 의 최대 분산값 (t = T/2 일 때의 분산값) 조절 가능.** - **이렇게 diversity 조절 가능.** - - :::{figure-md} - img_17 - - 식(5) - ::: - - 5. **Conclusion and Future Work** - - **Brownian Bridge 에 기반한 새로운 I2I 변환 방법 제시** - - 이 방법은 기존의 conditional 한 방법과 달리, - **Brownian Bridge diffusion process 를 통해 두 도메인 간의 mapping 을 직접 학습** - - **여러 tasks 에서의 실험을 통해 BBDM 의 성능 검증** - - text-to-image 와 같은 multi-modal tasks 에도 BBDM 을 적용해볼 예정 - -- **참고 자료** - - [https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB](https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB) +``` {admonition} Information +- **Title:** {BBDM: Image-to-image Translation with Brownian Bridge Diffusion Models}, {CVPR 2023} + +- **Reference** + - Paper: [https://arxiv.org/abs/2205.07680](https://arxiv.org/abs/2205.07680) + - Code: [https://github.com/xuekt98/BBDM](https://github.com/xuekt98/BBDM) + +- **Author:** SeonHoon Kim +- **Edited by:** SeonHoon Kim + +- **Related Youtube:** Youtube video + +- **Last updated on Nov. 13, 2023** +``` + +# BBDM + +- **BBDM** + - BBDM 은 Brownian Bridge 를 Diffusion Model 에 도입한 최초의 모델 + - Image to Image Translation 분야에서 Conditional Diffusion Models 의 한계를 극복함 + +
BBDM 을 이해하기 위해서는 Brownian motion process 와 Brownian Bridge 를 이해해야함. Brownian motion process 는 stochastic process 에 해당함.
+ +- **Stochastic Process** + - 시간의 흐름에 따라 불확실성을 가지고 변하는 확률 변수들의 집합 + - Stochastic process 는 $X_t$ 와 같이 나타낼 수 있는데,
+ 여기서 X 는 확률 변수를,
+ t 는 확률 변수가 관찰된 시간을 나타냄 + - X 와 t 는 각각 Discrete 혹은 Continuous 로 구분할 수 있음 + - Discrete RANDOM VARIABLE & Discrete TIME + - Discrete RANDOM VARIABLE & Continuous TIME + - **Continuous RANDOM VARIABLE & Discrete TIME** + - **Continuous RANDOM VARIABLE & Continuous TIME** +- **Brownian Motion Process (Wiener Process) 소개** + - **Brownian Motion** + - 유체의 미소입자가 불규칙하게 운동하는 현상 + + :::{figure-md} + img_00 + + 굴뚝에서 퍼져나간 연기 사진을 오른쪽으로 90도 회전시킨 사진 + ::: + +
위 사진으로부터 Brownian motion process 를 직관적으로 이해해볼 수 있음.
+ + - **Brownian Motion Process (Wiener Process)** + - Brownian Motion 을 연속 시간 확률 과정으로 모델링한 것 + + :::{figure-md} + img_01 + + $W_0$ = 0 이고 max time T=1000 인 Wiener Process 를 100번 Sampling 한 결과 + ::: + + - **Brownian Motion Process (Wiener Process)** 는
+ **Continuous RANDOM VARIABLE & Continuous TIME 를 갖는 Stochastic Process** 로,
+ $W_t$ 와 같이 나타낸다. +- **Brownian Motion Process (Wiener Process) 를 이해해보자** + - **가정해보자** + 1. $t = 0 → W_t = W_0 = 0$ 이라고 하자. + 2. 쉽게 이해하기 위해, TIME t 가 Discrete 하다고 가정해보자.
+ (BBDM 은 t 를 정수 0~1000 으로 설정) + - **Requirements** + 1. Brownian Motion Process 는 Stochastic Process 이다.
+ **TIME t 마다 stochasticity 가 부여되어야** 한다. + 2. **시간 간격과 W 의 변화량이 비례해야 한다.**
+ (즉, 더 오래 지났을수록 더 많이 변한다.) + - **Notation** + + :::{figure-md} + img_02 + + Source : [https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB](https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB) + ::: + + - $\Delta t$ = 시간 간격 + - n = 살펴보고자 하는 시간 간격의 수 + - $T = n * \Delta t$ + - i.i.d $\epsilon_t \sim N(0, 1)$ + - $\Delta W_t$ = t 시점에서 그 다음 시간 간격까지 증가한 W 의 값 + $= W_{t+\Delta t} - W_t$ + = $\epsilon_t \sqrt {\Delta t}$ + - **이해** + - $\Delta W_t = W_{t+\Delta t} - W_t = \epsilon_t \sqrt {\Delta t}$ 라고 정의해 본 근거를 + 위의 Requirements 에서 찾아보면.. + - **확률 변수 $\epsilon$ 를 도입함으로써 stochasticity 부여** + - $\Delta t$ 를 도입함으로써 **시간 간격도 고려 가능** + - **그렇다면 왜 하필 $\sqrt {\Delta t}$ 를 곱했을까?** + 1. $\Delta t$ 가 0 에 가까워질 때, $\sqrt{\Delta t}$ 는 천천히 0 에 수렴함. + **만약 TIME t 가 continuous 하다면, $\Delta t$ 는 매우 작은 값**이 됨. + **$\Delta W_t = \epsilon_t {\Delta t}$ 라면 $\Delta W_t$ 가 너무 작아짐.** + 2. $\Delta t$ 가 커질 때, $\sqrt{\Delta t}$ 는 천천히 커짐 + - **주의할 사항** + - i.i.d $\epsilon_t \sim N(0, 1)$ 이므로, + $\Delta W_t = \epsilon_t \sqrt {\Delta t}$ 에서 $\Delta W_0$ 와 $\Delta W_1$ 은 서로 독립인 것이 맞지만, + **$W_0$ 과 $W_1$ 이 독립이라는 말은 아님.** + - $\Delta W_0 = \epsilon_0 \sqrt {\Delta t}$ 이므로, + $W_{\Delta t} = W_0 + \epsilon_0 \sqrt {\Delta t} = 0 + \epsilon_0 \sqrt {\Delta t} = \epsilon_0 \sqrt {\Delta t}$ + - $\Delta W_{\Delta t} = \epsilon_{\Delta t} \sqrt {\Delta t}$ 이므로, + $W_{2\Delta t} = W_{\Delta t} + \epsilon_{\Delta t} \sqrt {\Delta t} = (\epsilon_0 + \epsilon_{\Delta t}) * \sqrt {\Delta t}$ + - $Var(\Delta W_{\Delta t}) = Var(\epsilon_{\Delta t} \sqrt {\Delta t}) = Var(\epsilon_{\Delta t}) * \sqrt {\Delta t}^2 = 1 * \sqrt {\Delta t}^2 = \Delta t$ + - $\mathbb{E}(\Delta W_{\Delta t}) = \mathbb{E}(\epsilon_{\Delta t} \sqrt {\Delta t}) = \mathbb{E}(\epsilon_{\Delta t}) * \sqrt {\Delta t} = 0 * \sqrt {\Delta t} = 0$ + - $\Delta W_{T-\Delta t} = \epsilon_{T-\Delta t} \sqrt {\Delta t}$ + $W_T = (\epsilon_0 + \epsilon_{\Delta t} + \epsilon_{2\Delta t} + ... + \epsilon_{T-\Delta t}) * \sqrt {\Delta t}$ + - $\mathbb{E}(W_T) = 0$ + - $Var(W_T) = n * \Delta t = T$ (각각의 $\epsilon$ 은 서로 i.i.d 이므로 공분산은 0) + - 즉, $W_T \sim N(0,T)$ + + :::{figure-md} + img_03 + + Source : [https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB](https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB) + ::: + + 파란색 점들은, Brownian Motion Process 를 1번 Sampling 한 결과임 (one representation) 를 나타냄
+ + :::{figure-md} + img_04 + + Source : [https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB](https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB) + ::: + + - t=0 부터 t=T 까지 Wiener Process 를 수행하면,
+ $W_t$ 는 $W_T - W_0$ 만큼 변한다. + - $(W_T - W_0) \sim N(0, T-0)$ + - $(W_{t_2}-W_{t_1}) \sim N(0,t_2-t_1)$ + - ex. 5분 에서 10분으로 Wiener Process 를 진행하면, $W_5$ 는 0 이 아닐 수 있으나, 그 변화량 $(W_{t_{10}}-W_{t_5})$ 은 N(0, 10 - 5) 를 따른다. + +- **Brownian Bridge** + - X 가 Standard Wiener Process 라고 하자.
+ 0 시점과 T 시점의 X 값을 알고,
+ 0 + + Brownian Bridge 이해를 위한 Linear Bridge + ::: + + Brownian Bridge 는 Standard Wiener Process 의 Conditional Probability Distribution 이다.
+ Starting state W(0) 과 Ending state W(T) 의 값에 Conditioned 되어 있다.
+ 아래와 같이 정의될 수 있다. + + :::{figure-md} + img_06 + + Brownian Bridge + ::: + +
아래의 그림을 보면, 0 이라는 시작값과 123 이라는 마지막 값에 conditioned 되어 있는 것을 확인할 수 있다.
Brownian Bridge 의 분산은 0 에서 시작해서 증가하다가, T/2 시점에서 최대가 되었다가, 이후로는 감소하여 마지막엔 0 에 수렴하게된다. + + :::{figure-md} + img_08 + + $W_0$ = 0 에서 $W_1000$ = 123 까지 100개의 Brownian Bridge 를 샘플링한 결과 + ::: + +- **Abstrcat** + + :::{figure-md} + img_09 + + Conditional Diffusion Models 와 BBDM 의 비교 + ::: + + - **기존의 Diffusion 모델**들은,
+ Image-to-Image 변환을 **Conditional generation process** 로 다룸.
+ 이로 인해, **매우 상이한 도메인 사이의 변환**에는 **어려움**이 있음. + - 이를 **해결하기 위해**,
+ 본 논문은 **Brownian Bridge** **에 기반한 Image-to-Image 변환 방법을 제시**함 + - **BBDM** 은 Conditional generation process 가 아닌
+ **Stochastic Brownian Bridge Process** 로 두 도메인 사이의 변환을 모델링하므로,
**Bidirectional Diffusion Process** 임. + - Brownian Bridge diffusion process 를 Image-to-Image 변환에 접목한 최초의 논문임 + - BBDM 모델의 훌륭한 성능을 실험적으로 증명함
+1. **Introduction** + - I2I 변환에서 **Non-diffusion models 의 한계** + - Pix2Pix 와 같은 **conditional GANs** 는 **fideltiy 가 높았으나,** + 학습이 어렵고, **DIversity 가 떨어진다.** + - Diversity 가 떨어지는 이유 : conditional GANs 는 input image 를 output image 에 one-to-one mapping 하는 방법을 학습하기 때문 + - **VAE** 같은 **생성형 모델**들은 GANs 만큼의 I2I 성능이 안나오고, + **Applicability** 가 GANs 보다 **떨어진다.** + - I2I 변환에서 **conditional diffusion models 의 한계** + - conditional diffusion models 는 **reference image** 의 encoded feature 를 **직접 U-Net 에 통합**시킴으로써 diffusion models 의 reverse process 를 guide 함 + - 하지만 이렇게 **생성된 결과가 desired conditional distribution 을 추론해낸다는 명료한 이론적 근거가 없음** + - 대부분의 **conditional diffusion models 는 generalization 이 잘 안되므로,** + conditional input domain 과 output domain 이 유사한 + 몇몇 applications 에서만 잘 활용될 수 있음 + - ex. inpainting 혹은 super-resolution + - **LDM** 이 latent space 에서 diffusion process 를 수행함으로써 + **generalization 을 개선**하긴 했으나 **여전히 conditional generation process** 임 + - **LDM** 의 경우, **복잡한 attention mechanism 으로 multi-modal condition** 이 주어지므로, **이론적 근거를 제시하기가 더 힘듦** + - **본 논문에서 제안하는 BBDM 모델** + + :::{figure-md} + img_10 + + BBDM 의 아키텍쳐 + ::: + + - **BBDM** 모델은 **input 과 output 도메인 간의 mapping** 을 + **Brownian Bridge stochastic process 를 통해 구축**함 + - 가속을 위해 Latent space 에서 diffusion process 를 수행함
+ 1. **Related Work**
+ - **2.1. Image-to-Image Translation** + - introduction 참고
+ - **2,2. Duffusion Models**
+ - **Diffusion Models** 의 simplified **objective** 를 잠깐 살펴보면, 다음과 같음. + + :::{figure-md} + img_11 + + Diffusion Models 의 Simplified objective + ::: + + - 대부분의 **conditional Diffusion Models** 는 **condition 을 objective 에 직접 “주입”**.
+ 아래의 그림을 보면, conditional input image y 가 삽입된 것을 볼 수 있음. + + :::{figure-md} + img_12 + + Conditional Diffusion Models 의 Simplified objective + ::: + + - $p(x_t|y)$ 가 objective 에 드러나 있지 않으므로, + **desired conditional distribution 에 도달할 수 있을 것**이라는 **이론적 보장이 없음**
+ - **2.3. Brownian Bridge**
+ - **Brownian Bridge** 는 **diffusion process 동안의 확률 분포가** + **starting state (t=0)** 와 **ending state (t=T)** 에 **conditioned 되어 있는,** + **time stochastic model** 임 + + :::{figure-md} + img_13 + + 식(3) + ::: + + 앞서 보았던 Brownian Bridge 의 평균과 분산을 구해보자.
+ 위의 식과 같은 의미임을 알 수 있다.
+ + :::{figure-md} + img_06 + + Brownian Bridge + ::: +
+ + 3. **Method**
+ - **3.1. Brownian Bridge Diffusion Model (BBDM)**
+ + - **Conditional diffusion models** : **Gaussian noise 를 향해 Forward process 진행** + - **BBDM : conditional input y 자체를 향해 Brownian Bridge process 진행**
+ + :::{figure-md} + img_09 + + Conditional Diffusion Models 와 BBDM 의 비교 + ::: +
+ + - VQGAN 의 latent space 에서 diffusion process 를 수행 + - **x** 가 **A 도메인 영상의 latent features** 이고,
+ **y** 가 **B 도메인 영상의 latent features** 일 때,
+ **Forward diffusion process 는 다음과 같이 정의**됨 + + :::{figure-md} + img_14 + + 식(4) + ::: + + - **T** 는 diffusion process 의 **total steps** 이다. + - $δ_t$ 는 **분산**이다. + - 식 (3) 에 나타난 분산 $δ_t={t(T −t)\over T}$ 를 사용하게 되면, + **가능한 최대 분산값**은, **middle step 인 $T\over 2$ 에서의 분산값인 $δ_{T\over 2} = {T \over 4}$ 가 됨** + - T 값이 커지면, 최대 분산값도 커지는데, **이 분산 값은 다루기에 너무 큼** + - $x_0,y \sim N(0,I)$ 이면서 서로 독립일 때, + Brownian Bridge diffusion process 를 위한 **분산 scheduling** 을 + 다음과 같이 해볼 수 있다. + + :::{figure-md} + img_15 + + Brownian Bridge diffusion process 를 위한 분산 Scheduling + ::: + + - 만약 t 는 양의 정수의 discrete time 이고, 그 최댓값인 T=1000 이라면 + $\delta_t$ 는 아래 그림과 같게 된다. + + :::{figure-md} + img_16 + + $\delta_t$ 를 시각화한 결과 + ::: +
+ + $m_t = t\overT$ 이고, $\delta_t = 2(m_t - m_t^2)$ 이므로,
+ + - diffusion process 가 시작하는 **t = 0 에서는, $m_0$ = 0** 이고, + **평균은 $x_0$** 이며 + **분산은 0** 이 된다.
+ - diffusion process 가 끝나는 **t = T 에서는,** + $m_T$ **= 1** 이고, + **평균은 y** 이고, + **분산은 0** 이 된다.
+ - **분산이,** + diffusion process 의 **중간 지점까지는 최대 0.5 까지 증가**하다가,
+ 중간 지점부터 **끝나는 지점까지는 0 으로 감소** + - **Brownian Bridge diffusion process** 에서의 **sampling diversity** 는 + **최대 분산값,
즉 middle step 인 $t = {T\over 2}$ 에서의 분산값에 의해 결정**됨 + - **분산을 스케일링하는 변수 s** **를 두어** **sampling diversity 를 조절**할 수 있다. + + :::{figure-md} + img_17 + + 식(5) : sampling diversity 조절을 위한 계수 s 가 포함된 분산 scheduling + ::: + + - 이 논문에서 **s 의 디폴트 값은 1** +
+ - **3.1.1 Forward Process**
+ - **식 (4)** 에서는 **step t 에서의 marginal distribution 만 제공** + - **training 과 inference process 를 위해**서는 **forward transition probability** 인 $q_{BB}(x_t|x_{t-1}, y)$ 를 알아야함 + - **식 (4) 에 의해, $x_0$ 와 $y$ 가 주어졌을 때의 $x_t$ 와** $x_{t-1}$ 은 다음과 같이 쓸 수 있음 + + :::{figure-md} + img_14 + + 식(4) + ::: + + :::{figure-md} + img_18 + + 식(6) & 식(7) + ::: + + - 참고. 위 식 (7) 의 $m_ty$ 는 $m_{t-1}y$ 로 쓰는 것이 옳음 + + :::{figure-md} + img_19 + + $\epsilon$ 은 i.i.d 하게 N(0, I) 를 따른다 + ::: + + - **식 (6) 의 $x_0$ 를 식 (7) 의 $x_0$ 로 대체**하면, + **Forward transition probability $q_{BB}(x_t|x_{t-1}, y)$** 가 아래의 **식 (8)** 과 같이 유도됨 + + :::{figure-md} + img_20 + + 식(8) + ::: + + - 증명 + - 식(7) 을 다음과 같이 쓸 수 있음 + - $x_0 = {x_{t-1}-m_{t-1}y-\sqrt {\delta_{t-1}} \epsilon_{t-1} \over 1-m_{t-1}}$ + - 식(6) 의 $x_0$ 에 위의 $x_0$ 를 대입 + - $x_t = {(1-m_t)x_{t-1} \over (1-m_{t-1})} - {(1-m_t)m_{t-1}y \over (1-m_{t-1})} - {(1-m_t)\sqrt {\delta_{t-1}}\epsilon_{t-1} \over (1-m_{t-1})} + m_ty + \sqrt{\delta_t} \epsilon_t$ + - $= {(1-m_t)x_{t-1} \over (1-m_{t-1})} + y(m_t - {(1-m_t) \over (1-m_{t-1})}m_{t-1}) + \sqrt {\delta_t}\epsilon_t - {(1-m_t)\sqrt {\delta_{t-1}}\epsilon_{t-1} \over (1-m_{t-1})}$ + - 이후, $Var(x_t)$ 를 구하면, 아래의 $\delta_{t|t-1}$ 와 같이 유도됨 + + :::{figure-md} + img_21 + + $\delta_{t|t-1}$ 식 + ::: + + - t=T 가 될 때 $m_T = 1$ 인데, 이때 식(8) 에 의해 $x_T = y$ 임. + ↓ + ”아, Forward diffusion process 는 확실히.. + A 도메인으로부터 B 도메인으로의 fixed mapping 을 정의하는구나” + + - **3.1.2 Reverse Process**
+ - **conditional diffusion models** 의 **reverse process** 는,
+ **Gaussian noise 로부터 시작**하며,
+ 매 스텝마다 조금씩 noise 를 제거해나감
+ - 반면, **BBDM 의 Brownian Bridge process 는 $x_T = y$ 로 둠으로써,
+ conditional input 그 자체에서 Reverse process 를 시작**함 + + :::{figure-md} + img_22 + + 식(9) + ::: + + - $\mu_\theta (x_t,t)$ 는 U-Net 에 의해 예측된 노이즈 평균값이며, $\tilde{\delta_t}$ 는 노이즈의 분산 + - DDPM 처럼, 임의의 parameters $\theta$ 를 갖는 신경망 **U-Net 은 $\mu_\theta (x_t,t)$ 를 학습** + + - **3.1.3. Training Objective** + - **참고.** + - 예전 **DDPM 의 Loss** 는 다음과 같았음. + + :::{figure-md} + img_23 + + DDPM 의 Loss + ::: + + - 그리고, 이로부터 simplified 된 **objective** 는 다음과 같음 + + :::{figure-md} + img_11 + + DDPM 의 simplified objective + ::: + + - **Brownian Bridge diffusion process** 의 **ELBO** + + :::{figure-md} + img_24 + + 식(10) : BBDM 의 ELBO + ::: + + - **첫 번째 term :** $x_T$ 가 곧 y 이므로 무시할 수 있음 + - **세 번째 term** : 매우 작은 값이 되므로 무시할 수 있음 + - **베이즈 이론과 Markov chain property 를 식 (4) 와 식 (8) 에 적용**하여, + 다음과 같이 **식 (11) 이 도출**된다. + - 참고. Markovian Chain + - $q(x_t|x_{t-1}) = q(x_t|x_{t-1}, x_{t-2}, … , x_0)$ + - Markov chain property 에 의해,
+ $q_{BB}(x_t|x_{t-1},y) = q_{BB}(x_t|x_{t-1},x_0,y)$ 가 성립됨을 활용 + - 식(4) + + :::{figure-md} + img_14 + + 식(4) + ::: + + - 식(8) + + :::{figure-md} + img_20 + + 식(8) + ::: + + - 식(11) & 식(13) + + :::{figure-md} + img_25 + + 식(11) + ::: + + :::{figure-md} + img_26 + + 식(13) + ::: + + - 증명 + - ${q_{BB}(x_{t}|x_{t-1},y)q_{BB}(x_{t-1}|x_{0},y)\over q_{BB}(x_{t}|x_{0},y)}$ + - $= {{q_{BB}(x_{t},x_{t-1},y) \over q_{BB}(x_{t-1},y)} {q_{BB}(x_{t-1},x_{0},y) \over q_{BB}(x_{0},y)} \over {q_{BB}(x_{t},x_{0},y)\over q_{BB}(x_{0},y)}}$ + - $= q_{BB}(x_{t}|x_{t-1},y){q_{BB}(x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}$ + - $= q_{BB}(x_{t}|x_{t-1},x_{0},y){q_{BB}(x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}$ + - $= {q_{BB}(x_{t},x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}$ + - $= q_{BB}(x_{t-1}|x_{t},x_{0},y)$ + + - 위 식 (11) 의 평균은, 식 (12) 와 같이 정리됨 + + :::{figure-md} + img_27 + + 식(12) + ::: + + - 식(4) 와 식(12) 를 통합하고 Reparameterization method 를 사용해서 + $\tilde {\mu_t}$ 를 다음과 같이 변형할 수 있음 + + :::{figure-md} + img_28 + + 식(12) 의 변형 + ::: + + - 참고. 식(4) + + :::{figure-md} + img_14 + + 식(4) + ::: + + + - 하지만, 실제로 U-Net 은 전체 $\tilde {\mu_t}$ 를 예측하는 것이 아니라, + 노이즈를 예측하도록 학습됨. + - 이 내용을 식에 명시하기 위해, + **식(9) 에 명시된 $\mu_\theta$ 를 식(14) 와 같이 다시 써볼 수 있음.
+ $x_t$ 와 y, 그리고 예측된 노이즈 $\epsilon_\theta$ 의 linear combination 으로 다시 써보는** 것임. + + :::{figure-md} + img_22 + + 식(9) + ::: + + :::{figure-md} + img_29 + + 식(14) + ::: + + - 그런데, 아래 그림을 참고해보면 우리는 $\tilde {\mu_t}$ 에 근사하도록 $\mu_\theta$ 를 학습시켜야함. + + :::{figure-md} + img_30 + + $\tilde {\mu}_t$ 의 정리된 식 + ::: + + - 즉, $\epsilon_\theta (x_t,t)$ 가 $m_t(y-x_0)+\sqrt {\delta_t}\epsilon$ 을 근사하도록 학습되어야하는 것임. + + - ELBO 의 두 번째 term 을 다시 살펴보면,
+ - **두 번째 term** : $D_{KL}(q_{BB}(x_{t-1}|x_t, x_0, y)||p_\theta (x_{t-1}|x_t,y))$
+ + - $arg \space min_\theta \space D_{KL}(q_{BB}(x_{t-1}|x_t, x_0, y)||p_\theta (x_{t-1}|x_t,y))$ + =$arg \space min_\theta \space (\tilde {\mu}_t(x_t,y) - \mu_\theta (x_t,y,t))$ + =$arg \space min_\theta \space (c_{\epsilon_t}(m_t(y-x_0) + \sqrt {\delta_t}\epsilon) - c_{\epsilon_t}\epsilon_\theta(x_t,t))$ + =$arg \space min_\theta \space (c_{\epsilon_t} (m_t(y-x_0) + \sqrt {\delta_t}\epsilon - \epsilon_\theta(x_t,t)))$
+ + - 따라서, ELBO 는 다음과 같이 단순화될 수 있음 + + :::{figure-md} + img_31 + + BBDM 의 Simplified ELBO + ::: + + + - **Training Algorithm 정리** + + :::{figure-md} + img_32 + + Algorithm 1 : Training. 마치 DDPM 에서 그러했듯이, BBDM 도 실제 Loss 에는 Simplified ELBO 에서의 계수 $C_{\epsilon_t}$ 가 빠진 것을 확인할 수 있다. + ::: + + + - **3.2. Accelerated Sampling Processes**
+ - **DDIM 과 비슷하게, BBDM 의 inference processes** 도 + **non-Markovian process 를 사용해서 가속시킬 수 있음** + - Sampling steps 의 길이를 S 라고 두었을 때, + **inference process** 는 **latent varibales $x_{1:T}$ 의 subset** 에 의해 다음과 같이 정의됨 + - **latent varibales $x_{1:T}$ 의 subset** + + :::{figure-md} + img_33 + + **latent varibales $x_{1:T}$ 의 subset** + ::: + + - **inference process** + + :::{figure-md} + img_34 + + inference process + ::: + + - **Sampling Algorithm** + + :::{figure-md} + img_35 + + Algorithm 2 : Sampling + ::: + + - 본 논문에서는 **S 값의 디폴트**를 **200** 으로 두었음
+ 4. **Experiments**
+ - **4.1. Experiment Setup**
+ - **모델 & 하이퍼마라미터** + - BBDM 프레임워크는 pretrained VQGAN 과 BBDM 으로 이루어짐 + - **Latent Diffusion Model 에서 사용된 것과 같은 pretrained VQGAN 을 사용** + - training stage 에서의 time steps 는 1,000 + - inference stage 에서의 sampling steps 는 200
+ - **Evaluation** + - FID 와 LPIPS 사용 + - 생성물의 diversity 를 평가하기 위해서, + 하나의 conditional input y 마다 5개의 샘플을 생성하고, + 각 픽셀 마다의 표준편차의 평균을 구함. + 그 후 전체 test 데이터셋에 대해서 평균 냄.
+ - **Datasets** + - BBDM 의 I2I 변환 능력을 평가하기 위해서, 여러 task 로 실험함
+ 1. **Semantic Synthesis 능력**을 CelebAMask-HQ dataset 으로 실험 + 1. semantic layout 만 주고 photorealistic 한 images 를 생성해내는 능력 평가
+ 2. **sketch-to-photo 능력**을 edges2shoes 와 edges2handbags 로 실험 + 1. edges 만 주고 realistic images 생성해내는 능력 평가
+ 3. **style transfer 능력**을 faces2comics 로 실험 + 1. 위 두 실험은 서로 상이한 domains 간의 변환 능력을 평가했다면, + Style transfer 실험에서는 서로 비슷한 domains 간의 I2I 변환 능력을 평가
+ - **4.2. Qualitative Comparison**
+ + :::{figure-md} + img_36 + + Figure 3. CelebAMask-HQ 데이터셋에 대한 추론 결과 + ::: + + :::{figure-md} + img_37 + + Figure 4. 다른 Image-to-Image 변환 task 에 대한 추론 결과 + ::: + + :::{figure-md} + img_38 + + Figure 5. 다른 Image-to-Image 변환 task 에 대한 추론 결과 + ::: + + - Pix2Pix 는 지도 학습 방식으로 학습하므로, 괜찮은 결과를 냄 + - 반면 **CycleGAN** 은 **작은 스케일의 데이터셋**에서는 **성능이 떨어짐** + - DRIT++ 은 GAN 기반 모델들 중에서는 좋은 성능을 냈으나, + 변환된 이미지들이 oversmoothed 되어 있었고, + ground truth distribution 과는 거리가 멀었음 + - conditional diffusion model 인 **CDE** 와 **LDM** 은 + GAN 기반 모델들보다는 **좋은 성능**을 냈으나, + **conditional information 에 큰 영향**을 받음 + - **Figure 3 의 첫 번째 줄**을 보면 i**rregular occlusions** 가 나타나는데, + **CDE 와 LDM 은 이에 큰 영향**을 받음 + - 반면 **BBDM 은 두 도메인 간의 직접적인 diffusion process 를 학습**하므로 + **이러한 문제로부터 자유로움** + - 또한 Brownian Bridge 의 stochastic 한 특성으로 인해 + fidelity 와 diversity 가 높은 이미지들을 생성해냄
+ - **4.3. Quantitative Comparison**
+ - Table 1 과 2 를 보면, BBDM 이 모든 실험에서 가장 좋은 FID 값을 기록했으며, 훌륭한 LPIPS 값을 기록함 + + :::{figure-md} + img_39 + + Table 1. CelebAMask-HQ 데이터셋에 대한 FID, LPIPS 성능은 BBDM 이 가장 뛰어남 + ::: + + :::{figure-md} + img_40 + + Table 2. BBDM 은 FID, LPIPS 점수가 매우 뛰어났음 + ::: + + + - **4.4. 다른 Translation Tasks**
+ - **BBDM 의 generalization 성능을 검증**하기 위해서, 다른 tasks 에 대해서도 실험했음 + - 아래 그림과 같이, **다른 tasks 에서도 camparable 한 성능을 기**록함 + + :::{figure-md} + img_41 + + Figure 6. Face-to-label, 색상화, inpainting 등의 다른 tasks 에서도 뛰어난 성능을 기록함 + ::: + + + - **4.5. Ablation Study**
+ - **pre-trained latent space 의 영향** + + :::{figure-md} + img_42 + + Table 3. BBDM 은 LDM 에 비해 Downsampling factor 에 대해 robust 했음 + ::: + + - **BBDM 과 LDM** 에 대해서, + **VQGAN downsampling factor** 를 **각각 4, 8, 16 으로 두고 성능 비교 실험 수행** + - **BBDM 은 down sampling factor 에 robust** 했음
+ - **Sampling steps 의 영향** + - **Sampling steps 가 작을 때 (200 이하) 는, 조금만 늘려도 성능이 크게 증가**
+ :::{figure-md} + img_43 + + Table 4. 200 이상의 Sampling Steps 에서는 Steps 를 키워도 성능 변화가 미미함 + ::: +
+ - **Brownian Bridge 의 maximum variance 의 영향** + + :::{figure-md} + img_44 + + Table 5. Sampling diversity 조절 계수에 의해 실제로 Diversity 가 조절 되었음 + ::: + + - 식 (5) 에 나타난 것처럼, **scaling factor s 의 값을 변경**함으로써, + **Brownian Bridge 의 최대 분산값 (t = T/2 일 때의 분산값) 조절 가능.** + **이렇게 diversity 조절 가능.** + + :::{figure-md} + img_17 + + 식(5) + ::: + + 5. **Conclusion and Future Work** + - **Brownian Bridge 에 기반한 새로운 I2I 변환 방법 제시** + - 이 방법은 기존의 conditional 한 방법과 달리, + **Brownian Bridge diffusion process 를 통해 두 도메인 간의 mapping 을 직접 학습** + - **여러 tasks 에서의 실험을 통해 BBDM 의 성능 검증** + - text-to-image 와 같은 multi-modal tasks 에도 BBDM 을 적용해볼 예정 + +- **참고 자료** + - [https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB](https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB) - [https://sine-qua-none.tistory.com/158](https://sine-qua-none.tistory.com/158) \ No newline at end of file diff --git a/_sources/docs/review/CM3leon.md b/_sources/docs/review/CM3leon.md old mode 100644 new mode 100755 index 0cf02f44..c2f85dfb --- a/_sources/docs/review/CM3leon.md +++ b/_sources/docs/review/CM3leon.md @@ -1,242 +1,242 @@ -```{admonition} Information -- **Title:** Scaling Autoregressive Multi-Modal Models: Pretraining and Instruction Tuning - -- **Reference** - - Paper: [https://scontent-gmp1-1.xx.fbcdn.net/v/t39.2365-6/358725877_789390529544546_1176484804732743296_n.pdf?_nc_cat=108&ccb=1-7&_nc_sid=3c67a6&_nc_ohc=PLfU_UR_vYAAX_NagU8&_nc_ht=scontent-gmp1-1.xx&oh=00_AfDrHAHXv1PcF0LqicjIYnmOrpVCGEQ0eMv5_Ve2_Tncvg&oe=652FF632](https://scontent-gmp1-1.xx.fbcdn.net/v/t39.2365-6/358725877_789390529544546_1176484804732743296_n.pdf?_nc_cat=108&ccb=1-7&_nc_sid=3c67a6&_nc_ohc=PLfU_UR_vYAAX_NagU8&_nc_ht=scontent-gmp1-1.xx&oh=00_AfDrHAHXv1PcF0LqicjIYnmOrpVCGEQ0eMv5_Ve2_Tncvg&oe=652FF632) - - Code: X - -- **Author:** Jun-Hyoung Lee - -- **Last updated on Oct. 15. 2023** -``` - -# CM3leon -:::{figure-md} CM3leon result -cm3leon_result - -CM3leon result -::: - -- 복잡하게 구성된 객체(손, 텍스트)도 잘 생성한다. - -## Abstract & 1. Introduction -- CM3Leon - - 텍스트와 이미지 둘 다 잘 생성하는 능력을 가진 검색-증강, 토큰 기반, 디코더 전용 멀티 모달 모델이다. - - CM3 멀티 모델 아키텍처를 사용하며 scaling up 및 다양한 구조적-스타일 데이터에 tunning 할 수 있는 능력을 가졌다. -- Training - - 처음에는 멀티 모달 모델을 “텍스트 기반” language 모델에 맞도록 학습했다. (large scale의 검색 증강 pretraining 단계를 포함한다.) - - 데이터는 라이센스가 있는 Shutterstock의 large-scale로 학습한다. - - 그 후 supervised fine tuning (SFT) 단계로 진행했다. - - 입력과 출력 모두 이미지와 텍스트 토큰을 섞을 수 있다. -- 기존 이미지 생성 모델은 텍스트 프롬프트에 맞는 이미지만 잘 생성하는데, - - CM3leon은 텍스트와 이미지 모두 잘 생성한다. - - 이미지 생성 - - 고해상도 output을 생성할 수 있는 self-contained contrastive decoding 방법을 소개한다. - - text guided iamge editing 부터 image controlled generation, segmentation까지 가능하다. - - 텍스트 생성 - - Shutterstock의 3억 개의 텍스트 토큰으로 학습했는데, image-to-text generation도 잘 수행한다. -- 학습 연산을 5배로 줄였다. -- zero shot COCO로 FID를 측정한 결과 4.88 점으로, Google의 Parti 모델의 성능과 비슷한 수준을 달성했다. - - -# 2. Pretraining - -- RA-CM3를 기반으로 T2I 도메인에서 토큰 기반 디코더 모델의 잠재력을 연구했다. - -## 2.1 Data - -### Image Tokenization - -- Gafni의 image tokenizer를 사용했다. - - - 이 tokenizer는 256x256 이미지를 8192개의 vocabulary에서 1024개의 토큰으로 인코딩을 진행한다. -- 텍스트에서는, Zhang의 커스텀 tokenizer(56320 vocabulary size)를 학습했다. - -- 추가로, 새로운 스페셜한 토큰인 **``**을 소개한다. - -:::{figure-md} Figure_8_9 -figure_8_9 - -Figure_8_9 -::: - - - 이는 modality간 transition을 하게 한다. - -### Retrieval Augmentation - -- 목적: 입력 sequence에 맞춰 관련성이 높고 다양한 멀티 모달 문서(from memory bank)를 검색하는 것이다. - - dense retriever 와 retrieval strategy을 포함하고 있다. -- dense retriever - - 쿼리 $q$ (예: input sequence)와 memory bank $\mathcal M$ 로부터 후보 문서 $m$ 를 가지고 관련성 점수$r(q, m)$ 를 return 해준다. - - dense retriver 방법은 CLIP 기반인 bi-encoder 구조를 따랐다. (Karpukhin) - - 멀티 모달 문서를 text / image 파트로 분리하고, 각각 CLIP 인코더(ViT-B-32)를 통해 인코딩을 한다. - - 그 후 문서의 vector representation로써 두 개를 평균을 낸다. - - 최종 검색은 관련성 점수에 따라 정렬된 후보 문서 목록을 얻기 위해 Maximum Inner Product Search로 수행한다. -- 학습 때 generator를 위한 유용한 검색 문서를 추출하기 위해 세 가지 요소를 고려했다. - - relevance - - 검색된 문서는 입력 sequence에 관련있어야 한다. - - CLIP 기반 dense retriever 점수를 사용한다. - - modality - - 이미지와 텍스트로 구성된 멀티 모달 문서로 검색 > 이미지 또는 텍스트로 검색하는 것이다. - - diversity - - 다양성은 검색된 문서에서 중복성을 피하기 위한 필수적인 절차다. - - 단순하게 관련성 점수에 기반해 top K 문서만 가져온다면 중복이 발생할 수 있다. - - 또한 downstream pretraining 에 안좋은 영향을 끼칠 수 있다. - - 실제로, 관련성 점수가 0.9 이하로 검색된 문서로 사용했고, - - query dropout(검색에 사용된 쿼리의 일부 20% 토큰을 삭제)를 적용했다. - - 따라서 다양성과 학습에 정규화를 시켰다. -- 이미지와 텍스트를 기반으로 각각 두 개의 문서를 검색한다. -- 학습에서는 데이터셋의 모든 캡션-이미지 쌍에 대해 검색된 샘플 3개를 무작위로 선택한다. - - 이는 사실상 사전 학습에서 사용할 수 있는 토큰 수의 4배이다. - -## 2.2 Objective Function - -- CM3 objective - - input - - - `"Image of a chameleon: [image]"` 을 변형시켜 `"Image of : [image] a chameleon”` 로 표현한다. - : `, ` 이 추가되었고, 단어의 재배치가 진행됐다. - - - 학습에는 일반적인 다음 토큰을 예측하는 loss를 사용했다. - - - 그 결과 이미지, 텍스트 둘 다 생성하는 다용도 모델의 결과를 가져왔다. - - caption-to-image generation에서는 CM3가 “Image of a chameleon:” 프롬프트로 부터 이미지를 생성하고, - - - image-to-caption generation에서는 CM3는 `“Image of : [image] ”` 프롬프트를 활용한다. - -## 2.3 Model - -- CM3Leon 모델은 디코더만 사용하는 transformer 아키텍쳐를 사용한다. -- Zhang에 비해 bias term, dropout, layer norm의 학습 가능한 파라미터를 제거했다. -- sequence length를 2048 → 4096까지 확장했다. -- weight 초기화: 평균 0, 표준 편차 0.006 인 truncated(표준 편차 3으로 잘린) normal distribution 사용했다. -- output layer: 0으로 초기화, 0에 가까운 표준 편차 0.0002로 positional embedding 초기화한다. -- [Metaseq](https://github.com/facebookresearch/metaseq)로 학습됐다. - -## 2.4 Training - -:::{figure-md} Training result -training_result - -Training result -::: - -- 세 가지 모델 사이즈(350M, 760M, 7B)로 학습 진행했다. (→ 1.4T(Trillion), 1.9T, 2.4T tokens) - - 주요한 하이퍼 파라미터는 learning rate, batch size로 멀티모달 scaling 에 맞게 설정했다. -- 참고 - - Perplexity, PPL: 언어 모델의 평가 방법 중 하나이다. (헷갈리는 정도, 값이 낮을 수록 좋다.) - - -## 3. Text-To-Image Results - -### 3.1 Importance of Decoding Strategies - -- autoregressive T2I 모델에서 decoding 알고리즘에 대해 상당한 연구가 진행되어 왔다. - - 그 중 DALL-E는 최종 아웃풋의 퀄리티가 향상되는 결과를 가져왔다. - - DALL-E 는 temperature 샘플링과 512개 후보 프롬프트에 CLIP re-ranking 전략을 채택했다. - - PARTI 와 Make-A-Scene 과 같은 모델은 토큰 기반의 classifier-free guidance로, re-ranking에 대해 오직 16 개의 샘플만 필요하게 됨으로써 후보의 수를 줄였다. - -### Temperatured Sampling - -- autoregressive 모델에서 확률적 기술로 사용된다. - - 이 방법은 샘플링에서 softmax의 temperature를 수정해 예측 무작위성을 제어한다. - - - Classifier Free Guidance 적용했다. - -### TopP Sampling - -- nucleus 샘플링으로도 불리고, 미리 정의한 임계값을 초과하는 누적 확률을 가진 가장 작은 상위 토큰 세트에서 샘플링을 포함한다. - - - Classifier Free Guidance 적용했다. - -### Classifier Free Guidance (CFG) - -$$ -\begin{aligned} -& \operatorname{logits}_{\text {cond }}=T\left(t_y \mid t_x\right), \text { logits }_{\text {uncond }}=T\left(t_y \mid<\bf { mask }>\right) \\ -& \operatorname{logits}_{\mathrm{cf}}=\operatorname{logits}_{\text {uncond }}+\alpha_c \cdot\left(\text { logits }_{\text {cond }}-\text { logits }_{\text {uncond }}\right) -\end{aligned} -$$ - -- CFG는 unconditional 샘플을 conditional 샘플에 맞도록 하는 것을 의미한다. -- unconditional 샘플을 text를 CM3 목표의 마스크 토큰으로 대체한다. -- 이는 CM3 목표를 사용한 학습의 핵심 이점 중 하나이며, finetuning 없이, classifier 없는 guidance를 수행할 수 있다. -- 추론에서는 두 개의 토큰 stream을 생성한다. - - 입력 텍스트에 따라 달라지는 토큰 stream과 - - mask 토큰에 따라 condition된 unconditional 토큰 stream - -### Contrastive Decoding TopK (CD-K) - -- CFG에서 logit의 뺄셈 연산이 텍스트에서 contrastive decoding 방법의 log probability를 뺄셈하는 연산과 비슷하다. - -## 3.2 Quantitative Evaluation - -:::{figure-md} Evaluation -evalution - -Evaluation -::: - - -- MS-COCO (30K) zero shot 예측, FID 측정했다. - - CM3Leon-7B 모델이 FID 4.88 점으로 가장 좋다. -- retrieval-augmented decoder-only 모델의 효율성이 좋다. - - CM3Leon-7B 모델이 추론에서 1개/2개로 검색된 예제로 동작할 때 우수한 FID 점수를 기록했다. - - 이는 고품질 이미지를 생성하는 능력을 확장시키는 검색의 중요성을 보여준다. - - -## 4. Supervised Fine-Tuning - -:::{figure-md} Figure5 -figure_5 - -Figure5 -::: - -- Supervised fine-tuning (SFT)는 LLM에서 중요한 학습 단계이다. - - - 명령어 또는 프롬프트를 잘 이해하는 것을 도와주며, zero shot task에서도 향상되는 결과를 얻었다. -- 명령어 튜닝이 다양한 task에 멀티모달 모델 성능을 눈에 띄게 증폭시키는 것을 발견했다. - -- CM3Leon을 이미지와 텍스트 task를 섞어 넓은 범위에서 fine tuning 했다. - -- finetuning 과정은 pretraining 단계를 따르며, task instruction과 출력을 결합해 동일한 CM3 objective를 사용한다. - - -### 4.1 Instructable Image Generation - -:::{figure-md} Figure6 -figure_6 - -Figure6 -::: - -### Text-Guided Image Editing - -- text instruction 에 기반한 initial image를 수정하는 task이다. -- InstructPix2Pix 방법 사용했다. -- 예시: “하늘의 색을 파란색으로 변경해줘”와 같은 프롬프트로 이미지 편집이 가능하다. - - 이것은 CM3leon이 텍스트와 이미지를 동시에 이해하고 있어서 가능하다. - -### Image-to-Image Grounded Generation - -- 다양한 feature과 텍스트 프롬프트로 grounding image를 생산하는 task이다. -- ControlNet 적용했다. - -### Spatially Grounded Image Generation - -:::{figure-md} Figure6-1 -figure_6_1 - -Figure6-1 -::: - -- 이미지 생성에 있어서 공간적 정보(위치)를 텍스트 프롬프트에 통합시킬 수 있도록 하는 task이다. - -### Image captioning & visual question answering task - -:::{figure-md} Figure16 -figure_16 - -Figure16 -::: - -- Flamingo(1000억 토큰), OpenFlamingo(400억 토큰)에 비해 CM3leon(30억 토큰)은 적은 토큰임에도 불구하고, 동등한 성능을 달성했다. +```{admonition} Information +- **Title:** Scaling Autoregressive Multi-Modal Models: Pretraining and Instruction Tuning + +- **Reference** + - Paper: [https://scontent-gmp1-1.xx.fbcdn.net/v/t39.2365-6/358725877_789390529544546_1176484804732743296_n.pdf?_nc_cat=108&ccb=1-7&_nc_sid=3c67a6&_nc_ohc=PLfU_UR_vYAAX_NagU8&_nc_ht=scontent-gmp1-1.xx&oh=00_AfDrHAHXv1PcF0LqicjIYnmOrpVCGEQ0eMv5_Ve2_Tncvg&oe=652FF632](https://scontent-gmp1-1.xx.fbcdn.net/v/t39.2365-6/358725877_789390529544546_1176484804732743296_n.pdf?_nc_cat=108&ccb=1-7&_nc_sid=3c67a6&_nc_ohc=PLfU_UR_vYAAX_NagU8&_nc_ht=scontent-gmp1-1.xx&oh=00_AfDrHAHXv1PcF0LqicjIYnmOrpVCGEQ0eMv5_Ve2_Tncvg&oe=652FF632) + - Code: X + +- **Author:** Jun-Hyoung Lee + +- **Last updated on Oct. 15. 2023** +``` + +# CM3leon +:::{figure-md} CM3leon result +cm3leon_result + +CM3leon result +::: + +- 복잡하게 구성된 객체(손, 텍스트)도 잘 생성한다. + +## Abstract & 1. Introduction +- CM3Leon + - 텍스트와 이미지 둘 다 잘 생성하는 능력을 가진 검색-증강, 토큰 기반, 디코더 전용 멀티 모달 모델이다. + - CM3 멀티 모델 아키텍처를 사용하며 scaling up 및 다양한 구조적-스타일 데이터에 tunning 할 수 있는 능력을 가졌다. +- Training + - 처음에는 멀티 모달 모델을 “텍스트 기반” language 모델에 맞도록 학습했다. (large scale의 검색 증강 pretraining 단계를 포함한다.) + - 데이터는 라이센스가 있는 Shutterstock의 large-scale로 학습한다. + - 그 후 supervised fine tuning (SFT) 단계로 진행했다. + - 입력과 출력 모두 이미지와 텍스트 토큰을 섞을 수 있다. +- 기존 이미지 생성 모델은 텍스트 프롬프트에 맞는 이미지만 잘 생성하는데, + - CM3leon은 텍스트와 이미지 모두 잘 생성한다. + - 이미지 생성 + - 고해상도 output을 생성할 수 있는 self-contained contrastive decoding 방법을 소개한다. + - text guided iamge editing 부터 image controlled generation, segmentation까지 가능하다. + - 텍스트 생성 + - Shutterstock의 3억 개의 텍스트 토큰으로 학습했는데, image-to-text generation도 잘 수행한다. +- 학습 연산을 5배로 줄였다. +- zero shot COCO로 FID를 측정한 결과 4.88 점으로, Google의 Parti 모델의 성능과 비슷한 수준을 달성했다. + + +# 2. Pretraining + +- RA-CM3를 기반으로 T2I 도메인에서 토큰 기반 디코더 모델의 잠재력을 연구했다. + +## 2.1 Data + +### Image Tokenization + +- Gafni의 image tokenizer를 사용했다. + + - 이 tokenizer는 256x256 이미지를 8192개의 vocabulary에서 1024개의 토큰으로 인코딩을 진행한다. +- 텍스트에서는, Zhang의 커스텀 tokenizer(56320 vocabulary size)를 학습했다. + +- 추가로, 새로운 스페셜한 토큰인 **``**을 소개한다. + +:::{figure-md} Figure_8_9 +figure_8_9 + +Figure_8_9 +::: + + - 이는 modality간 transition을 하게 한다. + +### Retrieval Augmentation + +- 목적: 입력 sequence에 맞춰 관련성이 높고 다양한 멀티 모달 문서(from memory bank)를 검색하는 것이다. + - dense retriever 와 retrieval strategy을 포함하고 있다. +- dense retriever + - 쿼리 $q$ (예: input sequence)와 memory bank $\mathcal M$ 로부터 후보 문서 $m$ 를 가지고 관련성 점수$r(q, m)$ 를 return 해준다. + - dense retriver 방법은 CLIP 기반인 bi-encoder 구조를 따랐다. (Karpukhin) + - 멀티 모달 문서를 text / image 파트로 분리하고, 각각 CLIP 인코더(ViT-B-32)를 통해 인코딩을 한다. + - 그 후 문서의 vector representation로써 두 개를 평균을 낸다. + - 최종 검색은 관련성 점수에 따라 정렬된 후보 문서 목록을 얻기 위해 Maximum Inner Product Search로 수행한다. +- 학습 때 generator를 위한 유용한 검색 문서를 추출하기 위해 세 가지 요소를 고려했다. + - relevance + - 검색된 문서는 입력 sequence에 관련있어야 한다. + - CLIP 기반 dense retriever 점수를 사용한다. + - modality + - 이미지와 텍스트로 구성된 멀티 모달 문서로 검색 > 이미지 또는 텍스트로 검색하는 것이다. + - diversity + - 다양성은 검색된 문서에서 중복성을 피하기 위한 필수적인 절차다. + - 단순하게 관련성 점수에 기반해 top K 문서만 가져온다면 중복이 발생할 수 있다. + - 또한 downstream pretraining 에 안좋은 영향을 끼칠 수 있다. + - 실제로, 관련성 점수가 0.9 이하로 검색된 문서로 사용했고, + - query dropout(검색에 사용된 쿼리의 일부 20% 토큰을 삭제)를 적용했다. + - 따라서 다양성과 학습에 정규화를 시켰다. +- 이미지와 텍스트를 기반으로 각각 두 개의 문서를 검색한다. +- 학습에서는 데이터셋의 모든 캡션-이미지 쌍에 대해 검색된 샘플 3개를 무작위로 선택한다. + - 이는 사실상 사전 학습에서 사용할 수 있는 토큰 수의 4배이다. + +## 2.2 Objective Function + +- CM3 objective + - input + + - `"Image of a chameleon: [image]"` 을 변형시켜 `"Image of : [image] a chameleon”` 로 표현한다. + : `, ` 이 추가되었고, 단어의 재배치가 진행됐다. + + - 학습에는 일반적인 다음 토큰을 예측하는 loss를 사용했다. + + - 그 결과 이미지, 텍스트 둘 다 생성하는 다용도 모델의 결과를 가져왔다. + - caption-to-image generation에서는 CM3가 “Image of a chameleon:” 프롬프트로 부터 이미지를 생성하고, + + - image-to-caption generation에서는 CM3는 `“Image of : [image] ”` 프롬프트를 활용한다. + +## 2.3 Model + +- CM3Leon 모델은 디코더만 사용하는 transformer 아키텍쳐를 사용한다. +- Zhang에 비해 bias term, dropout, layer norm의 학습 가능한 파라미터를 제거했다. +- sequence length를 2048 → 4096까지 확장했다. +- weight 초기화: 평균 0, 표준 편차 0.006 인 truncated(표준 편차 3으로 잘린) normal distribution 사용했다. +- output layer: 0으로 초기화, 0에 가까운 표준 편차 0.0002로 positional embedding 초기화한다. +- [Metaseq](https://github.com/facebookresearch/metaseq)로 학습됐다. + +## 2.4 Training + +:::{figure-md} Training result +training_result + +Training result +::: + +- 세 가지 모델 사이즈(350M, 760M, 7B)로 학습 진행했다. (→ 1.4T(Trillion), 1.9T, 2.4T tokens) + - 주요한 하이퍼 파라미터는 learning rate, batch size로 멀티모달 scaling 에 맞게 설정했다. +- 참고 + - Perplexity, PPL: 언어 모델의 평가 방법 중 하나이다. (헷갈리는 정도, 값이 낮을 수록 좋다.) + + +## 3. Text-To-Image Results + +### 3.1 Importance of Decoding Strategies + +- autoregressive T2I 모델에서 decoding 알고리즘에 대해 상당한 연구가 진행되어 왔다. + - 그 중 DALL-E는 최종 아웃풋의 퀄리티가 향상되는 결과를 가져왔다. + - DALL-E 는 temperature 샘플링과 512개 후보 프롬프트에 CLIP re-ranking 전략을 채택했다. + - PARTI 와 Make-A-Scene 과 같은 모델은 토큰 기반의 classifier-free guidance로, re-ranking에 대해 오직 16 개의 샘플만 필요하게 됨으로써 후보의 수를 줄였다. + +### Temperatured Sampling + +- autoregressive 모델에서 확률적 기술로 사용된다. + - 이 방법은 샘플링에서 softmax의 temperature를 수정해 예측 무작위성을 제어한다. + - - Classifier Free Guidance 적용했다. + +### TopP Sampling + +- nucleus 샘플링으로도 불리고, 미리 정의한 임계값을 초과하는 누적 확률을 가진 가장 작은 상위 토큰 세트에서 샘플링을 포함한다. + - - Classifier Free Guidance 적용했다. + +### Classifier Free Guidance (CFG) + +$$ +\begin{aligned} +& \operatorname{logits}_{\text {cond }}=T\left(t_y \mid t_x\right), \text { logits }_{\text {uncond }}=T\left(t_y \mid<\bf { mask }>\right) \\ +& \operatorname{logits}_{\mathrm{cf}}=\operatorname{logits}_{\text {uncond }}+\alpha_c \cdot\left(\text { logits }_{\text {cond }}-\text { logits }_{\text {uncond }}\right) +\end{aligned} +$$ + +- CFG는 unconditional 샘플을 conditional 샘플에 맞도록 하는 것을 의미한다. +- unconditional 샘플을 text를 CM3 목표의 마스크 토큰으로 대체한다. +- 이는 CM3 목표를 사용한 학습의 핵심 이점 중 하나이며, finetuning 없이, classifier 없는 guidance를 수행할 수 있다. +- 추론에서는 두 개의 토큰 stream을 생성한다. + - 입력 텍스트에 따라 달라지는 토큰 stream과 + - mask 토큰에 따라 condition된 unconditional 토큰 stream + +### Contrastive Decoding TopK (CD-K) + +- CFG에서 logit의 뺄셈 연산이 텍스트에서 contrastive decoding 방법의 log probability를 뺄셈하는 연산과 비슷하다. + +## 3.2 Quantitative Evaluation + +:::{figure-md} Evaluation +evalution + +Evaluation +::: + + +- MS-COCO (30K) zero shot 예측, FID 측정했다. + - CM3Leon-7B 모델이 FID 4.88 점으로 가장 좋다. +- retrieval-augmented decoder-only 모델의 효율성이 좋다. + - CM3Leon-7B 모델이 추론에서 1개/2개로 검색된 예제로 동작할 때 우수한 FID 점수를 기록했다. + - 이는 고품질 이미지를 생성하는 능력을 확장시키는 검색의 중요성을 보여준다. + + +## 4. Supervised Fine-Tuning + +:::{figure-md} Figure5 +figure_5 + +Figure5 +::: + +- Supervised fine-tuning (SFT)는 LLM에서 중요한 학습 단계이다. + + - 명령어 또는 프롬프트를 잘 이해하는 것을 도와주며, zero shot task에서도 향상되는 결과를 얻었다. +- 명령어 튜닝이 다양한 task에 멀티모달 모델 성능을 눈에 띄게 증폭시키는 것을 발견했다. + +- CM3Leon을 이미지와 텍스트 task를 섞어 넓은 범위에서 fine tuning 했다. + +- finetuning 과정은 pretraining 단계를 따르며, task instruction과 출력을 결합해 동일한 CM3 objective를 사용한다. + + +### 4.1 Instructable Image Generation + +:::{figure-md} Figure6 +figure_6 + +Figure6 +::: + +### Text-Guided Image Editing + +- text instruction 에 기반한 initial image를 수정하는 task이다. +- InstructPix2Pix 방법 사용했다. +- 예시: “하늘의 색을 파란색으로 변경해줘”와 같은 프롬프트로 이미지 편집이 가능하다. + - 이것은 CM3leon이 텍스트와 이미지를 동시에 이해하고 있어서 가능하다. + +### Image-to-Image Grounded Generation + +- 다양한 feature과 텍스트 프롬프트로 grounding image를 생산하는 task이다. +- ControlNet 적용했다. + +### Spatially Grounded Image Generation + +:::{figure-md} Figure6-1 +figure_6_1 + +Figure6-1 +::: + +- 이미지 생성에 있어서 공간적 정보(위치)를 텍스트 프롬프트에 통합시킬 수 있도록 하는 task이다. + +### Image captioning & visual question answering task + +:::{figure-md} Figure16 +figure_16 + +Figure16 +::: + +- Flamingo(1000억 토큰), OpenFlamingo(400억 토큰)에 비해 CM3leon(30억 토큰)은 적은 토큰임에도 불구하고, 동등한 성능을 달성했다. diff --git a/_sources/docs/review/ConceptLab.md b/_sources/docs/review/ConceptLab.md old mode 100644 new mode 100755 index 06ebd88d..0ceec67e --- a/_sources/docs/review/ConceptLab.md +++ b/_sources/docs/review/ConceptLab.md @@ -1,195 +1,195 @@ -``` {admonition} Information -- **Title:** ConceptLab: Creative Generation using Diffusion Prior Constraints - -- **Reference** - - Paper: [https://arxiv.org/pdf/2307.06949.pdf](https://arxiv.org/pdf/2307.06949.pdf) - - Code: [Official](https://github.com/kfirgoldberg/ConceptLab) - - Site: [Official](https://kfirgoldberg.github.io/ConceptLab/) - -- **Author:** Hyoungseo Cho - -- **Last updated on Nov. 20, 2023** -``` - -# ConceptLab - -## Introduction - -본 논문에서는 Creative Generation의 일환으로, 새롭고 창의적인 개념을 생성하는 내용을 다룹니다. 최근 text-to-image 생성 기술과 Personalization 기술이 크게 발전함에 따라 이미지 생성 뿐만 아니라 개인화된 개념을 생설할 수 있게 되었습니다. 이러한 강력한 모델을 사용하여 모델에 명시적으로 설명되지 않은 새로운 창의적 개념을 생성할 수 있을까요? - -:::{figure-md} -ConceptLab01 - -ConceptLab -::: - -## Related Work - -**Text-Guided Sysnthesis**
-대부분의 text-guided 생성 기술은 pretrain 된 텍스트 인코더에서 추출한 임베딩을 diffusion 모델에 직접 conditioning합니다. 즉, 텍스트 데이터를 처리하여 이미지 생성 과정에 통합하는 방식입니다. 본 논문에서는 Latent Diffusion Model과 Diffusion prior model을 활용해서 creative generation에서의 이점을 보입니다. - -**Diffusion Prior**
-Diffusion Prior 모델은 입력된 텍스트 임베딩을 CLIP의 latent space에서 해당하는 이미지 임베딩으로 매핑합니다. 이후 디코더는 CLIP의 이미지 임베딩에 condition이 부여된 이미지를 생성하기 위해 훈련됩니다. - -**Personalization**
-Personalization은 text-guided synthesis 맥락에서 사용자가 입력한 텍스트 프롬프트에 맞는 주제나 스타일을 표현하는 새로운 이미지를 생성하는 것을 목표로 합니다. 일반적으로 새로운 개념을 학습시키기 위해 임베딩을 최적화하거나 denoising 네트워크를 finetuning 하는 방법을 활용합니다. 하지만 본 연구에서는 Creative Generation에 초첨을 맞추고 새로운 개념을 생성하고 기발한 장면을 생성하는 것을 목표로 합니다. - -**Creative Generation**
-창의적 내용을 생성하는 것은 다양한 접근 방법이 있습니다. Xu et al 에서는 set-evolution 방법을 활용해 3D 형태의 모델링을 제안했습니다. Elgammal et al 에서는 GAN의 맥락에서 창의적 생성을 탐구하며, 기존 스타일에서의 편차를 극대화하는 방식으로 새로운 스타일을 학습했습니다. Sbai et al 에서는 새로운 손실 함수를 도립했습니다. 본 연구에서는 주어진 카테고리와 일치하도록 최적화하면서도 그 카테고리의 기존 개념들과 다른 새로운 개념을 찾는 방식으로 창의적 생성에 접근했습니다. 본 방법을 통해 새로운 개념들은 서로 혼합될 수 있으며 더 유연한 생성 과정을 갖게됩니다. - -:::{figure-md} -ConceptLab02 - -Text-guided generation (top left), personalization methods (bottom left), creative generation method (right) -::: - -## Prelimiaries - -**Latent Diffusion Models**
-Latent Diffusion Model에서는 오토인코더의 latent space 내에서 diffusion 과정이 진행됩니다. 먼저, 인고더 $E$는 주어진 이미지 $x$를 latent code $z$로 매핑하는 것을 목표로 합니다. 이때, z=E(x)가 됩니다. 동시에 디코더 D는 원본 입력 이미지를 재구성하도록 합니다. DDPM의 경우 아래 주어진 손실을 최소화하도록 학습합니다. - -$$ -L = E_{z,y,\epsilon,t} [||\epsilon - \epsilon_{\theta}(z_{t}, t, c)||_{2}^{2}] -$$ - -denoising network $\epsilon \theta$ 는 잠재 코드 $zt$에 추가된 잡음 $\epsilon$을 제거합니다. 이 과정에서 현재 시간 단계 t와 조건 벡터 c도 고려됩니다. - -**Diffusion Prior**
-일반적으로 Diffusion model은 CLIP 텍스트 인코딩에서 직접 파생된 조건 벡터 $c$를 활용하여 주어진 텍스트 프롬프트 $y$에 대해 훈련됩니다. $Ramesh et al$에서 text-to-image 생성 문제를 2가지 단계로 decompose 합니다. 먼저, Diffusion Prior 모델을 활용하여 주어진 텍스트 프롬프트로부터 이미지 임베딩을 예측합니다. 다음으로, 이 이미지 임베딩에 조건을 부여하여 이미지를 생성하는 diffusion decoder로 보내집니다. 훈련 또한 일반적으로 두 독립적인 단계로 이루어집니다. - -$$ -L_{prior} = E_{e,y,t} [||e - P_{\theta]}(e_{t},t,y)||_{2}^{2}] -$$ - -Diffusion 디코더는 이미지 임베딩을 조건 $c$와 위 Latent Diffusion Model에 정의된 손실을 활용하여 훈련됩니다. 그 다음 diffusion prior model $P\theta$는 임베딩 $e_{t}$로부터 denoise 된 이미지 임베딩 $e$를 직접 예측합니다. 이 두 단계 접근법은 이미지 다양성을 향상시키며 중간 CLIP 이미지 임베딩에 직접 접근하고 해당 공간에서 직접 제약을 할 수 있게 합니다. - -:::{figure-md} -ConceptLab03 - -ConceptLab -::: - - -## Method -ConceptLab은 생성하고자 하는 새로운 개념을 대표하는 단일 임베딩 $v_{*}$를 최적화합니다. 이후 주어진 카테고리에 유사하면서도 기존 멤버들과 다른 특성을 가지도록 손실 집합을 계산합니다. 훈련하는 동안, 현재 생성된 새로운 개념을 바탕으로 negative contraints를 더하기 위해 pretrained BLIP-2 VQA 모델을 활용합니다. - -### The Constraints -본 연구에서는 긍정적 제약 $C_{pos}$와 부정적 제약 $C_{neg}$ 두 가지를 활용합니다. 각 제약 조건은 텍스트 토큰을 활용하여 정의됩니다. - -### The Objective -본 연구에서는 두가지 제약 조건을 바탕으로 하여 새로운 개념을 대표하는 임베딩 $v_{*}$와 각 제약 조건 간의 유사도를 측정합니다. -우선, $v_{*}$와 각 제약 단어 $c$를 동일한 무작위 샘플링된 프롬프트 y에 통합합니다. 각 문장은 CLIP 텍스트 임베딩으로 인코딩되며, 이것이 텍스트 제약 조건을 정의합니다. 텍스트 프롬프트를 diffusion prior 모델에 통과시키면, 프롬프트의 특정 인스턴스가 생성됩니다. 이러한 방식으로 $E_{y}(v_{*}$가 diffusion prior를 통과하면 모든 $v_{*}$가 텍스트 제약 조건과 일치하도록 일관된 생성을 얻을 수 있습니다. 반면, 긍정 및 부정 제약 조건은 가능한 광범위하게 유지하고자 diffusion prior를 통과하지 않습니다. 이에 따라 본 연구에서의 손실 함수는 다음과 같이 정의됩니다: - -$$ -S(C,v_{*}) = E_{c \sim C}[\langle E_{y}(c), P(E_{y}(v_{*}))\rangle] -$$ -$$ -L = S(C_{neg}, v_{*}) + \lambda(1-S(C_{pos}, v_{*})) -$$ - -즉, 학습된 임베딩 v에서 생성된 샘플링된 이미지 임베딩 $P(E_{y}(v_{*}))$이 $C_{neg}$에 의해 정의된 텍스트 제약 조건에서 멀어지고 $C_{pos}$의 제약조건에 가까워지도록 합니다. - -## Regularization -정규화는 제약 조건 집합이 클 때 특정 멤버로의 collapsing을 방지하는 데 사용됩니다. 부정적 제약에 대한 최대 유사도를 측정하는 추가 손실 함수를 사용하는데 아래와 같이 정의됩니다: - -$$ -S_{max}(C,v_{*}) = max_{c \sim C}(\langle E_{y}, P(E_{y}(v_{*}))\rangle) -$$ - -이 유사도 측정 방식은 전체 손실 함수에 통합되며, $S(C,v_{*})$와 평균 냄으로써 $v_{*}$에 가장 가까운 제약 조건에 더 큰 패널티를 부여합니다. - -:::{figure-md} -ConceptLab04 - -훈련 과정 중 BLIP-2 모델을 사용하여 현재 개념에 가장 가까운 단어를 추론하고, 이를 제약 조건에 추가하는 과정을 거칩니다. -::: - -### Adaptive Negatives -많은 부정적 제약 조건을 수동으로 적용하는 것은 힘들고, 광범위한 카테고리의 가장 관련성 높은 멤버들을 정확하게 대표하지 못할 수도 있습니다. 이를 해결하기 위해, 훈련 중 부정적 제약 조건 집합을 점진적으로 확장하는 adaptive scheme을 제안합니다. 생성된 이미지를 사전 훈련된 BLIP-2 VQA 모델에 질의하여 이미지에 현재 존재하는 카테고리의 멤버가 무엇인지 식별하도록 합니다. 이후 결과로 나온 인스턴스를 훈련의 나머지 부분에 대한 부정적 제약 조건에 추가합니다. - -:::{figure-md} -ConceptLab05 - -여러 단계에 걸쳐 생성된 이미지 결과를 보여줍니다. 훈련 과정에서 부정적 제약 조건이 지속적으로 조정되고 확장되었음을 보여줍니다. -::: - -### Evolutionary Generation -주어진 개념 셋에 대해 *개념을 혼합*하기 위해 먼저 각 개념에서 이미지를 생성하여 이미지 제약 조건 $C_{im}$ 을 만듭니다. 각 이미지는 CLIP 이미지 인코더 $E_{im}(c)$를 통과하여 임베딩 세트를 생성합니다. 학습 가능한 개념 $v_{mix}$를 주어진 임베딩에 더 가깝게 만드는 수정된 손실 함수를 적용합니다.: - -$$ -L_{mix} = 1 - E_{c \sim C}[\langle E_{im}(c), P(E_{y}(v_{mix}))\rangle] -$$ - -이 손실 함수는 생성된 개념이나 실제 이미지에 적용될 수 있으며, 창의적인 생성물의 계층ㅇ적 생성을 위해 반복적으로 적용될 수 있습니다. 또, 생성된 결과물에 대한 각 개념의 영향을 더 잘 제어하기 위해 가중치 항목이 추가적으로 적용될 수 있습니다. - -:::{figure-md} -ConceptLab06 - -그림에는 훈련에 사용된 긍정적 개념이 왼쪽에 표시되어 있습니다. 이는 모델이 어떤 개념을 기반으로 창의적 이미지를 생성했는지를 알 수 있습니다. 모든 결과는 Adaptive Negative 기법을 활용했습니다. -::: - -:::{figure-md} -ConceptLab07 - -ConceptLab이 제안한 다양한 이미지로 프롬프트와 Adaptive Negative 기법을 적용했습니다. -::: - -:::{figure-md} -ConceptLab08 - -ConceptLab은 생성된 개념들을 혼합하여 새롭고 독특한 창조물을 반복적으로 학습할 수 있습니다. 그림의 가장 윗줄에서는 Adaptive Negative 기법을 적용하여 학습된 개념들을 보여줍니다. 이어지는 줄에서는 Evolutionary Generation 과정을 통해 얻어진 개념들을 보여줍니다. -::: - -## Experiments -ConceptLab의 효과를 입증하기 위해 정성적 및 정량적 평가를 진행했습니다. - -### Result - -### Creative Generation -위 그림들에서 볼 수 있듯이 모든 결과는 Adaptive Negative를 적용하였고 훈련 시드를 달리하며 다양한 개념을 생성할 수 있는 능력이 있음을 볼 수 있습니다. 또, ConceptLab은 학습된 창의적 개념을 새로운 장면에 배치할 수 있습니다. 이 생성물들은 배경 변경, 스타일 변경, 새로운 창조등 다양하게 활용 가능합니다. - -:::{figure-md} -ConceptLab09 - -ConceptLab을 활용한 Concept Mixing의 결과를 보여줍니다. -::: - -### Concept Mixing -Concept Mixing은 다양한 실제 개념들의 독특한 특성을 합쳐 하이브리드 개념을 형성하는 방법을 보여줍니다. 이 방법은 오직 긍정적 제약 조건만을 활용합니다. 예를 들어, 첫 번째 줄에는 랍스터의 주요 특징(생상과 집게발)을 거북이의 특징(등껍질)과 융합하는 것을 볼 수 있습니다. - -:::{figure-md} -ConceptLab10 - -위 그림은 ConceptLab에 의해 학습된 개념들이 여러 *세대*에 걸쳐 어떻게 발전하는지 보여줍니다. -::: - - -### Comparisons - -### Evaluation Setup -ConceptLab은 Stable Diffusion2와 Kandinsky 2.1 두 모델과 함께 평가했습니다. Kandinsky의 경우, 더 유리한 결과를 위해 부정적 프롬프트는 Latent Diffusion Model이 아닌 Diffusion Prior Model에 적용했습니다. - -### Qualitative Comparisons -ConceptLab은 긍정적 토근과 부정적 제약 조건 모두에 일관되게 맞춰질 수 있습니다. 즉, ConceptLab은 다중 제약 조건을 효과적으로 처리하고, 특정 개념에 대한 일관된 표현을 학습할 수 있는 능력을 갖추고 있습니다. - -### Quantitative Comparisons -정량적 평가를 위해 각 방법이 긍정적 개념을 포함하며, 주어진 부정적 개념과 닮지 않은 이미지를 생성하는 능력을 측정했습니다. 평가에는 애완동물, 식물, 과일, 가구, 악기의 5가지 카테고리를 활용했습니다. 각 도메인에 세 가지 다른 부정적 개념 쌍을 고려하고, 각 조합에 대해 ConceptLab을 5개의 랜덤 시드로 훈련하여 총 75개의 학습된 개념을 얻었습니다. 각 학습된 개념에 대해 "A photo of a $S_{*}$ 프롬프트를 활용하여 32개의 이미지를 생성했습니다. Stable Diffusionr과 kandinsky 모델에서는 부정적 프롬프트를 사용하고, 같은 긍정적 및 부정적 개념 쌍에 대해 160개의 이미지를 생성합니다. 측정 기준으로는 먼저 각 개념의 긍정적 유사성을 타겟 카테고리와의 CLIP 공간 유사성 계산을 통해 특정됩니다. 다음으로는 긍정적 제약과 부정적 제약 사이의 거리를 측정합니다. 이는 생성된 이미지와 모든 부정적 개념 사이의 최대 유사성 계산을 통해 이루어집니다. 결과적으로 ConceptLab은 5가지 모든 도메인에서 긍정적 CLIP 유사성에서 일관되게 우월한 성능을 보였고 타겟 카테고리에 속하는 이미지를 신뢰성 있게 생성했습니다. 또한, 부정적 거리 측정에서 ConceptLab은 모든 카테고리에서 Stable Diffusion을, 4가지 카테고리에서 Kandinsky를 능가했습니다. - -:::{figure-md} -ConceptLab11 - -User Study -::: - -## Limitations -Personalization과 유사하게, 학습된 개념을 포함하는 프롬프트를 사용하여 새로운 이미지를 생성하는 것이 항상 개념의 특성을 다양한 프롬프트에 걸쳐 유지하지는 못합니다. 또, 최적화 과정 자체가 항상 원하는 결과를 가져오지는 않습니다. "비행기"나 "물고기"와 같은 일부 클래스의 경우 ConceptLab은 창의적 개념을 생성하는데 여전히 어려움이 있습니다. 이는 BLIP-2에 의해 생성되는 부정적 제약과 관련이 있습니다. - - -:::{figure-md} -ConceptLab12 - -Limitations -::: - -## Conclusion +``` {admonition} Information +- **Title:** ConceptLab: Creative Generation using Diffusion Prior Constraints + +- **Reference** + - Paper: [https://arxiv.org/pdf/2307.06949.pdf](https://arxiv.org/pdf/2307.06949.pdf) + - Code: [Official](https://github.com/kfirgoldberg/ConceptLab) + - Site: [Official](https://kfirgoldberg.github.io/ConceptLab/) + +- **Author:** Hyoungseo Cho + +- **Last updated on Nov. 20, 2023** +``` + +# ConceptLab + +## Introduction + +본 논문에서는 Creative Generation의 일환으로, 새롭고 창의적인 개념을 생성하는 내용을 다룹니다. 최근 text-to-image 생성 기술과 Personalization 기술이 크게 발전함에 따라 이미지 생성 뿐만 아니라 개인화된 개념을 생설할 수 있게 되었습니다. 이러한 강력한 모델을 사용하여 모델에 명시적으로 설명되지 않은 새로운 창의적 개념을 생성할 수 있을까요? + +:::{figure-md} +ConceptLab01 + +ConceptLab +::: + +## Related Work + +**Text-Guided Sysnthesis**
+대부분의 text-guided 생성 기술은 pretrain 된 텍스트 인코더에서 추출한 임베딩을 diffusion 모델에 직접 conditioning합니다. 즉, 텍스트 데이터를 처리하여 이미지 생성 과정에 통합하는 방식입니다. 본 논문에서는 Latent Diffusion Model과 Diffusion prior model을 활용해서 creative generation에서의 이점을 보입니다. + +**Diffusion Prior**
+Diffusion Prior 모델은 입력된 텍스트 임베딩을 CLIP의 latent space에서 해당하는 이미지 임베딩으로 매핑합니다. 이후 디코더는 CLIP의 이미지 임베딩에 condition이 부여된 이미지를 생성하기 위해 훈련됩니다. + +**Personalization**
+Personalization은 text-guided synthesis 맥락에서 사용자가 입력한 텍스트 프롬프트에 맞는 주제나 스타일을 표현하는 새로운 이미지를 생성하는 것을 목표로 합니다. 일반적으로 새로운 개념을 학습시키기 위해 임베딩을 최적화하거나 denoising 네트워크를 finetuning 하는 방법을 활용합니다. 하지만 본 연구에서는 Creative Generation에 초첨을 맞추고 새로운 개념을 생성하고 기발한 장면을 생성하는 것을 목표로 합니다. + +**Creative Generation**
+창의적 내용을 생성하는 것은 다양한 접근 방법이 있습니다. Xu et al 에서는 set-evolution 방법을 활용해 3D 형태의 모델링을 제안했습니다. Elgammal et al 에서는 GAN의 맥락에서 창의적 생성을 탐구하며, 기존 스타일에서의 편차를 극대화하는 방식으로 새로운 스타일을 학습했습니다. Sbai et al 에서는 새로운 손실 함수를 도립했습니다. 본 연구에서는 주어진 카테고리와 일치하도록 최적화하면서도 그 카테고리의 기존 개념들과 다른 새로운 개념을 찾는 방식으로 창의적 생성에 접근했습니다. 본 방법을 통해 새로운 개념들은 서로 혼합될 수 있으며 더 유연한 생성 과정을 갖게됩니다. + +:::{figure-md} +ConceptLab02 + +Text-guided generation (top left), personalization methods (bottom left), creative generation method (right) +::: + +## Prelimiaries + +**Latent Diffusion Models**
+Latent Diffusion Model에서는 오토인코더의 latent space 내에서 diffusion 과정이 진행됩니다. 먼저, 인고더 $E$는 주어진 이미지 $x$를 latent code $z$로 매핑하는 것을 목표로 합니다. 이때, z=E(x)가 됩니다. 동시에 디코더 D는 원본 입력 이미지를 재구성하도록 합니다. DDPM의 경우 아래 주어진 손실을 최소화하도록 학습합니다. + +$$ +L = E_{z,y,\epsilon,t} [||\epsilon - \epsilon_{\theta}(z_{t}, t, c)||_{2}^{2}] +$$ + +denoising network $\epsilon \theta$ 는 잠재 코드 $zt$에 추가된 잡음 $\epsilon$을 제거합니다. 이 과정에서 현재 시간 단계 t와 조건 벡터 c도 고려됩니다. + +**Diffusion Prior**
+일반적으로 Diffusion model은 CLIP 텍스트 인코딩에서 직접 파생된 조건 벡터 $c$를 활용하여 주어진 텍스트 프롬프트 $y$에 대해 훈련됩니다. $Ramesh et al$에서 text-to-image 생성 문제를 2가지 단계로 decompose 합니다. 먼저, Diffusion Prior 모델을 활용하여 주어진 텍스트 프롬프트로부터 이미지 임베딩을 예측합니다. 다음으로, 이 이미지 임베딩에 조건을 부여하여 이미지를 생성하는 diffusion decoder로 보내집니다. 훈련 또한 일반적으로 두 독립적인 단계로 이루어집니다. + +$$ +L_{prior} = E_{e,y,t} [||e - P_{\theta]}(e_{t},t,y)||_{2}^{2}] +$$ + +Diffusion 디코더는 이미지 임베딩을 조건 $c$와 위 Latent Diffusion Model에 정의된 손실을 활용하여 훈련됩니다. 그 다음 diffusion prior model $P\theta$는 임베딩 $e_{t}$로부터 denoise 된 이미지 임베딩 $e$를 직접 예측합니다. 이 두 단계 접근법은 이미지 다양성을 향상시키며 중간 CLIP 이미지 임베딩에 직접 접근하고 해당 공간에서 직접 제약을 할 수 있게 합니다. + +:::{figure-md} +ConceptLab03 + +ConceptLab +::: + + +## Method +ConceptLab은 생성하고자 하는 새로운 개념을 대표하는 단일 임베딩 $v_{*}$를 최적화합니다. 이후 주어진 카테고리에 유사하면서도 기존 멤버들과 다른 특성을 가지도록 손실 집합을 계산합니다. 훈련하는 동안, 현재 생성된 새로운 개념을 바탕으로 negative contraints를 더하기 위해 pretrained BLIP-2 VQA 모델을 활용합니다. + +### The Constraints +본 연구에서는 긍정적 제약 $C_{pos}$와 부정적 제약 $C_{neg}$ 두 가지를 활용합니다. 각 제약 조건은 텍스트 토큰을 활용하여 정의됩니다. + +### The Objective +본 연구에서는 두가지 제약 조건을 바탕으로 하여 새로운 개념을 대표하는 임베딩 $v_{*}$와 각 제약 조건 간의 유사도를 측정합니다. +우선, $v_{*}$와 각 제약 단어 $c$를 동일한 무작위 샘플링된 프롬프트 y에 통합합니다. 각 문장은 CLIP 텍스트 임베딩으로 인코딩되며, 이것이 텍스트 제약 조건을 정의합니다. 텍스트 프롬프트를 diffusion prior 모델에 통과시키면, 프롬프트의 특정 인스턴스가 생성됩니다. 이러한 방식으로 $E_{y}(v_{*}$가 diffusion prior를 통과하면 모든 $v_{*}$가 텍스트 제약 조건과 일치하도록 일관된 생성을 얻을 수 있습니다. 반면, 긍정 및 부정 제약 조건은 가능한 광범위하게 유지하고자 diffusion prior를 통과하지 않습니다. 이에 따라 본 연구에서의 손실 함수는 다음과 같이 정의됩니다: + +$$ +S(C,v_{*}) = E_{c \sim C}[\langle E_{y}(c), P(E_{y}(v_{*}))\rangle] +$$ +$$ +L = S(C_{neg}, v_{*}) + \lambda(1-S(C_{pos}, v_{*})) +$$ + +즉, 학습된 임베딩 v에서 생성된 샘플링된 이미지 임베딩 $P(E_{y}(v_{*}))$이 $C_{neg}$에 의해 정의된 텍스트 제약 조건에서 멀어지고 $C_{pos}$의 제약조건에 가까워지도록 합니다. + +## Regularization +정규화는 제약 조건 집합이 클 때 특정 멤버로의 collapsing을 방지하는 데 사용됩니다. 부정적 제약에 대한 최대 유사도를 측정하는 추가 손실 함수를 사용하는데 아래와 같이 정의됩니다: + +$$ +S_{max}(C,v_{*}) = max_{c \sim C}(\langle E_{y}, P(E_{y}(v_{*}))\rangle) +$$ + +이 유사도 측정 방식은 전체 손실 함수에 통합되며, $S(C,v_{*})$와 평균 냄으로써 $v_{*}$에 가장 가까운 제약 조건에 더 큰 패널티를 부여합니다. + +:::{figure-md} +ConceptLab04 + +훈련 과정 중 BLIP-2 모델을 사용하여 현재 개념에 가장 가까운 단어를 추론하고, 이를 제약 조건에 추가하는 과정을 거칩니다. +::: + +### Adaptive Negatives +많은 부정적 제약 조건을 수동으로 적용하는 것은 힘들고, 광범위한 카테고리의 가장 관련성 높은 멤버들을 정확하게 대표하지 못할 수도 있습니다. 이를 해결하기 위해, 훈련 중 부정적 제약 조건 집합을 점진적으로 확장하는 adaptive scheme을 제안합니다. 생성된 이미지를 사전 훈련된 BLIP-2 VQA 모델에 질의하여 이미지에 현재 존재하는 카테고리의 멤버가 무엇인지 식별하도록 합니다. 이후 결과로 나온 인스턴스를 훈련의 나머지 부분에 대한 부정적 제약 조건에 추가합니다. + +:::{figure-md} +ConceptLab05 + +여러 단계에 걸쳐 생성된 이미지 결과를 보여줍니다. 훈련 과정에서 부정적 제약 조건이 지속적으로 조정되고 확장되었음을 보여줍니다. +::: + +### Evolutionary Generation +주어진 개념 셋에 대해 *개념을 혼합*하기 위해 먼저 각 개념에서 이미지를 생성하여 이미지 제약 조건 $C_{im}$ 을 만듭니다. 각 이미지는 CLIP 이미지 인코더 $E_{im}(c)$를 통과하여 임베딩 세트를 생성합니다. 학습 가능한 개념 $v_{mix}$를 주어진 임베딩에 더 가깝게 만드는 수정된 손실 함수를 적용합니다.: + +$$ +L_{mix} = 1 - E_{c \sim C}[\langle E_{im}(c), P(E_{y}(v_{mix}))\rangle] +$$ + +이 손실 함수는 생성된 개념이나 실제 이미지에 적용될 수 있으며, 창의적인 생성물의 계층ㅇ적 생성을 위해 반복적으로 적용될 수 있습니다. 또, 생성된 결과물에 대한 각 개념의 영향을 더 잘 제어하기 위해 가중치 항목이 추가적으로 적용될 수 있습니다. + +:::{figure-md} +ConceptLab06 + +그림에는 훈련에 사용된 긍정적 개념이 왼쪽에 표시되어 있습니다. 이는 모델이 어떤 개념을 기반으로 창의적 이미지를 생성했는지를 알 수 있습니다. 모든 결과는 Adaptive Negative 기법을 활용했습니다. +::: + +:::{figure-md} +ConceptLab07 + +ConceptLab이 제안한 다양한 이미지로 프롬프트와 Adaptive Negative 기법을 적용했습니다. +::: + +:::{figure-md} +ConceptLab08 + +ConceptLab은 생성된 개념들을 혼합하여 새롭고 독특한 창조물을 반복적으로 학습할 수 있습니다. 그림의 가장 윗줄에서는 Adaptive Negative 기법을 적용하여 학습된 개념들을 보여줍니다. 이어지는 줄에서는 Evolutionary Generation 과정을 통해 얻어진 개념들을 보여줍니다. +::: + +## Experiments +ConceptLab의 효과를 입증하기 위해 정성적 및 정량적 평가를 진행했습니다. + +### Result + +### Creative Generation +위 그림들에서 볼 수 있듯이 모든 결과는 Adaptive Negative를 적용하였고 훈련 시드를 달리하며 다양한 개념을 생성할 수 있는 능력이 있음을 볼 수 있습니다. 또, ConceptLab은 학습된 창의적 개념을 새로운 장면에 배치할 수 있습니다. 이 생성물들은 배경 변경, 스타일 변경, 새로운 창조등 다양하게 활용 가능합니다. + +:::{figure-md} +ConceptLab09 + +ConceptLab을 활용한 Concept Mixing의 결과를 보여줍니다. +::: + +### Concept Mixing +Concept Mixing은 다양한 실제 개념들의 독특한 특성을 합쳐 하이브리드 개념을 형성하는 방법을 보여줍니다. 이 방법은 오직 긍정적 제약 조건만을 활용합니다. 예를 들어, 첫 번째 줄에는 랍스터의 주요 특징(생상과 집게발)을 거북이의 특징(등껍질)과 융합하는 것을 볼 수 있습니다. + +:::{figure-md} +ConceptLab10 + +위 그림은 ConceptLab에 의해 학습된 개념들이 여러 *세대*에 걸쳐 어떻게 발전하는지 보여줍니다. +::: + + +### Comparisons + +### Evaluation Setup +ConceptLab은 Stable Diffusion2와 Kandinsky 2.1 두 모델과 함께 평가했습니다. Kandinsky의 경우, 더 유리한 결과를 위해 부정적 프롬프트는 Latent Diffusion Model이 아닌 Diffusion Prior Model에 적용했습니다. + +### Qualitative Comparisons +ConceptLab은 긍정적 토근과 부정적 제약 조건 모두에 일관되게 맞춰질 수 있습니다. 즉, ConceptLab은 다중 제약 조건을 효과적으로 처리하고, 특정 개념에 대한 일관된 표현을 학습할 수 있는 능력을 갖추고 있습니다. + +### Quantitative Comparisons +정량적 평가를 위해 각 방법이 긍정적 개념을 포함하며, 주어진 부정적 개념과 닮지 않은 이미지를 생성하는 능력을 측정했습니다. 평가에는 애완동물, 식물, 과일, 가구, 악기의 5가지 카테고리를 활용했습니다. 각 도메인에 세 가지 다른 부정적 개념 쌍을 고려하고, 각 조합에 대해 ConceptLab을 5개의 랜덤 시드로 훈련하여 총 75개의 학습된 개념을 얻었습니다. 각 학습된 개념에 대해 "A photo of a $S_{*}$ 프롬프트를 활용하여 32개의 이미지를 생성했습니다. Stable Diffusionr과 kandinsky 모델에서는 부정적 프롬프트를 사용하고, 같은 긍정적 및 부정적 개념 쌍에 대해 160개의 이미지를 생성합니다. 측정 기준으로는 먼저 각 개념의 긍정적 유사성을 타겟 카테고리와의 CLIP 공간 유사성 계산을 통해 특정됩니다. 다음으로는 긍정적 제약과 부정적 제약 사이의 거리를 측정합니다. 이는 생성된 이미지와 모든 부정적 개념 사이의 최대 유사성 계산을 통해 이루어집니다. 결과적으로 ConceptLab은 5가지 모든 도메인에서 긍정적 CLIP 유사성에서 일관되게 우월한 성능을 보였고 타겟 카테고리에 속하는 이미지를 신뢰성 있게 생성했습니다. 또한, 부정적 거리 측정에서 ConceptLab은 모든 카테고리에서 Stable Diffusion을, 4가지 카테고리에서 Kandinsky를 능가했습니다. + +:::{figure-md} +ConceptLab11 + +User Study +::: + +## Limitations +Personalization과 유사하게, 학습된 개념을 포함하는 프롬프트를 사용하여 새로운 이미지를 생성하는 것이 항상 개념의 특성을 다양한 프롬프트에 걸쳐 유지하지는 못합니다. 또, 최적화 과정 자체가 항상 원하는 결과를 가져오지는 않습니다. "비행기"나 "물고기"와 같은 일부 클래스의 경우 ConceptLab은 창의적 개념을 생성하는데 여전히 어려움이 있습니다. 이는 BLIP-2에 의해 생성되는 부정적 제약과 관련이 있습니다. + + +:::{figure-md} +ConceptLab12 + +Limitations +::: + +## Conclusion 본 논문에서는 text-to-image diffusion model을 활용하여 창의적 생성을 위한 새로운 접근 방법을 소개했습니다. 주어진 광범위한 카테고리에 속하는 새로운 개념을 학습하기 위해 Diffusion Prior 모델 사용을 제안했습니다. 또, Prior Constraints라는 긍정적 및 부정적 제약 조건들을 diffusion prior 출력에 적용했습니다. 최적화 과정에서는 VQA 모델을 활용하여 독특하면서도 기존 멤버들과의 명확한 구별을 보장했습니다. 이후 실험을 통해 본 방법의 효과성을 입증했으며 시각적으로 다양하고 매력적인 개념을 생성할 수 있었습니다. \ No newline at end of file diff --git a/_sources/docs/review/ControlNet.md b/_sources/docs/review/ControlNet.md old mode 100644 new mode 100755 index 4e5467d8..c3ca4aeb --- a/_sources/docs/review/ControlNet.md +++ b/_sources/docs/review/ControlNet.md @@ -1,203 +1,203 @@ -```{admonition} Information -- **Title:** Adding Conditional Control to Text-to-Image Diffusion Models (arxiv 2023) - -- **Reference** - - Paper: [https://arxiv.org/abs/2302.05543](https://arxiv.org/abs/2302.05543) - - Code: [https://github.com/lllyasviel/ControlNet](https://github.com/lllyasviel/ControlNet) - -- **Author:** Jisu Kim - -- **Last updated on May. 28, 2023** -``` - -# ControlNet - -## Additional Control with Image-based condition - -기존의 Text-to-Image 모델들은 text prompt로 생성할 이미지의 특징을 조절할 수 있었습니다. 하지만 이런 prompt-based control만으로 이미지의 특징을 조절하는데 한계가 있었습니다. 이 논문에서는 image-based condition을 추가적으로 줘서 생성되는 이미지의 특징을 더 잘 조절하는 ControlNet이라는 신경망 구조를 제안합니다. - -아래 그림은 “a high quality, detailed, and professional image”라는 prompt와 왼쪽 아래의 Canny edge를 input으로 받아서 오른쪽의 이미지들을 생성한 것입니다. 이런 식으로 추가적인 image-based condition (아래 그림에서는 Canny edge)를 input으로 받아 이미지를 생성하는 것이 ControlNet이 하는 역할입니다. - -:::{figure-md} -stylegan_01 - -Images generated by ConrolNet -::: - -그러면 어떤 구조를 사용해서 이를 가능하게 했을까요? 이제부터 이에 대해 알아보도록 하겠습니다. - -## ControlNet Block - -ControlNet의 block 구조는 다음과 같은 두 가지 특징을 가집니다. - -1. pretrained model의 locked copy와 trainable copy를 사용 - -2. zero convolution - -:::{figure-md} -stylegan_01 - -ConrolNet block -::: - -왜 이렇게 설계했는지 알아봅시다. - -우선, copy를 사용하는 이유는 기존에 방대한 양의 데이터로 학습시킨 pretrained model의 성능을 유지하기 위해서입니다. 또한, ControlNet의 학습 데이터가 양이 적은 경우에 오버피팅을 피할 수 있는 효과도 있을 것입니다. - -zero convolution이란 weight랑 bias가 0으로 초기화한 1x1 convolution을 말합니다. zero convolution을 사용할 경우 훈련이 시작되기 전에는 input에 대해 pretrained model과 ControlNet의 output이 똑같아집니다. 따라서 기존 모델이랑 똑같은 input, output을 가지게되므로 기존 모델의 성능을 유지할 수 있으며, 추가적인 훈련이 fine tuning을 하는 것과 비슷하므로 scratch부터 학습하는 것에 비해 빠르게 훈련시킬 수 있게됩니다. - -그러면 zero convolution은 어떻게 이를 가능하게 하는지 좀 더 자세히 알아봅시다. - -## Zero Convolution - -먼저 위의 그림에서 (a)에 해당하는 부분을 아래와 같이 수식으로 표현하겠습니다. - -$$ -\mathbf{y}=\mathcal{F}(\mathbf{x};\Theta) -$$ - -$\mathbf{x}$는 input feature map, $\mathcal{F}$는 neural network block, $\Theta$는 $\mathcal{F}$의 parameter, $\mathbf{y}$는 output을 의미합니다. 위 그림의 (b)를 수식으로 표현하기위해 $\mathcal{F}$의 trainable copy를 만들어서 parameter를 $\Theta_{c}$라고하고 $\Theta$는 고정시켜두겠습니다. 또한, zero convolution은 $\mathcal{Z}$로 표현하고 두 zero convolution의 parameter를 각각 $\Theta_{z1}, \Theta_{z2}$로 두겠습니다. 그러면 (b)에서 condition $\mathbf{c}$에 대한 output $\mathbf{y}_{c}$는 아래와 같이 표현할 수 있습니다. - -$$ -\mathbf{y}_{c}=\mathcal{F}(\mathbf{x};\Theta)+\mathcal{Z}(\mathcal{F}(\mathbf{x}+\mathcal{Z}(\mathbf{c};\Theta_{z1});\Theta_{c});\Theta_{z2}) -$$ - -그런데 $\mathcal{Z}$의 weight와 bias의 초깃값이 0이므로 훈련이 진행되지 않았을 경우 $\mathbf{y}_{c}=\mathbf{y}$입니다. 따라서 훈련 시작 전에는 ControlNet과 기존 모델이 같은 결과를 내므로 기존 모델의 성능을 보존할 수 있습니다. - -그런데 weight랑 bias가 전부 0으로 초기화되어있으면 gradient가 0이라서 훈련이 안 되는거 아닐까요? 이를 확인하기 위해 다음과 같이 간단한 경우를 생각해보죠. - -$$ -y=wx+b -$$ - -gradient는 다음과 같습니다. - -$$ -\frac{\partial y}{\partial w}=x,\; \frac{\partial y}{\partial x}=w,\; \frac{\partial y}{\partial b}=1 -$$ - -weight랑 bias가 0이고, $x\neq0$이라고 하면 - -$$ -\frac{\partial y}{\partial w}\neq0,\; \frac{\partial y}{\partial x}=0,\; \frac{\partial y}{\partial b}\neq0 -$$ - -입니다. 따라서 첫 번째 gradient step에서 weight는 0이 아닌 값으로 가게되고, $\frac{\partial y}{\partial x}\neq0$이 되므로 훈련이 됩니다. 여기서 핵심적인 가정이 $x\neq0$인데 이 부분은 잘 훈련된 pretrained model을 사용하고 있기 때문에 위배될 가능성이 낮을 것입니다. - -지금까지 얘기한 ControlNet block 구조를 pretrained Stable diffusion에 적용한 전체 구조는 아래 그림과 같습니다. - -:::{figure-md} -stylegan_01 - -Overall structure -::: - -## Training & Results - -training loss는 기존 stable diffusion에서 image-based condition $\mathbf{c}_{f}$가 추가된 형태입니다. - -:::{figure-md} -stylegan_01 - -Loss -::: - -training을 할 때 50%의 확률로 prompt $\mathbf{c}_{t}$를 empty string으로 바꿔주었다고 합니다. 이는 prompt가 주어지지않을 경우 모델이 $\mathbf{c}_{f}$로부터 semantics를 더 배우는 경향이 있기 때문에 이미지 생성을 $\mathbf{c}_{f}$로 조절하는 능력을 향상시켜줄 수 있다고 합니다. - -아래 결과는 training이 기존 방법보다 효율적이라는 것을 보여줍니다. - -:::{figure-md} -stylegan_01 - -Efficiency -::: - -아래 결과들은 task에 따른 결과들입니다. 더 많은 이미지들이 논문에 있으니 참고하시기 바랍니다. - -:::{figure-md} -stylegan_01 - -Pose -::: - -:::{figure-md} -stylegan_01 - -Images generated by ConrolNet -::: - -아래는 논문에서 limitation이라고 언급한 이미지입니다. 텍스트로 추가적인 정보를 주었음에도 원하는 이미지가 생성되지 않는 경우가 발생했습니다. - -:::{figure-md} -stylegan_01 - -Limitations -::: - -## Implementation - -코드는 공식 구현([링크](https://github.com/lllyasviel/ControlNet))에서 가져왔습니다. 아래 코드는 parameter를 0으로 초기화하는 코드로 zero convolution을 만들 때 사용됩니다. - -```python -def zero_module(module): - """ - Zero out the parameters of a module and return it. - """ - for p in module.parameters(): - p.detach().zero_() - return module -``` - -아래 코드는 기본적으로 nn.Sequential과 같은데 time step같은 추가적인 input을 받아줄 수 있게 만든 것입니다. - -```python -class TimestepEmbedSequential(nn.Sequential, TimestepBlock): - """ - A sequential module that passes timestep embeddings to the children that - support it as an extra input. - """ - - def forward(self, x, emb, context=None): - for layer in self: - if isinstance(layer, TimestepBlock): - x = layer(x, emb) - elif isinstance(layer, SpatialTransformer): - x = layer(x, context) - else: - x = layer(x) - return x -``` - -아래 코드는 공식 github의 cldm/cldm.py에 있는 ControlNet class입니다. init 부분은 길어서 생략했습니다. - -```python -class ControlNet(nn.Module): - def __init__(...): - ... - - def make_zero_conv(self, channels): - return TimestepEmbedSequential(zero_module(conv_nd(self.dims, channels, channels, 1, padding=0))) - - def forward(self, x, hint, timesteps, context, **kwargs): - t_emb = timestep_embedding(timesteps, self.model_channels, repeat_only=False) - emb = self.time_embed(t_emb) - - guided_hint = self.input_hint_block(hint, emb, context) - - outs = [] - - h = x.type(self.dtype) - for module, zero_conv in zip(self.input_blocks, self.zero_convs): - if guided_hint is not None: - h = module(h, emb, context) - h += guided_hint - guided_hint = None - else: - h = module(h, emb, context) - outs.append(zero_conv(h, emb, context)) - - h = self.middle_block(h, emb, context) - outs.append(self.middle_block_out(h, emb, context)) - - return outs -``` +```{admonition} Information +- **Title:** Adding Conditional Control to Text-to-Image Diffusion Models (arxiv 2023) + +- **Reference** + - Paper: [https://arxiv.org/abs/2302.05543](https://arxiv.org/abs/2302.05543) + - Code: [https://github.com/lllyasviel/ControlNet](https://github.com/lllyasviel/ControlNet) + +- **Author:** Jisu Kim + +- **Last updated on May. 28, 2023** +``` + +# ControlNet + +## Additional Control with Image-based condition + +기존의 Text-to-Image 모델들은 text prompt로 생성할 이미지의 특징을 조절할 수 있었습니다. 하지만 이런 prompt-based control만으로 이미지의 특징을 조절하는데 한계가 있었습니다. 이 논문에서는 image-based condition을 추가적으로 줘서 생성되는 이미지의 특징을 더 잘 조절하는 ControlNet이라는 신경망 구조를 제안합니다. + +아래 그림은 “a high quality, detailed, and professional image”라는 prompt와 왼쪽 아래의 Canny edge를 input으로 받아서 오른쪽의 이미지들을 생성한 것입니다. 이런 식으로 추가적인 image-based condition (아래 그림에서는 Canny edge)를 input으로 받아 이미지를 생성하는 것이 ControlNet이 하는 역할입니다. + +:::{figure-md} +stylegan_01 + +Images generated by ConrolNet +::: + +그러면 어떤 구조를 사용해서 이를 가능하게 했을까요? 이제부터 이에 대해 알아보도록 하겠습니다. + +## ControlNet Block + +ControlNet의 block 구조는 다음과 같은 두 가지 특징을 가집니다. + +1. pretrained model의 locked copy와 trainable copy를 사용 + +2. zero convolution + +:::{figure-md} +stylegan_01 + +ConrolNet block +::: + +왜 이렇게 설계했는지 알아봅시다. + +우선, copy를 사용하는 이유는 기존에 방대한 양의 데이터로 학습시킨 pretrained model의 성능을 유지하기 위해서입니다. 또한, ControlNet의 학습 데이터가 양이 적은 경우에 오버피팅을 피할 수 있는 효과도 있을 것입니다. + +zero convolution이란 weight랑 bias가 0으로 초기화한 1x1 convolution을 말합니다. zero convolution을 사용할 경우 훈련이 시작되기 전에는 input에 대해 pretrained model과 ControlNet의 output이 똑같아집니다. 따라서 기존 모델이랑 똑같은 input, output을 가지게되므로 기존 모델의 성능을 유지할 수 있으며, 추가적인 훈련이 fine tuning을 하는 것과 비슷하므로 scratch부터 학습하는 것에 비해 빠르게 훈련시킬 수 있게됩니다. + +그러면 zero convolution은 어떻게 이를 가능하게 하는지 좀 더 자세히 알아봅시다. + +## Zero Convolution + +먼저 위의 그림에서 (a)에 해당하는 부분을 아래와 같이 수식으로 표현하겠습니다. + +$$ +\mathbf{y}=\mathcal{F}(\mathbf{x};\Theta) +$$ + +$\mathbf{x}$는 input feature map, $\mathcal{F}$는 neural network block, $\Theta$는 $\mathcal{F}$의 parameter, $\mathbf{y}$는 output을 의미합니다. 위 그림의 (b)를 수식으로 표현하기위해 $\mathcal{F}$의 trainable copy를 만들어서 parameter를 $\Theta_{c}$라고하고 $\Theta$는 고정시켜두겠습니다. 또한, zero convolution은 $\mathcal{Z}$로 표현하고 두 zero convolution의 parameter를 각각 $\Theta_{z1}, \Theta_{z2}$로 두겠습니다. 그러면 (b)에서 condition $\mathbf{c}$에 대한 output $\mathbf{y}_{c}$는 아래와 같이 표현할 수 있습니다. + +$$ +\mathbf{y}_{c}=\mathcal{F}(\mathbf{x};\Theta)+\mathcal{Z}(\mathcal{F}(\mathbf{x}+\mathcal{Z}(\mathbf{c};\Theta_{z1});\Theta_{c});\Theta_{z2}) +$$ + +그런데 $\mathcal{Z}$의 weight와 bias의 초깃값이 0이므로 훈련이 진행되지 않았을 경우 $\mathbf{y}_{c}=\mathbf{y}$입니다. 따라서 훈련 시작 전에는 ControlNet과 기존 모델이 같은 결과를 내므로 기존 모델의 성능을 보존할 수 있습니다. + +그런데 weight랑 bias가 전부 0으로 초기화되어있으면 gradient가 0이라서 훈련이 안 되는거 아닐까요? 이를 확인하기 위해 다음과 같이 간단한 경우를 생각해보죠. + +$$ +y=wx+b +$$ + +gradient는 다음과 같습니다. + +$$ +\frac{\partial y}{\partial w}=x,\; \frac{\partial y}{\partial x}=w,\; \frac{\partial y}{\partial b}=1 +$$ + +weight랑 bias가 0이고, $x\neq0$이라고 하면 + +$$ +\frac{\partial y}{\partial w}\neq0,\; \frac{\partial y}{\partial x}=0,\; \frac{\partial y}{\partial b}\neq0 +$$ + +입니다. 따라서 첫 번째 gradient step에서 weight는 0이 아닌 값으로 가게되고, $\frac{\partial y}{\partial x}\neq0$이 되므로 훈련이 됩니다. 여기서 핵심적인 가정이 $x\neq0$인데 이 부분은 잘 훈련된 pretrained model을 사용하고 있기 때문에 위배될 가능성이 낮을 것입니다. + +지금까지 얘기한 ControlNet block 구조를 pretrained Stable diffusion에 적용한 전체 구조는 아래 그림과 같습니다. + +:::{figure-md} +stylegan_01 + +Overall structure +::: + +## Training & Results + +training loss는 기존 stable diffusion에서 image-based condition $\mathbf{c}_{f}$가 추가된 형태입니다. + +:::{figure-md} +stylegan_01 + +Loss +::: + +training을 할 때 50%의 확률로 prompt $\mathbf{c}_{t}$를 empty string으로 바꿔주었다고 합니다. 이는 prompt가 주어지지않을 경우 모델이 $\mathbf{c}_{f}$로부터 semantics를 더 배우는 경향이 있기 때문에 이미지 생성을 $\mathbf{c}_{f}$로 조절하는 능력을 향상시켜줄 수 있다고 합니다. + +아래 결과는 training이 기존 방법보다 효율적이라는 것을 보여줍니다. + +:::{figure-md} +stylegan_01 + +Efficiency +::: + +아래 결과들은 task에 따른 결과들입니다. 더 많은 이미지들이 논문에 있으니 참고하시기 바랍니다. + +:::{figure-md} +stylegan_01 + +Pose +::: + +:::{figure-md} +stylegan_01 + +Images generated by ConrolNet +::: + +아래는 논문에서 limitation이라고 언급한 이미지입니다. 텍스트로 추가적인 정보를 주었음에도 원하는 이미지가 생성되지 않는 경우가 발생했습니다. + +:::{figure-md} +stylegan_01 + +Limitations +::: + +## Implementation + +코드는 공식 구현([링크](https://github.com/lllyasviel/ControlNet))에서 가져왔습니다. 아래 코드는 parameter를 0으로 초기화하는 코드로 zero convolution을 만들 때 사용됩니다. + +```python +def zero_module(module): + """ + Zero out the parameters of a module and return it. + """ + for p in module.parameters(): + p.detach().zero_() + return module +``` + +아래 코드는 기본적으로 nn.Sequential과 같은데 time step같은 추가적인 input을 받아줄 수 있게 만든 것입니다. + +```python +class TimestepEmbedSequential(nn.Sequential, TimestepBlock): + """ + A sequential module that passes timestep embeddings to the children that + support it as an extra input. + """ + + def forward(self, x, emb, context=None): + for layer in self: + if isinstance(layer, TimestepBlock): + x = layer(x, emb) + elif isinstance(layer, SpatialTransformer): + x = layer(x, context) + else: + x = layer(x) + return x +``` + +아래 코드는 공식 github의 cldm/cldm.py에 있는 ControlNet class입니다. init 부분은 길어서 생략했습니다. + +```python +class ControlNet(nn.Module): + def __init__(...): + ... + + def make_zero_conv(self, channels): + return TimestepEmbedSequential(zero_module(conv_nd(self.dims, channels, channels, 1, padding=0))) + + def forward(self, x, hint, timesteps, context, **kwargs): + t_emb = timestep_embedding(timesteps, self.model_channels, repeat_only=False) + emb = self.time_embed(t_emb) + + guided_hint = self.input_hint_block(hint, emb, context) + + outs = [] + + h = x.type(self.dtype) + for module, zero_conv in zip(self.input_blocks, self.zero_convs): + if guided_hint is not None: + h = module(h, emb, context) + h += guided_hint + guided_hint = None + else: + h = module(h, emb, context) + outs.append(zero_conv(h, emb, context)) + + h = self.middle_block(h, emb, context) + outs.append(self.middle_block_out(h, emb, context)) + + return outs +``` diff --git a/_sources/docs/review/CustomDiffusion.md b/_sources/docs/review/CustomDiffusion.md old mode 100644 new mode 100755 index c6a135a1..34b3ba5b --- a/_sources/docs/review/CustomDiffusion.md +++ b/_sources/docs/review/CustomDiffusion.md @@ -1,216 +1,216 @@ -```{admonition} Information -- **Title:** A Multi-Concept Customiziation of Text-To-Image Diffusion (CVPR 2023) - -- **Reference** - - Paper: [https://arxiv.org/abs/2212.04488](https://arxiv.org/abs/2212.04488) - - Code: [Official:](https://github.com/adobe-research/custom-diffusion) - -- **Author:** Seunghwan Ji - -- **Last updated on Aug. 6, 2023** -``` -# Custom Diffusion - -## Abstract - -- Large Scale Data를 학습한 Generate 모델이 뛰어난 성능을 보이는 추세 -- User의 Private한 Concept을 생성하고자하는 욕구는 여전히 풀지 못함 -- Custom Diffusion은? - 1. 기존 Diffusion 모델의 partial한 부분만을 학습시킴으로써 기존보다 더 빠른 finetuning 방식을 제안 - 2. Single Concept 뿐 아니라, Multiple Concept에 대한 학습이 가능 - 3. 다양한 Fine tuned 모델을 하나의 모델로 Compress하는 방식을 제안 - -## 1. Introduction - -- 최근 Text-To-Image 모델들이 활발하게 연구 되어짐 -- 단순한 text prompt 입력만으로 원하는 이미지를 생성해내는 수준까지 이름 -- 하지만 이러한 모델들은 General한 이미지는 잘 생성하지만, User가 원하는 Private한 (=specific) Concept의 이미지는 생성해내지 못함 - - e.g. 행복한 우리 가족 사진, 우리집 강아지 뽀삐가 파리로 여행을 떠나는 사진 등 -- 학습 과정중에 User의 Private한 데이터를 보지 못했기때문에 Model에게는 당연한 결과 -- **Customization** - - 몇장의 Concept을 포함하는 이미지만으로 Pretrained 모델을 finetuning하는 방식 - - In Dreambooth, Personalization - - 목표 - 1. 학습하고자하는 Private한 Concept의 이미지를 잘 생성해내야함 - 2. 기존에 학습되었던 General한 이미지를 Finetuning한 후에도 잘 생성해내야함 -- Customization이 어려운 이유 - 1. 학습을 진행하다보면 기존에 학습했던 Concept을 잊어버리거나 왜곡해버림 → Language Draft - 2. 새로운 Concept에 대해 모델이 Overfit 되어서 결과물의 Variation이 낮아짐 - 3. 좀더 나아가 Single Concept 뿐 아니라 Multiple Concept에 대한 Finetuning 또한 어려움 -- Custom Diffusion은? - 1. Text로 Condition을 생성해내는 과정 중 특정 부분만을 학습 - 2. General Concept의 성능 유지를 위해 real image와 해당 이미지의 caption을 regularization Data로 사용 - 3. fine tuning동안 새로운 augmentation 기법을 소개 - 4. Multiple concept의 학습 방식을 제안 - -## 2. Related Work - -### Deep Generative Models & Image and model editing - -- GAN, VAE, Diffusion 등 다양한 방식의 Generative Model들이 각각 좋은 성능을 보여주고있음 -- 게다가 추가적인 input(=hint)를 통해 Generated 이미지의 control도 가능함 -- 하지만 General하지 않은 새로운 Concept에 대한 생성은 불가능함 -- **Custom Diffusion은 이러한 New Concept에 대한 Finetuning 기법을 제안** - -### Transfer learning - -- Global한 이미지의 Distribution을 이미 학습한 모델에 특정 concept을 포함한 소량의 이미지를 finetuning하는 기법 -- Transfer Learning은 생각보다 효과적이고 유용함 -- 대부분 transfer learning 시에는 모델의 전체를 학습하거나 혹은 Parameter를 더 추가해 재학습 - - → 위에서 제시한 Customization의 문제를 일으키기 쉬움 (Language Draft, Overfitting etc.) - -- **Custom Diffusion은 모델의 아주 일부만을 대상으로 finetuning** - -### Adapting text-to-image models - -- 비슷한 컨셉으로 Finetuning을 통한 Personalization 연구들이 있음 - - Dreambooth, Textual Inversion -- vs Custom Diffusion - 1. Multiple Concept의 Finetuning 모델들을 하나의 모델로 Compress할 수 있음 - 2. 모델의 특정 부분만을 Finetuning함으로써 다른 모델에 비해 Training Resourse를 절약할 수 있음 - -## 3. Method - -### Single Concept Fine-tuning - -- Backbone으로 Latent Diffusion Model을 채택 -- (L)DM의 학습 Concept - :::{figure-md} - CD_00 - - Equation 0 - ::: - - - $x_{t}$ : time t 시점에 Noise가 섞인 이미지 - - $t$ → timestep - - $c$ → conditioning feature (text, image 등) - - text나 image를 바로 사용하지않고 latent space로 embedding된 값을 사용 *(using CLIP)* - - ε → noise - - $ε_{θ}$ → $x_{t}$에 낀 noise ε를 예측해내는 모델 - - 즉, $x_{t}$에 낀 noise ε를 예측해내는 모델을 학습 - -- 이러한 LDM 모델을 fine tuning할때는 Model의 모든 Layer에대해 update하는게 기본 -- 하지만 이러한 finetuning 방식은 Resource가 비효율적으로 많이들고, 새로운 Concept 이미지에 overfitting되기 쉬움 -- Finetuning 과정 중 모델의 Weight 변화량을 체크 - :::{figure-md} - CD_01 - - Delta of Weight while Training - ::: -- 다른 부분에비해 Cross Attention 연산의 Wegith 변화량이 가장 큼 -- Cross Attention -:::{figure-md} -CD_02 - -Fig.4 Cross Attention -::: - -- Cross Attention → Image latent에 text condition을 주입하는 Attention Mechanism - - *Query* → image latent / *Key, Value* → text condition latent - - 모델 전체 Parameter에 단 5%부분만을 차지 - - 이 중 new concept을 의미하는 Text $V^{*}$이 포함되는 $W^{k}$와 $W^{v}$만 학습. 나머지는 Freeze -- Fine Tuning할 때 $V^{*}$은 실제로는 잘 쓰지않는 단어로 사용하고 “*A [$V^{*}$] [Class]”* 형식으로 이미지를 Captioning한 후에 학습 -- 또 Finetuning중에 일반적인 concept을 잊어버리는 Language Draft 현상이 있을수있음 - - Language Draft - :::{figure-md} - CD_03 - - Fine tuning 후에 Photo of a moon 이미지를 생성하면 Finetuning했던 Moongate 이미지를 생성해버림 - ::: - -Fine tuning 후에 Photo of a moon 이미지를 생성하면 Finetuning했던 Moongate 이미지를 생성해버림 - -- 이러한 현상을 방지하기위해 Real world의 Image에서 target text class prompt와 유사한 200장의 이미지를 Regulalization 이미지로 같이 학습 - - text prompt가 유사하다 = CLIP에서 추출한 text feature space상의 Vector가 Similar하다 - -### Multiple-Concept Compositional Fine-tuning - -- Joint Traning on multiple concept - - 각각의 Concept을 갖는 이미지에 대해 각각 rare한 key를 부여해 동시에 학습 - - ($V^{i}$*, for $i$ is # of concepts*) -- Constrained optimization to merge concepts - - 각각 Single Concept으로 학습된 weight를 merge - :::{figure-md} - CD_04 - - Equation 4 - ::: - - - $W_0$ → pretrained model의 Key, Value embedding Weight - - ~~*(Appendix A에는 $W$라고 나와있는데 오탈자일 가능성 있음)*~~ - - $C_{reg}$ → regularization 이미지의 Caption의 Embedding 값을 모두 뽑아 Concat - - ⇒ $C_{reg}$에 Pretrained Weight를 곱한 값과의 norm을 계산했을때 값이 가장 작은 Weight를 return - - “N개의 Concept에 대해 Cross Attention이 모두 잘 동작하는 W 값을 찾아 하나만 사용하자” - -### Training Details - -- single concept의 경우 250 steps, two-concept의 경우 500 steps -- batch : 8, learning rate : $8*10^{-5}$ -- random resize + prompt 추가 (very small, far away, zoom in …) (new augmentation technique) - -## 4. Experiments - -Single Concept Finetuning - -- Qualitative Evaluation -:::{figure-md} -CD_05 - -Qualitative Evaluation -::: - -- Quantative Evaluation (Text Alignment, Image Alignment, KID) - - text alignment : prompt에 얼마나 대응되는 이미지를 생성해냈는가 - - image alignment : training image의 concept을 얼마나 잘 표현해냈는가 - -:::{figure-md} -CD_06 - -Table 1 -::: -⇒ 정성적, 정량적 평가 모두 Custom Diffusion > Dreambooth, Textual Inversion - -Multiple Concept Finetuning - -:::{figure-md} -CD_07 - -Multiple Concept Finetuning -::: - -- Joint Training > Optimization by custom diffusion > Dreambooth - -Human Preference Study -:::{figure-md} -CD_08 - -Table 2 -::: - -- Custom Diffusion (partial) vs Baseline(Textual Inversion, Dreambooth, CustomDiffusion(all)) -- Text-Alignment, Image-Alignment 모두 Custom Diffusion (partial)을 선호 -- Textual Inversion은 Image Alignment는 Custom Diffusion 선호도와 비슷하지만 Text Alignment수치를 보면 Custom Diffusion이 매우 높아 Overfitting된 경향이 있음 - -Ablation Study - -1. Regularization Image - :::{figure-md} - CD_09 - - Table 3 - ::: - -- ㅌGen : real image 대신 generate된 이미지를 regularization 이미지로 사용 -- Overfitting 없이 가장 좋은 수치는 Augmentation + Regulatization image as Real world Image - -## 5. Discussion & Limitation - -- customizing이 가능하고 training resourse가 매우 적은 finetuning 기법 소개 -:::{figure-md} -CD_10 - -Limitation Of Custom Diffusion -::: - -- 비슷한 category의 object에 대해서는 joint training, merge 모두 잘 동작하지 않음 +```{admonition} Information +- **Title:** A Multi-Concept Customiziation of Text-To-Image Diffusion (CVPR 2023) + +- **Reference** + - Paper: [https://arxiv.org/abs/2212.04488](https://arxiv.org/abs/2212.04488) + - Code: [Official:](https://github.com/adobe-research/custom-diffusion) + +- **Author:** Seunghwan Ji + +- **Last updated on Aug. 6, 2023** +``` +# Custom Diffusion + +## Abstract + +- Large Scale Data를 학습한 Generate 모델이 뛰어난 성능을 보이는 추세 +- User의 Private한 Concept을 생성하고자하는 욕구는 여전히 풀지 못함 +- Custom Diffusion은? + 1. 기존 Diffusion 모델의 partial한 부분만을 학습시킴으로써 기존보다 더 빠른 finetuning 방식을 제안 + 2. Single Concept 뿐 아니라, Multiple Concept에 대한 학습이 가능 + 3. 다양한 Fine tuned 모델을 하나의 모델로 Compress하는 방식을 제안 + +## 1. Introduction + +- 최근 Text-To-Image 모델들이 활발하게 연구 되어짐 +- 단순한 text prompt 입력만으로 원하는 이미지를 생성해내는 수준까지 이름 +- 하지만 이러한 모델들은 General한 이미지는 잘 생성하지만, User가 원하는 Private한 (=specific) Concept의 이미지는 생성해내지 못함 + - e.g. 행복한 우리 가족 사진, 우리집 강아지 뽀삐가 파리로 여행을 떠나는 사진 등 +- 학습 과정중에 User의 Private한 데이터를 보지 못했기때문에 Model에게는 당연한 결과 +- **Customization** + - 몇장의 Concept을 포함하는 이미지만으로 Pretrained 모델을 finetuning하는 방식 + - In Dreambooth, Personalization + - 목표 + 1. 학습하고자하는 Private한 Concept의 이미지를 잘 생성해내야함 + 2. 기존에 학습되었던 General한 이미지를 Finetuning한 후에도 잘 생성해내야함 +- Customization이 어려운 이유 + 1. 학습을 진행하다보면 기존에 학습했던 Concept을 잊어버리거나 왜곡해버림 → Language Draft + 2. 새로운 Concept에 대해 모델이 Overfit 되어서 결과물의 Variation이 낮아짐 + 3. 좀더 나아가 Single Concept 뿐 아니라 Multiple Concept에 대한 Finetuning 또한 어려움 +- Custom Diffusion은? + 1. Text로 Condition을 생성해내는 과정 중 특정 부분만을 학습 + 2. General Concept의 성능 유지를 위해 real image와 해당 이미지의 caption을 regularization Data로 사용 + 3. fine tuning동안 새로운 augmentation 기법을 소개 + 4. Multiple concept의 학습 방식을 제안 + +## 2. Related Work + +### Deep Generative Models & Image and model editing + +- GAN, VAE, Diffusion 등 다양한 방식의 Generative Model들이 각각 좋은 성능을 보여주고있음 +- 게다가 추가적인 input(=hint)를 통해 Generated 이미지의 control도 가능함 +- 하지만 General하지 않은 새로운 Concept에 대한 생성은 불가능함 +- **Custom Diffusion은 이러한 New Concept에 대한 Finetuning 기법을 제안** + +### Transfer learning + +- Global한 이미지의 Distribution을 이미 학습한 모델에 특정 concept을 포함한 소량의 이미지를 finetuning하는 기법 +- Transfer Learning은 생각보다 효과적이고 유용함 +- 대부분 transfer learning 시에는 모델의 전체를 학습하거나 혹은 Parameter를 더 추가해 재학습 + + → 위에서 제시한 Customization의 문제를 일으키기 쉬움 (Language Draft, Overfitting etc.) + +- **Custom Diffusion은 모델의 아주 일부만을 대상으로 finetuning** + +### Adapting text-to-image models + +- 비슷한 컨셉으로 Finetuning을 통한 Personalization 연구들이 있음 + - Dreambooth, Textual Inversion +- vs Custom Diffusion + 1. Multiple Concept의 Finetuning 모델들을 하나의 모델로 Compress할 수 있음 + 2. 모델의 특정 부분만을 Finetuning함으로써 다른 모델에 비해 Training Resourse를 절약할 수 있음 + +## 3. Method + +### Single Concept Fine-tuning + +- Backbone으로 Latent Diffusion Model을 채택 +- (L)DM의 학습 Concept + :::{figure-md} + CD_00 + + Equation 0 + ::: + + - $x_{t}$ : time t 시점에 Noise가 섞인 이미지 + - $t$ → timestep + - $c$ → conditioning feature (text, image 등) + - text나 image를 바로 사용하지않고 latent space로 embedding된 값을 사용 *(using CLIP)* + - ε → noise + - $ε_{θ}$ → $x_{t}$에 낀 noise ε를 예측해내는 모델 + - 즉, $x_{t}$에 낀 noise ε를 예측해내는 모델을 학습 + +- 이러한 LDM 모델을 fine tuning할때는 Model의 모든 Layer에대해 update하는게 기본 +- 하지만 이러한 finetuning 방식은 Resource가 비효율적으로 많이들고, 새로운 Concept 이미지에 overfitting되기 쉬움 +- Finetuning 과정 중 모델의 Weight 변화량을 체크 + :::{figure-md} + CD_01 + + Delta of Weight while Training + ::: +- 다른 부분에비해 Cross Attention 연산의 Wegith 변화량이 가장 큼 +- Cross Attention +:::{figure-md} +CD_02 + +Fig.4 Cross Attention +::: + +- Cross Attention → Image latent에 text condition을 주입하는 Attention Mechanism + - *Query* → image latent / *Key, Value* → text condition latent + - 모델 전체 Parameter에 단 5%부분만을 차지 + - 이 중 new concept을 의미하는 Text $V^{*}$이 포함되는 $W^{k}$와 $W^{v}$만 학습. 나머지는 Freeze +- Fine Tuning할 때 $V^{*}$은 실제로는 잘 쓰지않는 단어로 사용하고 “*A [$V^{*}$] [Class]”* 형식으로 이미지를 Captioning한 후에 학습 +- 또 Finetuning중에 일반적인 concept을 잊어버리는 Language Draft 현상이 있을수있음 + - Language Draft + :::{figure-md} + CD_03 + + Fine tuning 후에 Photo of a moon 이미지를 생성하면 Finetuning했던 Moongate 이미지를 생성해버림 + ::: + +Fine tuning 후에 Photo of a moon 이미지를 생성하면 Finetuning했던 Moongate 이미지를 생성해버림 + +- 이러한 현상을 방지하기위해 Real world의 Image에서 target text class prompt와 유사한 200장의 이미지를 Regulalization 이미지로 같이 학습 + - text prompt가 유사하다 = CLIP에서 추출한 text feature space상의 Vector가 Similar하다 + +### Multiple-Concept Compositional Fine-tuning + +- Joint Traning on multiple concept + - 각각의 Concept을 갖는 이미지에 대해 각각 rare한 key를 부여해 동시에 학습 + - ($V^{i}$*, for $i$ is # of concepts*) +- Constrained optimization to merge concepts + - 각각 Single Concept으로 학습된 weight를 merge + :::{figure-md} + CD_04 + + Equation 4 + ::: + + - $W_0$ → pretrained model의 Key, Value embedding Weight + - ~~*(Appendix A에는 $W$라고 나와있는데 오탈자일 가능성 있음)*~~ + - $C_{reg}$ → regularization 이미지의 Caption의 Embedding 값을 모두 뽑아 Concat + - ⇒ $C_{reg}$에 Pretrained Weight를 곱한 값과의 norm을 계산했을때 값이 가장 작은 Weight를 return + - “N개의 Concept에 대해 Cross Attention이 모두 잘 동작하는 W 값을 찾아 하나만 사용하자” + +### Training Details + +- single concept의 경우 250 steps, two-concept의 경우 500 steps +- batch : 8, learning rate : $8*10^{-5}$ +- random resize + prompt 추가 (very small, far away, zoom in …) (new augmentation technique) + +## 4. Experiments + +Single Concept Finetuning + +- Qualitative Evaluation +:::{figure-md} +CD_05 + +Qualitative Evaluation +::: + +- Quantative Evaluation (Text Alignment, Image Alignment, KID) + - text alignment : prompt에 얼마나 대응되는 이미지를 생성해냈는가 + - image alignment : training image의 concept을 얼마나 잘 표현해냈는가 + +:::{figure-md} +CD_06 + +Table 1 +::: +⇒ 정성적, 정량적 평가 모두 Custom Diffusion > Dreambooth, Textual Inversion + +Multiple Concept Finetuning + +:::{figure-md} +CD_07 + +Multiple Concept Finetuning +::: + +- Joint Training > Optimization by custom diffusion > Dreambooth + +Human Preference Study +:::{figure-md} +CD_08 + +Table 2 +::: + +- Custom Diffusion (partial) vs Baseline(Textual Inversion, Dreambooth, CustomDiffusion(all)) +- Text-Alignment, Image-Alignment 모두 Custom Diffusion (partial)을 선호 +- Textual Inversion은 Image Alignment는 Custom Diffusion 선호도와 비슷하지만 Text Alignment수치를 보면 Custom Diffusion이 매우 높아 Overfitting된 경향이 있음 + +Ablation Study + +1. Regularization Image + :::{figure-md} + CD_09 + + Table 3 + ::: + +- ㅌGen : real image 대신 generate된 이미지를 regularization 이미지로 사용 +- Overfitting 없이 가장 좋은 수치는 Augmentation + Regulatization image as Real world Image + +## 5. Discussion & Limitation + +- customizing이 가능하고 training resourse가 매우 적은 finetuning 기법 소개 +:::{figure-md} +CD_10 + +Limitation Of Custom Diffusion +::: + +- 비슷한 category의 object에 대해서는 joint training, merge 모두 잘 동작하지 않음 diff --git a/_sources/docs/review/DALLE2.md b/_sources/docs/review/DALLE2.md old mode 100644 new mode 100755 index e297ee6b..1652dd07 --- a/_sources/docs/review/DALLE2.md +++ b/_sources/docs/review/DALLE2.md @@ -1,546 +1,546 @@ -``` {admonition} Information -- **Title:** Hierarchical Text-Conditional Image Generation with CLIP Latents (arXiv 2022) - -- **Reference** - - Paper: [https://arxiv.org/pdf/2204.06125v1.pdf](https://arxiv.org/pdf/2204.06125v1.pdf) - -- **Author:** SeonHoon Kim - -- **Last updated on Sep. 18, 2023** -``` - -# DALL-E 2 - -DALLE2 는 2022년에 공개되어 세상을 놀라게 했습니다.
-이미지 생성 능력도 뛰어났고, 이미지를 사용자 입맛에 맞게 조작할 수 있게 되었죠. - -DALLE2 의 이름은 왜 DALL-E 일까요?
-DALLE2 의 DALLE 는 초현실주의 화가 Salvador Dali 와 WALL-E 의 합성어입니다.
-DALLE2 로 생성해낸 결과물이 과연 어떻길래 세상을 놀라게 했을까요? - -
- -- **DALL-E 2 결과물** - - :::{figure-md} - img_01 - - Salvador Dali 의 생전 모습 - ::: - - :::{figure-md} - img_00 - - vibrant portrait of Salvador Dali with a robotic half face from DALLE2 - ::: - - 위 그림은 DALLE2 가 생성해낸 "vibrant portrait of Salvador Dali with a robotic half face" 이미지입니다.
- 실제 Salvador dali 의 모습이 보이네요.
- 게다가 Salvador dali 의 초현실주의적 그림체가 반영된 것 같기도 합니다.
- 놀라운 이미지입니다. - - 아래의 corgi 그림은 어떤가요 ? - :::{figure-md} - img_02 - - a corgi's head depicted as an explosion of a nebula from DALLE2 - ::: - - corgi 의 모습을 성운의 폭발로 묘사해달라고 했을 때 생성된 그림입니다.
- 아래의 그림은, 실제 NASA 에서 촬영한 초신성 폭발의 잔해입니다. - - 정말 그럴듯하지 않나요? - - :::{figure-md} - img_03 - - This mosaic image, one of the largest ever taken by NASA's Hubble Space Telescope of the Crab Nebula, is a six-light-year-wide expanding remnant of a star's supernova explosion. - ::: - -
- -- **학습 목표 및 주의사항** - - 본 포스팅에서는 DALLE2 paper 의 내용을 비선형적으로 살펴봅니다.
- 마치 오픈월드 게임처럼 말이죠.
- 핵심이 되는 질문들을 던지며, DALLE2 의 아키텍쳐를 파헤쳐 볼 겁니다. - - 본 포스팅은 [DALL-E 2 paper](https://cdn.openai.com/papers/dall-e-2.pdf), [OpenAI blog](https://openai.com/dall-e-2), [AssemblyAI Youtube](https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI), [Eden Meyer Youtube](https://www.youtube.com/watch?v=gmfI3B6pQTo&t=83s&ab_channel=EdanMeyer) 를 참고했습니다. - - 본격적으로 학습하기 전에 알아야할 것은, CLIP 모델입니다. - - CLIP 은, 이미지와 text 를 학습한 multi-modal 모델입니다. - - The fundamental principles of training CLIP are quite simple: - 1. First, all images and their associated captions are passed through their respective encoders, mapping all objects into an m-dimensional space. - 2. Then, the cosine similarity of each *(image, text)* pair is computed. - 3. The training objective is to simultaneously **maximize the cosine similarity** between N **correct** encoded image/caption pairs and **minimize the cosine similarity** between N - N **incorrect** encoded image/caption pairs. - - DALL-E 2 는 CLIP 과 Diffusion Model 을 통합시켰습니다. (최초는 x) - - 하지만 CLIP 을 사용하는 것이 정답은 아닙니다.
- DALL-E 2 는 22년 5월, CLIP 을 사용하지 않은 IMAGEN 에게 SOTA 를 내주었습니다. - -
- -- **아키텍쳐 찍먹하기** - - 특정 이미지 내의 Semantics 와 style 을 모두 포착해낼 수 있는 CLIP 의 이미지 표현 능력을 끌어올리기 위해서,
- 저자들은 CLIP 과 Diffusion 모델을 통합한 Two-stage model 을 제안합니다.
- 이것이 바로 DALLE2 인데요.
- 저자들은 이 모델을 unCLIP 이라고 부릅니다. - - :::{figure-md} - img_06 - - A high level overview of the architecture. - ::: - - DALLE2 paper 의 그림은 좀 복잡해보이니,
- Assembly AI 의 Youtube 에서 제공하는 좀 더 단순화된 그림을 살펴볼게요. - - :::{figure-md} - img_07 - - A high level overview of the architecture from AssemblyAI youtube. - ::: - [https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI](https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI) - - Prior 와 Decoder 가 DALLE2 의 핵심이 되는 모델인 것 같네요. - - - **Prior** : 텍스트 캡션을 받아서, 상응하는 CLIP image embedding 을 생성합니다. - - 본 논문에서는 Autogregressive prior 와 Diffusion prior 를 비교하는 실험 수행했습니다. - - Diffusion prior 가 computationally efficient 하고, 고품질 이미지 생성합니다.
- 따라서 후반부에는 Diffusion prior 만 사용해서 실험합니다. - - **Decoder** : CLIP image embedding 을 받아서, 이미지를 생성합니다. - - Diffusion 모델만 사용했습니다. - -
- -- **왜 CLIP 이랑 Diffusion 을 사용했을까요?** - - **CLIP** - - CLIP 이 images representation 을 학습하는데 에 큰 성공을 거두고 있었습니다. - - CLIP embeddings 는 image distribution shift 에 robust 했습니다. - - CLIP embeddings 는 zero-shot capabilities 가 뛰어났습니다. - - 다양한 vision & language tasks 에 fine-tuned 되어 SOTA 를 달성해냈습니다. - - **Diffusion** - - Diffusion 은 image 와 video generation taks 에서 SOTA 를 갱신하는 중이었죠. - - non-deterministic 하게 만들 수 있습니다.
- 이러한 Decoder 덕분에, CLIP image embedding 과 같은
- **image representation 에 존재하지 않는 non-essential 한 details** 는 **변주하면서,**
- **image representation 의 semantics 와 style 은 유지**할 수 있죠. - - :::{figure-md} - img_08 - - Variations of an input image by encoding with CLIP and then decoding with a diffusion model. - ::: - - 위 왼쪽의 그림처럼, Salvador dali 의 그림에서 중요한 objects 들은 보존됩니다.
- 하지만 그들이 표현되는 방식이나 전체적인 그림의 style 은 조금씩 바뀝니다.
- 그럼에도, Salvador dali 특유의 초현실주의적 화풍은 유지되는 것 같네요.
- Diffusion Decoder 덕분에, **Non-essential details** 는
- 마치 **변주곡처럼 매번 새롭게 연주**해낼 수 있는겁니다. - - -
- -- **아키텍쳐 파헤치기** - - :::{figure-md} - img_09 - - A high level overview of the architecture from AssemblyAI youtube. - ::: - [https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI](https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI) -
- - 이번에는 DALLE2 의 아키텍쳐를 좀 더 자세히 살펴보죠. - - - **Prior** - - **input** - - Caption 그 자체의 embedding vector 입니다. - - **CLIP text embedding** 입니다. - - **output** - - **Generated CLIP Image embedding** 입니다. - - **설명** - - 사실 Prior 은 CLIP text embedding 만 조건으로 받는 것이 아니라 Caption 자체도 받습니다.
- (물론 embedding vector 로 받겠죠)
- CLIP text embedding 과, 그 Caption 은 서로 1대1 대응되기 때문에,
- Duel-conditioning 이 문제될 것은 없다고 저자들은 변론합니다. - - 샘플 퀄리티를 높이기 위해서 2개의 CLIP image embeddings 를 생성한 후
- 주어진 CLIP text embedding 과 더 높은 dot product 를 갖는 CLIP image embedding 을 사용했다고 합니다. - - **Decoder** - - **Input** - - CLIP text embedding - - Generated CLIP Image embedding - - **Output** - - Generated Image - - **설명** - - modified GLIDE model 을 Decoder 로 사용했습니다.
- → 따라서, **projected CLIP text embeddings 를 아키텍쳐**에 통합시킬 수 있다고 주장합니다. -
- 어떻게 통합시키냐하면, - - 1. GLIDE timestep embedding 에 추가하고, - 2. 4개의 extra context tokens 을 만들어서 GLIDE text encoder 의 output sequence 에 concat 하는거죠. -
- 이 방법으로 **CLIP image embeddings 를 받아서, 원본 영상을 생성하는 것** 입니다. - - :::{figure-md} - img_10 - - GLIDE training process - ::: - - - GLIDE 를 수정해 사용함으로써 GLIDE 가 가지고 있던
- text-conditional photorealistic image generation capabilities 를 활용할 수 있다고 주장합니다. - -
- -- **그렇다면 왜 Prior 가 필요할까요?** - 1. **To obtain a full generative model of images**,
- we combine the CLIP image embedding decoder with a prior model,
- which generates possible CLIP image embeddings from a given text caption
- - 라고 하지만.. 딱히 와닿지는 않습니다.
- 하지만 아직 실망하긴 이릅니다.
- Prior 의 유무에 따라, 생성된 이미지의 품질을 비교하는 실험을 수행했다고 합니다.
- 한번 살펴볼까요? - - 2. **아래 세 가지 아키텍쳐를 비교하는 실험 수행**
- (1) GLIDE 모델처럼, text 의 token embeddings 만 조건으로 주어 실험
- (2) 추가적으로, CLIP text embeddings 를 조건으로 주어 실험
- (3) 추가적으로, CLIP image embeddings 를 생성해내는 Prior 를 갖추고 실험
-
- 실험 결과, (3) 이 가장 훌륭했습니다.
- 특히 image diversity 가 뛰어났습니다. - - :::{figure-md} - img_11 - - 3가지 경우의 아키텍쳐에 따른 실험 결과 from AssemblyAI youtube. - ::: - - :::{figure-md} - img_12 - - Samples using different conditioning signals for the same decoder. - ::: - - 그렇지만, 의문이 말끔히 해소되지는 않습니다. - 왜냐하면.. - - - **95% 의 학습 시간 동안, (3) 방식으로 학습한 Decoder 를,**
- **(1) 과 (2) 방식에 그대로 적용해 실험했습니다.**
- 따라서 공정한 실험이라고 보긴 어려울 것 같습니다. - - **Decoder 를, True CLIP Image embeddings 와 Generated CLIP Image embeddings 로**
- **각각 학습시켰을 때의 성능 비교 실험은 없습니다.** -
- 개인적으로 저는 이러한 결과들을 보고,
- Prior 를 반드시 써야하는 근거에 대한 설득력이 떨어진다고 생각했습니다. - -
- -- **왜 CLIP 을 써야할까요?** - 1. CLIP 은 어떤 객체를 묘사한 텍스트와, 그 객체의 시각적 발현 사이의 의미론적 관계를 학습했습니다.
- 따라서 저자들은 이러한 CLIP 의 능력이 Text-to-Image task 에서 매우 중요하다고 주장합니다. - 2. **CLIP 을 활용한 덕분에 이미지를 Manipulation 할 수 있습니다.** - - :::{figure-md} - img_13 - - Text diffs applied to images by interpolating between their CLIP image embeddings and a normalised difference of the CLIP text embeddings produced from the two descriptions. - ::: - - 어떻게 이미지를 Manipulation 하는지는 곧 자세히 살펴보겠습니다. - -
- -- **그래서 이 모델은 뭐가 좋은가요?** - - **Evaluation 결과, Diversity 가 뛰어났습니다.** - - 모델을 평가하기 위해서,
- 주어진 Caption 에 대한 GLIDE 의 생성물과 unCLIP 의 생성물을 사람들에게 제시하고,
- **Photorealism, Caption Similarity, Diversity** 에 대해서 **점수를 매기도록** 했습니다.
- - - :::{figure-md} - img_14 - - Samples when increasing guidance scale for both unCLIP and GLIDE. - ::: - - :::{figure-md} - img_15 - - Comparison of unCLIP and GLIDE for different evaluations. - ::: - - :::{figure-md} - img_16 - - FID versus guidance scale for unCLIP and GLIDE. - ::: - - 결론은 다음과 같습니다. - 1. GLIDE 에 비해서 **Photorealism, Caption Similarity,** 은 Comparable 했습니다.
- (안 좋다.) - 2. 하지만, **Diversity** 는 훨씬 뛰어났습니다. - -
- - - **Image Manipulations 가 가능합니다.** - - Bipartite Representation - - unCLIP 구조 덕분에,
- 주어진 이미지 x 를 (z_i, x_T) 와 같은 bipartite latent representation 로 인코딩 가능합니다. - - 이 latent space 를 활용해서, Image manipulation 을 수행할 수 있습니다. - - x_T 는 DDIM inversion 을 z_i 가 condition 된 x 에 적용해 얻으며,
- Decoder 가 x 를 복원하는데 필요한 잔여 정보들을 지닙니다. - -
- - 1. **Variations** - - :::{figure-md} - img_17 - - Variations of an input image by encoding with CLIP and then decoding with a diffusion model. - ::: - - - Non-essential details 를 변주하기 위해서,
- bipartite representation 에 DDIM with η > 0 for sampling decoder 를 적용합니다. - - η = 0 일 때, decoder 는 deterministic 해지고 x 자체를 복원해냅니다. - - η 가 커질수록, sampling steps 에는 stochasticity 가 생기고,
- 원본 이미지 x 근처에서 perceptually “centereed” 된 variations 를 만들어낼 것입니다. - - η 를 키우면, 우리는 CLIP image embedding 에 어떤 정보가 존재하고 어떤 정보가 유실되었는지 탐색 가능합니다.
- **→ 즉, CLIP latent space 를 탐색해낼 수 있는거죠 !** - -
- - 2. **Interpolations** - - :::{figure-md} - img_18 - - Variations between two images by interpolating their CLIP image embedding and then decoding with a diffusion model. - ::: - - - 이런 것도 됩니다.
- input image 두 장의 CLIP image embeddings 를 interpolation 해서 Decoder 에 준다면,
- interpolated image 를 생성할 수 있습니다. - -
- - 3. **Text Diffs** - - :::{figure-md} - img_19 - - Text diffs applied to images by interpolating between their CLIP image embeddings and a normalised difference of the CLIP text embeddings produced from the two descriptions. - ::: - - - **어떤 이미지와 그 캡션이 주어져있을 때,
- 그 이미지를 우리가 원하는 target text prompt 에 맞게 조작할 수도 있습니다.** - - **Method** - - **z_t0 = current CLIP text embedding** 이고, - - **z_t = target CLIP text embedding** 이라면, - - :::{figure-md} - img_19_2 - - text diff method - ::: - - - 주어진 이미지의 **CLIP image embdding z_i** 를
- 바로 이 **text diff vector 와 interpolate 해서 Decoding** 하면 이미지가 조작됩니다. - -
- - - **typographic attaks 에 대해서, Robust 합니다.** - - **typographic attacks** : 이미지 내 사물 위에, 글씨가 쓰여 있는 경우입니다. - - Multimodal 로 학습한 CLIP 은 텍스트에 있는 정보를 더 많이 활용해
- 사물을 판단하는 경향이 있습니다. - 1. unCLIP 의 Decoder 모델에 “iPod” 텍스트 종이가 붙은 사과를 보고 분류를 수행해보았습니다. - 2. 역시, “Granny Smith” 의 예측 확률을 거의 0 에 가깝다고 판단했습니다. - 3. 그럼에도 불구하고, 사과의 사진으로 recover 해냅니다. - :::{figure-md} - img_20 - - Variations of images featuring typographic attacks - ::: - - 이처럼 DALLE2 는 typographic attacks 에 더욱 robust 합니다. - -
- -- **이 모델, 단점은 없나요?** - -
- - 1. **객체(cubes)와 그들의 속성(colors) 을 매칭시키는 능력이 떨어집니다.** - - :::{figure-md} - img_21 - - Samples from unCLIP and GLIDE for the prompt “a red cube on top of a blue cube”. - ::: - - 위 그림처럼, 파란 큐브 위에 빨간 큐브를 그려달라고 했을 때,
- DALLE2 는 **아래의 큐브와 위의 큐브에 각각 어떤 색상 (attributes) 를 부여해야할지** 헷갈려합니다. - -
- - 2. **텍스트를 일관성있게 생성하는 능력이 떨어집니다** - - :::{figure-md} - img_22 - - Samples from unCLIP for the prompt, “A sign that says deep learning.” - ::: - - 물론 이것은 DALLE2 만의 문제는 아닙니다.
- 많은 text-to-image models 가 어려워하는 문제입니다. - -
- - 3. **복잡한 상황에서 디테일을 묘사하는 능력이 떨어집니다** - - :::{figure-md} - img_23 - - unCLIP samples show low levels of detail for some complex scenes. - ::: - - 복잡한 네온 사인들의 디테일들이 좀 떨어지는 것을 확인하실 수 있습니다. - -
- -- **Method - Training** - - 본 논문의 Method 에서는, unCLIP 모델의 아키텍쳐에 대한 수학적 justify 를 하고 있습니다. - - Training 데이터셋의 이미지를 x 라 합시다. - - 그에 상응하는 text captions 을 y 라 합시다. - - 각각에 대한 embeddings 인 Z_i, Z_t 를 기존의 CLIP 으로 생성합니다. - - image **x —CLIP Image encoder—> Z_i** image embeddings - - text caption **y —CLIP text encoder—> Z_t** text embeddings - -
- - - 저자의 주장 - - unCLIP 으로, text caption y 로부터 image x 를 샘플링할 수 있다고 합니다. - - :::{figure-md} - img_24 - - P(x|y) equation. - ::: - - - ***The first equality holds because z_i is a deterministic function of x.*** - - ***The second equality holds because of the chain rule.*** - -
- - - **포스팅을 위한 부가 설명** - - z_t 도 y 의 deterministic function 이므로, 다음과 같이 쓸 수 있죠. - - $$ - P(x|y) = P(x, z_i|y, z_t) = P(x|z_i, y, z_t)P(z_i|y, z_t) - $$ - - - 즉 위 공식을 풀어서 해설해보면 다음과 같습니다.
- Prior 를 사용해 Z_t 로부터 Z_i 를 샘플링하고,
- Decoder 를 사용해 x 를 샘플링함으로써
- True conditional distribution 인 P(x|y) 샘플링이 가능해지는 것입니다. - -
- -- **DALL-E 2 Bias** - -
- - 개인적으로 DALLe2 와 같은 모델에 Bias 는 없는지 궁금해서 추가적으로 공부해봤습니다.
- DALLE2 에 Bias 가 있는지,
- Bias 가 있다면 해소하기 위해 어떤 노력을 하고있는지,
- Bias 는 대체 어떻게 정량적으로 평가할 수 있는지 조사해봤습니다.
- - 결과부터 말씀드리면, DALLE2 처럼, 웹크롤링 데이터를 학습한 모델은 Bias 가 존재한다고 합니다.
- 이런 Bias 를 해소하기 위해서 OpenAI 는 어떤 노력을 하고있는지부터 살펴볼까요? - - [https://github.com/openai/dalle-2-preview/blob/main/system-card.md](https://github.com/openai/dalle-2-preview/blob/main/system-card.md) - - - **현재 OpenAI 가 DALL-E 2 의 Safety 를 위해 하고 있는 노력** - 1. 학습 데이터에서 violent, hate, or adult images 를 제거함으로써
- 이러한 이미지들에 DALL-E 2 가 노출되는 시간을 최소화했다고 합니다. - 2. Safety policies 를 위반한 text prompts 혹은 생성된 images 를 자정하는 시스템을 보유하고 있다고 합니다. - 3. 신뢰할 수 있는 전문가들과 DALL-E 2 에 대한 사전 검토를 진행했다고 합니다. - -
- - - **DALL-EVAL : 이미지 생성형 AI 의 Bias 를 평가하는 방법 소개** - - DALLE 와 같은 Text-to-Image 생성형 모델을 정량적으로 평가하는 기법이 있습니다.
- 바로 DALL-EVAL 입니다. - - [https://arxiv.org/pdf/2202.04053.pdf](https://arxiv.org/pdf/2202.04053.pdf) - - [https://github.com/j-min/DallEval](https://github.com/j-min/DallEval) - - - **Contribution** - - Text to Image Generation models 의 시각적 추론 능력 3가지를 평가하기 위한 데이터셋 제공합니다. - - 최근의 모델들이 object recognition skill 은 상대적으로 뛰어나지만,
- object counting 및 spaial relation 이해 능력은 떨어짐을 발견했습니다. - - Text to Image Generation models 에 존재하는
- **gender 및 skin tone biases 를 측정하는 evaluation metrics 와 그 분석 결과를 제시한 최초의 논문** 입니다. - - web 에서 image-text pairs 를 학습한 현재 T2I 생성 모델들은
- 특정한 gender/skin tone biases 를 학습했음을 보여주었습니다. - - :::{figure-md} - img_26 - - Overview of DALL-EVAL evaluation process. - ::: - - - **Social Bias Evaluation 측정 방법 (Sec. 4.2.1 참고)** - - :::{figure-md} - img_27 - - Overview of DALL-EVAL's social bias evaluation process. - ::: - - DALL-EVAL 의 자세한 social bias evaluation process 는 다음과 같습니다. - - 1. 우선 **Diagnostic prompts 로 이미지들을 생성합니다.** - 1. ex) “a person who works as a nurse” - 2. 총 252개의 Diagnostic prompts 제공 - 2. **Gender, Skin tone, Attributes 를 생성된 이미지로부터 탐지합니다.** - 1. using automated detection models and verify the reliability of detection models with human evaluation - 2. **Gender** - 1. BLIP-2 라는 모델에 생성된 영상을 주면서 영상 내 사람의 성별을 맞추게 합니다.
- BLIP-2 의 답변을 기반으로 Gender Bias 측정합니다. - 3. **Skin tone** - 1. 신경망으로 facial landmark 를 추출하고, illumination 을 측정합니다. - 4. **Attributes** - 1. BLIP-2 라는 모델에 생성된 영상을 주면서 영상 내 사람의 복장을 맞추게 합니다.
- BLIP-2 의 답변을 기반으로 Attributes Bias 측정합니다. - 3. 탐지된 Gender, Skin tone, Attributes 가
- unbiased uniform distribution 으로부터 얼마나 skewed 되어있는지 측정합니다. - -
- - - **실험 결과** - - :::{figure-md} - img_28 - - Gender, skin tone, and attribute detection results with automated and expert human evaluation. - ::: - - :::{figure-md} - img_29 - - Per-profession examples and average gender bias or average skin tone bias of images. - ::: - - :::{figure-md} - img_30 - - Comparison of overall gender and skin tone bias of each model. - ::: - - 위 실험 결과와 같이, DALL-EVAL 은 Text-to-Image models 를 정량적으로 평가하는데에 성공했습니다.
- Satble Diffusion 처럼 웹크롤링을 활용해 데이터를 학습한 모델은 Bias 가 존재했습니다.
- 이처럼 생성형 AI 의 Bias 를 측정하기 위한 다양한 노력이 지속되고 있습니다.
+``` {admonition} Information +- **Title:** Hierarchical Text-Conditional Image Generation with CLIP Latents (arXiv 2022) + +- **Reference** + - Paper: [https://arxiv.org/pdf/2204.06125v1.pdf](https://arxiv.org/pdf/2204.06125v1.pdf) + +- **Author:** SeonHoon Kim + +- **Last updated on Sep. 18, 2023** +``` + +# DALL-E 2 + +DALLE2 는 2022년에 공개되어 세상을 놀라게 했습니다.
+이미지 생성 능력도 뛰어났고, 이미지를 사용자 입맛에 맞게 조작할 수 있게 되었죠. + +DALLE2 의 이름은 왜 DALL-E 일까요?
+DALLE2 의 DALLE 는 초현실주의 화가 Salvador Dali 와 WALL-E 의 합성어입니다.
+DALLE2 로 생성해낸 결과물이 과연 어떻길래 세상을 놀라게 했을까요? + +
+ +- **DALL-E 2 결과물** + + :::{figure-md} + img_01 + + Salvador Dali 의 생전 모습 + ::: + + :::{figure-md} + img_00 + + vibrant portrait of Salvador Dali with a robotic half face from DALLE2 + ::: + + 위 그림은 DALLE2 가 생성해낸 "vibrant portrait of Salvador Dali with a robotic half face" 이미지입니다.
+ 실제 Salvador dali 의 모습이 보이네요.
+ 게다가 Salvador dali 의 초현실주의적 그림체가 반영된 것 같기도 합니다.
+ 놀라운 이미지입니다. + + 아래의 corgi 그림은 어떤가요 ? + :::{figure-md} + img_02 + + a corgi's head depicted as an explosion of a nebula from DALLE2 + ::: + + corgi 의 모습을 성운의 폭발로 묘사해달라고 했을 때 생성된 그림입니다.
+ 아래의 그림은, 실제 NASA 에서 촬영한 초신성 폭발의 잔해입니다. + + 정말 그럴듯하지 않나요? + + :::{figure-md} + img_03 + + This mosaic image, one of the largest ever taken by NASA's Hubble Space Telescope of the Crab Nebula, is a six-light-year-wide expanding remnant of a star's supernova explosion. + ::: + +
+ +- **학습 목표 및 주의사항** + - 본 포스팅에서는 DALLE2 paper 의 내용을 비선형적으로 살펴봅니다.
+ 마치 오픈월드 게임처럼 말이죠.
+ 핵심이 되는 질문들을 던지며, DALLE2 의 아키텍쳐를 파헤쳐 볼 겁니다. + - 본 포스팅은 [DALL-E 2 paper](https://cdn.openai.com/papers/dall-e-2.pdf), [OpenAI blog](https://openai.com/dall-e-2), [AssemblyAI Youtube](https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI), [Eden Meyer Youtube](https://www.youtube.com/watch?v=gmfI3B6pQTo&t=83s&ab_channel=EdanMeyer) 를 참고했습니다. + - 본격적으로 학습하기 전에 알아야할 것은, CLIP 모델입니다. + - CLIP 은, 이미지와 text 를 학습한 multi-modal 모델입니다. + - The fundamental principles of training CLIP are quite simple: + 1. First, all images and their associated captions are passed through their respective encoders, mapping all objects into an m-dimensional space. + 2. Then, the cosine similarity of each *(image, text)* pair is computed. + 3. The training objective is to simultaneously **maximize the cosine similarity** between N **correct** encoded image/caption pairs and **minimize the cosine similarity** between N - N **incorrect** encoded image/caption pairs. + - DALL-E 2 는 CLIP 과 Diffusion Model 을 통합시켰습니다. (최초는 x) + - 하지만 CLIP 을 사용하는 것이 정답은 아닙니다.
+ DALL-E 2 는 22년 5월, CLIP 을 사용하지 않은 IMAGEN 에게 SOTA 를 내주었습니다. + +
+ +- **아키텍쳐 찍먹하기** + + 특정 이미지 내의 Semantics 와 style 을 모두 포착해낼 수 있는 CLIP 의 이미지 표현 능력을 끌어올리기 위해서,
+ 저자들은 CLIP 과 Diffusion 모델을 통합한 Two-stage model 을 제안합니다.
+ 이것이 바로 DALLE2 인데요.
+ 저자들은 이 모델을 unCLIP 이라고 부릅니다. + + :::{figure-md} + img_06 + + A high level overview of the architecture. + ::: + + DALLE2 paper 의 그림은 좀 복잡해보이니,
+ Assembly AI 의 Youtube 에서 제공하는 좀 더 단순화된 그림을 살펴볼게요. + + :::{figure-md} + img_07 + + A high level overview of the architecture from AssemblyAI youtube. + ::: + [https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI](https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI) + + Prior 와 Decoder 가 DALLE2 의 핵심이 되는 모델인 것 같네요. + + - **Prior** : 텍스트 캡션을 받아서, 상응하는 CLIP image embedding 을 생성합니다. + - 본 논문에서는 Autogregressive prior 와 Diffusion prior 를 비교하는 실험 수행했습니다. + - Diffusion prior 가 computationally efficient 하고, 고품질 이미지 생성합니다.
+ 따라서 후반부에는 Diffusion prior 만 사용해서 실험합니다. + - **Decoder** : CLIP image embedding 을 받아서, 이미지를 생성합니다. + - Diffusion 모델만 사용했습니다. + +
+ +- **왜 CLIP 이랑 Diffusion 을 사용했을까요?** + - **CLIP** + - CLIP 이 images representation 을 학습하는데 에 큰 성공을 거두고 있었습니다. + - CLIP embeddings 는 image distribution shift 에 robust 했습니다. + - CLIP embeddings 는 zero-shot capabilities 가 뛰어났습니다. + - 다양한 vision & language tasks 에 fine-tuned 되어 SOTA 를 달성해냈습니다. + - **Diffusion** + - Diffusion 은 image 와 video generation taks 에서 SOTA 를 갱신하는 중이었죠. + - non-deterministic 하게 만들 수 있습니다.
+ 이러한 Decoder 덕분에, CLIP image embedding 과 같은
+ **image representation 에 존재하지 않는 non-essential 한 details** 는 **변주하면서,**
+ **image representation 의 semantics 와 style 은 유지**할 수 있죠. + + :::{figure-md} + img_08 + + Variations of an input image by encoding with CLIP and then decoding with a diffusion model. + ::: + + 위 왼쪽의 그림처럼, Salvador dali 의 그림에서 중요한 objects 들은 보존됩니다.
+ 하지만 그들이 표현되는 방식이나 전체적인 그림의 style 은 조금씩 바뀝니다.
+ 그럼에도, Salvador dali 특유의 초현실주의적 화풍은 유지되는 것 같네요.
+ Diffusion Decoder 덕분에, **Non-essential details** 는
+ 마치 **변주곡처럼 매번 새롭게 연주**해낼 수 있는겁니다. + + +
+ +- **아키텍쳐 파헤치기** + + :::{figure-md} + img_09 + + A high level overview of the architecture from AssemblyAI youtube. + ::: + [https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI](https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI) +
+ + 이번에는 DALLE2 의 아키텍쳐를 좀 더 자세히 살펴보죠. + + - **Prior** + - **input** + - Caption 그 자체의 embedding vector 입니다. + - **CLIP text embedding** 입니다. + - **output** + - **Generated CLIP Image embedding** 입니다. + - **설명** + - 사실 Prior 은 CLIP text embedding 만 조건으로 받는 것이 아니라 Caption 자체도 받습니다.
+ (물론 embedding vector 로 받겠죠)
+ CLIP text embedding 과, 그 Caption 은 서로 1대1 대응되기 때문에,
+ Duel-conditioning 이 문제될 것은 없다고 저자들은 변론합니다. + - 샘플 퀄리티를 높이기 위해서 2개의 CLIP image embeddings 를 생성한 후
+ 주어진 CLIP text embedding 과 더 높은 dot product 를 갖는 CLIP image embedding 을 사용했다고 합니다. + - **Decoder** + - **Input** + - CLIP text embedding + - Generated CLIP Image embedding + - **Output** + - Generated Image + - **설명** + - modified GLIDE model 을 Decoder 로 사용했습니다.
+ → 따라서, **projected CLIP text embeddings 를 아키텍쳐**에 통합시킬 수 있다고 주장합니다. +
+ 어떻게 통합시키냐하면, + + 1. GLIDE timestep embedding 에 추가하고, + 2. 4개의 extra context tokens 을 만들어서 GLIDE text encoder 의 output sequence 에 concat 하는거죠. +
+ 이 방법으로 **CLIP image embeddings 를 받아서, 원본 영상을 생성하는 것** 입니다. + + :::{figure-md} + img_10 + + GLIDE training process + ::: + + - GLIDE 를 수정해 사용함으로써 GLIDE 가 가지고 있던
+ text-conditional photorealistic image generation capabilities 를 활용할 수 있다고 주장합니다. + +
+ +- **그렇다면 왜 Prior 가 필요할까요?** + 1. **To obtain a full generative model of images**,
+ we combine the CLIP image embedding decoder with a prior model,
+ which generates possible CLIP image embeddings from a given text caption
+ + 라고 하지만.. 딱히 와닿지는 않습니다.
+ 하지만 아직 실망하긴 이릅니다.
+ Prior 의 유무에 따라, 생성된 이미지의 품질을 비교하는 실험을 수행했다고 합니다.
+ 한번 살펴볼까요? + + 2. **아래 세 가지 아키텍쳐를 비교하는 실험 수행**
+ (1) GLIDE 모델처럼, text 의 token embeddings 만 조건으로 주어 실험
+ (2) 추가적으로, CLIP text embeddings 를 조건으로 주어 실험
+ (3) 추가적으로, CLIP image embeddings 를 생성해내는 Prior 를 갖추고 실험
+
+ 실험 결과, (3) 이 가장 훌륭했습니다.
+ 특히 image diversity 가 뛰어났습니다. + + :::{figure-md} + img_11 + + 3가지 경우의 아키텍쳐에 따른 실험 결과 from AssemblyAI youtube. + ::: + + :::{figure-md} + img_12 + + Samples using different conditioning signals for the same decoder. + ::: + + 그렇지만, 의문이 말끔히 해소되지는 않습니다. + 왜냐하면.. + + - **95% 의 학습 시간 동안, (3) 방식으로 학습한 Decoder 를,**
+ **(1) 과 (2) 방식에 그대로 적용해 실험했습니다.**
+ 따라서 공정한 실험이라고 보긴 어려울 것 같습니다. + - **Decoder 를, True CLIP Image embeddings 와 Generated CLIP Image embeddings 로**
+ **각각 학습시켰을 때의 성능 비교 실험은 없습니다.** +
+ 개인적으로 저는 이러한 결과들을 보고,
+ Prior 를 반드시 써야하는 근거에 대한 설득력이 떨어진다고 생각했습니다. + +
+ +- **왜 CLIP 을 써야할까요?** + 1. CLIP 은 어떤 객체를 묘사한 텍스트와, 그 객체의 시각적 발현 사이의 의미론적 관계를 학습했습니다.
+ 따라서 저자들은 이러한 CLIP 의 능력이 Text-to-Image task 에서 매우 중요하다고 주장합니다. + 2. **CLIP 을 활용한 덕분에 이미지를 Manipulation 할 수 있습니다.** + + :::{figure-md} + img_13 + + Text diffs applied to images by interpolating between their CLIP image embeddings and a normalised difference of the CLIP text embeddings produced from the two descriptions. + ::: + + 어떻게 이미지를 Manipulation 하는지는 곧 자세히 살펴보겠습니다. + +
+ +- **그래서 이 모델은 뭐가 좋은가요?** + - **Evaluation 결과, Diversity 가 뛰어났습니다.** + - 모델을 평가하기 위해서,
+ 주어진 Caption 에 대한 GLIDE 의 생성물과 unCLIP 의 생성물을 사람들에게 제시하고,
+ **Photorealism, Caption Similarity, Diversity** 에 대해서 **점수를 매기도록** 했습니다.
+ + + :::{figure-md} + img_14 + + Samples when increasing guidance scale for both unCLIP and GLIDE. + ::: + + :::{figure-md} + img_15 + + Comparison of unCLIP and GLIDE for different evaluations. + ::: + + :::{figure-md} + img_16 + + FID versus guidance scale for unCLIP and GLIDE. + ::: + + 결론은 다음과 같습니다. + 1. GLIDE 에 비해서 **Photorealism, Caption Similarity,** 은 Comparable 했습니다.
+ (안 좋다.) + 2. 하지만, **Diversity** 는 훨씬 뛰어났습니다. + +
+ + - **Image Manipulations 가 가능합니다.** + - Bipartite Representation + - unCLIP 구조 덕분에,
+ 주어진 이미지 x 를 (z_i, x_T) 와 같은 bipartite latent representation 로 인코딩 가능합니다. + - 이 latent space 를 활용해서, Image manipulation 을 수행할 수 있습니다. + - x_T 는 DDIM inversion 을 z_i 가 condition 된 x 에 적용해 얻으며,
+ Decoder 가 x 를 복원하는데 필요한 잔여 정보들을 지닙니다. + +
+ + 1. **Variations** + + :::{figure-md} + img_17 + + Variations of an input image by encoding with CLIP and then decoding with a diffusion model. + ::: + + - Non-essential details 를 변주하기 위해서,
+ bipartite representation 에 DDIM with η > 0 for sampling decoder 를 적용합니다. + - η = 0 일 때, decoder 는 deterministic 해지고 x 자체를 복원해냅니다. + - η 가 커질수록, sampling steps 에는 stochasticity 가 생기고,
+ 원본 이미지 x 근처에서 perceptually “centereed” 된 variations 를 만들어낼 것입니다. + - η 를 키우면, 우리는 CLIP image embedding 에 어떤 정보가 존재하고 어떤 정보가 유실되었는지 탐색 가능합니다.
+ **→ 즉, CLIP latent space 를 탐색해낼 수 있는거죠 !** + +
+ + 2. **Interpolations** + + :::{figure-md} + img_18 + + Variations between two images by interpolating their CLIP image embedding and then decoding with a diffusion model. + ::: + + - 이런 것도 됩니다.
+ input image 두 장의 CLIP image embeddings 를 interpolation 해서 Decoder 에 준다면,
+ interpolated image 를 생성할 수 있습니다. + +
+ + 3. **Text Diffs** + + :::{figure-md} + img_19 + + Text diffs applied to images by interpolating between their CLIP image embeddings and a normalised difference of the CLIP text embeddings produced from the two descriptions. + ::: + + - **어떤 이미지와 그 캡션이 주어져있을 때,
+ 그 이미지를 우리가 원하는 target text prompt 에 맞게 조작할 수도 있습니다.** + - **Method** + - **z_t0 = current CLIP text embedding** 이고, + - **z_t = target CLIP text embedding** 이라면, + + :::{figure-md} + img_19_2 + + text diff method + ::: + + - 주어진 이미지의 **CLIP image embdding z_i** 를
+ 바로 이 **text diff vector 와 interpolate 해서 Decoding** 하면 이미지가 조작됩니다. + +
+ + - **typographic attaks 에 대해서, Robust 합니다.** + - **typographic attacks** : 이미지 내 사물 위에, 글씨가 쓰여 있는 경우입니다. + - Multimodal 로 학습한 CLIP 은 텍스트에 있는 정보를 더 많이 활용해
+ 사물을 판단하는 경향이 있습니다. + 1. unCLIP 의 Decoder 모델에 “iPod” 텍스트 종이가 붙은 사과를 보고 분류를 수행해보았습니다. + 2. 역시, “Granny Smith” 의 예측 확률을 거의 0 에 가깝다고 판단했습니다. + 3. 그럼에도 불구하고, 사과의 사진으로 recover 해냅니다. + :::{figure-md} + img_20 + + Variations of images featuring typographic attacks + ::: + + 이처럼 DALLE2 는 typographic attacks 에 더욱 robust 합니다. + +
+ +- **이 모델, 단점은 없나요?** + +
+ + 1. **객체(cubes)와 그들의 속성(colors) 을 매칭시키는 능력이 떨어집니다.** + + :::{figure-md} + img_21 + + Samples from unCLIP and GLIDE for the prompt “a red cube on top of a blue cube”. + ::: + + 위 그림처럼, 파란 큐브 위에 빨간 큐브를 그려달라고 했을 때,
+ DALLE2 는 **아래의 큐브와 위의 큐브에 각각 어떤 색상 (attributes) 를 부여해야할지** 헷갈려합니다. + +
+ + 2. **텍스트를 일관성있게 생성하는 능력이 떨어집니다** + + :::{figure-md} + img_22 + + Samples from unCLIP for the prompt, “A sign that says deep learning.” + ::: + + 물론 이것은 DALLE2 만의 문제는 아닙니다.
+ 많은 text-to-image models 가 어려워하는 문제입니다. + +
+ + 3. **복잡한 상황에서 디테일을 묘사하는 능력이 떨어집니다** + + :::{figure-md} + img_23 + + unCLIP samples show low levels of detail for some complex scenes. + ::: + + 복잡한 네온 사인들의 디테일들이 좀 떨어지는 것을 확인하실 수 있습니다. + +
+ +- **Method - Training** + - 본 논문의 Method 에서는, unCLIP 모델의 아키텍쳐에 대한 수학적 justify 를 하고 있습니다. + - Training 데이터셋의 이미지를 x 라 합시다. + - 그에 상응하는 text captions 을 y 라 합시다. + - 각각에 대한 embeddings 인 Z_i, Z_t 를 기존의 CLIP 으로 생성합니다. + - image **x —CLIP Image encoder—> Z_i** image embeddings + - text caption **y —CLIP text encoder—> Z_t** text embeddings + +
+ + - 저자의 주장 + - unCLIP 으로, text caption y 로부터 image x 를 샘플링할 수 있다고 합니다. + + :::{figure-md} + img_24 + + P(x|y) equation. + ::: + + - ***The first equality holds because z_i is a deterministic function of x.*** + - ***The second equality holds because of the chain rule.*** + +
+ + - **포스팅을 위한 부가 설명** + - z_t 도 y 의 deterministic function 이므로, 다음과 같이 쓸 수 있죠. + + $$ + P(x|y) = P(x, z_i|y, z_t) = P(x|z_i, y, z_t)P(z_i|y, z_t) + $$ + + - 즉 위 공식을 풀어서 해설해보면 다음과 같습니다.
+ Prior 를 사용해 Z_t 로부터 Z_i 를 샘플링하고,
+ Decoder 를 사용해 x 를 샘플링함으로써
+ True conditional distribution 인 P(x|y) 샘플링이 가능해지는 것입니다. + +
+ +- **DALL-E 2 Bias** + +
+ + 개인적으로 DALLe2 와 같은 모델에 Bias 는 없는지 궁금해서 추가적으로 공부해봤습니다.
+ DALLE2 에 Bias 가 있는지,
+ Bias 가 있다면 해소하기 위해 어떤 노력을 하고있는지,
+ Bias 는 대체 어떻게 정량적으로 평가할 수 있는지 조사해봤습니다.
+ + 결과부터 말씀드리면, DALLE2 처럼, 웹크롤링 데이터를 학습한 모델은 Bias 가 존재한다고 합니다.
+ 이런 Bias 를 해소하기 위해서 OpenAI 는 어떤 노력을 하고있는지부터 살펴볼까요? + + [https://github.com/openai/dalle-2-preview/blob/main/system-card.md](https://github.com/openai/dalle-2-preview/blob/main/system-card.md) + + - **현재 OpenAI 가 DALL-E 2 의 Safety 를 위해 하고 있는 노력** + 1. 학습 데이터에서 violent, hate, or adult images 를 제거함으로써
+ 이러한 이미지들에 DALL-E 2 가 노출되는 시간을 최소화했다고 합니다. + 2. Safety policies 를 위반한 text prompts 혹은 생성된 images 를 자정하는 시스템을 보유하고 있다고 합니다. + 3. 신뢰할 수 있는 전문가들과 DALL-E 2 에 대한 사전 검토를 진행했다고 합니다. + +
+ + - **DALL-EVAL : 이미지 생성형 AI 의 Bias 를 평가하는 방법 소개** + + DALLE 와 같은 Text-to-Image 생성형 모델을 정량적으로 평가하는 기법이 있습니다.
+ 바로 DALL-EVAL 입니다. + + [https://arxiv.org/pdf/2202.04053.pdf](https://arxiv.org/pdf/2202.04053.pdf) + + [https://github.com/j-min/DallEval](https://github.com/j-min/DallEval) + + - **Contribution** + - Text to Image Generation models 의 시각적 추론 능력 3가지를 평가하기 위한 데이터셋 제공합니다. + - 최근의 모델들이 object recognition skill 은 상대적으로 뛰어나지만,
+ object counting 및 spaial relation 이해 능력은 떨어짐을 발견했습니다. + - Text to Image Generation models 에 존재하는
+ **gender 및 skin tone biases 를 측정하는 evaluation metrics 와 그 분석 결과를 제시한 최초의 논문** 입니다. + - web 에서 image-text pairs 를 학습한 현재 T2I 생성 모델들은
+ 특정한 gender/skin tone biases 를 학습했음을 보여주었습니다. + + :::{figure-md} + img_26 + + Overview of DALL-EVAL evaluation process. + ::: + + - **Social Bias Evaluation 측정 방법 (Sec. 4.2.1 참고)** + + :::{figure-md} + img_27 + + Overview of DALL-EVAL's social bias evaluation process. + ::: + + DALL-EVAL 의 자세한 social bias evaluation process 는 다음과 같습니다. + + 1. 우선 **Diagnostic prompts 로 이미지들을 생성합니다.** + 1. ex) “a person who works as a nurse” + 2. 총 252개의 Diagnostic prompts 제공 + 2. **Gender, Skin tone, Attributes 를 생성된 이미지로부터 탐지합니다.** + 1. using automated detection models and verify the reliability of detection models with human evaluation + 2. **Gender** + 1. BLIP-2 라는 모델에 생성된 영상을 주면서 영상 내 사람의 성별을 맞추게 합니다.
+ BLIP-2 의 답변을 기반으로 Gender Bias 측정합니다. + 3. **Skin tone** + 1. 신경망으로 facial landmark 를 추출하고, illumination 을 측정합니다. + 4. **Attributes** + 1. BLIP-2 라는 모델에 생성된 영상을 주면서 영상 내 사람의 복장을 맞추게 합니다.
+ BLIP-2 의 답변을 기반으로 Attributes Bias 측정합니다. + 3. 탐지된 Gender, Skin tone, Attributes 가
+ unbiased uniform distribution 으로부터 얼마나 skewed 되어있는지 측정합니다. + +
+ + - **실험 결과** + + :::{figure-md} + img_28 + + Gender, skin tone, and attribute detection results with automated and expert human evaluation. + ::: + + :::{figure-md} + img_29 + + Per-profession examples and average gender bias or average skin tone bias of images. + ::: + + :::{figure-md} + img_30 + + Comparison of overall gender and skin tone bias of each model. + ::: + + 위 실험 결과와 같이, DALL-EVAL 은 Text-to-Image models 를 정량적으로 평가하는데에 성공했습니다.
+ Satble Diffusion 처럼 웹크롤링을 활용해 데이터를 학습한 모델은 Bias 가 존재했습니다.
+ 이처럼 생성형 AI 의 Bias 를 측정하기 위한 다양한 노력이 지속되고 있습니다.
미래에는 생성형 AI 가 더 안전하게 활용될 수 있기를 기대합니다. \ No newline at end of file diff --git a/_sources/docs/review/DDIM.md b/_sources/docs/review/DDIM.md old mode 100644 new mode 100755 index 35b7ada6..35c780ee --- a/_sources/docs/review/DDIM.md +++ b/_sources/docs/review/DDIM.md @@ -1,287 +1,287 @@ -```{admonition} Information -- **Title:** Denoising Diffusion Implicit Models (ICLR 2021) - -- **Reference** - - Paper: [https://arxiv.org/abs/2010.02502](https://arxiv.org/abs/2010.02502) - - Code: [Official:](https://github.com/ermongroup/ddim) - -- **Author:** Seunghwan Ji - -- **Last updated on April. 23, 2023** -``` - -# DDIM -## Abstract - -- DDPM의 단점인 Markov Process를 Non markovian process로 정의함으로서 Time efficient, deterministic한 Sampling이 가능한 모델을 제안 - - Deterministic vs Stochastic - -## 1. Introduction - -- 생성 분야에서 GAN(Generative Adversarial Network)이 뛰어난 성능을 보여주고있다. -- 하지만, GAN은 학습 과정에서 불안정성을 보이는 경우가 많다. - - Generator와 Discriminator의 Imbalanced에 의한 Mode collapse -- 그러던 중, DDPM과 NCSN같은 adversarial training구조가 아닌 model들이 등장하였고 성공의 가능성을 보여주었다. -- 이 중 DDPM은 Forward Process에서 Markov Process를 거치는데 이때문에 GAN에 비해 매우 느린 Performance를 보여준다. - - - | sampling | GAN | DDPM | - | --- | --- | --- | - | 32 x 32 x 50k | Less than 1 min | About 20h | - | 256 x 256 x 50k | - | About 1000h | -- DDIM은, - 1. Markov Chain에 기반한 Process를 Non Markovian Process로 대체하였고 - 2. 결국 좀더 빠르고 비교적 우수한 Quality의 결과를 생성해내고, (with accelate) - 3. DDPM과는 다르게 Consistency한 학습 결과를 보여줌으로써 latent간의 Interpolation이 가능하다. - - Consistency? - - If x, y is equivalent, then f(x) = f(y) - -## 2. Background - -### DDPM - -:::{figure-md} -DDIM_00 - -DDPM & DDIM Architectures -::: - -- DDPM의 Forward Process는 Markov process로 동작한다. - - ***Markov process*** - - *미래 시점을 예측하기위해 현재 시점의 값을 이용한다.* - - *미래 시점은 과거 시점의 값에는 독립적인 값을 갖는다.* -- time step T는 DDPM에서 성능을 좌지우지하는 중요한 Hyper parameter이다. (대충 T=1000 정도?) -- 하지만, Sampling 과정에서 DDPM은 결국 T 번의 inference 과정을 모두 Sequential하게 거쳐야하고 이는 다른 Method(GAN 등)보다 현저히 느린 속도를 보이는 요소가 된다. - -## 3. Variational Inference For Non-Markovian Forward Process - -**3.1. Non-Markovian Forward Processes** - -- Inference’s Distribution 정의 - -:::{figure-md} -DDIM_01 - -Equation 1 -::: - -:::{figure-md} -DDIM_02 - -Equation 2 -::: -- t 시점의 값을 구하기위해 $X_{t-1}$의 값과 $X_{0}$의 값을 참조 - - DDPM은? $X_{t-1}$의 값만을 참조 - - σ는 Forward process의 stochastic한 정도를 조절하는 hyper parameter (chap 4 참조) - -**3.2. Generative Process And Unified Variational Inference Objective (Reverse Process)** - -:::{figure-md} -DDIM_00 - -Equation 3 -::: - -:::{figure-md} -DDIM_00 - -Equation 4 -::: - -1. $X_{t}$을 통해 $X_{0}$의 값을 예측 (trainable) -2. 위의 식을 통해 $X_{t}$와, $X_{0}$의 값을 이용해 $X_{t-1}$을 샘플링 - -실제로는 - -- noise(ε)와 $X_{0}$, $X_{t}$의 관계 - - :::{figure-md} - DDIM_05 - - Equation 5 - ::: - -1. $X_{t}$을 통해 $X_{0}$을 예측 - 1. t 시점의 이미지를 통해 t 시점의 noise를 예측 - 2. t 시점의 이미지와 t 시점의 noise를 통해 0 시점의 이미지를 계산 (fixed) -2. 위의 식을 통해 t시점의 값과 예측한 0 시점의 값을 이용해 t-1 시점의 값을 샘플링 - -## 4. Sampling From Generalized Generative Process - -4.1. Denoising Diffusion Implicit Models - -1. If σ → 0 - -:::{figure-md} -DDIM_06 - -Equation 6 -::: - -1. σ가 특정 값을 가질 때 DDPM의 generative process의 수식과 동일하다. -:::{figure-md} -DDIM_07 - -Explanation of σ -::: -4.2. Accelerated Generation Processes -:::{figure-md} -DDIM_08 - -Explanation of accelated method -::: - -- DDIM은 Deterministic하기때문에 모든 시점의 값을 모두 계산할 필요 없이 subset의 시점만으로 sampling이 가능하다. -- 이 Accelerating method는 약간의 quality 저하가 있지만 Computational efficiency를 충분히 증가시킬 수 있다. -- **DDIM 방식의 재학습 없이 DDPM의 training에 DDIM의 sampling이 가능하다.** - -4.3. Relevance To Neural ODEs - -- DDIM은 Object(e.g. 이미지)의 Encoding이 가능한 식을 유도할 수 있다. - -## 5. Experiments -:::{figure-md} -DDIM_09 - -Table1 -::: - -:::{figure-md} -DDIM_010 - -Euqation 7 -::: -- η → model을 simple하게 control하기위한 hyperparameter - - η = 1 → Model is DDPM - - η = 0 → Model is DDIM -- 모든 비교 모델이 S(sampling 횟수)의 값이 커질수록 더 낮은 FiD를 보여준다. -- Fig.3의 DDIM은 다른 모델(η가 0이 아닌 모델)과 다르게 sampling step에 consistency한 결과를 보여준다. - -:::{figure-md} -DDIM_011 - -Figure 4, 5 -::: -- Step과 Inference time이 linear한 관계를 갖는다. -- 적은 sampling step에서도 어느정도의 object를 보여준다. -:::{figure-md} -DDIM_012 - -Figure 6 -::: -- T 시점의 이미지에 interpolation이 가능하다. - -## 6. Code - -```python -# https://keras.io/examples/generative/ddim/ -class DiffusionModel(keras.Model): - def __init__(self, image_size, widths, block_depth): - super().__init__() - - self.normalizer = layers.Normalization() - self.network = get_network(image_size, widths, block_depth) # unet 구조 - - def denormalize(self, images): - # convert the pixel values back to 0-1 range - images = self.normalizer.mean + images * self.normalizer.variance**0.5 - return tf.clip_by_value(images, 0.0, 1.0) - - def diffusion_schedule(self, diffusion_times): - # diffusion times -> angles - start_angle = tf.acos(max_signal_rate) - end_angle = tf.acos(min_signal_rate) - - diffusion_angles = start_angle + diffusion_times * (end_angle - start_angle) - - # angles -> signal and noise rates - signal_rates = tf.cos(diffusion_angles) - noise_rates = tf.sin(diffusion_angles) - # note that their squared sum is always: sin^2(x) + cos^2(x) = 1 - - return noise_rates, signal_rates - - def denoise(self, noisy_images, noise_rates, signal_rates, training): - # the exponential moving average weights are used at evaluation - if training: - network = self.network - else: - network = self.ema_network - - # predict noise component and calculate the image component using it - pred_noises = network([noisy_images, noise_rates**2], training=training) - pred_images = (noisy_images - noise_rates * pred_noises) / signal_rates - - return pred_noises, pred_images - - - - def train_step(self, images): - # normalize images to have standard deviation of 1, like the noises - images = self.normalizer(images, training=True) - noises = tf.random.normal(shape=(batch_size, image_size, image_size, 3)) - - # sample uniform random diffusion times - diffusion_times = tf.random.uniform( - shape=(batch_size, 1, 1, 1), minval=0.0, maxval=1.0 - ) - noise_rates, signal_rates = self.diffusion_schedule(diffusion_times) - # mix the images with noises accordingly - noisy_images = signal_rates * images + noise_rates * noises - - with tf.GradientTape() as tape: - # train the network to separate noisy images to their components - pred_noises, pred_images = self.denoise( - noisy_images, noise_rates, signal_rates, training=True - ) - - noise_loss = self.loss(noises, pred_noises) # used for training - image_loss = self.loss(images, pred_images) # only used as metric - - gradients = tape.gradient(noise_loss, self.network.trainable_weights) - self.optimizer.apply_gradients(zip(gradients, self.network.trainable_weights)) - - self.noise_loss_tracker.update_state(noise_loss) - self.image_loss_tracker.update_state(image_loss) - - return {m.name: m.result() for m in self.metrics[:-1]} - - def reverse_diffusion(self, initial_noise, diffusion_steps): - # reverse diffusion = sampling - num_images = initial_noise.shape[0] - step_size = 1.0 / diffusion_steps - - # important line: - # at the first sampling step, the "noisy image" is pure noise - # but its signal rate is assumed to be nonzero (min_signal_rate) - next_noisy_images = initial_noise - for step in range(diffusion_steps): - noisy_images = next_noisy_images - - # separate the current noisy image to its components - diffusion_times = tf.ones((num_images, 1, 1, 1)) - step * step_size - noise_rates, signal_rates = self.diffusion_schedule(diffusion_times) - pred_noises, pred_images = self.denoise( - noisy_images, noise_rates, signal_rates, training=False - ) - # network used in eval mode - - # remix the predicted components using the next signal and noise rates - next_diffusion_times = diffusion_times - step_size - next_noise_rates, next_signal_rates = self.diffusion_schedule( - next_diffusion_times - ) - next_noisy_images = ( - next_signal_rates * pred_images + next_noise_rates * pred_noises - ) - # this new noisy image will be used in the next step - - return pred_images - - def generate(self, num_images, diffusion_steps): - # noise -> images -> denormalized images - initial_noise = tf.random.normal(shape=(num_images, image_size, image_size, 3)) - generated_images = self.reverse_diffusion(initial_noise, diffusion_steps) - generated_images = self.denormalize(generated_images) - return generated_images -``` +```{admonition} Information +- **Title:** Denoising Diffusion Implicit Models (ICLR 2021) + +- **Reference** + - Paper: [https://arxiv.org/abs/2010.02502](https://arxiv.org/abs/2010.02502) + - Code: [Official:](https://github.com/ermongroup/ddim) + +- **Author:** Seunghwan Ji + +- **Last updated on April. 23, 2023** +``` + +# DDIM +## Abstract + +- DDPM의 단점인 Markov Process를 Non markovian process로 정의함으로서 Time efficient, deterministic한 Sampling이 가능한 모델을 제안 + - Deterministic vs Stochastic + +## 1. Introduction + +- 생성 분야에서 GAN(Generative Adversarial Network)이 뛰어난 성능을 보여주고있다. +- 하지만, GAN은 학습 과정에서 불안정성을 보이는 경우가 많다. + - Generator와 Discriminator의 Imbalanced에 의한 Mode collapse +- 그러던 중, DDPM과 NCSN같은 adversarial training구조가 아닌 model들이 등장하였고 성공의 가능성을 보여주었다. +- 이 중 DDPM은 Forward Process에서 Markov Process를 거치는데 이때문에 GAN에 비해 매우 느린 Performance를 보여준다. + + + | sampling | GAN | DDPM | + | --- | --- | --- | + | 32 x 32 x 50k | Less than 1 min | About 20h | + | 256 x 256 x 50k | - | About 1000h | +- DDIM은, + 1. Markov Chain에 기반한 Process를 Non Markovian Process로 대체하였고 + 2. 결국 좀더 빠르고 비교적 우수한 Quality의 결과를 생성해내고, (with accelate) + 3. DDPM과는 다르게 Consistency한 학습 결과를 보여줌으로써 latent간의 Interpolation이 가능하다. + - Consistency? + - If x, y is equivalent, then f(x) = f(y) + +## 2. Background + +### DDPM + +:::{figure-md} +DDIM_00 + +DDPM & DDIM Architectures +::: + +- DDPM의 Forward Process는 Markov process로 동작한다. + - ***Markov process*** + - *미래 시점을 예측하기위해 현재 시점의 값을 이용한다.* + - *미래 시점은 과거 시점의 값에는 독립적인 값을 갖는다.* +- time step T는 DDPM에서 성능을 좌지우지하는 중요한 Hyper parameter이다. (대충 T=1000 정도?) +- 하지만, Sampling 과정에서 DDPM은 결국 T 번의 inference 과정을 모두 Sequential하게 거쳐야하고 이는 다른 Method(GAN 등)보다 현저히 느린 속도를 보이는 요소가 된다. + +## 3. Variational Inference For Non-Markovian Forward Process + +**3.1. Non-Markovian Forward Processes** + +- Inference’s Distribution 정의 + +:::{figure-md} +DDIM_01 + +Equation 1 +::: + +:::{figure-md} +DDIM_02 + +Equation 2 +::: +- t 시점의 값을 구하기위해 $X_{t-1}$의 값과 $X_{0}$의 값을 참조 + - DDPM은? $X_{t-1}$의 값만을 참조 + - σ는 Forward process의 stochastic한 정도를 조절하는 hyper parameter (chap 4 참조) + +**3.2. Generative Process And Unified Variational Inference Objective (Reverse Process)** + +:::{figure-md} +DDIM_00 + +Equation 3 +::: + +:::{figure-md} +DDIM_00 + +Equation 4 +::: + +1. $X_{t}$을 통해 $X_{0}$의 값을 예측 (trainable) +2. 위의 식을 통해 $X_{t}$와, $X_{0}$의 값을 이용해 $X_{t-1}$을 샘플링 + +실제로는 + +- noise(ε)와 $X_{0}$, $X_{t}$의 관계 + + :::{figure-md} + DDIM_05 + + Equation 5 + ::: + +1. $X_{t}$을 통해 $X_{0}$을 예측 + 1. t 시점의 이미지를 통해 t 시점의 noise를 예측 + 2. t 시점의 이미지와 t 시점의 noise를 통해 0 시점의 이미지를 계산 (fixed) +2. 위의 식을 통해 t시점의 값과 예측한 0 시점의 값을 이용해 t-1 시점의 값을 샘플링 + +## 4. Sampling From Generalized Generative Process + +4.1. Denoising Diffusion Implicit Models + +1. If σ → 0 + +:::{figure-md} +DDIM_06 + +Equation 6 +::: + +1. σ가 특정 값을 가질 때 DDPM의 generative process의 수식과 동일하다. +:::{figure-md} +DDIM_07 + +Explanation of σ +::: +4.2. Accelerated Generation Processes +:::{figure-md} +DDIM_08 + +Explanation of accelated method +::: + +- DDIM은 Deterministic하기때문에 모든 시점의 값을 모두 계산할 필요 없이 subset의 시점만으로 sampling이 가능하다. +- 이 Accelerating method는 약간의 quality 저하가 있지만 Computational efficiency를 충분히 증가시킬 수 있다. +- **DDIM 방식의 재학습 없이 DDPM의 training에 DDIM의 sampling이 가능하다.** + +4.3. Relevance To Neural ODEs + +- DDIM은 Object(e.g. 이미지)의 Encoding이 가능한 식을 유도할 수 있다. + +## 5. Experiments +:::{figure-md} +DDIM_09 + +Table1 +::: + +:::{figure-md} +DDIM_010 + +Euqation 7 +::: +- η → model을 simple하게 control하기위한 hyperparameter + - η = 1 → Model is DDPM + - η = 0 → Model is DDIM +- 모든 비교 모델이 S(sampling 횟수)의 값이 커질수록 더 낮은 FiD를 보여준다. +- Fig.3의 DDIM은 다른 모델(η가 0이 아닌 모델)과 다르게 sampling step에 consistency한 결과를 보여준다. + +:::{figure-md} +DDIM_011 + +Figure 4, 5 +::: +- Step과 Inference time이 linear한 관계를 갖는다. +- 적은 sampling step에서도 어느정도의 object를 보여준다. +:::{figure-md} +DDIM_012 + +Figure 6 +::: +- T 시점의 이미지에 interpolation이 가능하다. + +## 6. Code + +```python +# https://keras.io/examples/generative/ddim/ +class DiffusionModel(keras.Model): + def __init__(self, image_size, widths, block_depth): + super().__init__() + + self.normalizer = layers.Normalization() + self.network = get_network(image_size, widths, block_depth) # unet 구조 + + def denormalize(self, images): + # convert the pixel values back to 0-1 range + images = self.normalizer.mean + images * self.normalizer.variance**0.5 + return tf.clip_by_value(images, 0.0, 1.0) + + def diffusion_schedule(self, diffusion_times): + # diffusion times -> angles + start_angle = tf.acos(max_signal_rate) + end_angle = tf.acos(min_signal_rate) + + diffusion_angles = start_angle + diffusion_times * (end_angle - start_angle) + + # angles -> signal and noise rates + signal_rates = tf.cos(diffusion_angles) + noise_rates = tf.sin(diffusion_angles) + # note that their squared sum is always: sin^2(x) + cos^2(x) = 1 + + return noise_rates, signal_rates + + def denoise(self, noisy_images, noise_rates, signal_rates, training): + # the exponential moving average weights are used at evaluation + if training: + network = self.network + else: + network = self.ema_network + + # predict noise component and calculate the image component using it + pred_noises = network([noisy_images, noise_rates**2], training=training) + pred_images = (noisy_images - noise_rates * pred_noises) / signal_rates + + return pred_noises, pred_images + + + + def train_step(self, images): + # normalize images to have standard deviation of 1, like the noises + images = self.normalizer(images, training=True) + noises = tf.random.normal(shape=(batch_size, image_size, image_size, 3)) + + # sample uniform random diffusion times + diffusion_times = tf.random.uniform( + shape=(batch_size, 1, 1, 1), minval=0.0, maxval=1.0 + ) + noise_rates, signal_rates = self.diffusion_schedule(diffusion_times) + # mix the images with noises accordingly + noisy_images = signal_rates * images + noise_rates * noises + + with tf.GradientTape() as tape: + # train the network to separate noisy images to their components + pred_noises, pred_images = self.denoise( + noisy_images, noise_rates, signal_rates, training=True + ) + + noise_loss = self.loss(noises, pred_noises) # used for training + image_loss = self.loss(images, pred_images) # only used as metric + + gradients = tape.gradient(noise_loss, self.network.trainable_weights) + self.optimizer.apply_gradients(zip(gradients, self.network.trainable_weights)) + + self.noise_loss_tracker.update_state(noise_loss) + self.image_loss_tracker.update_state(image_loss) + + return {m.name: m.result() for m in self.metrics[:-1]} + + def reverse_diffusion(self, initial_noise, diffusion_steps): + # reverse diffusion = sampling + num_images = initial_noise.shape[0] + step_size = 1.0 / diffusion_steps + + # important line: + # at the first sampling step, the "noisy image" is pure noise + # but its signal rate is assumed to be nonzero (min_signal_rate) + next_noisy_images = initial_noise + for step in range(diffusion_steps): + noisy_images = next_noisy_images + + # separate the current noisy image to its components + diffusion_times = tf.ones((num_images, 1, 1, 1)) - step * step_size + noise_rates, signal_rates = self.diffusion_schedule(diffusion_times) + pred_noises, pred_images = self.denoise( + noisy_images, noise_rates, signal_rates, training=False + ) + # network used in eval mode + + # remix the predicted components using the next signal and noise rates + next_diffusion_times = diffusion_times - step_size + next_noise_rates, next_signal_rates = self.diffusion_schedule( + next_diffusion_times + ) + next_noisy_images = ( + next_signal_rates * pred_images + next_noise_rates * pred_noises + ) + # this new noisy image will be used in the next step + + return pred_images + + def generate(self, num_images, diffusion_steps): + # noise -> images -> denormalized images + initial_noise = tf.random.normal(shape=(num_images, image_size, image_size, 3)) + generated_images = self.reverse_diffusion(initial_noise, diffusion_steps) + generated_images = self.denormalize(generated_images) + return generated_images +``` diff --git a/_sources/docs/review/DDPM.md b/_sources/docs/review/DDPM.md old mode 100644 new mode 100755 index 0e30d045..051f225b --- a/_sources/docs/review/DDPM.md +++ b/_sources/docs/review/DDPM.md @@ -1,509 +1,509 @@ -```{admonition} Information -- **Title:** Denoising Diffusion Probabilistic Models (NeurIPS 2020) - -- **Reference** - - Paper: [https://arxiv.org/abs/2006.11239](https://arxiv.org/abs/2006.11239) - - Code: [PyTorch implementation:](https://github.com/lucidrains/denoising-diffusion-pytorch) - - Review: [PR-409: Denoising Diffusion Probabilistic Models](https://www.youtube.com/watch?v=1j0W_lu55nc) - -- **Author:** Beomsoo Park - -- **Last updated on Apr. 19, 2023** -``` - - -# DDPM - - -:::{figure-md} -DDPM_01 - -DDPM samples \ (source: https://arxiv.org/abs/2006.11239) -::: - - ---- -# 1. Introduction - -:::{figure-md} -DDPM_02 - -Diffusion models \ (source: https://velog.io/@yetsyl0705/What-are-Diffusion-Models) -::: - -**Diffusion model**은 **variational inference로 학습시켜 데이터를 생성하는 parameterized Markov chain**. Diffusion model은 Markov가 데이터가 normal distribution의 형태를 할 때까지 **noise를 더해가는 diffusion process**와 **이를 역으로 거치며 학습하는 reverse process**로 구성됨. - -Diffusion model은 정의하기 쉽고 학습시키는 것도 편리함. 또한 높은 품질의 sample(output)도 생성이 가능. - -> - **Variational inference(변분추론)**: 사후확률(posterior) 분포 $p(z -|x)$를 다루기 쉬운 확률분포 $q(z)$로 근사(approximation)하는 것 -> - **Parameterize**: 하나의 표현식에 대해 다른 parameter를 사용하여 다시 표현하는 과정. 이 과정에서 보통 parameter의 개수를 표현 식의 차수보다 적은 수로 선택(ex. 3차 표현식 --> 2개 parameter 사용)하므로, 낮은 차수로의 mapping 함수(ex. 3D --> 2D)가 생성 -> - **Markov chain**: 어떤 상태에서 다른 상태로 넘어갈 때, 바로 전 단계의 상태에만 영향을 받는 확률 과정 - ---- -# 2. Background - -:::{figure-md} -DDPM_03 - -Graphical model of DDPM \ (source: https://arxiv.org/abs/2006.11239) -::: - -## 2-1. Forward(diffusion) process $q(\mathbf{x}_t|\mathbf{x}_{t-1})$ - -$$ -q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right):=\prod_{t=1}^T q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right), \quad q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right):=\mathcal{N}\left(\mathbf{x}_t ; \sqrt{1-\beta_t} \mathbf{x}_{t-1}, \beta_t \mathbf{I}\right) -$$ - -Markov chain으로 **data에 noise를 추가**하는 과정. Noise를 추가할 때 **variance schedule $\beta_1,,,\beta_T$로 scaling**을 한 후 더해준다. -- $\beta_t = 1$이면 mean인 $\sqrt{1-\beta_t}\mathbf{x}_{t-1} = 0$. 이전 정보를 갖지 못하고 노이즈가 증가함 -- 단순히 noise만을 더해주는게 아니라 $\sqrt{1-\beta_t}$로 scaling하는 이유는 variance가 발산하는 것을 막기 위함 -- $q(x_1|x_0)$: $x_0$에 noise를 추가해 $x_1$을 만드는 과정 -- $x_T$는 완전 destroy된 noise 상태 ~ $N(x_T;0, I)$ - -## 2-2. Reverse process $p(\mathbf{x}_{t-1}|\mathbf{x}_t)$ - -$$ -p_\theta\left(\mathbf{x}_{0: T}\right):=p\left(\mathbf{x}_T\right) \prod_{t=1}^T p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right), \quad p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right):=\mathcal{N}\left(\mathbf{x}_{t-1} ; \boldsymbol{\mu}_\theta\left(\mathbf{x}_t, t\right), \boldsymbol{\Sigma}_\theta\left(\mathbf{x}_t, t\right)\right) -$$ - -Reverse process로 가우시안 노이즈를 사용하는 이유는 1994년 논문에 forward process가 가우시안이면 reverse process도 가우시안으로 쓰면 된다라는 증명이 있다고 함. - -여기서 우리가 해야 할 것은 **$\mathbf{x}_t$를 보고 $\mathbf{x}_{t-1}$의 평균 $\mu_\theta$과 분산 $\Sigma_\theta$을 예측해내는 것**. -- Hierarachical VAE에서의 decoding 과정과 비슷함 -- $\mu_\theta$과 분산 $\Sigma_\theta$는 학습 가능한 parameter - - -## 2-3. Loss Function $L$ - -Diffusion model의 목적은 **noise를 어떻게 제거할 것인가?**이다. $x_t$가 들어왔을 때 $x_{t-1}$을 예측할 수 있다면 $x_0$ 또한 예측이 가능해짐. - -$$ -\mathbb{E}\left[-\log p_\theta\left(\mathbf{x}_0\right)\right] \leq \mathbb{E}_q\left[-\log \frac{p_\theta\left(\mathbf{x}_{0: T}\right)}{q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right)}\right]=\mathbb{E}_q\left[-\log p\left(\mathbf{x}_T\right)-\sum_{t \geq 1} \log \frac{p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)}{q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right)}\right]=: L -$$ - -본 논문에서는 **negative log likelihood를 최소화**하는 방향으로 진행. 위 수식을 **ELBO**(Evidence of Lower BOund)로 우항과 같이 정리하고 이를 풀어내면 - -> ELBO의 역할은 우리가 관찰한 P(z|x)가 다루기 힘든 분포를 이루고 있을 때 이를 조금 더 다루기 쉬운 분포인 Q(x)로 대신 표현하려 하는 과정에서 **두 분포 (P(z|x)와 Q(x))의 차이 (KL Divergence)를 최소화** 하기 위해 사용된다. - -$$ -\mathbb{E}_q[\underbrace{D_{\mathrm{KL}}\left(q\left(\mathbf{x}_T \mid \mathbf{x}_0\right) \| p\left(\mathbf{x}_T\right)\right)}_{L_T}+\sum_{t>1} \underbrace{D_{\mathrm{KL}}\left(q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t, \mathbf{x}_0\right) \| p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)\right)}_{L_{t-1}} \underbrace{-\log p_\theta\left(\mathbf{x}_0 \mid \mathbf{x}_1\right)}_{L_0}] -$$ - -와 같은 결과가 나온다. - -- $L_T$: Regularization term으로 $\beta_t$를 학습시킴 -- $L_{t-1}$: Reconstruction term으로 매 단계에서 noise를 지우는 지움 -- $L_0$: Reconstruction term으로 최종 단계에서 image를 생성 - ---- -# 3. Diffusion models and denoising encoders - -DDPM에서는 **inductive bias를 늘려** 모델을 더 stable하고 성능도 개선할 수 있었음. - -> Inductive bias: 학습 모델이 지금까지 만나보지 못했던 상황에서 정확한 예측을 하기 위해 사용하는 **추가적인 가정**, 즉 우리가 풀려는 문제에 대한 정보를 모델에 적용하는 것 - - -## 3-1. Forward process and $L_T$ - -**$\beta_t$를 고정**했더니 학습이 잘됨. 10^-4 ~ 0.02로 linear하게 image에 가까울수록 noise를 적게 주는 방식으로 설정. - -따라서 $q$에는 학습 가능한 parameter가 없어 **$L_T$는 0이 되기 때문에 삭제**할 수 있었음. - -## 3-2. Reverse process and $L_{1:T-1}$ - - -$$ -L_{t-1}=D_{K L}\left(q\left(x_{t-1} \mid x_t, x_0\right) \| p_\theta\left(x_{t-1} \mid x_t\right)\right) -$$ - -- $ -q\left(x_{t-1} \mid x_t, x_0\right)=N\left(x_{t-1} ; \tilde{\mu}\left(x_t, x_0\right), \tilde{\beta}_t \mathrm{I}\right) -$ -- $ -p_\theta\left(x_{t-1} \mid x_t\right)=\mathcal{N}\left(x_{t-1} ; \mu_\theta\left(x_t, t\right), \sum_\theta\left(x_t, t\right)\right) -$ - - -$L_{1:T-1}$는 forward progress posterior를 예측하는 loss. $\mathbf{x}_{t-1}$에서 noise를 더해 $\mathbf{x}_{t}$를 만들었을때, 그 과정을 복원 $p(\mathbf{x}_{t-1}|\mathbf{x}_t)$ 하는 과정을 학습. - -:::{figure-md} -DDPM_08 - -Loss Simplication \ (source: https://velog.io/@sjina0722/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Denoising-Diffusion-Probabilistic-Models) -::: - -- $\Sigma_\theta$: $\beta$를 상수로 가정했고 $p(\mathbf{x}_{t-1}|\mathbf{x}_t)$의 variance가 $\beta$에 영향을 받기 때문에 학습시키지 않아도 된다고 생각해 **variance term을 제거**함. - -:::{figure-md} -DDPM_09 - -Residual Estimation \ (source: https://velog.io/@sjina0722/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Denoising-Diffusion-Probabilistic-Models) -::: - -- $\mu_\theta$: DDPM에서는 $\mu_\theta$를 바로 구하지 않고 **residual $\epsilon_\theta$만 구해 정확도를 높임**. - -## 3-3. Data scaling, reverse process decoder and $L_0$ - -$$ -\begin{aligned} -p_\theta\left(\mathbf{x}_0 \mid \mathbf{x}_1\right) & =\prod_{i=1}^D \int_{\delta_{-}\left(x_0^i\right)}^{\delta_{+}\left(x_0^i\right)} \mathcal{N}\left(x ; \mu_\theta^i\left(\mathbf{x}_1, 1\right), \sigma_1^2\right) d x \\ -\delta_{+}(x) & =\left\{\begin{array}{ll} -\infty & \text { if } x=1 \\ -x+\frac{1}{255} & \text { if } x<1 -\end{array} \quad \delta_{-}(x)= \begin{cases}-\infty & \text { if } x=-1 \\ -x-\frac{1}{255} & \text { if } x>-1\end{cases} \right. -\end{aligned} -$$ - -[0, 255]의 image를 [-1,1] 사이로 linearly mapping. Sampling 마지막 단계에는 noise를 추가하지 않음. - - -$L_0$은 두 normal distribution 사이의 KL divergence를 나타냄. -- $D$: Data dimensionality -- $i$: 좌표 - - -## 3-4. Simplified training objective - -:::{figure-md} -DDPM_10 - -Simplified training objective \ (source: https://velog.io/@sjina0722/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Denoising-Diffusion-Probabilistic-Models) -::: - -:::{figure-md} -DDPM_11 - -Final Loss \ (source: https://velog.io/@sjina0722/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Denoising-Diffusion-Probabilistic-Models) -::: - -최종 loss는 위와 같이 나타난다. Ground truth - estimated output간 MSE loss를 줄이는 과정이 denoising과 비슷해 DDPM이라는 이름이 붙음. - -Simplified objective을 통해 diffusion process를 학습하면 매우 작은 t 에서뿐만 아니라 **큰 t에 대해서도 network 학습이 가능하기 때문에 매우 효과적**. - -:::{figure-md} -DDPM_12 - -Psuedo code of training process \ (source: https://arxiv.org/abs/2006.11239) -::: - -- Algorithm 1: Training - - Noise를 더해나가는 과정, network($\epsilon_\theta$, $p_\theta$)가 t step에서 noise($\epsilon$)가 얼마만큼 더해졌는지를 학습한다. - - 학습 시에는 특정 step의 이미지가 얼마나 gaussian noise가 추가되었는지를 예측하도록 학습된다. - - 코드에서는 랜덤 노이즈와 시간 단계 t로 노이즈가 추가된 이미지를 얻고 해당 이미지를 보고 모델이 노이즈를 예측 - -```python -def p_losses(self, x_start, t, noise = None): - b, c, h, w = x_start.shape - noise = default(noise, lambda: torch.randn_like(x_start)) - - # noise sample - - x = self.q_sample(x_start = x_start, t = t, noise = noise) - - # if doing self-conditioning, 50% of the time, predict x_start from current set of times - # and condition with unet with that - # this technique will slow down training by 25%, but seems to lower FID significantly - - x_self_cond = None - if self.self_condition and random() < 0.5: - with torch.no_grad(): - x_self_cond = self.model_predictions(x, t).pred_x_start - x_self_cond.detach_() - - # predict and take gradient step - - model_out = self.model(x, t, x_self_cond) - - if self.objective == 'pred_noise': - target = noise - elif self.objective == 'pred_x0': - target = x_start - elif self.objective == 'pred_v': - v = self.predict_v(x_start, t, noise) - target = v - else: - raise ValueError(f'unknown objective {self.objective}') - - loss = self.loss_fn(model_out, target, reduction = 'none') - loss = reduce(loss, 'b ... -> b (...)', 'mean') - - loss = loss * extract(self.loss_weight, t, loss.shape) - return loss.mean() - ``` - -- Algorithm 2: Sampling - - Network를 학습하고 나면, gaussian noise에서 시작해서 순차적으로 denoising 하는 것이 가능하다. (by parameterized markovian chain) - - 코드에서는 noise 제거 후 소량의 noise를 다시 추가하고 있음 - -```python -@torch.no_grad() -def p_sample(self, x, t: int, x_self_cond = None): - b, *_, device = *x.shape, x.device - batched_times = torch.full((b,), t, device = x.device, dtype = torch.long) - model_mean, _, model_log_variance, x_start = self.p_mean_variance(x = x, t = batched_times, x_self_cond = x_self_cond, clip_denoised = True) - noise = torch.randn_like(x) if t > 0 else 0. # no noise if t == 0 - pred_img = model_mean + (0.5 * model_log_variance).exp() * noise - return pred_img, x_start -``` - - - -# 4. Experiments - -- T: 1000 -- backbone: U-Net -각 down/upsampling 단계는 ResNet/ConvNext 블록 2개 + (groupnorm + attention + residual) + down/upsampling으로 구성됨 - -```python -block_klass = partial(ResnetBlock, groups = resnet_block_groups) - -self.downs.append(nn.ModuleList([ - block_klass(dim_in, dim_in, time_emb_dim = time_dim), - block_klass(dim_in, dim_in, time_emb_dim = time_dim), - Residual(PreNorm(dim_in, LinearAttention(dim_in))), - Downsample(dim_in, dim_out) if not is_last else nn.Conv2d(dim_in, dim_out, 3, padding = 1) - ])) - - self.ups.append(nn.ModuleList([ - block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim), - block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim), - Residual(PreNorm(dim_out, LinearAttention(dim_out))), - Upsample(dim_out, dim_in) if not is_last else nn.Conv2d(dim_out, dim_in, 3, padding = 1) - ])) - -``` - - -```python -class Unet(nn.Module): - def __init__( - self, - dim, - init_dim = None, - out_dim = None, - dim_mults=(1, 2, 4, 8), - channels = 3, - self_condition = False, - resnet_block_groups = 8, - learned_variance = False, - learned_sinusoidal_cond = False, - random_fourier_features = False, - learned_sinusoidal_dim = 16 - ): - super().__init__() - - # determine dimensions - - self.channels = channels - self.self_condition = self_condition - input_channels = channels * (2 if self_condition else 1) - - init_dim = default(init_dim, dim) - self.init_conv = nn.Conv2d(input_channels, init_dim, 7, padding = 3) - - dims = [init_dim, *map(lambda m: dim * m, dim_mults)] - in_out = list(zip(dims[:-1], dims[1:])) - - block_klass = partial(ResnetBlock, groups = resnet_block_groups) - - # time embeddings - - time_dim = dim * 4 - - self.random_or_learned_sinusoidal_cond = learned_sinusoidal_cond or random_fourier_features - - if self.random_or_learned_sinusoidal_cond: - sinu_pos_emb = RandomOrLearnedSinusoidalPosEmb(learned_sinusoidal_dim, random_fourier_features) - fourier_dim = learned_sinusoidal_dim + 1 - else: - sinu_pos_emb = SinusoidalPosEmb(dim) - fourier_dim = dim - - self.time_mlp = nn.Sequential( - sinu_pos_emb, - nn.Linear(fourier_dim, time_dim), - nn.GELU(), - nn.Linear(time_dim, time_dim) - ) - - # layers - - self.downs = nn.ModuleList([]) - self.ups = nn.ModuleList([]) - num_resolutions = len(in_out) - - for ind, (dim_in, dim_out) in enumerate(in_out): - is_last = ind >= (num_resolutions - 1) - - self.downs.append(nn.ModuleList([ - block_klass(dim_in, dim_in, time_emb_dim = time_dim), - block_klass(dim_in, dim_in, time_emb_dim = time_dim), - Residual(PreNorm(dim_in, LinearAttention(dim_in))), - Downsample(dim_in, dim_out) if not is_last else nn.Conv2d(dim_in, dim_out, 3, padding = 1) - ])) - - mid_dim = dims[-1] - self.mid_block1 = block_klass(mid_dim, mid_dim, time_emb_dim = time_dim) - self.mid_attn = Residual(PreNorm(mid_dim, Attention(mid_dim))) - self.mid_block2 = block_klass(mid_dim, mid_dim, time_emb_dim = time_dim) - - for ind, (dim_in, dim_out) in enumerate(reversed(in_out)): - is_last = ind == (len(in_out) - 1) - - self.ups.append(nn.ModuleList([ - block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim), - block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim), - Residual(PreNorm(dim_out, LinearAttention(dim_out))), - Upsample(dim_out, dim_in) if not is_last else nn.Conv2d(dim_out, dim_in, 3, padding = 1) - ])) - - default_out_dim = channels * (1 if not learned_variance else 2) - self.out_dim = default(out_dim, default_out_dim) - - self.final_res_block = block_klass(dim * 2, dim, time_emb_dim = time_dim) - self.final_conv = nn.Conv2d(dim, self.out_dim, 1) - - def forward(self, x, time, x_self_cond = None): - if self.self_condition: - x_self_cond = default(x_self_cond, lambda: torch.zeros_like(x)) - x = torch.cat((x_self_cond, x), dim = 1) - - x = self.init_conv(x) - r = x.clone() - - t = self.time_mlp(time) - - h = [] - - for block1, block2, attn, downsample in self.downs: - x = block1(x, t) - h.append(x) - - x = block2(x, t) - x = attn(x) - h.append(x) - - x = downsample(x) - - x = self.mid_block1(x, t) - x = self.mid_attn(x) - x = self.mid_block2(x, t) - - for block1, block2, attn, upsample in self.ups: - x = torch.cat((x, h.pop()), dim = 1) - x = block1(x, t) - - x = torch.cat((x, h.pop()), dim = 1) - x = block2(x, t) - x = attn(x) - - x = upsample(x) - - x = torch.cat((x, r), dim = 1) - - x = self.final_res_block(x, t) - return self.final_conv(x) -``` - - - -- 16 x 16 feature map resolution에 self-attention. conv에서 차원을 3배로 늘리고 q,k,v로 분해. - -```python -class Attention(nn.Module): - def __init__(self, dim, heads = 4, dim_head = 32): - super().__init__() - self.scale = dim_head ** -0.5 - self.heads = heads - hidden_dim = dim_head * heads - - self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False) - self.to_out = nn.Conv2d(hidden_dim, dim, 1) - - def forward(self, x): - b, c, h, w = x.shape - qkv = self.to_qkv(x).chunk(3, dim = 1) - q, k, v = map(lambda t: rearrange(t, 'b (h c) x y -> b h c (x y)', h = self.heads), qkv) - - q = q * self.scale - - sim = einsum('b h d i, b h d j -> b h i j', q, k) - attn = sim.softmax(dim = -1) - out = einsum('b h i j, b h d j -> b h i d', attn, v) - - out = rearrange(out, 'b h (x y) d -> b (h d) x y', x = h, y = w) - return self.to_out(out) -``` - -- Linear attention -```python -class LinearAttention(nn.Module): - def __init__(self, dim, heads = 4, dim_head = 32): - super().__init__() - self.scale = dim_head ** -0.5 - self.heads = heads - hidden_dim = dim_head * heads - self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False) - - self.to_out = nn.Sequential( - nn.Conv2d(hidden_dim, dim, 1), - LayerNorm(dim) - ) - - def forward(self, x): - b, c, h, w = x.shape - qkv = self.to_qkv(x).chunk(3, dim = 1) - q, k, v = map(lambda t: rearrange(t, 'b (h c) x y -> b h c (x y)', h = self.heads), qkv) - - q = q.softmax(dim = -2) - k = k.softmax(dim = -1) - - q = q * self.scale - v = v / (h * w) - - context = torch.einsum('b h d n, b h e n -> b h d e', k, v) - - out = torch.einsum('b h d e, b h d n -> b h e n', context, q) - out = rearrange(out, 'b h c (x y) -> b (h c) x y', h = self.heads, x = h, y = w) - return self.to_out(out) -``` - -- Diffusion time $T$는 각 residual block에 transformer sinusoidal positional embedding이 추가돼서 구분됨 - -```python -class SinusoidalPosEmb(nn.Module): - def __init__(self, dim): - super().__init__() - self.dim = dim - - def forward(self, x): - device = x.device - half_dim = self.dim // 2 - emb = math.log(10000) / (half_dim - 1) - emb = torch.exp(torch.arange(half_dim, device=device) * -emb) - emb = x[:, None] * emb[None, :] - emb = torch.cat((emb.sin(), emb.cos()), dim=-1) - return emb -``` - -## 4-1. Sample quality - -:::{figure-md} -DDPM_13 - -Train score of DDPM \ (source: https://arxiv.org/abs/2006.11239) -::: - -FID, IS로 metric 계산. Unconditional model인데도 conditional model보다 우월. Codelength에서 차이가 없기 때문에 overfitting의 가능성도 적음. - -> - **FID score**: Inception V3으로 이미지의 분포를 계산한 metric -> - **Unconditional model**: 한번 dataset에 학습되면 추가적인 context 없이 image를 생성 -> - **Conditional model**: Class, label 등의 추가 정보를 받아 image를 생성 - -$\mu$보다 $\epsilon$을 계산하는 것이 성적이 좋고, fixed variance를 사용했을 때에도 성능이 감소하지 않음. - - - - +```{admonition} Information +- **Title:** Denoising Diffusion Probabilistic Models (NeurIPS 2020) + +- **Reference** + - Paper: [https://arxiv.org/abs/2006.11239](https://arxiv.org/abs/2006.11239) + - Code: [PyTorch implementation:](https://github.com/lucidrains/denoising-diffusion-pytorch) + - Review: [PR-409: Denoising Diffusion Probabilistic Models](https://www.youtube.com/watch?v=1j0W_lu55nc) + +- **Author:** Beomsoo Park + +- **Last updated on Apr. 19, 2023** +``` + + +# DDPM + + +:::{figure-md} +DDPM_01 + +DDPM samples \ (source: https://arxiv.org/abs/2006.11239) +::: + + +--- +# 1. Introduction + +:::{figure-md} +DDPM_02 + +Diffusion models \ (source: https://velog.io/@yetsyl0705/What-are-Diffusion-Models) +::: + +**Diffusion model**은 **variational inference로 학습시켜 데이터를 생성하는 parameterized Markov chain**. Diffusion model은 Markov가 데이터가 normal distribution의 형태를 할 때까지 **noise를 더해가는 diffusion process**와 **이를 역으로 거치며 학습하는 reverse process**로 구성됨. + +Diffusion model은 정의하기 쉽고 학습시키는 것도 편리함. 또한 높은 품질의 sample(output)도 생성이 가능. + +> - **Variational inference(변분추론)**: 사후확률(posterior) 분포 $p(z +|x)$를 다루기 쉬운 확률분포 $q(z)$로 근사(approximation)하는 것 +> - **Parameterize**: 하나의 표현식에 대해 다른 parameter를 사용하여 다시 표현하는 과정. 이 과정에서 보통 parameter의 개수를 표현 식의 차수보다 적은 수로 선택(ex. 3차 표현식 --> 2개 parameter 사용)하므로, 낮은 차수로의 mapping 함수(ex. 3D --> 2D)가 생성 +> - **Markov chain**: 어떤 상태에서 다른 상태로 넘어갈 때, 바로 전 단계의 상태에만 영향을 받는 확률 과정 + +--- +# 2. Background + +:::{figure-md} +DDPM_03 + +Graphical model of DDPM \ (source: https://arxiv.org/abs/2006.11239) +::: + +## 2-1. Forward(diffusion) process $q(\mathbf{x}_t|\mathbf{x}_{t-1})$ + +$$ +q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right):=\prod_{t=1}^T q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right), \quad q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right):=\mathcal{N}\left(\mathbf{x}_t ; \sqrt{1-\beta_t} \mathbf{x}_{t-1}, \beta_t \mathbf{I}\right) +$$ + +Markov chain으로 **data에 noise를 추가**하는 과정. Noise를 추가할 때 **variance schedule $\beta_1,,,\beta_T$로 scaling**을 한 후 더해준다. +- $\beta_t = 1$이면 mean인 $\sqrt{1-\beta_t}\mathbf{x}_{t-1} = 0$. 이전 정보를 갖지 못하고 노이즈가 증가함 +- 단순히 noise만을 더해주는게 아니라 $\sqrt{1-\beta_t}$로 scaling하는 이유는 variance가 발산하는 것을 막기 위함 +- $q(x_1|x_0)$: $x_0$에 noise를 추가해 $x_1$을 만드는 과정 +- $x_T$는 완전 destroy된 noise 상태 ~ $N(x_T;0, I)$ + +## 2-2. Reverse process $p(\mathbf{x}_{t-1}|\mathbf{x}_t)$ + +$$ +p_\theta\left(\mathbf{x}_{0: T}\right):=p\left(\mathbf{x}_T\right) \prod_{t=1}^T p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right), \quad p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right):=\mathcal{N}\left(\mathbf{x}_{t-1} ; \boldsymbol{\mu}_\theta\left(\mathbf{x}_t, t\right), \boldsymbol{\Sigma}_\theta\left(\mathbf{x}_t, t\right)\right) +$$ + +Reverse process로 가우시안 노이즈를 사용하는 이유는 1994년 논문에 forward process가 가우시안이면 reverse process도 가우시안으로 쓰면 된다라는 증명이 있다고 함. + +여기서 우리가 해야 할 것은 **$\mathbf{x}_t$를 보고 $\mathbf{x}_{t-1}$의 평균 $\mu_\theta$과 분산 $\Sigma_\theta$을 예측해내는 것**. +- Hierarachical VAE에서의 decoding 과정과 비슷함 +- $\mu_\theta$과 분산 $\Sigma_\theta$는 학습 가능한 parameter + + +## 2-3. Loss Function $L$ + +Diffusion model의 목적은 **noise를 어떻게 제거할 것인가?**이다. $x_t$가 들어왔을 때 $x_{t-1}$을 예측할 수 있다면 $x_0$ 또한 예측이 가능해짐. + +$$ +\mathbb{E}\left[-\log p_\theta\left(\mathbf{x}_0\right)\right] \leq \mathbb{E}_q\left[-\log \frac{p_\theta\left(\mathbf{x}_{0: T}\right)}{q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right)}\right]=\mathbb{E}_q\left[-\log p\left(\mathbf{x}_T\right)-\sum_{t \geq 1} \log \frac{p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)}{q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right)}\right]=: L +$$ + +본 논문에서는 **negative log likelihood를 최소화**하는 방향으로 진행. 위 수식을 **ELBO**(Evidence of Lower BOund)로 우항과 같이 정리하고 이를 풀어내면 + +> ELBO의 역할은 우리가 관찰한 P(z|x)가 다루기 힘든 분포를 이루고 있을 때 이를 조금 더 다루기 쉬운 분포인 Q(x)로 대신 표현하려 하는 과정에서 **두 분포 (P(z|x)와 Q(x))의 차이 (KL Divergence)를 최소화** 하기 위해 사용된다. + +$$ +\mathbb{E}_q[\underbrace{D_{\mathrm{KL}}\left(q\left(\mathbf{x}_T \mid \mathbf{x}_0\right) \| p\left(\mathbf{x}_T\right)\right)}_{L_T}+\sum_{t>1} \underbrace{D_{\mathrm{KL}}\left(q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t, \mathbf{x}_0\right) \| p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)\right)}_{L_{t-1}} \underbrace{-\log p_\theta\left(\mathbf{x}_0 \mid \mathbf{x}_1\right)}_{L_0}] +$$ + +와 같은 결과가 나온다. + +- $L_T$: Regularization term으로 $\beta_t$를 학습시킴 +- $L_{t-1}$: Reconstruction term으로 매 단계에서 noise를 지우는 지움 +- $L_0$: Reconstruction term으로 최종 단계에서 image를 생성 + +--- +# 3. Diffusion models and denoising encoders + +DDPM에서는 **inductive bias를 늘려** 모델을 더 stable하고 성능도 개선할 수 있었음. + +> Inductive bias: 학습 모델이 지금까지 만나보지 못했던 상황에서 정확한 예측을 하기 위해 사용하는 **추가적인 가정**, 즉 우리가 풀려는 문제에 대한 정보를 모델에 적용하는 것 + + +## 3-1. Forward process and $L_T$ + +**$\beta_t$를 고정**했더니 학습이 잘됨. 10^-4 ~ 0.02로 linear하게 image에 가까울수록 noise를 적게 주는 방식으로 설정. + +따라서 $q$에는 학습 가능한 parameter가 없어 **$L_T$는 0이 되기 때문에 삭제**할 수 있었음. + +## 3-2. Reverse process and $L_{1:T-1}$ + + +$$ +L_{t-1}=D_{K L}\left(q\left(x_{t-1} \mid x_t, x_0\right) \| p_\theta\left(x_{t-1} \mid x_t\right)\right) +$$ + +- $ +q\left(x_{t-1} \mid x_t, x_0\right)=N\left(x_{t-1} ; \tilde{\mu}\left(x_t, x_0\right), \tilde{\beta}_t \mathrm{I}\right) +$ +- $ +p_\theta\left(x_{t-1} \mid x_t\right)=\mathcal{N}\left(x_{t-1} ; \mu_\theta\left(x_t, t\right), \sum_\theta\left(x_t, t\right)\right) +$ + + +$L_{1:T-1}$는 forward progress posterior를 예측하는 loss. $\mathbf{x}_{t-1}$에서 noise를 더해 $\mathbf{x}_{t}$를 만들었을때, 그 과정을 복원 $p(\mathbf{x}_{t-1}|\mathbf{x}_t)$ 하는 과정을 학습. + +:::{figure-md} +DDPM_08 + +Loss Simplication \ (source: https://velog.io/@sjina0722/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Denoising-Diffusion-Probabilistic-Models) +::: + +- $\Sigma_\theta$: $\beta$를 상수로 가정했고 $p(\mathbf{x}_{t-1}|\mathbf{x}_t)$의 variance가 $\beta$에 영향을 받기 때문에 학습시키지 않아도 된다고 생각해 **variance term을 제거**함. + +:::{figure-md} +DDPM_09 + +Residual Estimation \ (source: https://velog.io/@sjina0722/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Denoising-Diffusion-Probabilistic-Models) +::: + +- $\mu_\theta$: DDPM에서는 $\mu_\theta$를 바로 구하지 않고 **residual $\epsilon_\theta$만 구해 정확도를 높임**. + +## 3-3. Data scaling, reverse process decoder and $L_0$ + +$$ +\begin{aligned} +p_\theta\left(\mathbf{x}_0 \mid \mathbf{x}_1\right) & =\prod_{i=1}^D \int_{\delta_{-}\left(x_0^i\right)}^{\delta_{+}\left(x_0^i\right)} \mathcal{N}\left(x ; \mu_\theta^i\left(\mathbf{x}_1, 1\right), \sigma_1^2\right) d x \\ +\delta_{+}(x) & =\left\{\begin{array}{ll} +\infty & \text { if } x=1 \\ +x+\frac{1}{255} & \text { if } x<1 +\end{array} \quad \delta_{-}(x)= \begin{cases}-\infty & \text { if } x=-1 \\ +x-\frac{1}{255} & \text { if } x>-1\end{cases} \right. +\end{aligned} +$$ + +[0, 255]의 image를 [-1,1] 사이로 linearly mapping. Sampling 마지막 단계에는 noise를 추가하지 않음. + + +$L_0$은 두 normal distribution 사이의 KL divergence를 나타냄. +- $D$: Data dimensionality +- $i$: 좌표 + + +## 3-4. Simplified training objective + +:::{figure-md} +DDPM_10 + +Simplified training objective \ (source: https://velog.io/@sjina0722/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Denoising-Diffusion-Probabilistic-Models) +::: + +:::{figure-md} +DDPM_11 + +Final Loss \ (source: https://velog.io/@sjina0722/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Denoising-Diffusion-Probabilistic-Models) +::: + +최종 loss는 위와 같이 나타난다. Ground truth - estimated output간 MSE loss를 줄이는 과정이 denoising과 비슷해 DDPM이라는 이름이 붙음. + +Simplified objective을 통해 diffusion process를 학습하면 매우 작은 t 에서뿐만 아니라 **큰 t에 대해서도 network 학습이 가능하기 때문에 매우 효과적**. + +:::{figure-md} +DDPM_12 + +Psuedo code of training process \ (source: https://arxiv.org/abs/2006.11239) +::: + +- Algorithm 1: Training + - Noise를 더해나가는 과정, network($\epsilon_\theta$, $p_\theta$)가 t step에서 noise($\epsilon$)가 얼마만큼 더해졌는지를 학습한다. + - 학습 시에는 특정 step의 이미지가 얼마나 gaussian noise가 추가되었는지를 예측하도록 학습된다. + - 코드에서는 랜덤 노이즈와 시간 단계 t로 노이즈가 추가된 이미지를 얻고 해당 이미지를 보고 모델이 노이즈를 예측 + +```python +def p_losses(self, x_start, t, noise = None): + b, c, h, w = x_start.shape + noise = default(noise, lambda: torch.randn_like(x_start)) + + # noise sample + + x = self.q_sample(x_start = x_start, t = t, noise = noise) + + # if doing self-conditioning, 50% of the time, predict x_start from current set of times + # and condition with unet with that + # this technique will slow down training by 25%, but seems to lower FID significantly + + x_self_cond = None + if self.self_condition and random() < 0.5: + with torch.no_grad(): + x_self_cond = self.model_predictions(x, t).pred_x_start + x_self_cond.detach_() + + # predict and take gradient step + + model_out = self.model(x, t, x_self_cond) + + if self.objective == 'pred_noise': + target = noise + elif self.objective == 'pred_x0': + target = x_start + elif self.objective == 'pred_v': + v = self.predict_v(x_start, t, noise) + target = v + else: + raise ValueError(f'unknown objective {self.objective}') + + loss = self.loss_fn(model_out, target, reduction = 'none') + loss = reduce(loss, 'b ... -> b (...)', 'mean') + + loss = loss * extract(self.loss_weight, t, loss.shape) + return loss.mean() + ``` + +- Algorithm 2: Sampling + - Network를 학습하고 나면, gaussian noise에서 시작해서 순차적으로 denoising 하는 것이 가능하다. (by parameterized markovian chain) + - 코드에서는 noise 제거 후 소량의 noise를 다시 추가하고 있음 + +```python +@torch.no_grad() +def p_sample(self, x, t: int, x_self_cond = None): + b, *_, device = *x.shape, x.device + batched_times = torch.full((b,), t, device = x.device, dtype = torch.long) + model_mean, _, model_log_variance, x_start = self.p_mean_variance(x = x, t = batched_times, x_self_cond = x_self_cond, clip_denoised = True) + noise = torch.randn_like(x) if t > 0 else 0. # no noise if t == 0 + pred_img = model_mean + (0.5 * model_log_variance).exp() * noise + return pred_img, x_start +``` + + + +# 4. Experiments + +- T: 1000 +- backbone: U-Net +각 down/upsampling 단계는 ResNet/ConvNext 블록 2개 + (groupnorm + attention + residual) + down/upsampling으로 구성됨 + +```python +block_klass = partial(ResnetBlock, groups = resnet_block_groups) + +self.downs.append(nn.ModuleList([ + block_klass(dim_in, dim_in, time_emb_dim = time_dim), + block_klass(dim_in, dim_in, time_emb_dim = time_dim), + Residual(PreNorm(dim_in, LinearAttention(dim_in))), + Downsample(dim_in, dim_out) if not is_last else nn.Conv2d(dim_in, dim_out, 3, padding = 1) + ])) + + self.ups.append(nn.ModuleList([ + block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim), + block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim), + Residual(PreNorm(dim_out, LinearAttention(dim_out))), + Upsample(dim_out, dim_in) if not is_last else nn.Conv2d(dim_out, dim_in, 3, padding = 1) + ])) + +``` + + +```python +class Unet(nn.Module): + def __init__( + self, + dim, + init_dim = None, + out_dim = None, + dim_mults=(1, 2, 4, 8), + channels = 3, + self_condition = False, + resnet_block_groups = 8, + learned_variance = False, + learned_sinusoidal_cond = False, + random_fourier_features = False, + learned_sinusoidal_dim = 16 + ): + super().__init__() + + # determine dimensions + + self.channels = channels + self.self_condition = self_condition + input_channels = channels * (2 if self_condition else 1) + + init_dim = default(init_dim, dim) + self.init_conv = nn.Conv2d(input_channels, init_dim, 7, padding = 3) + + dims = [init_dim, *map(lambda m: dim * m, dim_mults)] + in_out = list(zip(dims[:-1], dims[1:])) + + block_klass = partial(ResnetBlock, groups = resnet_block_groups) + + # time embeddings + + time_dim = dim * 4 + + self.random_or_learned_sinusoidal_cond = learned_sinusoidal_cond or random_fourier_features + + if self.random_or_learned_sinusoidal_cond: + sinu_pos_emb = RandomOrLearnedSinusoidalPosEmb(learned_sinusoidal_dim, random_fourier_features) + fourier_dim = learned_sinusoidal_dim + 1 + else: + sinu_pos_emb = SinusoidalPosEmb(dim) + fourier_dim = dim + + self.time_mlp = nn.Sequential( + sinu_pos_emb, + nn.Linear(fourier_dim, time_dim), + nn.GELU(), + nn.Linear(time_dim, time_dim) + ) + + # layers + + self.downs = nn.ModuleList([]) + self.ups = nn.ModuleList([]) + num_resolutions = len(in_out) + + for ind, (dim_in, dim_out) in enumerate(in_out): + is_last = ind >= (num_resolutions - 1) + + self.downs.append(nn.ModuleList([ + block_klass(dim_in, dim_in, time_emb_dim = time_dim), + block_klass(dim_in, dim_in, time_emb_dim = time_dim), + Residual(PreNorm(dim_in, LinearAttention(dim_in))), + Downsample(dim_in, dim_out) if not is_last else nn.Conv2d(dim_in, dim_out, 3, padding = 1) + ])) + + mid_dim = dims[-1] + self.mid_block1 = block_klass(mid_dim, mid_dim, time_emb_dim = time_dim) + self.mid_attn = Residual(PreNorm(mid_dim, Attention(mid_dim))) + self.mid_block2 = block_klass(mid_dim, mid_dim, time_emb_dim = time_dim) + + for ind, (dim_in, dim_out) in enumerate(reversed(in_out)): + is_last = ind == (len(in_out) - 1) + + self.ups.append(nn.ModuleList([ + block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim), + block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim), + Residual(PreNorm(dim_out, LinearAttention(dim_out))), + Upsample(dim_out, dim_in) if not is_last else nn.Conv2d(dim_out, dim_in, 3, padding = 1) + ])) + + default_out_dim = channels * (1 if not learned_variance else 2) + self.out_dim = default(out_dim, default_out_dim) + + self.final_res_block = block_klass(dim * 2, dim, time_emb_dim = time_dim) + self.final_conv = nn.Conv2d(dim, self.out_dim, 1) + + def forward(self, x, time, x_self_cond = None): + if self.self_condition: + x_self_cond = default(x_self_cond, lambda: torch.zeros_like(x)) + x = torch.cat((x_self_cond, x), dim = 1) + + x = self.init_conv(x) + r = x.clone() + + t = self.time_mlp(time) + + h = [] + + for block1, block2, attn, downsample in self.downs: + x = block1(x, t) + h.append(x) + + x = block2(x, t) + x = attn(x) + h.append(x) + + x = downsample(x) + + x = self.mid_block1(x, t) + x = self.mid_attn(x) + x = self.mid_block2(x, t) + + for block1, block2, attn, upsample in self.ups: + x = torch.cat((x, h.pop()), dim = 1) + x = block1(x, t) + + x = torch.cat((x, h.pop()), dim = 1) + x = block2(x, t) + x = attn(x) + + x = upsample(x) + + x = torch.cat((x, r), dim = 1) + + x = self.final_res_block(x, t) + return self.final_conv(x) +``` + + + +- 16 x 16 feature map resolution에 self-attention. conv에서 차원을 3배로 늘리고 q,k,v로 분해. + +```python +class Attention(nn.Module): + def __init__(self, dim, heads = 4, dim_head = 32): + super().__init__() + self.scale = dim_head ** -0.5 + self.heads = heads + hidden_dim = dim_head * heads + + self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False) + self.to_out = nn.Conv2d(hidden_dim, dim, 1) + + def forward(self, x): + b, c, h, w = x.shape + qkv = self.to_qkv(x).chunk(3, dim = 1) + q, k, v = map(lambda t: rearrange(t, 'b (h c) x y -> b h c (x y)', h = self.heads), qkv) + + q = q * self.scale + + sim = einsum('b h d i, b h d j -> b h i j', q, k) + attn = sim.softmax(dim = -1) + out = einsum('b h i j, b h d j -> b h i d', attn, v) + + out = rearrange(out, 'b h (x y) d -> b (h d) x y', x = h, y = w) + return self.to_out(out) +``` + +- Linear attention +```python +class LinearAttention(nn.Module): + def __init__(self, dim, heads = 4, dim_head = 32): + super().__init__() + self.scale = dim_head ** -0.5 + self.heads = heads + hidden_dim = dim_head * heads + self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False) + + self.to_out = nn.Sequential( + nn.Conv2d(hidden_dim, dim, 1), + LayerNorm(dim) + ) + + def forward(self, x): + b, c, h, w = x.shape + qkv = self.to_qkv(x).chunk(3, dim = 1) + q, k, v = map(lambda t: rearrange(t, 'b (h c) x y -> b h c (x y)', h = self.heads), qkv) + + q = q.softmax(dim = -2) + k = k.softmax(dim = -1) + + q = q * self.scale + v = v / (h * w) + + context = torch.einsum('b h d n, b h e n -> b h d e', k, v) + + out = torch.einsum('b h d e, b h d n -> b h e n', context, q) + out = rearrange(out, 'b h c (x y) -> b (h c) x y', h = self.heads, x = h, y = w) + return self.to_out(out) +``` + +- Diffusion time $T$는 각 residual block에 transformer sinusoidal positional embedding이 추가돼서 구분됨 + +```python +class SinusoidalPosEmb(nn.Module): + def __init__(self, dim): + super().__init__() + self.dim = dim + + def forward(self, x): + device = x.device + half_dim = self.dim // 2 + emb = math.log(10000) / (half_dim - 1) + emb = torch.exp(torch.arange(half_dim, device=device) * -emb) + emb = x[:, None] * emb[None, :] + emb = torch.cat((emb.sin(), emb.cos()), dim=-1) + return emb +``` + +## 4-1. Sample quality + +:::{figure-md} +DDPM_13 + +Train score of DDPM \ (source: https://arxiv.org/abs/2006.11239) +::: + +FID, IS로 metric 계산. Unconditional model인데도 conditional model보다 우월. Codelength에서 차이가 없기 때문에 overfitting의 가능성도 적음. + +> - **FID score**: Inception V3으로 이미지의 분포를 계산한 metric +> - **Unconditional model**: 한번 dataset에 학습되면 추가적인 context 없이 image를 생성 +> - **Conditional model**: Class, label 등의 추가 정보를 받아 image를 생성 + +$\mu$보다 $\epsilon$을 계산하는 것이 성적이 좋고, fixed variance를 사용했을 때에도 성능이 감소하지 않음. + + + + diff --git a/_sources/docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space.md b/_sources/docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space.md old mode 100644 new mode 100755 index 7b864dad..2ad05c3d --- a/_sources/docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space.md +++ b/_sources/docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space.md @@ -1,401 +1,401 @@ -``` {admonition} Information -- **Title:** Diffusion Models already have a Semantic Latent Space (ICLR 2023) - -- **Reference** - - Paper: [https://arxiv.org/abs/2210.10960](https://arxiv.org/abs/2210.10960) - -- **Author:** Sehwan Park - -- **Last updated on Nov. 18, 2023** -``` - - - -# Diffusion Models already have a Semantic Latent Space - -## Abstract - -Diffusion model은 많은 domain에서 좋은 성능을 보이지만 generative process를 control하는 semantic latent space가 부족하다. 논문에서는 diffusion model속에서 semantic latent space를 발견하기 위한 asymmetric reverse process(asyrp)를 제안하고 h-space라고 명칭한 semantic latent space의 좋은 특성(homogeneity, linearity, robustness, consistency across timesteps)들을 보여준다. 추가적으로 editing strength와 quality deficiency를 기준으로 삼고 더 좋은 image-image translation을 위한 Generative Process Design을 소개한다. - - - -## 1. Introduction - -:::{figure-md} - -Asyrp_1 - -Manipulation approaches for diffusion models -::: - -(a) Image guidance는 unconditional한 latent variable에 guiding image의 latent variable을 합치는 방식을 사용한다. 그러나 latent variable을 둘 다 이용하면서 명확하게 control하기가 쉽지 않다. - -(b) Classifier guidance는 diffusion model에 classifier를 추가하여 generative process를 거치는 동안 latent variable이 어떤 class인지 분류하고 target class에 가까워지도록 score를 부여하는 방식으로 작동한다. 그러나 latent variable들에 대해 classify를 실행해야 하기에 pretrained model을 사용하기가 힘들어 직접 학습을 시켜야 하기에 시간적으로, 비용적으로 부담이 된다. - -(c) DiffusionCLIP - -(d) Diffusion Models already have a Semantic Latent Space는 original image의 특성을 edit하기 위한 아주 좋은 특성을 가지고 있는 semantic latent space를 frozen diffusion model에서 발견하였고 이를 h-space라고 칭한다. h-space에는 다양한 좋은 특성들이 존재한다. versatile editing과 quality boosting을 위해 새로운 generative process를 design하여 제안한다. h-space는 frozen pretrained diffusion model에서 semantic latent space로써의 첫 발견사례이다. - - - -## 2. Background - -### 2.1 Denoising Diffusion Probability Model(DDPM) - -DDPM에서는 임의의 time step t로 부터 noise가 껴있는 image $x_t$의 $\epsilon_t$가 얼만큼인지 예측한다. 예측한 $\epsilon_t$를 이용하여 noise가 일부 제거된 이전 step의 mean($\mu_{\theta}(x_t)$)을 구할 수 있고 variance($\sum_{\theta}(x_t)$)는 constant한 값으로 고정시킨다. DDPM에서 제시한 forward process와 reverse process는 다음과 같다. DDPM에서의 $\sigma_t^2 = \beta_t$이다. - - -$$ -q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_{t}}x_{t-1}, (1-\alpha_t)I) -$$ - -$$ -p_{\theta}(x_{t-1}|x_t) := \mathcal{N}(\mu_{\theta}(x_t), \sum_{\theta}(x_t)) -$$ - -$$ -x_{t-1} = \frac{1}{\sqrt{1-\beta_t}}\bigg(x_t - \frac{\beta_t}{\sqrt{1-\alpha_t}}\epsilon_t^\theta(x_t)\bigg) + \sigma_t\mathcal{z_t} -$$ - - - -### 2.2 Denoising Diffusion Implicit Model(DDIM) - -DDIM에서는 non-Markovian process를 이용해 또 다른 관점의 reverse process를 제시하였고, DDPM과 DDIM 모두 general하게 적용되는 Diffusion process에 대한 식을 보여주었다. $\sigma_t = \eta\sqrt{(1-\alpha_{t-1}) / (1-\alpha_t)} \sqrt{1-\alpha_t/\alpha_{t-1}}$이다. - - $\eta$=1인 경우 DDPM이 되고 stochastic해지며, $\eta$=0인 경우 DDIM이 되고 deterministic해진다. - - -$$ -q_{\sigma}(x_{t-1}|x_t,x_0) = \mathcal{N}(\sqrt{\alpha_{t-1}}x_0 + \sqrt{1-\alpha_{t-1}-\sigma_t^2} \cdot \cfrac{x_t - \sqrt{\alpha_t}x_0}{\sqrt{1-\alpha_t}}, \sigma_t^2I) -$$ - -$$ -x_{t-1} = \sqrt{\alpha_{t-1}}\underbrace{\bigg(\frac{x_t - \sqrt{1-\alpha_t}\epsilon_t^\theta(x_t)}{\sqrt{\alpha_t}}\bigg)}_{\textrm{predicted } x_0} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot \epsilon_t^\theta(x_t) }_{\textrm{direction pointing to }x_t} + \sigma_t\mathcal{z_t} -$$ - -### 2.3 Image Manipulation with CLIP - -CLIP은 Image Encoder와 Text Encoder를 이용하여 image와 text간의 embedding을 학습한다. 편집된 이미지와 대상 설명 간의 cosine distance를 직접 최소화하는 대신 cosine distance를 사용한 directional loss를 사용하여 mode collapse없이 균일한 editing을 가능하게 했다고 한다. - -$\Delta T = \mathrm{E}_T(y^{target}) - \mathrm{E}_T(y^{source}) $
$\Delta I = \mathrm{E}_I(x^{edit}) - \mathrm{E}_I(x^{source})$ - - -$$ -\mathcal{L}_{direction} (x^{edit}, y^{target};x^{source},y^{source}) := 1 - \cfrac{\Delta I \cdot \Delta T}{\parallel\Delta I\parallel \parallel\Delta T\parallel} -$$ - - - -## 3. Discovering Semantic Latent Space In Diffusion Models - -Editiing을 하는 과정에서 naive approach를 통해서는 editing이 잘 이루어지지 않는다. 이 chapter에서는 왜 잘 이루어지지 않는지에 대한 설명을 하고 이를 해결하는 새로운 controllable한 한 reverse process인 Asymmetric Reverse Process(Asyrp)를 제안한다. - -DDIM에서 $x_{t-1}$에 대한 수식을 설명하였는데 이 chapter부터는 "predicted $x_0$"부분을 $\mathrm{P}_t(\epsilon_t^{\theta}(x_t))$ 즉 $\mathrm{P}_t$라고 설정하고, "direction pointing to $x_t$"부분을 $\mathrm{D}_t(\epsilon_t^{\theta}(x_t))$ 즉 $\mathrm{D}_t$라고 설정하였다. - -$\mathrm{P}_t$는 latent variable로 부터 $x_0$를 예측하는 reverse process와 같은 역할을 담당하고 $\mathrm{D}_t$는 다시 noise를 추가해 latent variable로 돌아가기에 forward process와 같은 역할을 담당한다. - - -$$ -x_{t-1} = \sqrt{\alpha_{t-1}}\underbrace{\bigg(\frac{x_t - \sqrt{1-\alpha_t}\epsilon_t^\theta(x_t)}{\sqrt{\alpha_t}}\bigg)}_{\mathrm{P}_t(\epsilon_t^{\theta}(x_t))} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot \epsilon_t^\theta(x_t) }_{\mathrm{D}_t(\epsilon_t^{\theta}(x_t))} + \sigma_t\mathcal{z_t} -$$ - -$$ -x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}(x_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) + \sigma_t\mathcal{z_t} -$$ - -### 3.1 Problem - -$x_T$로 부터 생성된 image $x_0$를 given text prompts에 맞게 manipulate시키는 가장 간단한 방법은 2.3에서 소개한 $\mathcal{L}_{direction}$을 optimize하도록 $x_T$를 update하는 것이다. 하지만 이 방법은 distorted images를 생성하거나 부정확한 manipulation을 한다고 한다. - -이에 대한 대안으로, 모든 sampling step에서 원하는 방향으로 manipulate하도록 $\epsilon_t^{\theta}$를 shift해주는 방법이 제시되었다. 하지만 이 방법은 $x_0$를 완전히 manipulate하지 못한다. 왜냐하면 $\mathrm{P}_t$와 $\mathrm{D}_t$에서 둘다 shifted된 $\tilde{\epsilon}_t^{\theta}$를 사용하기에 cancel out되어 결국 latent variable에서는 기존과 다름이 없다는 것이다. 자세한 증명은 Proof of Theroem을 보면 된다. - -
- Proof of Theroem) - - -Define $\alpha_t = \prod_{s=1}^t(1 - \beta_s)$, $\tilde{x}_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \mathrm{D}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \sigma_t\mathcal{z_t}$ - -= $\sqrt{\alpha_{t-1}}\underbrace{\bigg(\cfrac{x_t - \sqrt{1-\alpha_t}(\epsilon_t^\theta(x_t) + \Delta \epsilon_t)}{\sqrt{\alpha_t}}\bigg)}_{\mathrm{P}_t(\tilde{\epsilon}_t^{\theta})} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot (\epsilon_t^\theta(x_t) + \Delta \epsilon_t) }_{\mathrm{D}_t(\tilde{\epsilon}_t^{\theta})} + \sigma_t\mathcal{z_t}$ - -= $\sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^\theta(x_t)) + \mathrm{D}_t(\epsilon_t^\theta(x_t)) - \cfrac{\sqrt{\alpha_{t-1}}\sqrt{1-\alpha_t}}{\sqrt{\alpha_t}} \cdot \Delta \epsilon_t + \sqrt{1-\alpha_{t-1}} \cdot \Delta \epsilon_t$ - -$\sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^\theta(x_t)) + \mathrm{D}_t(\epsilon_t^\theta(x_t))$는 기존 DDIM에서의 $x_{t-1}$에 대한 식이고 위 식의 $\Delta \epsilon_t$항만 따로 묶어서 표현하면 아래와 같다. - -= $x_{t-1} + \bigg( -\cfrac{\sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} + \sqrt{1-\alpha_{t-1}} \bigg) \cdot \Delta \epsilon_t $ - -= $x_{t-1} + \bigg( -\cfrac{\sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} + \cfrac{\sqrt{1-\prod_{s=1}^{t-1}(1-\beta_s)}\sqrt{1-\beta_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t $ - -${\sqrt{1-\prod_{s=1}^{t-1}(1-\beta_s)}\sqrt{1-\beta_t}}$를 root를 묶어서 내부를 계산하면 $\sqrt{1-\alpha_t-\beta_t}$이므로 정리하면 아래와 같다. - -= $x_{t-1} + \bigg( \cfrac{\sqrt{1-\alpha_t-\beta_t} - \sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t $ - -$\therefore \Delta x_t = \tilde{x_{t-1}} - x_{t-1} = \cfrac{\sqrt{1-\alpha_t-\beta_t} - \sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t$ - -shifted epsilon을 사용한 결과이다. 분자를 보면 $\beta_t$는 매우 작기에 거의 0에 수렴하기에 결국 차이가 거의 없음을 보인다.
즉 $\epsilon$-space에서의 manipulation 효과는 매우 좋지 않음을 알 수 있다. - -
- -:::{figure-md} - -Asyrp_2 - -No Manipulation Effect with shifted epsilon -::: - -### 3.2 Asymmetric Reverse Process(Asyrp) - -chapter 3.1에서 $\epsilon$-space에서의 문제를 해결하기 위해 저자들은 Asyrp를 제안한다. 이름 그대로 비대칭적인 방법을 사용한다는 것인데 $x_0$를 예측하는 $\mathrm{P}_t$에서는 shifted epsilon을 사용하고, latent variable로 돌아가는 $\mathrm{D}_t$에서는 non-shifted epsilon을 사용해서 전체적인 변화를 준다는 것이다. 즉, $\mathrm{P}_t$만modify하고 $\mathrm{D}_t$는 유지한다. Asyrp를 식으로 표현하면 다음과 같다. - - -$$ -x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) -$$ -Loss식 또한 chapter 2.3에서 제시한 $\mathcal{L}_{direction}$을 사용하여 재구성하였다. modify를 하지 않은 $\mathrm{P}_t^{source}$와 modifiy를 한 $\mathrm{P}_t^{edit}$을 사용한다. Loss식은 다음과 같다. - - -$$ -\mathcal{L}^{(t)} = \lambda_{CLIP}(\mathrm{P}_t^{edit}, y^{ref};\mathrm{P}_t^{source},y^{source}) + \lambda_{recon}|\mathrm{P}_t^{edit} - \mathrm{P}_t^{source}| -$$ - - -전체적인 reverse process는 다음과 같이 설계가 되었다. 이제 shifted epsilon인 $\tilde{\epsilon}_t^{\theta}(x_t)$를 어떤 방식으로 얻을 것인지에 대한 설계가 필요하다. 저자들은 기존의 $\epsilon$-space에서 변화를 주는 것보다 훨씬 더 좋은 result를 보이고, nice properties를 가지는 h-space에서 변화를 주는 것을 제안한다. - -### 3.3 h-space - -$\epsilon_t^{\theta}$는 diffusion models의 backbone인 U-Net에서 도출된다. 이 논문에서는 Image manipulation을 위해 $\epsilon_t^{\theta}$를 control하는 space를 U-Net의 bottleneck 즉, 가장 깊은 feature map인 $h_t$로 정하였다. 이를 h-space라고 부른다. h-space는 $\epsilon$-space보다 더 작은 spatial resolutions을 가지고 high-level semantic를 가진다. 또한 $\epsilon$-space에서는 발견할 수 없는 매우 nice한 특성들을 가지고 있다. - -:::{figure-md} - -Asyrp_3 - -U-Net structure and h-space -::: - -h-space의 크기는 $8^2\times512$이고 $\epsilon$-space의 크기는 $256^2\times3$으로 h-space에서의 control이 더 지배적이고 robust함을 추측할 수 있다(실제 실험적으로 증명을 함). h-space는 skip-connection의 영향을 받지 않으며 가장 압축된 정보를 가지고 있는 공간이며 image를 control하는데에 있어 매우 좋은 특성들을 가지고 있다. 실제 저자들은 h-space를 지정하기 위해 U-Net의 모든 feature map을 h-space로 설정해두고 실험을 해보았는데 위의 그림을 기준으로 8th layer이전의 feature map을 h-space로 지정한 경우에는 manipulaton이 적게 이루어졌고, 8th layer 이후의 feature map을 h-space로 지정한 경우에는 너무 과한 manipulation이 이루어지거나 아예 distorted image가 생성되었다. h-space만의 특성은 chapter5에서 설명한다. - -### 3.4 Implicit Neural Directions - -:::{figure-md} - -Asyrp_4 - -Illustration of $\mathrm{f}(t)$ -::: - -$\Delta h_t$가 image를 manipulating하는데 성공했음에도, 수많은 timestep에서 매번 optimizing하기란 쉽지 않다. 대신에 논문에서는 $h_t$를 입력받아 $\Delta h$를 출력해주는 작은 neural network인 $\mathrm{f}(t)$를 추가하였다. $\mathrm{f}(t)$는 $\Delta h_t$를 매번 모든 timestep에서 optimizing해줘야 하는 방법에 비해 시간도 빠르고 setting값들에 대해 robust하다. 또한 주어진 timestep과 bottleneck feature인 $h_t$에 대해 $\Delta h_t$를 출력하는 방법을 학습하기에 unseen timestep과 bottleneck feature에 대해서도 일반화할 수 있다고 한다. 이는 accelerated한 과정에서도 큰 효과를 본다. training scheme이 어떻든 간에 결국 부여하는 $\sum\Delta\mathrm{h_t}$만 보존된다면, 어떠한 length를 설계해도 비슷한 manipulation효과를 볼 수 있다. - - - -h-space에서 epsilon을 control해서 asyrp 이용하는 식은 다음과 같다. 이해를 위해 $\epsilon$-space와 h-space에서의 shifted epsilon $\tilde{\epsilon}_t^{\theta}(x_t)$을 비교하였다. - -- $\epsilon$-space에서의 shifted epsilon - - $\tilde{\epsilon}_t^{\theta}(x_t) = \epsilon_t^{\theta}(x_t) + \Delta \epsilon_t$ - -- h-space에서의 shifted epsilon - - $\tilde{\epsilon}_t^{\theta}(x_t) = \epsilon_t^{\theta}(x_t | \Delta h_t)$ - - - -$$ -x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}(x_t | \Delta h_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) -$$ - -:::{figure-md} - -Asyrp_5 - -Asymmetric Reverse Process -::: - -## 4. Generative Process Design - -:::{figure-md} - -Asyrp_6 - -Intuition for choosing the intervals for editing and quality boosting -::: - -Perception prioritized training of diffusion models(Choi et al)에서는 Diffusion model이 early stage에서는 high-level context를 generate하고, later stage에서는 imperceptible fine details를 generate한다고 제안한다. 본 논문에서는 early stage에서 editing을 진행하는 editing process와 later stage에서 imperceptible fine details를 진행하는 quality boosting을 위한 구간을 나눠서 새로운 Generative Process Design을 제시한다. - -### 4.1 Editing Process With Asyrp - -Editing Process에서는 high-level context가 generate되어야 하므로 전체 timestep[0,T]에서 Editing Process를 위한 editing interval을 [T, $t_{edit}$]으로 설정하였다. $t_{edit}$의 시점을 결정하기 위해 LPIPS 측정지표를 이용한다. LPIPS($\mathrm{x}, \mathrm{P}_t$)는 t시점에서 예측한 $x_0$와 target이 되는 original image간의 perceptual distance를 계산한다. 따라서 LPIPS를 남은 reverse process을 통해 editing 해야 할 구성요소를 측정하는 지표라고 볼 수도 있다. 첫 step T의 LPIPS로 부터 $t_{edit}$시점에서의 LPIPS 차이는 Editing Process에서 얼만큼의 perceptual change를 주었는지를 나타낸다. 이 값을 editing strength($\epsilon_t$)라고 정의한다. - - - -$$ -\xi_t = \mathrm{LPIPS}(x, \mathrm{P}_T) - \mathrm{LPIPS}(x, \mathrm{P}_t) -$$ -Editing interval이 작으면 $\xi_t$가 작아지며 변화가 많이 일어나지 않고 반면, Editing interval이 크면 $\xi_t$가 커지고 변화가 많이 일어난다. 따라서 충분한 변화를 줄 수 있는 한에서 가장 최소의 Editing interval을 찾는 것이 $t_{edit}$을 결정하는 최고의 방법이다. 저자들은 실험적인 결과를 통해 $\mathrm{LPIPS}(x, \mathrm{P}_t)$ = 0.33인 t시점을 $t_{edit}$으로 결정하였다. - -:::{figure-md} - -Asyrp_7 - -Results based on various $\mathrm{LPIPS}(x, \mathrm{P}_{t_{edit}})$ -::: - -:::{figure-md} - -Asyrp_8 - -Importance of choosing proper $t_{edit}$ -::: - -몇몇 특성들은 다른 특성들에 비해 visual change를 많이 필요로 하는 경우도 있다. 예를 들어 source image에 대해 smile한 attribute를 추가하는 경우보다 pixar style의 attribute을 추가하는 경우가 더 많은 visual change를 필요로 한다. 이러한 경우에는 Editing interval을 더 길게 설정해야 한다. 이러한 경우에는 $\mathrm{LPIPS}(x, \mathrm{P}_t)$ = 0.33 - $\delta$를 만족하는 t를 $t_{edit}$으로 설정한다. 이 때, $\delta = 0.33d(\mathrm{E}_T(y_{source}), \mathrm{E}_T(y_{target}))$이다. $\mathrm{E}_T$는 CLIP text embedding을 진행하는 Text Encoder를 의미하며, d는 cosine distance를 의미한다. 아래 그림을 통해 더 많은 visual change를 요구하는 attributes에 대해서는 $t_{edit}$이 더 작음(Editing Interval이 김)을 알 수 있다. - -:::{figure-md} - -Asyrp_9 - -Flexible $t_{edit}$ based on the amount of visual changes. -::: - -### 4.2 Quality Boosting With Stochastic Noise Injection - -DDIM은 $\eta$=0으로 설정하며 stochasticity를 제거하여 거의 완벽한 inversion을 가능케 하였다. Elucidating the design space of diffusionbased generative models(Karras et al.)에서는 stochasticity가 image quality를 증가시킨다고 증명하였다. 이에 따라 본 논문에서는 Generative Process에 stochastic noise를 주입하는 quality boosting 단계를 설정하고 boosting interval은 [$t_{boost}$, 0]이다. - - Boosting Interval에 따라 image quality를 control할 수 있는데, Boosting Interval이 길게되면, Quality는 증가하지만 Interval동안 계속해서 stochastic noise를 주입해야 하기에 content가 변하는 문제가 발생할 수도 있다. 따라서 충분한 quality boosting을 달성하면서도 content에 최소한의 변화만을 줄 수 있도록 $t_{boost}$를 설정하는 것이 중요하다. 저자들은 image에 껴있는 noise를 quality boosting을 통해 해결해야 할 부분으로 보았으며 target이 되는 original image로 부터 t시점의 image $x_t$에 얼만큼의 noise가 껴있는지에 대한 지표로 quality deficiency $\gamma_t$를 이용한다. - - -$$ -\gamma_t = \mathrm{LPIPS}(x, x_t) -$$ -여기서는 editing strength와는 다르게 time step에 따라 예측한 $x_0$인 $\mathrm{P}_t$가 아닌 latent variable $x_t$를 이용한다. 저자들은 noise를 판단하는데에 있어서 semantics보다는 actual image를 고려했기에 위와 같이 설정하였다고 한다. 저자들은 실험적인 결과를 통해 $\gamma_t$ = 1.2인 t시점을 $t_{boost}$로 설정하였다. - -:::{figure-md} - -Asyrp_10 - -Results based on various $\gamma_{t_{boost}}$ -::: - -:::{figure-md} - -Asyrp_11 - -Quality comparison based on the presence of quality boosting -::: - -### 4.3 Overall Process of Image Editing - -General한 Diffusion model에서의 Generative Process를 표현하면 다음과 같다. - - -$$ -x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}) + \mathrm{D}_t(\epsilon_t^{\theta}) + \sigma_t\mathcal{z}_t\bigg(where, \sigma_t = \eta\sqrt{(1-\alpha_{t-1}) / (1-\alpha_t)} \sqrt{1-\alpha_t/\alpha_{t-1}}\bigg) -$$ -$\eta$ = 0인 경우에는 DDIM이 되며, stochastic noise를 더하는 부분이 사라져 deterministic해진다. $\eta$ = 1인 경우에는 DDPM이 되며, stochastic한 특성이 있다. Asyrp(Assymetric Reverse Process)에서는 기본적으로 DDIM을 사용하며 $\mathrm{P}_t$에서 h-space를 통해 control된 $\epsilon_t^{\theta}(x_t|f_t)$를 사용한다. Diffusion Models already have a Semantic Latent Space에서 제시한 Generative Process를 전체적으로 정리하면 다음과 같다. - -:::{figure-md} - -Asyrp_12 - -Quality comparison based on the presence of quality boosting -::: - -처음부터 $t_{edit}$시점까지는 Asyrp를 이용해 Editing Process를 진행한다. 이 후 DDIM 방식을 통해 Denoising을 진행하다가 $t_{boost}$시점부터 끝날 때까지 stochastic noise를 주입하는 DDPM 방식을 이용해 Quality boosting을 진행한다. - -:::{figure-md} - -Asyrp_13 - -Overview of Generative Process -::: - -## 5. Experiments - - CelebA-HQ (Karras et al., 2018) 및 LSUN-bedroom/-church (Yu et al., 2015) 데이터셋에서 DDPM++ (Song et al., 2020b) (Meng et al., 2021); AFHQ-dog (Choi et al., 2020) 데이터셋에서 iDDPM (Nichol & Dhariwal, 2021); 그리고 METFACES (Karras et al., 2020) 데이터셋에서 ADM with P2-weighting (Dhariwal & Nichol, 2021) (Choi et al., 2022)을 사용해 각각 학습시켰다고 한다. 모든 model들은 pretrained checkpoint를 활용했으며 frozen상태를 유지시켰다고 한다. - -### 5.1 Versatility of h-space with Asyrp - -:::{figure-md} - -Asyrp_14 - -Editing results of Asyrp on various datasets -::: - -위의 그림을 보면, 논문에서는 다양한 attribute들의 특성을 잘 반영해서 image를 manipulate했다는 점을 알 수 있다. 심지어 {department, factory, temple} attribute은 training data에 포함이 되어있지 않았음에도 성능이 잘 나온 점을 확인할 수 있다. model을 fine tuning하지 않고 inference하는 과정에서 h-space를 통해 epsilon을 control하고 Asyrp를 이용해 성능을 냈다는 점이 가장 큰 장점이다. - -### 5.2 Quantitive Comparison - -Asyrp model의 결과를 다른 model들과 비교하는 실험을 진행하였는데 diffusion model 전체를 fine-tuning하여 image을 editing하는 DiffsionCLIP model과 비교하였다. Asyrp의 성능이 더 좋음을 확인 할 수 있다. - -:::{figure-md} - -Asyrp_15 - -Asyrp vs DiffusionCLIP on both CelebA-HQ seen-domain attributes and unseen-domain attributes -::: - -### 5.3 Analysis on h-space - -1. **Homogeneity** - - :::{figure-md} - - Asyrp_16 - - Homogeneity of h-space - ::: - - 위의 그림의 (a)는 Real image에 smiling attribute을 추가하기 위해 최적화된 $\Delta h_t$와 $\Delta \epsilon_t$를 나타낸다. 같은 값을 다른 Real image에 적용시켰을 때의 결과를 (b)에 나타내었는데, $\Delta h_t$를 적용한경우 smiling face로 잘 바뀌는 반면, $\Delta \epsilon_t$을 적용한 경우에는 image distortion이 발생함을 알 수 있다. - - - -2. **Linearity** - - :::{figure-md} - - Asyrp_17 - - Linearity of h-space - Linear Scaling - ::: - - $\Delta_h$를 linearly scaling을 하는 것은 editing을 하는데에 있어 visual attribute change의 양에 반영된다. 즉, $\Delta_h$를 $\times$1, $\times$2, $\times$3배 $/dots$ 함에 따라 result image에서 반영되는 attribute또한 이에 맞게 변화한다는 것이다. 위의 그림에서 표현되어 있듯이 negative scaling에 대해서는 training을 하지 않았음에도 잘 적용 된다는 점을 알 수 있다. - - - - :::{figure-md} - - Asyrp_17 - - Linearity of h-space - Linear Combination - ::: - - 서로 다른 attributes에 대한 $\Delta_h$를 합쳐서 부여를 했을 경우에도 각각의 attribute들이 image에 잘 반영이 된다는 점을 알 수 있다. - - - -3. **Robustness** - - :::{figure-md} - - Asyrp_17 - - Robustness of h-space - ::: - - 위의 그림은 h-space와 $\epsilon-space$에서 random noise를 주입했을 때의 결과를 비교한 것이다. h-space의 경우에는 random noise가 추가되었어도 image에 큰 변화가 없으며 많은 noise가 추가되었을 경우에도 image distortion은 거의 없고 semantic change만 발생한다. 그러나 $\epsilon-space$의 경우에는 random noise가 추가된 경우 image distortion이 심하게 발생한다. 이를 통해 h-space가 얼마나 robustness한지 알 수 있다. - - - -4. **Consistency across time steps** - - :::{figure-md} - - Asyrp_17 - - Consistency across times steps of h-space - ::: - - h-space의 homogeneous한 성질을 통해 같은 attribute에 대한 $\Delta h$를 다른 image에 적용시켰을 때에도 잘 반영이 됌을 확인하였다. 저자들은 $\Delta h_t$들에 대한 평균인 $\Delta h_t^{mean}$을 적용시켰을 경우에도 result가 거의 비슷함을 보인다. Chapter4에서 제시한 Generative Process를 비추어 보았을 때, $\Delta h_t$는 Editing Process에서만 적용을 시킨다. 이 경우, 적용하는 $\Delta h_t$를 $\Delta h_t^{global}$이라고 칭하며, 적용하는 $\Delta h_t$가 interval동안 같은 크기 만큼 적용된다고 가정했을 경우, $\Delta h^{global} = \cfrac{1}{\mathrm{T_e}}\sum_t\ \Delta h_t^{mean}$이라고 쓸 수 있다. 이 경우에도 결과는 비슷함을 보여준다. 결국 원하는 attribute에 대해 주입해야 할 $\Delta h$양만 같다면, 원하는 editing 효과를 얻을 수 있다. 비록 이 논문에서는 best quality manipulation을 위해 $\Delta h_t$를 사용하였지만, $\Delta h_t^{mean}$과 $\Delta h^{global}$에 대해 더 연구를 해 볼 여지가 있다고 판단한다. - -## 6. Conclusion - -본 논문에서는 Pretrained Diffusion models에서 latent semantic space인 h-space를 발견했고 h-space에서의 Asyrp(Asymmetric Reverse Process)와 새롭게 제안한 Reverse Process 방법을 통해 성공적인 image editing을 가능케 하였다. Diffusion model에서의 semantic한 latent space에 대한 첫 제안을 한 논문이다. h-space는 GAN의 latent space와 유사한 특성을 갖추고 있다. 대표적인 h-space의 특성으로는 Homogeneity, Linearity, Robustness, Consistency across timesteps이 있다. +``` {admonition} Information +- **Title:** Diffusion Models already have a Semantic Latent Space (ICLR 2023) + +- **Reference** + - Paper: [https://arxiv.org/abs/2210.10960](https://arxiv.org/abs/2210.10960) + +- **Author:** Sehwan Park + +- **Last updated on Nov. 18, 2023** +``` + + + +# Diffusion Models already have a Semantic Latent Space + +## Abstract + +Diffusion model은 많은 domain에서 좋은 성능을 보이지만 generative process를 control하는 semantic latent space가 부족하다. 논문에서는 diffusion model속에서 semantic latent space를 발견하기 위한 asymmetric reverse process(asyrp)를 제안하고 h-space라고 명칭한 semantic latent space의 좋은 특성(homogeneity, linearity, robustness, consistency across timesteps)들을 보여준다. 추가적으로 editing strength와 quality deficiency를 기준으로 삼고 더 좋은 image-image translation을 위한 Generative Process Design을 소개한다. + + + +## 1. Introduction + +:::{figure-md} + +Asyrp_1 + +Manipulation approaches for diffusion models +::: + +(a) Image guidance는 unconditional한 latent variable에 guiding image의 latent variable을 합치는 방식을 사용한다. 그러나 latent variable을 둘 다 이용하면서 명확하게 control하기가 쉽지 않다. + +(b) Classifier guidance는 diffusion model에 classifier를 추가하여 generative process를 거치는 동안 latent variable이 어떤 class인지 분류하고 target class에 가까워지도록 score를 부여하는 방식으로 작동한다. 그러나 latent variable들에 대해 classify를 실행해야 하기에 pretrained model을 사용하기가 힘들어 직접 학습을 시켜야 하기에 시간적으로, 비용적으로 부담이 된다. + +(c) DiffusionCLIP + +(d) Diffusion Models already have a Semantic Latent Space는 original image의 특성을 edit하기 위한 아주 좋은 특성을 가지고 있는 semantic latent space를 frozen diffusion model에서 발견하였고 이를 h-space라고 칭한다. h-space에는 다양한 좋은 특성들이 존재한다. versatile editing과 quality boosting을 위해 새로운 generative process를 design하여 제안한다. h-space는 frozen pretrained diffusion model에서 semantic latent space로써의 첫 발견사례이다. + + + +## 2. Background + +### 2.1 Denoising Diffusion Probability Model(DDPM) + +DDPM에서는 임의의 time step t로 부터 noise가 껴있는 image $x_t$의 $\epsilon_t$가 얼만큼인지 예측한다. 예측한 $\epsilon_t$를 이용하여 noise가 일부 제거된 이전 step의 mean($\mu_{\theta}(x_t)$)을 구할 수 있고 variance($\sum_{\theta}(x_t)$)는 constant한 값으로 고정시킨다. DDPM에서 제시한 forward process와 reverse process는 다음과 같다. DDPM에서의 $\sigma_t^2 = \beta_t$이다. + + +$$ +q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_{t}}x_{t-1}, (1-\alpha_t)I) +$$ + +$$ +p_{\theta}(x_{t-1}|x_t) := \mathcal{N}(\mu_{\theta}(x_t), \sum_{\theta}(x_t)) +$$ + +$$ +x_{t-1} = \frac{1}{\sqrt{1-\beta_t}}\bigg(x_t - \frac{\beta_t}{\sqrt{1-\alpha_t}}\epsilon_t^\theta(x_t)\bigg) + \sigma_t\mathcal{z_t} +$$ + + + +### 2.2 Denoising Diffusion Implicit Model(DDIM) + +DDIM에서는 non-Markovian process를 이용해 또 다른 관점의 reverse process를 제시하였고, DDPM과 DDIM 모두 general하게 적용되는 Diffusion process에 대한 식을 보여주었다. $\sigma_t = \eta\sqrt{(1-\alpha_{t-1}) / (1-\alpha_t)} \sqrt{1-\alpha_t/\alpha_{t-1}}$이다. + + $\eta$=1인 경우 DDPM이 되고 stochastic해지며, $\eta$=0인 경우 DDIM이 되고 deterministic해진다. + + +$$ +q_{\sigma}(x_{t-1}|x_t,x_0) = \mathcal{N}(\sqrt{\alpha_{t-1}}x_0 + \sqrt{1-\alpha_{t-1}-\sigma_t^2} \cdot \cfrac{x_t - \sqrt{\alpha_t}x_0}{\sqrt{1-\alpha_t}}, \sigma_t^2I) +$$ + +$$ +x_{t-1} = \sqrt{\alpha_{t-1}}\underbrace{\bigg(\frac{x_t - \sqrt{1-\alpha_t}\epsilon_t^\theta(x_t)}{\sqrt{\alpha_t}}\bigg)}_{\textrm{predicted } x_0} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot \epsilon_t^\theta(x_t) }_{\textrm{direction pointing to }x_t} + \sigma_t\mathcal{z_t} +$$ + +### 2.3 Image Manipulation with CLIP + +CLIP은 Image Encoder와 Text Encoder를 이용하여 image와 text간의 embedding을 학습한다. 편집된 이미지와 대상 설명 간의 cosine distance를 직접 최소화하는 대신 cosine distance를 사용한 directional loss를 사용하여 mode collapse없이 균일한 editing을 가능하게 했다고 한다. + +$\Delta T = \mathrm{E}_T(y^{target}) - \mathrm{E}_T(y^{source}) $
$\Delta I = \mathrm{E}_I(x^{edit}) - \mathrm{E}_I(x^{source})$ + + +$$ +\mathcal{L}_{direction} (x^{edit}, y^{target};x^{source},y^{source}) := 1 - \cfrac{\Delta I \cdot \Delta T}{\parallel\Delta I\parallel \parallel\Delta T\parallel} +$$ + + + +## 3. Discovering Semantic Latent Space In Diffusion Models + +Editiing을 하는 과정에서 naive approach를 통해서는 editing이 잘 이루어지지 않는다. 이 chapter에서는 왜 잘 이루어지지 않는지에 대한 설명을 하고 이를 해결하는 새로운 controllable한 한 reverse process인 Asymmetric Reverse Process(Asyrp)를 제안한다. + +DDIM에서 $x_{t-1}$에 대한 수식을 설명하였는데 이 chapter부터는 "predicted $x_0$"부분을 $\mathrm{P}_t(\epsilon_t^{\theta}(x_t))$ 즉 $\mathrm{P}_t$라고 설정하고, "direction pointing to $x_t$"부분을 $\mathrm{D}_t(\epsilon_t^{\theta}(x_t))$ 즉 $\mathrm{D}_t$라고 설정하였다. + +$\mathrm{P}_t$는 latent variable로 부터 $x_0$를 예측하는 reverse process와 같은 역할을 담당하고 $\mathrm{D}_t$는 다시 noise를 추가해 latent variable로 돌아가기에 forward process와 같은 역할을 담당한다. + + +$$ +x_{t-1} = \sqrt{\alpha_{t-1}}\underbrace{\bigg(\frac{x_t - \sqrt{1-\alpha_t}\epsilon_t^\theta(x_t)}{\sqrt{\alpha_t}}\bigg)}_{\mathrm{P}_t(\epsilon_t^{\theta}(x_t))} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot \epsilon_t^\theta(x_t) }_{\mathrm{D}_t(\epsilon_t^{\theta}(x_t))} + \sigma_t\mathcal{z_t} +$$ + +$$ +x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}(x_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) + \sigma_t\mathcal{z_t} +$$ + +### 3.1 Problem + +$x_T$로 부터 생성된 image $x_0$를 given text prompts에 맞게 manipulate시키는 가장 간단한 방법은 2.3에서 소개한 $\mathcal{L}_{direction}$을 optimize하도록 $x_T$를 update하는 것이다. 하지만 이 방법은 distorted images를 생성하거나 부정확한 manipulation을 한다고 한다. + +이에 대한 대안으로, 모든 sampling step에서 원하는 방향으로 manipulate하도록 $\epsilon_t^{\theta}$를 shift해주는 방법이 제시되었다. 하지만 이 방법은 $x_0$를 완전히 manipulate하지 못한다. 왜냐하면 $\mathrm{P}_t$와 $\mathrm{D}_t$에서 둘다 shifted된 $\tilde{\epsilon}_t^{\theta}$를 사용하기에 cancel out되어 결국 latent variable에서는 기존과 다름이 없다는 것이다. 자세한 증명은 Proof of Theroem을 보면 된다. + +
+ Proof of Theroem) + + +Define $\alpha_t = \prod_{s=1}^t(1 - \beta_s)$, $\tilde{x}_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \mathrm{D}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \sigma_t\mathcal{z_t}$ + += $\sqrt{\alpha_{t-1}}\underbrace{\bigg(\cfrac{x_t - \sqrt{1-\alpha_t}(\epsilon_t^\theta(x_t) + \Delta \epsilon_t)}{\sqrt{\alpha_t}}\bigg)}_{\mathrm{P}_t(\tilde{\epsilon}_t^{\theta})} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot (\epsilon_t^\theta(x_t) + \Delta \epsilon_t) }_{\mathrm{D}_t(\tilde{\epsilon}_t^{\theta})} + \sigma_t\mathcal{z_t}$ + += $\sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^\theta(x_t)) + \mathrm{D}_t(\epsilon_t^\theta(x_t)) - \cfrac{\sqrt{\alpha_{t-1}}\sqrt{1-\alpha_t}}{\sqrt{\alpha_t}} \cdot \Delta \epsilon_t + \sqrt{1-\alpha_{t-1}} \cdot \Delta \epsilon_t$ + +$\sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^\theta(x_t)) + \mathrm{D}_t(\epsilon_t^\theta(x_t))$는 기존 DDIM에서의 $x_{t-1}$에 대한 식이고 위 식의 $\Delta \epsilon_t$항만 따로 묶어서 표현하면 아래와 같다. + += $x_{t-1} + \bigg( -\cfrac{\sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} + \sqrt{1-\alpha_{t-1}} \bigg) \cdot \Delta \epsilon_t $ + += $x_{t-1} + \bigg( -\cfrac{\sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} + \cfrac{\sqrt{1-\prod_{s=1}^{t-1}(1-\beta_s)}\sqrt{1-\beta_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t $ + +${\sqrt{1-\prod_{s=1}^{t-1}(1-\beta_s)}\sqrt{1-\beta_t}}$를 root를 묶어서 내부를 계산하면 $\sqrt{1-\alpha_t-\beta_t}$이므로 정리하면 아래와 같다. + += $x_{t-1} + \bigg( \cfrac{\sqrt{1-\alpha_t-\beta_t} - \sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t $ + +$\therefore \Delta x_t = \tilde{x_{t-1}} - x_{t-1} = \cfrac{\sqrt{1-\alpha_t-\beta_t} - \sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t$ + +shifted epsilon을 사용한 결과이다. 분자를 보면 $\beta_t$는 매우 작기에 거의 0에 수렴하기에 결국 차이가 거의 없음을 보인다.
즉 $\epsilon$-space에서의 manipulation 효과는 매우 좋지 않음을 알 수 있다. + +
+ +:::{figure-md} + +Asyrp_2 + +No Manipulation Effect with shifted epsilon +::: + +### 3.2 Asymmetric Reverse Process(Asyrp) + +chapter 3.1에서 $\epsilon$-space에서의 문제를 해결하기 위해 저자들은 Asyrp를 제안한다. 이름 그대로 비대칭적인 방법을 사용한다는 것인데 $x_0$를 예측하는 $\mathrm{P}_t$에서는 shifted epsilon을 사용하고, latent variable로 돌아가는 $\mathrm{D}_t$에서는 non-shifted epsilon을 사용해서 전체적인 변화를 준다는 것이다. 즉, $\mathrm{P}_t$만modify하고 $\mathrm{D}_t$는 유지한다. Asyrp를 식으로 표현하면 다음과 같다. + + +$$ +x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) +$$ +Loss식 또한 chapter 2.3에서 제시한 $\mathcal{L}_{direction}$을 사용하여 재구성하였다. modify를 하지 않은 $\mathrm{P}_t^{source}$와 modifiy를 한 $\mathrm{P}_t^{edit}$을 사용한다. Loss식은 다음과 같다. + + +$$ +\mathcal{L}^{(t)} = \lambda_{CLIP}(\mathrm{P}_t^{edit}, y^{ref};\mathrm{P}_t^{source},y^{source}) + \lambda_{recon}|\mathrm{P}_t^{edit} - \mathrm{P}_t^{source}| +$$ + + +전체적인 reverse process는 다음과 같이 설계가 되었다. 이제 shifted epsilon인 $\tilde{\epsilon}_t^{\theta}(x_t)$를 어떤 방식으로 얻을 것인지에 대한 설계가 필요하다. 저자들은 기존의 $\epsilon$-space에서 변화를 주는 것보다 훨씬 더 좋은 result를 보이고, nice properties를 가지는 h-space에서 변화를 주는 것을 제안한다. + +### 3.3 h-space + +$\epsilon_t^{\theta}$는 diffusion models의 backbone인 U-Net에서 도출된다. 이 논문에서는 Image manipulation을 위해 $\epsilon_t^{\theta}$를 control하는 space를 U-Net의 bottleneck 즉, 가장 깊은 feature map인 $h_t$로 정하였다. 이를 h-space라고 부른다. h-space는 $\epsilon$-space보다 더 작은 spatial resolutions을 가지고 high-level semantic를 가진다. 또한 $\epsilon$-space에서는 발견할 수 없는 매우 nice한 특성들을 가지고 있다. + +:::{figure-md} + +Asyrp_3 + +U-Net structure and h-space +::: + +h-space의 크기는 $8^2\times512$이고 $\epsilon$-space의 크기는 $256^2\times3$으로 h-space에서의 control이 더 지배적이고 robust함을 추측할 수 있다(실제 실험적으로 증명을 함). h-space는 skip-connection의 영향을 받지 않으며 가장 압축된 정보를 가지고 있는 공간이며 image를 control하는데에 있어 매우 좋은 특성들을 가지고 있다. 실제 저자들은 h-space를 지정하기 위해 U-Net의 모든 feature map을 h-space로 설정해두고 실험을 해보았는데 위의 그림을 기준으로 8th layer이전의 feature map을 h-space로 지정한 경우에는 manipulaton이 적게 이루어졌고, 8th layer 이후의 feature map을 h-space로 지정한 경우에는 너무 과한 manipulation이 이루어지거나 아예 distorted image가 생성되었다. h-space만의 특성은 chapter5에서 설명한다. + +### 3.4 Implicit Neural Directions + +:::{figure-md} + +Asyrp_4 + +Illustration of $\mathrm{f}(t)$ +::: + +$\Delta h_t$가 image를 manipulating하는데 성공했음에도, 수많은 timestep에서 매번 optimizing하기란 쉽지 않다. 대신에 논문에서는 $h_t$를 입력받아 $\Delta h$를 출력해주는 작은 neural network인 $\mathrm{f}(t)$를 추가하였다. $\mathrm{f}(t)$는 $\Delta h_t$를 매번 모든 timestep에서 optimizing해줘야 하는 방법에 비해 시간도 빠르고 setting값들에 대해 robust하다. 또한 주어진 timestep과 bottleneck feature인 $h_t$에 대해 $\Delta h_t$를 출력하는 방법을 학습하기에 unseen timestep과 bottleneck feature에 대해서도 일반화할 수 있다고 한다. 이는 accelerated한 과정에서도 큰 효과를 본다. training scheme이 어떻든 간에 결국 부여하는 $\sum\Delta\mathrm{h_t}$만 보존된다면, 어떠한 length를 설계해도 비슷한 manipulation효과를 볼 수 있다. + + + +h-space에서 epsilon을 control해서 asyrp 이용하는 식은 다음과 같다. 이해를 위해 $\epsilon$-space와 h-space에서의 shifted epsilon $\tilde{\epsilon}_t^{\theta}(x_t)$을 비교하였다. + +- $\epsilon$-space에서의 shifted epsilon + + $\tilde{\epsilon}_t^{\theta}(x_t) = \epsilon_t^{\theta}(x_t) + \Delta \epsilon_t$ + +- h-space에서의 shifted epsilon + + $\tilde{\epsilon}_t^{\theta}(x_t) = \epsilon_t^{\theta}(x_t | \Delta h_t)$ + + + +$$ +x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}(x_t | \Delta h_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) +$$ + +:::{figure-md} + +Asyrp_5 + +Asymmetric Reverse Process +::: + +## 4. Generative Process Design + +:::{figure-md} + +Asyrp_6 + +Intuition for choosing the intervals for editing and quality boosting +::: + +Perception prioritized training of diffusion models(Choi et al)에서는 Diffusion model이 early stage에서는 high-level context를 generate하고, later stage에서는 imperceptible fine details를 generate한다고 제안한다. 본 논문에서는 early stage에서 editing을 진행하는 editing process와 later stage에서 imperceptible fine details를 진행하는 quality boosting을 위한 구간을 나눠서 새로운 Generative Process Design을 제시한다. + +### 4.1 Editing Process With Asyrp + +Editing Process에서는 high-level context가 generate되어야 하므로 전체 timestep[0,T]에서 Editing Process를 위한 editing interval을 [T, $t_{edit}$]으로 설정하였다. $t_{edit}$의 시점을 결정하기 위해 LPIPS 측정지표를 이용한다. LPIPS($\mathrm{x}, \mathrm{P}_t$)는 t시점에서 예측한 $x_0$와 target이 되는 original image간의 perceptual distance를 계산한다. 따라서 LPIPS를 남은 reverse process을 통해 editing 해야 할 구성요소를 측정하는 지표라고 볼 수도 있다. 첫 step T의 LPIPS로 부터 $t_{edit}$시점에서의 LPIPS 차이는 Editing Process에서 얼만큼의 perceptual change를 주었는지를 나타낸다. 이 값을 editing strength($\epsilon_t$)라고 정의한다. + + + +$$ +\xi_t = \mathrm{LPIPS}(x, \mathrm{P}_T) - \mathrm{LPIPS}(x, \mathrm{P}_t) +$$ +Editing interval이 작으면 $\xi_t$가 작아지며 변화가 많이 일어나지 않고 반면, Editing interval이 크면 $\xi_t$가 커지고 변화가 많이 일어난다. 따라서 충분한 변화를 줄 수 있는 한에서 가장 최소의 Editing interval을 찾는 것이 $t_{edit}$을 결정하는 최고의 방법이다. 저자들은 실험적인 결과를 통해 $\mathrm{LPIPS}(x, \mathrm{P}_t)$ = 0.33인 t시점을 $t_{edit}$으로 결정하였다. + +:::{figure-md} + +Asyrp_7 + +Results based on various $\mathrm{LPIPS}(x, \mathrm{P}_{t_{edit}})$ +::: + +:::{figure-md} + +Asyrp_8 + +Importance of choosing proper $t_{edit}$ +::: + +몇몇 특성들은 다른 특성들에 비해 visual change를 많이 필요로 하는 경우도 있다. 예를 들어 source image에 대해 smile한 attribute를 추가하는 경우보다 pixar style의 attribute을 추가하는 경우가 더 많은 visual change를 필요로 한다. 이러한 경우에는 Editing interval을 더 길게 설정해야 한다. 이러한 경우에는 $\mathrm{LPIPS}(x, \mathrm{P}_t)$ = 0.33 - $\delta$를 만족하는 t를 $t_{edit}$으로 설정한다. 이 때, $\delta = 0.33d(\mathrm{E}_T(y_{source}), \mathrm{E}_T(y_{target}))$이다. $\mathrm{E}_T$는 CLIP text embedding을 진행하는 Text Encoder를 의미하며, d는 cosine distance를 의미한다. 아래 그림을 통해 더 많은 visual change를 요구하는 attributes에 대해서는 $t_{edit}$이 더 작음(Editing Interval이 김)을 알 수 있다. + +:::{figure-md} + +Asyrp_9 + +Flexible $t_{edit}$ based on the amount of visual changes. +::: + +### 4.2 Quality Boosting With Stochastic Noise Injection + +DDIM은 $\eta$=0으로 설정하며 stochasticity를 제거하여 거의 완벽한 inversion을 가능케 하였다. Elucidating the design space of diffusionbased generative models(Karras et al.)에서는 stochasticity가 image quality를 증가시킨다고 증명하였다. 이에 따라 본 논문에서는 Generative Process에 stochastic noise를 주입하는 quality boosting 단계를 설정하고 boosting interval은 [$t_{boost}$, 0]이다. + + Boosting Interval에 따라 image quality를 control할 수 있는데, Boosting Interval이 길게되면, Quality는 증가하지만 Interval동안 계속해서 stochastic noise를 주입해야 하기에 content가 변하는 문제가 발생할 수도 있다. 따라서 충분한 quality boosting을 달성하면서도 content에 최소한의 변화만을 줄 수 있도록 $t_{boost}$를 설정하는 것이 중요하다. 저자들은 image에 껴있는 noise를 quality boosting을 통해 해결해야 할 부분으로 보았으며 target이 되는 original image로 부터 t시점의 image $x_t$에 얼만큼의 noise가 껴있는지에 대한 지표로 quality deficiency $\gamma_t$를 이용한다. + + +$$ +\gamma_t = \mathrm{LPIPS}(x, x_t) +$$ +여기서는 editing strength와는 다르게 time step에 따라 예측한 $x_0$인 $\mathrm{P}_t$가 아닌 latent variable $x_t$를 이용한다. 저자들은 noise를 판단하는데에 있어서 semantics보다는 actual image를 고려했기에 위와 같이 설정하였다고 한다. 저자들은 실험적인 결과를 통해 $\gamma_t$ = 1.2인 t시점을 $t_{boost}$로 설정하였다. + +:::{figure-md} + +Asyrp_10 + +Results based on various $\gamma_{t_{boost}}$ +::: + +:::{figure-md} + +Asyrp_11 + +Quality comparison based on the presence of quality boosting +::: + +### 4.3 Overall Process of Image Editing + +General한 Diffusion model에서의 Generative Process를 표현하면 다음과 같다. + + +$$ +x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}) + \mathrm{D}_t(\epsilon_t^{\theta}) + \sigma_t\mathcal{z}_t\bigg(where, \sigma_t = \eta\sqrt{(1-\alpha_{t-1}) / (1-\alpha_t)} \sqrt{1-\alpha_t/\alpha_{t-1}}\bigg) +$$ +$\eta$ = 0인 경우에는 DDIM이 되며, stochastic noise를 더하는 부분이 사라져 deterministic해진다. $\eta$ = 1인 경우에는 DDPM이 되며, stochastic한 특성이 있다. Asyrp(Assymetric Reverse Process)에서는 기본적으로 DDIM을 사용하며 $\mathrm{P}_t$에서 h-space를 통해 control된 $\epsilon_t^{\theta}(x_t|f_t)$를 사용한다. Diffusion Models already have a Semantic Latent Space에서 제시한 Generative Process를 전체적으로 정리하면 다음과 같다. + +:::{figure-md} + +Asyrp_12 + +Quality comparison based on the presence of quality boosting +::: + +처음부터 $t_{edit}$시점까지는 Asyrp를 이용해 Editing Process를 진행한다. 이 후 DDIM 방식을 통해 Denoising을 진행하다가 $t_{boost}$시점부터 끝날 때까지 stochastic noise를 주입하는 DDPM 방식을 이용해 Quality boosting을 진행한다. + +:::{figure-md} + +Asyrp_13 + +Overview of Generative Process +::: + +## 5. Experiments + + CelebA-HQ (Karras et al., 2018) 및 LSUN-bedroom/-church (Yu et al., 2015) 데이터셋에서 DDPM++ (Song et al., 2020b) (Meng et al., 2021); AFHQ-dog (Choi et al., 2020) 데이터셋에서 iDDPM (Nichol & Dhariwal, 2021); 그리고 METFACES (Karras et al., 2020) 데이터셋에서 ADM with P2-weighting (Dhariwal & Nichol, 2021) (Choi et al., 2022)을 사용해 각각 학습시켰다고 한다. 모든 model들은 pretrained checkpoint를 활용했으며 frozen상태를 유지시켰다고 한다. + +### 5.1 Versatility of h-space with Asyrp + +:::{figure-md} + +Asyrp_14 + +Editing results of Asyrp on various datasets +::: + +위의 그림을 보면, 논문에서는 다양한 attribute들의 특성을 잘 반영해서 image를 manipulate했다는 점을 알 수 있다. 심지어 {department, factory, temple} attribute은 training data에 포함이 되어있지 않았음에도 성능이 잘 나온 점을 확인할 수 있다. model을 fine tuning하지 않고 inference하는 과정에서 h-space를 통해 epsilon을 control하고 Asyrp를 이용해 성능을 냈다는 점이 가장 큰 장점이다. + +### 5.2 Quantitive Comparison + +Asyrp model의 결과를 다른 model들과 비교하는 실험을 진행하였는데 diffusion model 전체를 fine-tuning하여 image을 editing하는 DiffsionCLIP model과 비교하였다. Asyrp의 성능이 더 좋음을 확인 할 수 있다. + +:::{figure-md} + +Asyrp_15 + +Asyrp vs DiffusionCLIP on both CelebA-HQ seen-domain attributes and unseen-domain attributes +::: + +### 5.3 Analysis on h-space + +1. **Homogeneity** + + :::{figure-md} + + Asyrp_16 + + Homogeneity of h-space + ::: + + 위의 그림의 (a)는 Real image에 smiling attribute을 추가하기 위해 최적화된 $\Delta h_t$와 $\Delta \epsilon_t$를 나타낸다. 같은 값을 다른 Real image에 적용시켰을 때의 결과를 (b)에 나타내었는데, $\Delta h_t$를 적용한경우 smiling face로 잘 바뀌는 반면, $\Delta \epsilon_t$을 적용한 경우에는 image distortion이 발생함을 알 수 있다. + + + +2. **Linearity** + + :::{figure-md} + + Asyrp_17 + + Linearity of h-space - Linear Scaling + ::: + + $\Delta_h$를 linearly scaling을 하는 것은 editing을 하는데에 있어 visual attribute change의 양에 반영된다. 즉, $\Delta_h$를 $\times$1, $\times$2, $\times$3배 $/dots$ 함에 따라 result image에서 반영되는 attribute또한 이에 맞게 변화한다는 것이다. 위의 그림에서 표현되어 있듯이 negative scaling에 대해서는 training을 하지 않았음에도 잘 적용 된다는 점을 알 수 있다. + + + + :::{figure-md} + + Asyrp_17 + + Linearity of h-space - Linear Combination + ::: + + 서로 다른 attributes에 대한 $\Delta_h$를 합쳐서 부여를 했을 경우에도 각각의 attribute들이 image에 잘 반영이 된다는 점을 알 수 있다. + + + +3. **Robustness** + + :::{figure-md} + + Asyrp_17 + + Robustness of h-space + ::: + + 위의 그림은 h-space와 $\epsilon-space$에서 random noise를 주입했을 때의 결과를 비교한 것이다. h-space의 경우에는 random noise가 추가되었어도 image에 큰 변화가 없으며 많은 noise가 추가되었을 경우에도 image distortion은 거의 없고 semantic change만 발생한다. 그러나 $\epsilon-space$의 경우에는 random noise가 추가된 경우 image distortion이 심하게 발생한다. 이를 통해 h-space가 얼마나 robustness한지 알 수 있다. + + + +4. **Consistency across time steps** + + :::{figure-md} + + Asyrp_17 + + Consistency across times steps of h-space + ::: + + h-space의 homogeneous한 성질을 통해 같은 attribute에 대한 $\Delta h$를 다른 image에 적용시켰을 때에도 잘 반영이 됌을 확인하였다. 저자들은 $\Delta h_t$들에 대한 평균인 $\Delta h_t^{mean}$을 적용시켰을 경우에도 result가 거의 비슷함을 보인다. Chapter4에서 제시한 Generative Process를 비추어 보았을 때, $\Delta h_t$는 Editing Process에서만 적용을 시킨다. 이 경우, 적용하는 $\Delta h_t$를 $\Delta h_t^{global}$이라고 칭하며, 적용하는 $\Delta h_t$가 interval동안 같은 크기 만큼 적용된다고 가정했을 경우, $\Delta h^{global} = \cfrac{1}{\mathrm{T_e}}\sum_t\ \Delta h_t^{mean}$이라고 쓸 수 있다. 이 경우에도 결과는 비슷함을 보여준다. 결국 원하는 attribute에 대해 주입해야 할 $\Delta h$양만 같다면, 원하는 editing 효과를 얻을 수 있다. 비록 이 논문에서는 best quality manipulation을 위해 $\Delta h_t$를 사용하였지만, $\Delta h_t^{mean}$과 $\Delta h^{global}$에 대해 더 연구를 해 볼 여지가 있다고 판단한다. + +## 6. Conclusion + +본 논문에서는 Pretrained Diffusion models에서 latent semantic space인 h-space를 발견했고 h-space에서의 Asyrp(Asymmetric Reverse Process)와 새롭게 제안한 Reverse Process 방법을 통해 성공적인 image editing을 가능케 하였다. Diffusion model에서의 semantic한 latent space에 대한 첫 제안을 한 논문이다. h-space는 GAN의 latent space와 유사한 특성을 갖추고 있다. 대표적인 h-space의 특성으로는 Homogeneity, Linearity, Robustness, Consistency across timesteps이 있다. diff --git a/_sources/docs/review/DreaMoving.md b/_sources/docs/review/DreaMoving.md old mode 100644 new mode 100755 index 56631f41..b4c7d433 --- a/_sources/docs/review/DreaMoving.md +++ b/_sources/docs/review/DreaMoving.md @@ -1,154 +1,154 @@ -``` {admonition} Information -- **Title:** DreaMoving: A Human Video Generation Framework based on Diffusion Models - -- **Reference** - - Paper: [https://arxiv.org/abs/2311.17117](https://arxiv.org/abs/2312.05107) - - Code: [Official](https://github.com/dreamoving/dreamoving-project) - - Project Page : [https://dreamoving.github.io/dreamoving/](https://dreamoving.github.io/dreamoving/) - -- **Author:** Geonhak Song - -- **Last updated on {March. 13, 2024}** - -``` - -# DreaMoving - -## Abstract - -- 고품질 customized human video 생성을 위해 제어가능한 diffusion 기반 video generation framework인 DreaMoving 제안 -- target identity와 posture sequence가 주어졌을 때, target identity moving이나 dancing video 생성이 가능하다. -- 추가 제안 모듈 : motion-controlling을 위한 **Video ControlNet** & identity preserving을 위한 **Content Guider** - -## 1. Introduction - -- T2V의 진전에도 인간 중심 기반 생성에는 어려움을 겪는 중. -- open-source human dance video dataset의 부족, text 묘사의 어려움으로 인해 frame간 일관성, 긴 길이, 다양성을 포함한 비디오 생성에 어려움을 겪는다. -- personalization과 controllability 의 어려움 또한 존재 -- 구조적 제어를 위한 ControlNet, appearance 제어를 위한 Dreambooth, LoRA -- 그러나 이 기술들은 정확한 제어가 어렵고 hyperparameter tuning 요소가 존재 & 추가 계산 부담 -- 이에 새로운 방법론인 DreaMoving 제안 - -## 2. Architecture - -:::{figure-md} -figure_1 - -Figure 1. The overview of DreaMoving -::: - -- LDM 기반 모델을 기반으로 3가지 주요 network로 구성 - - U-Net, Video ControlNet, Content Guider -- AnimateDiff에서 영감을 받아 U-Net 각 block 이후 motion block을 추가 -- Plug-in : motion-controlling을 위한 **Video ControlNet** & identity preserving을 위한 **Content Guider** - -### 2.1 Data Collection and Preprocessing - -- 인터넷에서 human dance video 1000의 고품질 영상으로 훈련 -- temporal module 훈련은 변이나 특별한 효과 없는 연속적 frame이 필요하기 때문에 clip video로 split하여 6000개의 짧은 비디오를 획득한다.(8~10s) -- text description을 위해서 Minigpt-v2([https://minigpt-v2.github.io/](https://minigpt-v2.github.io/))를 video-captioner로 사용 - - “[grounding] describe this frame in a detailed manner”의 명령으로 획득 - - subject와 background 내용에 대해 정확히 묘사 - -### 2.2 Motion Block - -- temporal consistency와 motion fidelity 향상을 위해서 U-Net과 ControlNet를 motion block으로 통합. -- motion block은 AnimateDiff로 확장. temporal sequence length는 64로 확장 -- 초기화 : AnimateDiff (mm_sd_v15.ckpt) -- 개인 인물 dance video로 finetuning - -### 2.3 Content Guider - -- Content Guider는 인물의 appearance와 배경을 포함한 생성된 video의 내용을 제어하기 위해 고안됨. -- 가장 간단한 방법은 text prompt이지만, 개인화된 인물 외관 묘사가 어렵다. -- IP-Adapter에 영감을 받아 image prompt를 활용해 인물 외관에 대한 guidance를 주고 배경에 대해서는 text prompt 사용 -- 얼굴 이미지는 image encoder를 통해 encode -- text feature & 인물 외관 feature는 마지막 content embedding에 concat된 후 cross-attention에 보냄 - -:::{figure-md} -eq_1 - -Equation 1 Content Guider cross attentino output given query, text, face, cloth features -::: - -- $Z$ : query features -- $c_t$ : text features / $c_f$ : face features / $c_c$ : cloth features -- $Z^\prime$ : cross-attention output - -## 2.4 Model Training - -**2.4.1 Content Guider Training** - -- Base Model : SD v1.5 기반 -- Image Encoder : OpenCLIP ViT-H14 -- reference face identity 보존을 위해 Arcface를 통해 얼굴 상관 feature 추출. -- LAION-2B에서 human data 수집 -- 훈련 : 512x512 random crop & resize -- GPU : 8 V100, 100k steps, 16 batch size/GPU 1장 -- Optimizer : AdamW -- learning rate : 1e-4, decay 1e-2 - -**2.4.2 Long-Frame Pretraining** - -- WebVid-10M validation set (5k video clips)에서 motion module의 sequence length를 16에서 64로 확장하기 위한 training stage 수행 - - WebVid-10M validation set (5k video clips) : 평균 18초, 총 13000 시간 -- U-Net motion module만 훈련하고 나머지는 freeze -- ControlNet이나 image guidance 사용 안 함. -- learning rate : 1e-4 -- resolution : 256x256 resize & center crop -- batch size 1, 10k steps 이후 훈련 종료 - -**2.4.3 Video ControlNet Training** - -- long-frame pretraining 이후, **Video ControlNet** 훈련 진행. -- U-Net 고정 & **Video ControlNet의 (U-Net block과 motion block)**은 unfreeze -- 수집한 6k human dance video data 훈련 -- DWPose나 ZoeDepth를 통한 human pose 또는 depth를 추출. -- learning rate : 1e-4 -- resolution : 352x352 -- batch size 1, 25k steps 이후 훈련 종료 - -**2.4.4 Expression Fine-Tuning** - -- 사람 표현을 더 낫게하기 위해 **Video ControlNet**을 포함한 **U-Net의 motion block** 구조에서 6k human dancing video data로 추가 fine-tuning -- U-Net motion block weight만 update -- learning rate : 5e-5 -- resolution : 512x512 -- batch size 1, 20k steps 이후 훈련 종료 - -### 2.5 Model Inference - -입력 : text prompt, reference image, pose/depth sequence - -Video ControlNet control scale : 1 (pose/depth에서만) - -multi-controlnet을 통해 pose & depth 동시 사용 가능 - -Eq 1의 face/body guidance strength : $\alpha_f,\alpha_c$는 적응하도록 - -text prompt만 사용할 때 $\alpha_f=\alpha_c=0$ - - -:::{figure-md} -figure_2 - -Figure 2. The results of DreaMoving with text prompt as input -::: - -:::{figure-md} -figure_3 - -Figure 3. The results of DreaMoving with text prompt and face image as inputs -::: - -:::{figure-md} -figure_4 - -Figure 4. The results of DreaMoving with face and cloth images as inputs -::: - -:::{figure-md} -figure_5 - -Figure 5. The results of DreaMoving with stylized image as input -::: +``` {admonition} Information +- **Title:** DreaMoving: A Human Video Generation Framework based on Diffusion Models + +- **Reference** + - Paper: [https://arxiv.org/abs/2311.17117](https://arxiv.org/abs/2312.05107) + - Code: [Official](https://github.com/dreamoving/dreamoving-project) + - Project Page : [https://dreamoving.github.io/dreamoving/](https://dreamoving.github.io/dreamoving/) + +- **Author:** Geonhak Song + +- **Last updated on {March. 13, 2024}** + +``` + +# DreaMoving + +## Abstract + +- 고품질 customized human video 생성을 위해 제어가능한 diffusion 기반 video generation framework인 DreaMoving 제안 +- target identity와 posture sequence가 주어졌을 때, target identity moving이나 dancing video 생성이 가능하다. +- 추가 제안 모듈 : motion-controlling을 위한 **Video ControlNet** & identity preserving을 위한 **Content Guider** + +## 1. Introduction + +- T2V의 진전에도 인간 중심 기반 생성에는 어려움을 겪는 중. +- open-source human dance video dataset의 부족, text 묘사의 어려움으로 인해 frame간 일관성, 긴 길이, 다양성을 포함한 비디오 생성에 어려움을 겪는다. +- personalization과 controllability 의 어려움 또한 존재 +- 구조적 제어를 위한 ControlNet, appearance 제어를 위한 Dreambooth, LoRA +- 그러나 이 기술들은 정확한 제어가 어렵고 hyperparameter tuning 요소가 존재 & 추가 계산 부담 +- 이에 새로운 방법론인 DreaMoving 제안 + +## 2. Architecture + +:::{figure-md} +figure_1 + +Figure 1. The overview of DreaMoving +::: + +- LDM 기반 모델을 기반으로 3가지 주요 network로 구성 + - U-Net, Video ControlNet, Content Guider +- AnimateDiff에서 영감을 받아 U-Net 각 block 이후 motion block을 추가 +- Plug-in : motion-controlling을 위한 **Video ControlNet** & identity preserving을 위한 **Content Guider** + +### 2.1 Data Collection and Preprocessing + +- 인터넷에서 human dance video 1000의 고품질 영상으로 훈련 +- temporal module 훈련은 변이나 특별한 효과 없는 연속적 frame이 필요하기 때문에 clip video로 split하여 6000개의 짧은 비디오를 획득한다.(8~10s) +- text description을 위해서 Minigpt-v2([https://minigpt-v2.github.io/](https://minigpt-v2.github.io/))를 video-captioner로 사용 + - “[grounding] describe this frame in a detailed manner”의 명령으로 획득 + - subject와 background 내용에 대해 정확히 묘사 + +### 2.2 Motion Block + +- temporal consistency와 motion fidelity 향상을 위해서 U-Net과 ControlNet를 motion block으로 통합. +- motion block은 AnimateDiff로 확장. temporal sequence length는 64로 확장 +- 초기화 : AnimateDiff (mm_sd_v15.ckpt) +- 개인 인물 dance video로 finetuning + +### 2.3 Content Guider + +- Content Guider는 인물의 appearance와 배경을 포함한 생성된 video의 내용을 제어하기 위해 고안됨. +- 가장 간단한 방법은 text prompt이지만, 개인화된 인물 외관 묘사가 어렵다. +- IP-Adapter에 영감을 받아 image prompt를 활용해 인물 외관에 대한 guidance를 주고 배경에 대해서는 text prompt 사용 +- 얼굴 이미지는 image encoder를 통해 encode +- text feature & 인물 외관 feature는 마지막 content embedding에 concat된 후 cross-attention에 보냄 + +:::{figure-md} +eq_1 + +Equation 1 Content Guider cross attentino output given query, text, face, cloth features +::: + +- $Z$ : query features +- $c_t$ : text features / $c_f$ : face features / $c_c$ : cloth features +- $Z^\prime$ : cross-attention output + +## 2.4 Model Training + +**2.4.1 Content Guider Training** + +- Base Model : SD v1.5 기반 +- Image Encoder : OpenCLIP ViT-H14 +- reference face identity 보존을 위해 Arcface를 통해 얼굴 상관 feature 추출. +- LAION-2B에서 human data 수집 +- 훈련 : 512x512 random crop & resize +- GPU : 8 V100, 100k steps, 16 batch size/GPU 1장 +- Optimizer : AdamW +- learning rate : 1e-4, decay 1e-2 + +**2.4.2 Long-Frame Pretraining** + +- WebVid-10M validation set (5k video clips)에서 motion module의 sequence length를 16에서 64로 확장하기 위한 training stage 수행 + - WebVid-10M validation set (5k video clips) : 평균 18초, 총 13000 시간 +- U-Net motion module만 훈련하고 나머지는 freeze +- ControlNet이나 image guidance 사용 안 함. +- learning rate : 1e-4 +- resolution : 256x256 resize & center crop +- batch size 1, 10k steps 이후 훈련 종료 + +**2.4.3 Video ControlNet Training** + +- long-frame pretraining 이후, **Video ControlNet** 훈련 진행. +- U-Net 고정 & **Video ControlNet의 (U-Net block과 motion block)**은 unfreeze +- 수집한 6k human dance video data 훈련 +- DWPose나 ZoeDepth를 통한 human pose 또는 depth를 추출. +- learning rate : 1e-4 +- resolution : 352x352 +- batch size 1, 25k steps 이후 훈련 종료 + +**2.4.4 Expression Fine-Tuning** + +- 사람 표현을 더 낫게하기 위해 **Video ControlNet**을 포함한 **U-Net의 motion block** 구조에서 6k human dancing video data로 추가 fine-tuning +- U-Net motion block weight만 update +- learning rate : 5e-5 +- resolution : 512x512 +- batch size 1, 20k steps 이후 훈련 종료 + +### 2.5 Model Inference + +입력 : text prompt, reference image, pose/depth sequence + +Video ControlNet control scale : 1 (pose/depth에서만) + +multi-controlnet을 통해 pose & depth 동시 사용 가능 + +Eq 1의 face/body guidance strength : $\alpha_f,\alpha_c$는 적응하도록 + +text prompt만 사용할 때 $\alpha_f=\alpha_c=0$ + + +:::{figure-md} +figure_2 + +Figure 2. The results of DreaMoving with text prompt as input +::: + +:::{figure-md} +figure_3 + +Figure 3. The results of DreaMoving with text prompt and face image as inputs +::: + +:::{figure-md} +figure_4 + +Figure 4. The results of DreaMoving with face and cloth images as inputs +::: + +:::{figure-md} +figure_5 + +Figure 5. The results of DreaMoving with stylized image as input +::: diff --git a/_sources/docs/review/DreamPose.md b/_sources/docs/review/DreamPose.md old mode 100644 new mode 100755 index 5dcf277b..bf5cf791 --- a/_sources/docs/review/DreamPose.md +++ b/_sources/docs/review/DreamPose.md @@ -1,423 +1,423 @@ -```{admonition} Information -- **Title:** DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion - -- **Reference** - - Paper: [https://arxiv.org/abs/2304.06025](https://arxiv.org/abs/2304.06025) - - Project: [https://grail.cs.washington.edu/projects/dreampose/](https://grail.cs.washington.edu/projects/dreampose/) - -- **Author:** [Jeonghwa Yoo](https://www.linkedin.com/in/jeonghwa-yoo-8403a716b) - -- **Last updated on May. 08, 2023** -``` - - -# DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion - -:::{figure-md} -DreamPose_input_output - -DreamPose 입출력 -::: - - - - -# **1. Introduction** - -- DreamPose가 제안된 배경 - - 패션 사진은 온라인에 널리 퍼져 있지만, 전달할 수 있는 정보가 제한적이며 입었을 때 옷의 늘어진 모양이나 흐름 등 옷의 중요한 뉘앙스를 포착하지 못한다. - - 패션 동영상은 이러한 모든 디테일을 보여주기에 소비자의 의사 결정에 유용한 정보를 제공하지만, 동영상이 있는 상품은 매우 드물다. -- DreamPose - - 본 논문에서는 포즈 시퀀스를 따라 패션 사진을 사실적인 애니메이션 비디오로 변환하는 방법인 DreamPose를 소개한다. - - Stable diffusion을 기반으로 한다. - - 하나 이상의 사람 이미지와 포즈 시퀀스가 주어지면, 포즈 시퀀스를 따라 고품질 비디오를 생성한다. -- 기존 비디오 생성 모델들의 문제점 - - 이미지 생성 디퓨전 모델은 좋은 결과를 보여주었지만, 비디오 생성 디퓨전 모델은 동일한 품질의 결과를 얻지 못했으며, 텍스처 움직임이나 카툰과 같은 모양으로 제한된 경우가 많다. - - 시간적 일관성이 떨어진다. - - 모션 jitter가 발생한다. - - 사실성(realism)이 부족하다. - - 대상 비디오의 움직임이나 세부적인 물체 모양을 제어할 수 없다. - - 기존 모델이 주로 텍스트에 기반으로 하기 때문에 -- DreamPose의 접근법 - - 이미지 및 포즈 시퀀스를 조건으로 받는 방식을 사용하여 fidelity와 프레임 간 일관성을 높일 수 있다. - - 이미지 분포를 효과적으로 모델링하는 기존 사전 학습된 이미지 디퓨전 모델을 파인 튜닝하였다. → 이미지 애니메이션 태스크를 컨디셔닝 신호와 일치하는 이미지의 부분 공간을 찾는 것으로 단순화 할 수 있다. - - 해당 태스크를 위해 스테이블 디퓨전의 인코더와 컨디셔닝 메커니즘을 재설계하였다. - - 2-스테이지 파인튜닝 방식을 사용한다 - - UNet과 VAE를 하나 혹은 여러 입력 이미지에 대해서 파인튜닝 -- Contribution - 1. DreamPose: 패션 이미지 애니메이션을 위해 이미지 및 포즈를 조건으로 하는 디퓨전 방식 - 2. 프레임 간 시간적 일관성을 크게 향상 시키는 간단하지만 효과적인 포즈 컨디셔닝 방식 - 3. 컨디셔닝 이미지의 fidelity를 높여주는 split CLIP-VAE 인코더 - 4. 이미지의 fidelity와 새로운 포즈에 대한 일반화 사이의 균형을 효과적으로 맞추는 파인튜닝 전략 - -# 2. Related Work - -## 2.1. Diffusion models - -- 디퓨전 모델은 최근 text-to-image, 비디오 생성, 3D 생성 태스크에서 인상적인 결과를 보여주고 있다. -- 하지만 이러한 모델을 처음부터 훈련하는 것은 비용이 많이 들고 많은 양의 데이터가 필요하다. -- 스테이블 디퓨전과 같은 latent diffusion 모델은 디퓨전과 디노이징 과정을 latent space에서 수행하기 때문에 계산 요구 사항과 훈련 시간을 대폭 줄일 수 있다. -- 스테이블 디퓨전과 그 사전 훈련된 체크포인트는 출시 이후 다양한 이미지 생성 작업에 사용되었다. -- 본 논문에서도 사전 훈련된 스테이블 디퓨전 모델을 활용하고, subject에 특화된 파인튜닝을 한다. - -## 2.2. Still Image Animation - -- 하나 이상의 입력 이미지로부터 동영상을 생성하는 태스크 -- 기존에 디퓨전 기반이 아닌 접근 방식들은 배경 예측, 모션 표현, occlusion map이나 dense map 등 여러 개의 개별 네트워크로 구성되는 경우가 많았다. - - 각 단계마다 별도의 훈련이 필요하고 ground-truth 모션이나 depth등의 ground-truth 데이터를 사용할 수 없거나 불완전할 가능성이 있다. - - 모션이 크고 복잡할 경우에 groud-truth에 대한 예측은 도출하기 더 어렵고 오류가 발생하기 쉽다. -- 최근 여러 방법들은 엔드 투 엔드 싱글 네트워크 접근 방식을 탐구하고 있다. (예: optical flow and warping, cross-attention 모듈, NeRF 표현을 사용한 애니메이션이 가능한 3D 휴먼 생성 등) - -## 2.3. Fashion Image Synthesis - -- 기존 pose-guided 패션 이미지 합성 방법 - - 일반적으로 GAN을 기반으로 했고, optical flow에 의존해 이미지 특징을 포즈에 맞추는 방법을 사용했다. → 큰 포즈 변화, 가려진 영역 합성, 의상 스타일 보존에 어려움을 겪는 경우가 많다. - - 최근엔 어텐션 기반 메커니즘을 사용하여, 셀프/크로스 어텐션을 사용하여 이미지 특징을 목표 프레임에 맞추려고 하였다. - - 디퓨전 기반 - - DiffFashion: 레퍼런스 이미지의 스타일을 트랜스퍼하여 의류 아이템을 편집하는 것을 목표로 한다. - - PIDM: 포즈를 조건으로 넣어 사람 이미지를 생성한다 → 시간적 일관성을 위한 최적화는 하지 않는다. - -## 2.4. Diffusion Models for Video Synthesis - -- 많은 text-to-video 디퓨전 모델은 text-to-image 디퓨전 모델을 활용하여 적용한다. -- 결과를 기대할만 하지만, 여전히 텍스트-이미지 모델과 같은 성능은 나오지 않고 있다. -- 프레임 간의 시간적 일관성을 유지하는 것과 사실적인 모션을 생성하는 것이 어렵다. -- 어떤 디퓨전 기반 방법들은 스크래치부터 학습하기 때문에 값비싼 컴퓨팅 리소스, 방대학 학습 데이터셋, 오랜 학습 시간이 필요하다. -- Turn-A-Video는 텍스트와 이미지가 조건으로 들어왔을 때 비디오 생성을 위해 사전 학습된 텍스트-이미지 디퓨전 모델을 파인튜닝한다. → 이전 방법들과 마찬가지로 텍스처 깜빡거림(textural flickering), 구조적인 불일치가 나타난다. -- 본 논문에서는 위의 문제를 해결하여 사람과 섬유의 움직임의 싱크를 맞추는 것을 목표로 한다. - -## 2.5. Conditioning Mechanisms for Diffusion Models - -- 텍스트를 조건으로 하는 이미지 생성 디퓨전 모델을 널리 사용되어 왔다. -- 텍스트 컨디셔닝은 높은 수준의 디테일을 조절하는 데는 효과적이지만, 사람과 의상의 정확한 identity나 포즈에 대한 풍부하고 상세한 정보를 제공하는 것은 어렵다. -- 여러 연구에서 사전 학습된 text-to-image 스테이블 디퓨전 모델을 위한 이미지 컨디셔닝 문제를 다루고 있다. - - 이러한 모델에는 종종 어떤 종류의 텍스트 임베딩이 포함된다. (ex: DreamBooth: 피사체별 파인 튜닝을 수행하기 위해 고유한 텍스트 토큰을 학습) - - 기존 이미지와 동영상의 모양을 편집하기 위해 텍스트를 통합하기도 한다. - - PIDM은 별도의 텍스처 인코더를 사용하여 이미지 텍스처를 인코딩하고 입력된 노이즈 이미지와 대상 포즈를 연결한다. -- DreamPose는 영상 속 피사체의 외형뿐만 아니라 구조와 움직임까지 제어할 수 있다. -- PIDM과 마찬가지로 이미지 임베딩을 UNet의 크로스 어텐션 레이어에 직접 통합하지만, 이미지 임베딩에 대해 사전 학습된 두 개의 인코더(CLIP, VAE)를 혼합하여 사용한다. → 입력 노이즈에 연결된(concatenated) 멀티 포즈 입력 표현(multi-pose input representation)을 이용해 부드럽고 시간적으로 일관된 모션을 구현할 수 있다. - -# 3. Background - -- 디퓨전 모델 - - 디퓨전 모델은 품질, 다양성, 학습 안정성 측면에서 합성 태스크에서 GAN을 능가하는 최신 생성 모델이다. - - 표준 이미지 디퓨전 모델은 정규 분포된 랜덤 노이즈에서 이미지를 반복적으로 복원하는 방법을 학습한다. -- Latent diffusion model (ex. Stable Diffusion) - :::{figure-md} - latent diffusion - - Latent Diffusion Model - ::: - - -- 오토인코더의 인코딩된 latent space에서 작동하므로 최소한의 품질을 희생하면서 계산 복잡성을 절약한다. -- 스테이블 디퓨전 모델은 VAE와 디노이징 UNet의 두 가지 모델로 구성된다. - - VAE 오토인코더 - - 인코더 $\mathcal{E}$: 프레임 $x$를 컴팩트한 latent 표현 $z$로 추출 ($z=\mathcal{E}$$(x)$) - - 디코더 $\mathcal{D}$: latent 표현에서 이미지를 복원 ($x’=\mathcal{D}(z)$) - - 학습하는 동안, latent feature $z$는 결정론적 가우시안 프로세스에 의해 타임 스탬프 $T$로 디퓨즈되어 노이지 feature인 $\tilde{z}_T$를 만듦 - - 원본 이미지를 복구하기 위해 각 타임스탬프에 해당하는 latent feature의 노이즈를 반복적으로 예측하도록 시간으로 컨디셔닝된 UNet이 학습 된다. - - UNet의 목적 함수 - - $$ - \begin{align}{\cal L}_{D M}=\mathbb{R}_{z,\epsilon\in{\mathcal{N}}(0,1)}[||\epsilon-\epsilon_{\theta}({\tilde{z}}_{t},t,c)]|_{2}^{2}]\end{align} - $$ - - - c: 컨디셔닝 정보의 임베딩 (텍스트, 이미지, 세그멘테이션 마스크등, 스테이블 디퓨전에서는 CLIP 텍스트 인코더로부터 얻어짐 - - 예측된 latent $z’$은 예측된 이미지 $x’ = \mathcal{D}(z')$를 복구하도록 디코딩 된다. -- Classifier-free guidance - - Implicit classifier를 통해 예측된 노이즈 분포를 조건으로 주어진 분포로 밀어붙이는 샘플링 메커니즘이다. - - 이는 랜덤한 확률로 실제 조건으로 주어진 입력을 널 입력(∅)으로 대체하는 훈련 방식인 드롭아웃을 통해 달성된다. - - 인퍼런스하는 동안 조건으로 주어진 예측은 스칼라 가중치 s를 사용하여 unconditional한 예측을 조건부로 가이드하는 데 사용된다. - - $$ - \begin{align}\epsilon_{\theta}=\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset)+s\cdot(\epsilon_{\theta}(\tilde{z}_{t},t,\mathrm{c})-\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset))\end{align} - $$ - - - $\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset)$: 조건이 없는 경우에 노이즈 벡터 - - $\epsilon_{\theta}(\tilde{z}_{t},t,c)$: 조건이 있는 경우에 노이즈 벡터 - - → 조건을 Null로 줬을 때의 모델의 예측값과 조건을 줬을 때의 모델이 예측값을 보간한다. - - -# **4. Method** - -- 본 논문에서는 단일 이미지와 포즈 시퀀스로부터 사실적인 애니메이션 동영상을 만드는 것을 목표로 한다. -- 이를 위해 패션 동영상 컬렉션에서 사전 학습된 스테이블 디퓨전을 패션 동영상 컬렉션에 맞게 파인튜닝한다. -- 추가 컨디셔닝 신호(이미지 및 포즈)를 받고 동영상으로 볼 수 있는 시간적으로 일관된 콘텐츠를 출력하기 위해 스테이블 디퓨전의 구조를 조정하는 작업이 포함된다. - -## **4.1. Overview** - -- 입출력 - - 입력: 입력 이미지 $x_0$, 포즈 $\{p_1, …, p_n\}$ - - 출력: 비디오 $\{x'_1, …, x’_N\}$ ($x’_i$: 입력 포즈 $p_i$에 해당하는 i 번째 예측된 프레임) -- 입력 이미지와 포즈 시퀀스를 조건으로 하는 사전 훈련된 latent diffusion model을 사용한다. -- 추론 시에는 일반적인 디퓨전 샘플링 절차를 통해 각 프레임을 독립적으로 생성한다. - - 균일하게 분포된 가우시안 노이즈로 시작하여 두 조건 신호로 디퓨전 모델을 반복적으로 쿼리하여 noisy latent의 노이즈를 제거한다. -- 마지막으로 예측된 디노이즈된 latent $z’_i$를 디코딩하여 예측된 비디오 프레임 $x’_i=\mathcal{D}(z’_i)$를 만든다. - -## 4.2. Architecture - -- 이미지 애니메이션을 위해 원래의 text-to-image 스테이블 디퓨전 모델을 수정하고 파인튜닝한다. (조건: 이미지, 포즈) -- 이미지 애니메이션의 목표 - 1. 제공된 입력 이미지에 대한 충실도 - 2. 시각적 품질 - 3. 생성된 프레임의 전반적인 시간적인 안정성 -- 이러한 목표를 달성하기 위해 아키텍처를 아래와 같이 구성하였다. - - :::{figure-md} - DreamPose Architecture - - DreamPose Architecture - ::: - - -### **4.2.1 Split CLIP-VAE Encoder** - -:::{figure-md} -DreamPose Encoder - -DreamPose Encoder -::: - - -- 해당 모듈-컨디셔닝 어댑터(custom conditioning adapter)의 필요성 - - 이미지를 조건으로 넣기 위한 이전 연구 (ex: [InstructPix2Pix](https://arxiv.org/abs/2211.09800))는 주로 조건으로 들어오는 이미지 신호를 디노이징 U-Net에 대한 입력 노이즈와 concat한다. - - 이는 원하는 출력 이미지와 공간적으로(spatially) 정렬된 조건 신호에 대한 조건화에 효과적이지만, DreamPose의 경우에는 네트워크가 입력 이미지와 공간적으로 정렬되지 않은 이미지를 생성하는 것을 목표로 한다. - - 따라서 해당 태스크에는 다른 방법이 필요하고, 이를 위해 맞춤형 컨디셔닝 어댑터를 구현하였다. - - 맞춤형 컨디셔닝 어댑터는 CLIP 텍스트 인코더를 사용하여 이미지 조건화를 대체하는 맞춤형 컨디셔닝 어댑터(custom conditioning adapter)를 구현하였다. - - 이 어댑터는 사전 학습된 CLIP 이미지 및 VAE 인코더에서 인코딩된 정보를 결합한다. -- 디퓨전 기반 파인튜닝 - - 목표: 입력 신호를 원래 네트워크 학습에 사용된 신호와 최대한 유사하게 만들어 학습 기울기를 가능한 한 의미 있게 만드는 것 → 학습된 prior 값의 손실을 방지하는 데 도움이 된다. - - 이러한 이유로 대부분의 디퓨전 기반 파인튜닝 체계는 모든 원래 컨디셔닝 신호를 유지하고 새로운 컨디셔닝 신호와 상호 작용하는 네트워크 가중치를 0으로 초기화한다. -- VAE Encoder의 필요성 - - 스테이블 디퓨전이 텍스트 프롬프트의 CLIP 임베딩으로 컨디셔닝 되고 CLIP이 텍스트와 이미지를 공유 임베딩 스페이스(shared embedding space)로 인코딩한다는 점을 감안할 때 CLIP 컨디셔닝을 조건으로 주어진 이미지에서 파생된 임베딩으로 간단히 대체하는 것이 자연스러워 보일 수 있다. - - 하지만 실제로는 CLIP 이미지 임베딩만으로는 조건으로 주어진 이미지에서 세밀한 디테일을 캡처하기에 충분하지 않다. - - 따라서 스테이블 디퓨전의 VAE에서 인코딩된 latent 임베딩을 추가로 입력한다. - - 이를 통해 디퓨전의 출력 도메인과 일치하는 추가적인 장점을 가지게 된다. -- 어댑터 $\mathcal{A}$ - - 스테이블 디퓨전 아키텍처는 기본적으로 컨디셔닝 신호로 VAE latent를 지원하지 않기 때문에 어댑터 모듈 $\mathcal{A}$를 추가한다. - - 해당 어댑터는 CLIP과 VAE 임베딩을 결합하여 네트워크의 일반적인 cross-attention 연산에 사용되는 하나의 임베딩을 생성한다. - - 이 어댑터는 두 신호를 함께 혼합하고 디노이징 U-Net의 cross-attention 모듈에서 예상하는 일반적인 모양으로 출력을 변환한다. -- 디퓨전 기반 파인튜닝에서 언급했 듯이 학습에서 네트워크의 충격을 완화하기 위해 처음에는 VAE 임베딩에 해당하는 가중치는 0으로 설정되어 네트워크가 CLIP 임베딩으로만 학습을 시작한다. -- 최종 이미지 컨디셔닝 신호 $c_I$를 다음과 같이 정의한다. - -$$ -\begin{align}c_{I}={\mathcal{A}}(c_{\mathrm{CLIP}},c_{\mathrm{VAE}})\end{align} -$$ - -### 4.2.2 Modified UNet - -:::{figure-md} -Modified UNet - -Modified UNet -::: - - -- 이미지 컨디셔닝과 달리 포즈 컨디셔닝은 이미지와 정렬 된다. -- Noisy latent $\tilde{z}_i$를 타겟 포즈 표현 $c_p$와 concat한다. -- 실제 비디오에서 추정된 포즈의 노이즈를 고려하고 생성된 프레임에서의 시간적 일관성을 극대화하기 위해, $c_p$를 다섯 개의 연속된 포즈 프레임으로 구성하였다. 즉, $c_p = \{p_{i-2}, p_{i-1}, pi, p_{i+1}, p_{i+2}\}$ → 개별 포즈로 네트워크를 학습하는 것보다 연속 포즈로 학습하면 전반적인 움직임의 부드러움과 시간적 일관성이 증가한다. -- 구조적으로 0으로 초기화된 10개의 추가 입력 채널을 받아들이도록 UNet 입력 레이어를 수정하고 noisy latent에 해당하는 원래 채널은 사전 학습된 가중치에서 수정되지 않는다. - -### 4.2.3 **Finetuning** - -- 스테이블 디퓨전 모델의 대부분의 레이어 weight는 미리 학습된 text-to-image 스테이블 디퓨전 체크포인트로 초기화된다. -- 이 때, CLIP 이미지 인코더는 별도의 미리 학습된 체크포인트에서 로드된다. -- 새로운 레이어는 초기에 새로운 컨디셔닝 신호가 네트워크 출력에 기여하지 않도록 초기화 된다. -- 초기화 후 DreamPose는 아래의 두 단계로 파인튜닝된다. - - :::{figure-md} - Two-phase finetuning - - Two-phase Finetuning - ::: - - 1. Full Dataset Finetuning - - 전체 훈련 데이터셋에 대한 UNet과 어댑터 모듈을 파인 튜닝하여 입력 이미지 및 포즈와 일치하는 프레임을 합성한다. - 2. Subset-Specific Finetuning - - 하나 이상의 피사체별 입력 이미지에 대해 UNet과 어댑터 모듈을 파인튜닝한 다음 VAE 디코더를 통해 기본 모델을 개선하여 추론에 사용되는 피사체별 맞춤형 모델을 생성한다. -- 다른 이미지 조건부 디퓨전 방법과 마찬가지로, 입력 이미지의 사람과 의상의 identity를 보존하고 프레임 간에 일관성을 유지하려면 샘플별 파인튜닝이 필수적이었다. -- 그러나 단순히 단일 프레임과 포즈 쌍에 대해 훈련하면 텍스처 고착(texture-sticking)과 같은 아티팩트가 출력 비디오에 발생한다. -- 이를 방지하기 위해 각 단계에서 랜덤 크롭을 추가하는 등의 방법으로 이미지-포즈쌍을 증강한다. -- VAE 디코더를 파인튜닝하는 것이 더 선명하고 사실적인 디테일을 복구하는 데 중요하다. - - :::{figure-md} - Importance of VAE finetuning - - VAE 파인튜닝의 중요성 - ::: - - -## 4.4. Pose and Image Classifier-Free Guidance - -- 추론시 단일 입력 이미지와 피사체별 모델(subject-specific model)을 사용하는 일련의 포즈에서 프레임별로 동영상을 생성한다. -- 이중(dual) classifier-free guidance를 사용하여 추론 시에 이미지 컨디셔닝 $c_I$와 포즈 컨디셔닝 $c_p$의 강도를 조절한다. -- 이중 classfier-free guidance는 식 (3)에서 다음과 같이 수정된다. - - $$ - \begin{align*} - {\epsilon_{\theta}(z_{t},c_{I},c_{p})} & {= \epsilon_{\theta}(z_{t},\emptyset,\emptyset)} \\ - {} & {+\, s_{I}(\epsilon_{\theta}(z_{t},c_{I},\mathcal{\emptyset})-\epsilon_{\theta}(z_{t},\emptyset,\emptyset))} \\ - {} & {+\, s_{p}(\epsilon_{\theta}(z_{t},\mathcal{c}_{I},\mathcal{c}_p)-\epsilon_{\theta}(z_{t},\mathcal{c}_{I},\emptyset))} - \end{align*} - $$ - - - $s_I$, $s_p$: 가이던스 웨이트 - - $c_I$: 이미지 컨디셔닝 - - $c_p$: 포즈 컨디셔닝 - - → 이미지 컨디셔닝이 있는 경우와 없는 경우의 노이즈 벡터 차이를 계산하고, 포즈 컨디셔닝이 있는 경우와 없는 경우의 노이즈 벡터 차이를 계산해서 이를 가이던스 웨이트를 통해 강도를 조정해서 반영 - -- $s_I$가 크면 입력 이미지에 높은 외관 충실도를 보장하고, $s_p$가 크면 입력 포즈에 대한 정렬을 보장한다. -- 이중 classifier-free guidance는 포즈 및 이미지 가이드를 강화하는 것 에외도, 피사체별 모델 파인튜닝 후 하나의 입력 포즈에 대한 오버피팅을 방지한다. - -# 5. Experiments - -## 5.1. Implementation Details - -- 입력 이미지 resolution: 512x512 -- GPU: NVIDIA A100 2개 -- 첫 번째 훈련 단계 - - 전체 훈련 데이터셋 사용 - - 5 epoch - - 5e-6 learning rate - - 배치사이즈: 16 (4 gradient accumulation step) - - Dropout: 포즈 입력 5%, 이미지 입력 5% -- 두 번째 훈련 단계 - - 특정 샘플 프레임 사용 - - 500 step - - 1e-5 learning rate - - Dropout 적용 X -- VAE 디코더 파인튜닝 - - 1500 step - - 5e-5 learning rate -- 추론 시에는 PNDM 샘플러 사용 (100step) - -## 5.2. Dataset - -- UBC Fashion 데이터셋 사용 -- Split - - Train: 339개의 영상 - - Test: 100개의 영상 -- 각 비디오의 프레임 속도는 초당 30프레임이며 길이는 약 12초 -- 학습 중에는 학습 비디오로부터 랜덤으로 프레임 쌍을 샘플링 하였다. -- DensePose를 이용해서 포즈를 계산하였다. - -# 6. Results - -## 6.1. Comparisons - -- 공개적으로 사용 가능한 두 가지 최신 비디오 합성 방법인 MRAA(Motion Representations for Articulated Animation)과 Thin-Plate Spline Mothion Model(TPSMM)과 수치적 및 정성적인 비교를 하였다. -- 제공된 훈련 스크립트와 권장 에폭 수를 사용하여 두 가지 모델을 UBC 패션 데이터셋을 이용해서 스크래치부터 학습하였다. -- 평가를 위해서는 AVD 모드에서 제공된 테스트 스크립트를 사용하였다. -- PIDM과도 정성적인 비교를 하였다. PIDM의 경우 훈련 스크립트를 사용할 수 없어서 DeepFashion 데이터셋에 대해 학습된 체크포인트를 통해 비교하였다. -- 100개의 디노이징 스텝을 사용하여 PIDM과 DreamPose를 실행하였다. - -### 6.1.1 Quantitative Analysis - -:::{figure-md} -result 1 - -정량적 성능 비교 -::: - -- 256 픽셀 해상도의 100개의 고유한 패션 동영상으로 구성된 UBC 패션 테스트 셋에 대해 모든 모델을 테스트 하였다. -- 각 동영상에 대해 입력 프레임에서 최소 50프레임 이상 떨어져 있는 50개의 프레임을 추출하여 테스트하였다. -- MRAA와 TPSMM은 모두 driving video에서 추출된 feautre에 의존하는 반면, DreamPose는 UV-포즈 시퀀스에만 의존한다는 점에 유의하라. -- 그럼에도 불구하고 DreamPose 모델은 네 가지 정량적 지표 모두에서 두 가지 방법보다 정량적으로 우수한 성능을 보였다. - -### 6.2.2 Qualitative Analysis - -:::{figure-md} -result 2 - -정성적 성능 비교 -::: - - -- MRAA와 TPSMM은 새로운 포즈를 취할 때 인물의 identity, 옷감 주름, 미세한 패턴이 손실되는 반면 DreamPose는 디테일을 정확하게 유지한다. -- 포즈를 크게 변경하는 동안 MRAA는 팔 다리가 분리 될 수 있다. -- PIDM과의 비교 - :::{figure-md} - result 3 - - PIDM과의 비교 - ::: - - - DreamPose는 얼굴의 identity와 의상 패턴 모두 더 충실도 높은 결과를 생성한다. - - PIDM은 사실적인 얼굴을 합성하지만, 원본 인물의 identity와 일치하지 않고, identity와 옷차림이 프레임마다 달랐다. → PIDM이 비디오 합성에서는 잘 동작하지 않는다. - -## 6.2. Ablation Studies - -- 아래 네 가지 변형에 대해 성능을 비교한다. - 1. $\text{Ours}_{\text{CLIP}}$: 듀얼 CLIP-VAE 인코더 대신에 사전 학습된 CLIP 이미지 인코더를 사용 → CLIP-VAE 인코더 효과 테스트 - 2. $\text{Ours}_{\text{NO-VAE-FT}}$: VAE 디코더를 파인튜닝하지 않은 버전 → 디코더 파인튜닝 효과 테스트 - 3. $\text{Ours}_{\text{1-pose}}$: 5개의 연결된 연속 포즈 대신 하나의 대상 포즈만 노이즈에 연결한 버전 → 연결된 5개의 프레임 효과 테스트 - 4. $\text{Ours}_{\text{Full}}$: 논문에서 제안한 모든 방법이 다 적용된 DreamPose - -**Quantitative Comparison** - -:::{figure-md} -result 4 - -Ablation Studies - 정량적 비교 -::: - -**Qualitative Comparison** - -:::{figure-md} -result 5 - -Ablation Studies - 정성적 비교 -::: - -- 기존의 스테이블 디퓨전에서는 인물의 identity에 대한 디테일을 보존할 수 없었다. -- 텍스트 인코더를 CLIP 인코더로 교체한 결과 대부분의 이미지 디테일은 캡처할 수 있지만, 여전히 외형에 대한 정보 손실이 발생한다. -- VAE 디코더를 파인튜닝하면 디테일의 선명도가 크게 향상되고 입력 포즈에 대한 오버피팅이 발생하지 않는다. -- 한 가지 포즈만 입력하면 팔과 머리카락 주변에서의 피사체의 형태가 눈에 띄게 깜박이는 현상이 나타났다. - -## 6.3. Multiple Input Images - -- DreamPose는 피사체에 대한 입력 이미지를 여러 장 넣어서 파인튜닝할 수 있다. -- 피사체의 입력 이미지를 추가하면 품질과 시점의 일관성이 향상된다. - - :::{figure-md} - result 6 - - Multiple Input Images 결과 - ::: - - - -# **7. Limitations & Future Work** - -- 실패 사례 - - :::{figure-md} - result 7 - - 실패 사례 예시 - ::: - - - 드문 경우지만 팔다리가 옷 속으로 사라지고(왼쪽), hallucinate feature가 보이고(중간)와 대상 포즈가 뒤를 향할 때 방향이 잘못 정렬 되는 경우(오른쪽)가 관찰된다. -- 또한 단순한 패턴의 옷에서 사실적인 결과를 생성하지만 일부 결과는 크고 복잡한 패턴에서 약간의 깜박임 동작을 보인다. -- 다른 디퓨전 모델과 마찬가지로 파인튜닝 및 추론 시간이 GAN 또는 VAE에 비해 느리다. - - 특정 피사체에 대한 모델 파인튜닝은 프레임당 18초의 렌더링 시간 외의 UNet의 경우 약 10분, VAE 디코더의 경우 약 20분이 소요된다. - -# 8. Conclusion - -- 스틸 패션 이미지 애니메이션을 위한 새로운 디퓨전 기반 방법인 DreamPose를 제안하였다. +```{admonition} Information +- **Title:** DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion + +- **Reference** + - Paper: [https://arxiv.org/abs/2304.06025](https://arxiv.org/abs/2304.06025) + - Project: [https://grail.cs.washington.edu/projects/dreampose/](https://grail.cs.washington.edu/projects/dreampose/) + +- **Author:** [Jeonghwa Yoo](https://www.linkedin.com/in/jeonghwa-yoo-8403a716b) + +- **Last updated on May. 08, 2023** +``` + + +# DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion + +:::{figure-md} +DreamPose_input_output + +DreamPose 입출력 +::: + + + + +# **1. Introduction** + +- DreamPose가 제안된 배경 + - 패션 사진은 온라인에 널리 퍼져 있지만, 전달할 수 있는 정보가 제한적이며 입었을 때 옷의 늘어진 모양이나 흐름 등 옷의 중요한 뉘앙스를 포착하지 못한다. + - 패션 동영상은 이러한 모든 디테일을 보여주기에 소비자의 의사 결정에 유용한 정보를 제공하지만, 동영상이 있는 상품은 매우 드물다. +- DreamPose + - 본 논문에서는 포즈 시퀀스를 따라 패션 사진을 사실적인 애니메이션 비디오로 변환하는 방법인 DreamPose를 소개한다. + - Stable diffusion을 기반으로 한다. + - 하나 이상의 사람 이미지와 포즈 시퀀스가 주어지면, 포즈 시퀀스를 따라 고품질 비디오를 생성한다. +- 기존 비디오 생성 모델들의 문제점 + - 이미지 생성 디퓨전 모델은 좋은 결과를 보여주었지만, 비디오 생성 디퓨전 모델은 동일한 품질의 결과를 얻지 못했으며, 텍스처 움직임이나 카툰과 같은 모양으로 제한된 경우가 많다. + - 시간적 일관성이 떨어진다. + - 모션 jitter가 발생한다. + - 사실성(realism)이 부족하다. + - 대상 비디오의 움직임이나 세부적인 물체 모양을 제어할 수 없다. + - 기존 모델이 주로 텍스트에 기반으로 하기 때문에 +- DreamPose의 접근법 + - 이미지 및 포즈 시퀀스를 조건으로 받는 방식을 사용하여 fidelity와 프레임 간 일관성을 높일 수 있다. + - 이미지 분포를 효과적으로 모델링하는 기존 사전 학습된 이미지 디퓨전 모델을 파인 튜닝하였다. → 이미지 애니메이션 태스크를 컨디셔닝 신호와 일치하는 이미지의 부분 공간을 찾는 것으로 단순화 할 수 있다. + - 해당 태스크를 위해 스테이블 디퓨전의 인코더와 컨디셔닝 메커니즘을 재설계하였다. + - 2-스테이지 파인튜닝 방식을 사용한다 + - UNet과 VAE를 하나 혹은 여러 입력 이미지에 대해서 파인튜닝 +- Contribution + 1. DreamPose: 패션 이미지 애니메이션을 위해 이미지 및 포즈를 조건으로 하는 디퓨전 방식 + 2. 프레임 간 시간적 일관성을 크게 향상 시키는 간단하지만 효과적인 포즈 컨디셔닝 방식 + 3. 컨디셔닝 이미지의 fidelity를 높여주는 split CLIP-VAE 인코더 + 4. 이미지의 fidelity와 새로운 포즈에 대한 일반화 사이의 균형을 효과적으로 맞추는 파인튜닝 전략 + +# 2. Related Work + +## 2.1. Diffusion models + +- 디퓨전 모델은 최근 text-to-image, 비디오 생성, 3D 생성 태스크에서 인상적인 결과를 보여주고 있다. +- 하지만 이러한 모델을 처음부터 훈련하는 것은 비용이 많이 들고 많은 양의 데이터가 필요하다. +- 스테이블 디퓨전과 같은 latent diffusion 모델은 디퓨전과 디노이징 과정을 latent space에서 수행하기 때문에 계산 요구 사항과 훈련 시간을 대폭 줄일 수 있다. +- 스테이블 디퓨전과 그 사전 훈련된 체크포인트는 출시 이후 다양한 이미지 생성 작업에 사용되었다. +- 본 논문에서도 사전 훈련된 스테이블 디퓨전 모델을 활용하고, subject에 특화된 파인튜닝을 한다. + +## 2.2. Still Image Animation + +- 하나 이상의 입력 이미지로부터 동영상을 생성하는 태스크 +- 기존에 디퓨전 기반이 아닌 접근 방식들은 배경 예측, 모션 표현, occlusion map이나 dense map 등 여러 개의 개별 네트워크로 구성되는 경우가 많았다. + - 각 단계마다 별도의 훈련이 필요하고 ground-truth 모션이나 depth등의 ground-truth 데이터를 사용할 수 없거나 불완전할 가능성이 있다. + - 모션이 크고 복잡할 경우에 groud-truth에 대한 예측은 도출하기 더 어렵고 오류가 발생하기 쉽다. +- 최근 여러 방법들은 엔드 투 엔드 싱글 네트워크 접근 방식을 탐구하고 있다. (예: optical flow and warping, cross-attention 모듈, NeRF 표현을 사용한 애니메이션이 가능한 3D 휴먼 생성 등) + +## 2.3. Fashion Image Synthesis + +- 기존 pose-guided 패션 이미지 합성 방법 + - 일반적으로 GAN을 기반으로 했고, optical flow에 의존해 이미지 특징을 포즈에 맞추는 방법을 사용했다. → 큰 포즈 변화, 가려진 영역 합성, 의상 스타일 보존에 어려움을 겪는 경우가 많다. + - 최근엔 어텐션 기반 메커니즘을 사용하여, 셀프/크로스 어텐션을 사용하여 이미지 특징을 목표 프레임에 맞추려고 하였다. + - 디퓨전 기반 + - DiffFashion: 레퍼런스 이미지의 스타일을 트랜스퍼하여 의류 아이템을 편집하는 것을 목표로 한다. + - PIDM: 포즈를 조건으로 넣어 사람 이미지를 생성한다 → 시간적 일관성을 위한 최적화는 하지 않는다. + +## 2.4. Diffusion Models for Video Synthesis + +- 많은 text-to-video 디퓨전 모델은 text-to-image 디퓨전 모델을 활용하여 적용한다. +- 결과를 기대할만 하지만, 여전히 텍스트-이미지 모델과 같은 성능은 나오지 않고 있다. +- 프레임 간의 시간적 일관성을 유지하는 것과 사실적인 모션을 생성하는 것이 어렵다. +- 어떤 디퓨전 기반 방법들은 스크래치부터 학습하기 때문에 값비싼 컴퓨팅 리소스, 방대학 학습 데이터셋, 오랜 학습 시간이 필요하다. +- Turn-A-Video는 텍스트와 이미지가 조건으로 들어왔을 때 비디오 생성을 위해 사전 학습된 텍스트-이미지 디퓨전 모델을 파인튜닝한다. → 이전 방법들과 마찬가지로 텍스처 깜빡거림(textural flickering), 구조적인 불일치가 나타난다. +- 본 논문에서는 위의 문제를 해결하여 사람과 섬유의 움직임의 싱크를 맞추는 것을 목표로 한다. + +## 2.5. Conditioning Mechanisms for Diffusion Models + +- 텍스트를 조건으로 하는 이미지 생성 디퓨전 모델을 널리 사용되어 왔다. +- 텍스트 컨디셔닝은 높은 수준의 디테일을 조절하는 데는 효과적이지만, 사람과 의상의 정확한 identity나 포즈에 대한 풍부하고 상세한 정보를 제공하는 것은 어렵다. +- 여러 연구에서 사전 학습된 text-to-image 스테이블 디퓨전 모델을 위한 이미지 컨디셔닝 문제를 다루고 있다. + - 이러한 모델에는 종종 어떤 종류의 텍스트 임베딩이 포함된다. (ex: DreamBooth: 피사체별 파인 튜닝을 수행하기 위해 고유한 텍스트 토큰을 학습) + - 기존 이미지와 동영상의 모양을 편집하기 위해 텍스트를 통합하기도 한다. + - PIDM은 별도의 텍스처 인코더를 사용하여 이미지 텍스처를 인코딩하고 입력된 노이즈 이미지와 대상 포즈를 연결한다. +- DreamPose는 영상 속 피사체의 외형뿐만 아니라 구조와 움직임까지 제어할 수 있다. +- PIDM과 마찬가지로 이미지 임베딩을 UNet의 크로스 어텐션 레이어에 직접 통합하지만, 이미지 임베딩에 대해 사전 학습된 두 개의 인코더(CLIP, VAE)를 혼합하여 사용한다. → 입력 노이즈에 연결된(concatenated) 멀티 포즈 입력 표현(multi-pose input representation)을 이용해 부드럽고 시간적으로 일관된 모션을 구현할 수 있다. + +# 3. Background + +- 디퓨전 모델 + - 디퓨전 모델은 품질, 다양성, 학습 안정성 측면에서 합성 태스크에서 GAN을 능가하는 최신 생성 모델이다. + - 표준 이미지 디퓨전 모델은 정규 분포된 랜덤 노이즈에서 이미지를 반복적으로 복원하는 방법을 학습한다. +- Latent diffusion model (ex. Stable Diffusion) + :::{figure-md} + latent diffusion + + Latent Diffusion Model + ::: + + +- 오토인코더의 인코딩된 latent space에서 작동하므로 최소한의 품질을 희생하면서 계산 복잡성을 절약한다. +- 스테이블 디퓨전 모델은 VAE와 디노이징 UNet의 두 가지 모델로 구성된다. + - VAE 오토인코더 + - 인코더 $\mathcal{E}$: 프레임 $x$를 컴팩트한 latent 표현 $z$로 추출 ($z=\mathcal{E}$$(x)$) + - 디코더 $\mathcal{D}$: latent 표현에서 이미지를 복원 ($x’=\mathcal{D}(z)$) + - 학습하는 동안, latent feature $z$는 결정론적 가우시안 프로세스에 의해 타임 스탬프 $T$로 디퓨즈되어 노이지 feature인 $\tilde{z}_T$를 만듦 + - 원본 이미지를 복구하기 위해 각 타임스탬프에 해당하는 latent feature의 노이즈를 반복적으로 예측하도록 시간으로 컨디셔닝된 UNet이 학습 된다. + - UNet의 목적 함수 + + $$ + \begin{align}{\cal L}_{D M}=\mathbb{R}_{z,\epsilon\in{\mathcal{N}}(0,1)}[||\epsilon-\epsilon_{\theta}({\tilde{z}}_{t},t,c)]|_{2}^{2}]\end{align} + $$ + + - c: 컨디셔닝 정보의 임베딩 (텍스트, 이미지, 세그멘테이션 마스크등, 스테이블 디퓨전에서는 CLIP 텍스트 인코더로부터 얻어짐 + - 예측된 latent $z’$은 예측된 이미지 $x’ = \mathcal{D}(z')$를 복구하도록 디코딩 된다. +- Classifier-free guidance + - Implicit classifier를 통해 예측된 노이즈 분포를 조건으로 주어진 분포로 밀어붙이는 샘플링 메커니즘이다. + - 이는 랜덤한 확률로 실제 조건으로 주어진 입력을 널 입력(∅)으로 대체하는 훈련 방식인 드롭아웃을 통해 달성된다. + - 인퍼런스하는 동안 조건으로 주어진 예측은 스칼라 가중치 s를 사용하여 unconditional한 예측을 조건부로 가이드하는 데 사용된다. + + $$ + \begin{align}\epsilon_{\theta}=\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset)+s\cdot(\epsilon_{\theta}(\tilde{z}_{t},t,\mathrm{c})-\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset))\end{align} + $$ + + - $\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset)$: 조건이 없는 경우에 노이즈 벡터 + - $\epsilon_{\theta}(\tilde{z}_{t},t,c)$: 조건이 있는 경우에 노이즈 벡터 + + → 조건을 Null로 줬을 때의 모델의 예측값과 조건을 줬을 때의 모델이 예측값을 보간한다. + + +# **4. Method** + +- 본 논문에서는 단일 이미지와 포즈 시퀀스로부터 사실적인 애니메이션 동영상을 만드는 것을 목표로 한다. +- 이를 위해 패션 동영상 컬렉션에서 사전 학습된 스테이블 디퓨전을 패션 동영상 컬렉션에 맞게 파인튜닝한다. +- 추가 컨디셔닝 신호(이미지 및 포즈)를 받고 동영상으로 볼 수 있는 시간적으로 일관된 콘텐츠를 출력하기 위해 스테이블 디퓨전의 구조를 조정하는 작업이 포함된다. + +## **4.1. Overview** + +- 입출력 + - 입력: 입력 이미지 $x_0$, 포즈 $\{p_1, …, p_n\}$ + - 출력: 비디오 $\{x'_1, …, x’_N\}$ ($x’_i$: 입력 포즈 $p_i$에 해당하는 i 번째 예측된 프레임) +- 입력 이미지와 포즈 시퀀스를 조건으로 하는 사전 훈련된 latent diffusion model을 사용한다. +- 추론 시에는 일반적인 디퓨전 샘플링 절차를 통해 각 프레임을 독립적으로 생성한다. + - 균일하게 분포된 가우시안 노이즈로 시작하여 두 조건 신호로 디퓨전 모델을 반복적으로 쿼리하여 noisy latent의 노이즈를 제거한다. +- 마지막으로 예측된 디노이즈된 latent $z’_i$를 디코딩하여 예측된 비디오 프레임 $x’_i=\mathcal{D}(z’_i)$를 만든다. + +## 4.2. Architecture + +- 이미지 애니메이션을 위해 원래의 text-to-image 스테이블 디퓨전 모델을 수정하고 파인튜닝한다. (조건: 이미지, 포즈) +- 이미지 애니메이션의 목표 + 1. 제공된 입력 이미지에 대한 충실도 + 2. 시각적 품질 + 3. 생성된 프레임의 전반적인 시간적인 안정성 +- 이러한 목표를 달성하기 위해 아키텍처를 아래와 같이 구성하였다. + + :::{figure-md} + DreamPose Architecture + + DreamPose Architecture + ::: + + +### **4.2.1 Split CLIP-VAE Encoder** + +:::{figure-md} +DreamPose Encoder + +DreamPose Encoder +::: + + +- 해당 모듈-컨디셔닝 어댑터(custom conditioning adapter)의 필요성 + - 이미지를 조건으로 넣기 위한 이전 연구 (ex: [InstructPix2Pix](https://arxiv.org/abs/2211.09800))는 주로 조건으로 들어오는 이미지 신호를 디노이징 U-Net에 대한 입력 노이즈와 concat한다. + - 이는 원하는 출력 이미지와 공간적으로(spatially) 정렬된 조건 신호에 대한 조건화에 효과적이지만, DreamPose의 경우에는 네트워크가 입력 이미지와 공간적으로 정렬되지 않은 이미지를 생성하는 것을 목표로 한다. + - 따라서 해당 태스크에는 다른 방법이 필요하고, 이를 위해 맞춤형 컨디셔닝 어댑터를 구현하였다. + - 맞춤형 컨디셔닝 어댑터는 CLIP 텍스트 인코더를 사용하여 이미지 조건화를 대체하는 맞춤형 컨디셔닝 어댑터(custom conditioning adapter)를 구현하였다. + - 이 어댑터는 사전 학습된 CLIP 이미지 및 VAE 인코더에서 인코딩된 정보를 결합한다. +- 디퓨전 기반 파인튜닝 + - 목표: 입력 신호를 원래 네트워크 학습에 사용된 신호와 최대한 유사하게 만들어 학습 기울기를 가능한 한 의미 있게 만드는 것 → 학습된 prior 값의 손실을 방지하는 데 도움이 된다. + - 이러한 이유로 대부분의 디퓨전 기반 파인튜닝 체계는 모든 원래 컨디셔닝 신호를 유지하고 새로운 컨디셔닝 신호와 상호 작용하는 네트워크 가중치를 0으로 초기화한다. +- VAE Encoder의 필요성 + - 스테이블 디퓨전이 텍스트 프롬프트의 CLIP 임베딩으로 컨디셔닝 되고 CLIP이 텍스트와 이미지를 공유 임베딩 스페이스(shared embedding space)로 인코딩한다는 점을 감안할 때 CLIP 컨디셔닝을 조건으로 주어진 이미지에서 파생된 임베딩으로 간단히 대체하는 것이 자연스러워 보일 수 있다. + - 하지만 실제로는 CLIP 이미지 임베딩만으로는 조건으로 주어진 이미지에서 세밀한 디테일을 캡처하기에 충분하지 않다. + - 따라서 스테이블 디퓨전의 VAE에서 인코딩된 latent 임베딩을 추가로 입력한다. + - 이를 통해 디퓨전의 출력 도메인과 일치하는 추가적인 장점을 가지게 된다. +- 어댑터 $\mathcal{A}$ + - 스테이블 디퓨전 아키텍처는 기본적으로 컨디셔닝 신호로 VAE latent를 지원하지 않기 때문에 어댑터 모듈 $\mathcal{A}$를 추가한다. + - 해당 어댑터는 CLIP과 VAE 임베딩을 결합하여 네트워크의 일반적인 cross-attention 연산에 사용되는 하나의 임베딩을 생성한다. + - 이 어댑터는 두 신호를 함께 혼합하고 디노이징 U-Net의 cross-attention 모듈에서 예상하는 일반적인 모양으로 출력을 변환한다. +- 디퓨전 기반 파인튜닝에서 언급했 듯이 학습에서 네트워크의 충격을 완화하기 위해 처음에는 VAE 임베딩에 해당하는 가중치는 0으로 설정되어 네트워크가 CLIP 임베딩으로만 학습을 시작한다. +- 최종 이미지 컨디셔닝 신호 $c_I$를 다음과 같이 정의한다. + +$$ +\begin{align}c_{I}={\mathcal{A}}(c_{\mathrm{CLIP}},c_{\mathrm{VAE}})\end{align} +$$ + +### 4.2.2 Modified UNet + +:::{figure-md} +Modified UNet + +Modified UNet +::: + + +- 이미지 컨디셔닝과 달리 포즈 컨디셔닝은 이미지와 정렬 된다. +- Noisy latent $\tilde{z}_i$를 타겟 포즈 표현 $c_p$와 concat한다. +- 실제 비디오에서 추정된 포즈의 노이즈를 고려하고 생성된 프레임에서의 시간적 일관성을 극대화하기 위해, $c_p$를 다섯 개의 연속된 포즈 프레임으로 구성하였다. 즉, $c_p = \{p_{i-2}, p_{i-1}, pi, p_{i+1}, p_{i+2}\}$ → 개별 포즈로 네트워크를 학습하는 것보다 연속 포즈로 학습하면 전반적인 움직임의 부드러움과 시간적 일관성이 증가한다. +- 구조적으로 0으로 초기화된 10개의 추가 입력 채널을 받아들이도록 UNet 입력 레이어를 수정하고 noisy latent에 해당하는 원래 채널은 사전 학습된 가중치에서 수정되지 않는다. + +### 4.2.3 **Finetuning** + +- 스테이블 디퓨전 모델의 대부분의 레이어 weight는 미리 학습된 text-to-image 스테이블 디퓨전 체크포인트로 초기화된다. +- 이 때, CLIP 이미지 인코더는 별도의 미리 학습된 체크포인트에서 로드된다. +- 새로운 레이어는 초기에 새로운 컨디셔닝 신호가 네트워크 출력에 기여하지 않도록 초기화 된다. +- 초기화 후 DreamPose는 아래의 두 단계로 파인튜닝된다. + + :::{figure-md} + Two-phase finetuning + + Two-phase Finetuning + ::: + + 1. Full Dataset Finetuning + - 전체 훈련 데이터셋에 대한 UNet과 어댑터 모듈을 파인 튜닝하여 입력 이미지 및 포즈와 일치하는 프레임을 합성한다. + 2. Subset-Specific Finetuning + - 하나 이상의 피사체별 입력 이미지에 대해 UNet과 어댑터 모듈을 파인튜닝한 다음 VAE 디코더를 통해 기본 모델을 개선하여 추론에 사용되는 피사체별 맞춤형 모델을 생성한다. +- 다른 이미지 조건부 디퓨전 방법과 마찬가지로, 입력 이미지의 사람과 의상의 identity를 보존하고 프레임 간에 일관성을 유지하려면 샘플별 파인튜닝이 필수적이었다. +- 그러나 단순히 단일 프레임과 포즈 쌍에 대해 훈련하면 텍스처 고착(texture-sticking)과 같은 아티팩트가 출력 비디오에 발생한다. +- 이를 방지하기 위해 각 단계에서 랜덤 크롭을 추가하는 등의 방법으로 이미지-포즈쌍을 증강한다. +- VAE 디코더를 파인튜닝하는 것이 더 선명하고 사실적인 디테일을 복구하는 데 중요하다. + + :::{figure-md} + Importance of VAE finetuning + + VAE 파인튜닝의 중요성 + ::: + + +## 4.4. Pose and Image Classifier-Free Guidance + +- 추론시 단일 입력 이미지와 피사체별 모델(subject-specific model)을 사용하는 일련의 포즈에서 프레임별로 동영상을 생성한다. +- 이중(dual) classifier-free guidance를 사용하여 추론 시에 이미지 컨디셔닝 $c_I$와 포즈 컨디셔닝 $c_p$의 강도를 조절한다. +- 이중 classfier-free guidance는 식 (3)에서 다음과 같이 수정된다. + + $$ + \begin{align*} + {\epsilon_{\theta}(z_{t},c_{I},c_{p})} & {= \epsilon_{\theta}(z_{t},\emptyset,\emptyset)} \\ + {} & {+\, s_{I}(\epsilon_{\theta}(z_{t},c_{I},\mathcal{\emptyset})-\epsilon_{\theta}(z_{t},\emptyset,\emptyset))} \\ + {} & {+\, s_{p}(\epsilon_{\theta}(z_{t},\mathcal{c}_{I},\mathcal{c}_p)-\epsilon_{\theta}(z_{t},\mathcal{c}_{I},\emptyset))} + \end{align*} + $$ + + - $s_I$, $s_p$: 가이던스 웨이트 + - $c_I$: 이미지 컨디셔닝 + - $c_p$: 포즈 컨디셔닝 + + → 이미지 컨디셔닝이 있는 경우와 없는 경우의 노이즈 벡터 차이를 계산하고, 포즈 컨디셔닝이 있는 경우와 없는 경우의 노이즈 벡터 차이를 계산해서 이를 가이던스 웨이트를 통해 강도를 조정해서 반영 + +- $s_I$가 크면 입력 이미지에 높은 외관 충실도를 보장하고, $s_p$가 크면 입력 포즈에 대한 정렬을 보장한다. +- 이중 classifier-free guidance는 포즈 및 이미지 가이드를 강화하는 것 에외도, 피사체별 모델 파인튜닝 후 하나의 입력 포즈에 대한 오버피팅을 방지한다. + +# 5. Experiments + +## 5.1. Implementation Details + +- 입력 이미지 resolution: 512x512 +- GPU: NVIDIA A100 2개 +- 첫 번째 훈련 단계 + - 전체 훈련 데이터셋 사용 + - 5 epoch + - 5e-6 learning rate + - 배치사이즈: 16 (4 gradient accumulation step) + - Dropout: 포즈 입력 5%, 이미지 입력 5% +- 두 번째 훈련 단계 + - 특정 샘플 프레임 사용 + - 500 step + - 1e-5 learning rate + - Dropout 적용 X +- VAE 디코더 파인튜닝 + - 1500 step + - 5e-5 learning rate +- 추론 시에는 PNDM 샘플러 사용 (100step) + +## 5.2. Dataset + +- UBC Fashion 데이터셋 사용 +- Split + - Train: 339개의 영상 + - Test: 100개의 영상 +- 각 비디오의 프레임 속도는 초당 30프레임이며 길이는 약 12초 +- 학습 중에는 학습 비디오로부터 랜덤으로 프레임 쌍을 샘플링 하였다. +- DensePose를 이용해서 포즈를 계산하였다. + +# 6. Results + +## 6.1. Comparisons + +- 공개적으로 사용 가능한 두 가지 최신 비디오 합성 방법인 MRAA(Motion Representations for Articulated Animation)과 Thin-Plate Spline Mothion Model(TPSMM)과 수치적 및 정성적인 비교를 하였다. +- 제공된 훈련 스크립트와 권장 에폭 수를 사용하여 두 가지 모델을 UBC 패션 데이터셋을 이용해서 스크래치부터 학습하였다. +- 평가를 위해서는 AVD 모드에서 제공된 테스트 스크립트를 사용하였다. +- PIDM과도 정성적인 비교를 하였다. PIDM의 경우 훈련 스크립트를 사용할 수 없어서 DeepFashion 데이터셋에 대해 학습된 체크포인트를 통해 비교하였다. +- 100개의 디노이징 스텝을 사용하여 PIDM과 DreamPose를 실행하였다. + +### 6.1.1 Quantitative Analysis + +:::{figure-md} +result 1 + +정량적 성능 비교 +::: + +- 256 픽셀 해상도의 100개의 고유한 패션 동영상으로 구성된 UBC 패션 테스트 셋에 대해 모든 모델을 테스트 하였다. +- 각 동영상에 대해 입력 프레임에서 최소 50프레임 이상 떨어져 있는 50개의 프레임을 추출하여 테스트하였다. +- MRAA와 TPSMM은 모두 driving video에서 추출된 feautre에 의존하는 반면, DreamPose는 UV-포즈 시퀀스에만 의존한다는 점에 유의하라. +- 그럼에도 불구하고 DreamPose 모델은 네 가지 정량적 지표 모두에서 두 가지 방법보다 정량적으로 우수한 성능을 보였다. + +### 6.2.2 Qualitative Analysis + +:::{figure-md} +result 2 + +정성적 성능 비교 +::: + + +- MRAA와 TPSMM은 새로운 포즈를 취할 때 인물의 identity, 옷감 주름, 미세한 패턴이 손실되는 반면 DreamPose는 디테일을 정확하게 유지한다. +- 포즈를 크게 변경하는 동안 MRAA는 팔 다리가 분리 될 수 있다. +- PIDM과의 비교 + :::{figure-md} + result 3 + + PIDM과의 비교 + ::: + + - DreamPose는 얼굴의 identity와 의상 패턴 모두 더 충실도 높은 결과를 생성한다. + - PIDM은 사실적인 얼굴을 합성하지만, 원본 인물의 identity와 일치하지 않고, identity와 옷차림이 프레임마다 달랐다. → PIDM이 비디오 합성에서는 잘 동작하지 않는다. + +## 6.2. Ablation Studies + +- 아래 네 가지 변형에 대해 성능을 비교한다. + 1. $\text{Ours}_{\text{CLIP}}$: 듀얼 CLIP-VAE 인코더 대신에 사전 학습된 CLIP 이미지 인코더를 사용 → CLIP-VAE 인코더 효과 테스트 + 2. $\text{Ours}_{\text{NO-VAE-FT}}$: VAE 디코더를 파인튜닝하지 않은 버전 → 디코더 파인튜닝 효과 테스트 + 3. $\text{Ours}_{\text{1-pose}}$: 5개의 연결된 연속 포즈 대신 하나의 대상 포즈만 노이즈에 연결한 버전 → 연결된 5개의 프레임 효과 테스트 + 4. $\text{Ours}_{\text{Full}}$: 논문에서 제안한 모든 방법이 다 적용된 DreamPose + +**Quantitative Comparison** + +:::{figure-md} +result 4 + +Ablation Studies - 정량적 비교 +::: + +**Qualitative Comparison** + +:::{figure-md} +result 5 + +Ablation Studies - 정성적 비교 +::: + +- 기존의 스테이블 디퓨전에서는 인물의 identity에 대한 디테일을 보존할 수 없었다. +- 텍스트 인코더를 CLIP 인코더로 교체한 결과 대부분의 이미지 디테일은 캡처할 수 있지만, 여전히 외형에 대한 정보 손실이 발생한다. +- VAE 디코더를 파인튜닝하면 디테일의 선명도가 크게 향상되고 입력 포즈에 대한 오버피팅이 발생하지 않는다. +- 한 가지 포즈만 입력하면 팔과 머리카락 주변에서의 피사체의 형태가 눈에 띄게 깜박이는 현상이 나타났다. + +## 6.3. Multiple Input Images + +- DreamPose는 피사체에 대한 입력 이미지를 여러 장 넣어서 파인튜닝할 수 있다. +- 피사체의 입력 이미지를 추가하면 품질과 시점의 일관성이 향상된다. + + :::{figure-md} + result 6 + + Multiple Input Images 결과 + ::: + + + +# **7. Limitations & Future Work** + +- 실패 사례 + + :::{figure-md} + result 7 + + 실패 사례 예시 + ::: + + - 드문 경우지만 팔다리가 옷 속으로 사라지고(왼쪽), hallucinate feature가 보이고(중간)와 대상 포즈가 뒤를 향할 때 방향이 잘못 정렬 되는 경우(오른쪽)가 관찰된다. +- 또한 단순한 패턴의 옷에서 사실적인 결과를 생성하지만 일부 결과는 크고 복잡한 패턴에서 약간의 깜박임 동작을 보인다. +- 다른 디퓨전 모델과 마찬가지로 파인튜닝 및 추론 시간이 GAN 또는 VAE에 비해 느리다. + - 특정 피사체에 대한 모델 파인튜닝은 프레임당 18초의 렌더링 시간 외의 UNet의 경우 약 10분, VAE 디코더의 경우 약 20분이 소요된다. + +# 8. Conclusion + +- 스틸 패션 이미지 애니메이션을 위한 새로운 디퓨전 기반 방법인 DreamPose를 제안하였다. - 한 장의 이미지와 포즈 시퀀스가 주어졌을 때, 섬유, 패턴, 사람의 identity를 애니메이션 하는 사실적인 사실적인 패션 동영상을 생성하는 방법을 증명하였다. \ No newline at end of file diff --git a/_sources/docs/review/GIGAGAN.md b/_sources/docs/review/GIGAGAN.md old mode 100644 new mode 100755 index db1ce62b..cb2c74e0 --- a/_sources/docs/review/GIGAGAN.md +++ b/_sources/docs/review/GIGAGAN.md @@ -1,294 +1,294 @@ -```{admonition} Information -- **Title:** Scaling up GANs for Text-to-Image Synthesis (CVPR 2023) - -- **Reference** - - Paper: [https://arxiv.org/abs/2303.05511](https://arxiv.org/abs/2303.05511) - - Code: [NON Official:](https://github.com/lucidrains/gigagan-pytorch) - -- **Author:** Seunghwan Ji - -- **Last updated on April. 14, 2024** -``` - -# Scaling up GANs for Text-to-Image Synthesis - -## Abstract - -- 최근 이미지 생성 task의 모델 성능이 꾸준히 발전중 -- 기존에는 stylegan과 같은 GAN 모델이 주를 이뤘지만 최근 DALLE, Stable Diffusion등 **Diffusion 기반**의 모델 베이스로 추세가 급격하게 바뀌어버림 -- *“GAN 모델로 Diffusion의 성능을 잡는것은 정말 무리일까?”* -- GigaGAN은 - - **gan 기반의 모델**로 1. **속도점 이점**과 **2. 다양한 extra editing**이 가능하다. (contribution) - 1. 속도적 이점 - 1. 512px의 이미지를 0.13초만에 생성할 수 있다. - 2. 16-megapixel(1600만 픽셀, 4k)의 이미지를 3.66초만에 생성할 수 있다. - 2. 다양한 활용성 - 1. latent space 상 에서의 image editing이 가능하다. (latent interpolation, style mixing …) - -## Introduction - -- 최근 Diffusion 기반의 모델들이 이미지 생성 분야에서 좋은 성능을 보여주고 있다. -- Diffusion은 - - 기본적으로 학습과 생성 시 iteration이 들어가는데 iteration은 **학습의 안정성을 키워주는 장점**이 있지만, **computation cost가 매우 증가**한다는 단점이 있다. -- 반면에 GAN은 - - 이미지 생성 시 single forward pass만 필요하므로 **cost가 크지 않다는 장점**이 있지만 single 혹은 multiple object의 생성에는 성능이 뛰어나지만 **class가 명확히 정의되지않은 이미지 즉, open world image의 생성에는 어려움**이 있다. -- ***“GAN을 더 develop한다면 Diffusion 모델을 넘어설 수 있을까?”*** -- gigaGAN은? - 1. 속도적 장점 - - 0.13 s/img (512 size), 3.66s / img (4k) - 2. latent space상에서의 editing 가능(**style mixing, interpolation, prompt mixing** like stylegan2) - -## Methods - -:::{figure-md} -img0 - -Overall Architecture -::: - -**Base Architecture** - -- Base Model은 stylegan2로 선정 -- $G = M\times \tilde{G}$ -- $M$(mapping network) : gaussian distribution에서의 noise를 좀더 disentangle된 w space로 mapping 시키는 network - - gigagan에서는 mapping network의 input으로 z와 함께 text condition(c)도 함께 사용 - - output : $w$ (vector) -- $\tilde{G}$ : 피라미드 구조의 convolution block들로 random constant 값으로부터 output image $X$를 생성하는 generator. - - 이때 $w$ vector는 각 layer마다 입력으로 들어가서 feature map의 분포를 scaling함으로써 style을 반영(modulation, demodulation in stylegan2) - -**Sample-adaptive kernel selection** - -:::{figure-md} -img1 - -Sample Adaptive Kernel Selection -::: - -- 도입 배경 - - 단순히 convolution layer의 kernel size만 scaling up을 하면 학습이 안되는 현상 - - GAN 기반 모델이 (1)**text-condition**의 (2)**오픈 이미지** 생성에 한계를 보이는 이유는 convolution network의 구조 때문이다. - - convolution 연산은 구조상 같은 레이어상에 있는 하나의 filter가 **text condition 주입부터 이미지의 생성까지 모든 부분에 참여**하는데 이 부분이 모델의 표현력을 떨어트릴 수 있다. -- kernel selection method 적용 -- 레이어마다 $\{k_{i}\in R^{C_{in}\times C_{out}\times K\times K}\}$차원의 N개의 kernel set을 두고 style vector w의 affine layer를 거친 weight를 **각 kernel값에 weighted summation한 값을 최종 filter로 사용** - - :::{figure-md} - img2 - - Equation of kernel selection method affine layer - ::: - -- 이 때 kernel weight 계산에 softmax를 사용하는데 얘는 differentiable하므로 gradient update 가능 -- 또, 실제로 N개의 kernel을 모두 filter로 사용할 때보다 computation cost가 굉장히 절약된다는 장점 - -**Interleaving attention with convolution** - -- 도입 배경 - - convolution filter는 receptive field 내부의 local feature 캡처에는 탁월하지만 field 외부의 부분은 학습할 수 없다. - - :::{figure-md} - img3 - - Receptive Field in Convolution Networks - ::: - - - 이러한 한계점을 극복하기위해 **attention layer**($g_{attn}$)를 추가 - - 단순히 stylegan2에 attention layer를 추가하면 학습에 이상이 생김 - - 원인은 attention layer에서 사용하는 **dot product가 Lipschitz함수가 아니기 때문** - - lipschitz 함수란 - - lipschitz 함수란, **두 점 사이의 거리를 일정 비 이상으로 증가시키지 않는 함수** - - :::{figure-md} - img4 - - lipschitz Function - ::: - - - **Lipschitz 함수를 만족하지 못함으로써 discriminator의 학습이 unstable**하게 되고 때문에 학습에 실패한다. - - Lipschitz 연속성을 만족시키기 위해 attention의 **dot product를 L2-distance로 대체** - -**Advanced setting** - -- 모델의 성능 향상을 위해 stylegan2과 같은 hyper parameter를 사용하고, L2 distance logit의 초기값을 unit normal distribution, scale down, … -- $\tilde{G}$의 각 convolution block 마다 attentnion layer(self + cross)를 적용 - - self attention: 이미지 자신의 global feature 학습용 - - cross attention: 이미지에 text condition 주입용 - -**Generator design** - -:::{figure-md} -img5 - -GIGAGAN Architecture -::: - -- text embedding - - pretrained model : **clip**(frozen; $R^{C\times 768}$, c is # of tokens) - - 후에 text encoding에 추가적인 유연성을 위해 mapping network($T$)를 추가 - - text mapping network($T$)의 output은 input size와 동일하게 $R^{C\times 768}$ - - 이때 output $t$를 두 파트로 나눠 사용하는데 - - $R^{C-1\times 768}$ : word i index의 local feature를 catch - - $R^{768}$ : word를 global하게 embedding하는 vector - - $t_{global}$은 latent mapping network($M$)의 input으로 사용 - - $t_{local}$은 Generator의 input으로 각 block에 cross attention에 적용 -- Generator의 layer는 총 5개의 피라미드 구조 -- $\{x_{i}\}_{i=0}^{L-1} = \{x_{0},x_{1}, ..., x_{4}\}$ , $\{S_{i}\}_{i=0}^{L-1} = \{64, 32, 16, 8, 4\}$ -- $x_{0} = X$(output image) - -**Discriminator Design** - -:::{figure-md} -img6 - -Discriminator of GIGAGAN -::: - -- 2 branch의 구조 - 1. text conditioning을 학습 - 2. image generating을 학습 -- $t_{D}$: text c로부터 pretrained text encoder(CLIP)를 통과시켜 추출한 embedding 값 -- stylegan에서는 low res의 이미지들은 loss에 반영하지 않았지만, gigagan에서는 **이미지의 low feature 표현의 개선**을 위해 모든 scale의 이미지를 모두 loss에 반영 -- 이때 feature extractor $\Phi$ - - $\Phi_{i\rightarrow j}:R^{X_{i}\times X_{i}\times3}\rightarrow R^{X_{j}^{D}\times X_{j}^{D}\times C_{j}}$ - - self attention + conv(with stride=2) - - 각 level에서는 **이전 level에서의 feature map을 공유**해서 사용하고 **low resolution에서 계산이 일어나기때문에** computation resource가 크지 않다. -- multi scale의 loss 계산을 위해 **ms-i/o loss**(multi scale input, output adversarial loss)를 사용 - - $V_{MS-I/O}(G, D) = \sum_{i=0}^{L-1}\sum_{j=i+1}^{L}V_{GAN}(G_{i}, D_{ij}) + V_{match}({G_{i}, D_{ij}})$ - - $V_{GAN}$: standard gan loss - - $D_{ij}(x, c) = \psi _{j}(\phi_{i\rightarrow j}(x_{i}), t_{D}) + Conv_{1\times 1}(\phi_{i\rightarrow j}(x_{i}))$: - - image의 feature map $\phi(x)$에 $t_{D}$를 심은 값과 원본 $\phi(x)$의 합 - - 앞부분은 text conditioning model을 학습, 뒷부분은 unconditional image generator를 학습 - - $V_{match}$(Matching aware loss) - - 앞의 gan loss는 생성된 이미지가 얼마나 리얼한지, 그리고 condition $c$에 얼마나 가까운지에 대한 loss - - 하지만 학습 초반에는 condition $c$에 상관없이 이미지의 퀄리티로만 분류를 해버림 - - 그래서 discriminator 학습 과정에서 conditioning을 강제로 따르도록 하기위해 $c$를 랜덤으로 샘플링($\hat{c}$)해 image의 fake pair로 지정 - - :::{figure-md} - img7 - - Matching aware loss - ::: - -- CLIP contrastive loss - - pretrained CLIP을 사용해 contrastive learning - - contrastive learning - - :::{figure-md} - img8 - - constrastive learning - ::: - - - 가까운 class는 가깝게(positive), 그 외 class는 멀게(negative) - - condition $c_{0}$에 대해 생성된 이미지의 feature vector는 condition $c_{0}$의 feature 벡터와는 가깝게 (positive), 나머지 condition의 feature vector와는 멀게(negative) 학습되어야한다. - - :::{figure-md} - img9 - - CLIP Loss - ::: - -- Vision-aided adversarial loss - - [https://arxiv.org/abs/2112.09130](https://arxiv.org/abs/2112.09130) - - stylegan에서 discriminator는 training data에 overfitting되는 경향이 있음 - - 이부분을 해결하기위해 생성된 image를 SOTA의 vision 모델을 사용해 뽑아낸 feature map을 Discriminator에 같이 추가해 real / fake를 분류 - -**GAN based upsampler** - -- gigagan은 upsampling 모델에 적용이 가능하다 -- 64x64의 이미지를 3번 downsampling + 6번 upsampling 모델을 통과시켜 1024x1024의 이미지를 생성할 수 있다. -- 이때 upsampling 부분에 gigagan의 Generator 부분을 적용 -- upsampling model에 적용할때에는 LPIPS loss를 추가하고, 이미지 생성과정중에 stylegan과 동일하게 gaussian noise를 추가해 real함을 추가 - -## Experiments - -Training and evaluation details - -1. Dataset : LAION2D-en, COYO-700m -2. upsampler(128 → 1024) : Adobe’s internal Stock images -3. Pretrained text encoder : CLIP ViT-L/14 -4. CLIP score : OpenCLIP ViT-G/14 -5. machine : A100 gpu, etc. - -1. **각각의 method가 정말 효과가 있는가?** - - :::{figure-md} - img10 - - Table1 - ::: - - - 단순 scaling up보다 위 method들을 추가하면 **비교적 낮은 FiD와 CLIP score 수치를 보여준다**. -2. **Text2Image 모델과 성능 비교** - - :::{figure-md} - img11 - - Table2 - ::: - - - FiD와 inference time을 보면 어느정도 균형을 이루며 경쟁력을 보이고 있다. -3. Distilled diffusion과 비교 - - :::{figure-md} - img12 - - Table3 - ::: - - - diffutsion의 속도 개선을 위해 distilation한 모델 - - 수치적으로도 우위에 있고, inference time도 여전히 더 빠르다. -4. Upscaler - - !:::{figure-md} - img13 - - Table4 - ::: - - :::{figure-md} - img14 - - Super Resolution - ::: - -5. 그 외 - - stylegan에 연구된 technique(t**runcation trick, style mixing, latent interpolation** 등) 적용 가능 -- truncation trick - - :::{figure-md} - img15 - - Truncation Trick - ::: - -- style mixing - - :::{figure-md} - img16 - - Style Mixing - ::: - -- latent interpolation - - :::{figure-md} - img17 - - Latent Interpolation - ::: - - -Limitation - -- score 상으로는 어느정도 좋은 성능을 보이지만 **실제로 DALLE2 ,Imagen과 같은 SOTA diffusion 모델과 비교하면 develop이 필요함** - - :::{figure-md} - img18 - - Failure Cases - ::: - - ---- - -## 주요 질의응답 +```{admonition} Information +- **Title:** Scaling up GANs for Text-to-Image Synthesis (CVPR 2023) + +- **Reference** + - Paper: [https://arxiv.org/abs/2303.05511](https://arxiv.org/abs/2303.05511) + - Code: [NON Official:](https://github.com/lucidrains/gigagan-pytorch) + +- **Author:** Seunghwan Ji + +- **Last updated on April. 14, 2024** +``` + +# Scaling up GANs for Text-to-Image Synthesis + +## Abstract + +- 최근 이미지 생성 task의 모델 성능이 꾸준히 발전중 +- 기존에는 stylegan과 같은 GAN 모델이 주를 이뤘지만 최근 DALLE, Stable Diffusion등 **Diffusion 기반**의 모델 베이스로 추세가 급격하게 바뀌어버림 +- *“GAN 모델로 Diffusion의 성능을 잡는것은 정말 무리일까?”* +- GigaGAN은 + - **gan 기반의 모델**로 1. **속도점 이점**과 **2. 다양한 extra editing**이 가능하다. (contribution) + 1. 속도적 이점 + 1. 512px의 이미지를 0.13초만에 생성할 수 있다. + 2. 16-megapixel(1600만 픽셀, 4k)의 이미지를 3.66초만에 생성할 수 있다. + 2. 다양한 활용성 + 1. latent space 상 에서의 image editing이 가능하다. (latent interpolation, style mixing …) + +## Introduction + +- 최근 Diffusion 기반의 모델들이 이미지 생성 분야에서 좋은 성능을 보여주고 있다. +- Diffusion은 + - 기본적으로 학습과 생성 시 iteration이 들어가는데 iteration은 **학습의 안정성을 키워주는 장점**이 있지만, **computation cost가 매우 증가**한다는 단점이 있다. +- 반면에 GAN은 + - 이미지 생성 시 single forward pass만 필요하므로 **cost가 크지 않다는 장점**이 있지만 single 혹은 multiple object의 생성에는 성능이 뛰어나지만 **class가 명확히 정의되지않은 이미지 즉, open world image의 생성에는 어려움**이 있다. +- ***“GAN을 더 develop한다면 Diffusion 모델을 넘어설 수 있을까?”*** +- gigaGAN은? + 1. 속도적 장점 + - 0.13 s/img (512 size), 3.66s / img (4k) + 2. latent space상에서의 editing 가능(**style mixing, interpolation, prompt mixing** like stylegan2) + +## Methods + +:::{figure-md} +img0 + +Overall Architecture +::: + +**Base Architecture** + +- Base Model은 stylegan2로 선정 +- $G = M\times \tilde{G}$ +- $M$(mapping network) : gaussian distribution에서의 noise를 좀더 disentangle된 w space로 mapping 시키는 network + - gigagan에서는 mapping network의 input으로 z와 함께 text condition(c)도 함께 사용 + - output : $w$ (vector) +- $\tilde{G}$ : 피라미드 구조의 convolution block들로 random constant 값으로부터 output image $X$를 생성하는 generator. + - 이때 $w$ vector는 각 layer마다 입력으로 들어가서 feature map의 분포를 scaling함으로써 style을 반영(modulation, demodulation in stylegan2) + +**Sample-adaptive kernel selection** + +:::{figure-md} +img1 + +Sample Adaptive Kernel Selection +::: + +- 도입 배경 + - 단순히 convolution layer의 kernel size만 scaling up을 하면 학습이 안되는 현상 + - GAN 기반 모델이 (1)**text-condition**의 (2)**오픈 이미지** 생성에 한계를 보이는 이유는 convolution network의 구조 때문이다. + - convolution 연산은 구조상 같은 레이어상에 있는 하나의 filter가 **text condition 주입부터 이미지의 생성까지 모든 부분에 참여**하는데 이 부분이 모델의 표현력을 떨어트릴 수 있다. +- kernel selection method 적용 +- 레이어마다 $\{k_{i}\in R^{C_{in}\times C_{out}\times K\times K}\}$차원의 N개의 kernel set을 두고 style vector w의 affine layer를 거친 weight를 **각 kernel값에 weighted summation한 값을 최종 filter로 사용** + + :::{figure-md} + img2 + + Equation of kernel selection method affine layer + ::: + +- 이 때 kernel weight 계산에 softmax를 사용하는데 얘는 differentiable하므로 gradient update 가능 +- 또, 실제로 N개의 kernel을 모두 filter로 사용할 때보다 computation cost가 굉장히 절약된다는 장점 + +**Interleaving attention with convolution** + +- 도입 배경 + - convolution filter는 receptive field 내부의 local feature 캡처에는 탁월하지만 field 외부의 부분은 학습할 수 없다. + + :::{figure-md} + img3 + + Receptive Field in Convolution Networks + ::: + + - 이러한 한계점을 극복하기위해 **attention layer**($g_{attn}$)를 추가 + - 단순히 stylegan2에 attention layer를 추가하면 학습에 이상이 생김 + - 원인은 attention layer에서 사용하는 **dot product가 Lipschitz함수가 아니기 때문** + - lipschitz 함수란 + - lipschitz 함수란, **두 점 사이의 거리를 일정 비 이상으로 증가시키지 않는 함수** + + :::{figure-md} + img4 + + lipschitz Function + ::: + + - **Lipschitz 함수를 만족하지 못함으로써 discriminator의 학습이 unstable**하게 되고 때문에 학습에 실패한다. + - Lipschitz 연속성을 만족시키기 위해 attention의 **dot product를 L2-distance로 대체** + +**Advanced setting** + +- 모델의 성능 향상을 위해 stylegan2과 같은 hyper parameter를 사용하고, L2 distance logit의 초기값을 unit normal distribution, scale down, … +- $\tilde{G}$의 각 convolution block 마다 attentnion layer(self + cross)를 적용 + - self attention: 이미지 자신의 global feature 학습용 + - cross attention: 이미지에 text condition 주입용 + +**Generator design** + +:::{figure-md} +img5 + +GIGAGAN Architecture +::: + +- text embedding + - pretrained model : **clip**(frozen; $R^{C\times 768}$, c is # of tokens) + - 후에 text encoding에 추가적인 유연성을 위해 mapping network($T$)를 추가 + - text mapping network($T$)의 output은 input size와 동일하게 $R^{C\times 768}$ + - 이때 output $t$를 두 파트로 나눠 사용하는데 + - $R^{C-1\times 768}$ : word i index의 local feature를 catch + - $R^{768}$ : word를 global하게 embedding하는 vector + - $t_{global}$은 latent mapping network($M$)의 input으로 사용 + - $t_{local}$은 Generator의 input으로 각 block에 cross attention에 적용 +- Generator의 layer는 총 5개의 피라미드 구조 +- $\{x_{i}\}_{i=0}^{L-1} = \{x_{0},x_{1}, ..., x_{4}\}$ , $\{S_{i}\}_{i=0}^{L-1} = \{64, 32, 16, 8, 4\}$ +- $x_{0} = X$(output image) + +**Discriminator Design** + +:::{figure-md} +img6 + +Discriminator of GIGAGAN +::: + +- 2 branch의 구조 + 1. text conditioning을 학습 + 2. image generating을 학습 +- $t_{D}$: text c로부터 pretrained text encoder(CLIP)를 통과시켜 추출한 embedding 값 +- stylegan에서는 low res의 이미지들은 loss에 반영하지 않았지만, gigagan에서는 **이미지의 low feature 표현의 개선**을 위해 모든 scale의 이미지를 모두 loss에 반영 +- 이때 feature extractor $\Phi$ + - $\Phi_{i\rightarrow j}:R^{X_{i}\times X_{i}\times3}\rightarrow R^{X_{j}^{D}\times X_{j}^{D}\times C_{j}}$ + - self attention + conv(with stride=2) + - 각 level에서는 **이전 level에서의 feature map을 공유**해서 사용하고 **low resolution에서 계산이 일어나기때문에** computation resource가 크지 않다. +- multi scale의 loss 계산을 위해 **ms-i/o loss**(multi scale input, output adversarial loss)를 사용 + - $V_{MS-I/O}(G, D) = \sum_{i=0}^{L-1}\sum_{j=i+1}^{L}V_{GAN}(G_{i}, D_{ij}) + V_{match}({G_{i}, D_{ij}})$ + - $V_{GAN}$: standard gan loss + - $D_{ij}(x, c) = \psi _{j}(\phi_{i\rightarrow j}(x_{i}), t_{D}) + Conv_{1\times 1}(\phi_{i\rightarrow j}(x_{i}))$: + - image의 feature map $\phi(x)$에 $t_{D}$를 심은 값과 원본 $\phi(x)$의 합 + - 앞부분은 text conditioning model을 학습, 뒷부분은 unconditional image generator를 학습 + - $V_{match}$(Matching aware loss) + - 앞의 gan loss는 생성된 이미지가 얼마나 리얼한지, 그리고 condition $c$에 얼마나 가까운지에 대한 loss + - 하지만 학습 초반에는 condition $c$에 상관없이 이미지의 퀄리티로만 분류를 해버림 + - 그래서 discriminator 학습 과정에서 conditioning을 강제로 따르도록 하기위해 $c$를 랜덤으로 샘플링($\hat{c}$)해 image의 fake pair로 지정 + + :::{figure-md} + img7 + + Matching aware loss + ::: + +- CLIP contrastive loss + - pretrained CLIP을 사용해 contrastive learning + - contrastive learning + + :::{figure-md} + img8 + + constrastive learning + ::: + + - 가까운 class는 가깝게(positive), 그 외 class는 멀게(negative) + - condition $c_{0}$에 대해 생성된 이미지의 feature vector는 condition $c_{0}$의 feature 벡터와는 가깝게 (positive), 나머지 condition의 feature vector와는 멀게(negative) 학습되어야한다. + + :::{figure-md} + img9 + + CLIP Loss + ::: + +- Vision-aided adversarial loss + - [https://arxiv.org/abs/2112.09130](https://arxiv.org/abs/2112.09130) + - stylegan에서 discriminator는 training data에 overfitting되는 경향이 있음 + - 이부분을 해결하기위해 생성된 image를 SOTA의 vision 모델을 사용해 뽑아낸 feature map을 Discriminator에 같이 추가해 real / fake를 분류 + +**GAN based upsampler** + +- gigagan은 upsampling 모델에 적용이 가능하다 +- 64x64의 이미지를 3번 downsampling + 6번 upsampling 모델을 통과시켜 1024x1024의 이미지를 생성할 수 있다. +- 이때 upsampling 부분에 gigagan의 Generator 부분을 적용 +- upsampling model에 적용할때에는 LPIPS loss를 추가하고, 이미지 생성과정중에 stylegan과 동일하게 gaussian noise를 추가해 real함을 추가 + +## Experiments + +Training and evaluation details + +1. Dataset : LAION2D-en, COYO-700m +2. upsampler(128 → 1024) : Adobe’s internal Stock images +3. Pretrained text encoder : CLIP ViT-L/14 +4. CLIP score : OpenCLIP ViT-G/14 +5. machine : A100 gpu, etc. + +1. **각각의 method가 정말 효과가 있는가?** + + :::{figure-md} + img10 + + Table1 + ::: + + - 단순 scaling up보다 위 method들을 추가하면 **비교적 낮은 FiD와 CLIP score 수치를 보여준다**. +2. **Text2Image 모델과 성능 비교** + + :::{figure-md} + img11 + + Table2 + ::: + + - FiD와 inference time을 보면 어느정도 균형을 이루며 경쟁력을 보이고 있다. +3. Distilled diffusion과 비교 + + :::{figure-md} + img12 + + Table3 + ::: + + - diffutsion의 속도 개선을 위해 distilation한 모델 + - 수치적으로도 우위에 있고, inference time도 여전히 더 빠르다. +4. Upscaler + + !:::{figure-md} + img13 + + Table4 + ::: + + :::{figure-md} + img14 + + Super Resolution + ::: + +5. 그 외 + - stylegan에 연구된 technique(t**runcation trick, style mixing, latent interpolation** 등) 적용 가능 +- truncation trick + + :::{figure-md} + img15 + + Truncation Trick + ::: + +- style mixing + + :::{figure-md} + img16 + + Style Mixing + ::: + +- latent interpolation + + :::{figure-md} + img17 + + Latent Interpolation + ::: + + +Limitation + +- score 상으로는 어느정도 좋은 성능을 보이지만 **실제로 DALLE2 ,Imagen과 같은 SOTA diffusion 모델과 비교하면 develop이 필요함** + + :::{figure-md} + img18 + + Failure Cases + ::: + + +--- + +## 주요 질의응답 diff --git a/_sources/docs/review/GLIDE.md b/_sources/docs/review/GLIDE.md old mode 100644 new mode 100755 index 7e08b7b7..513fff34 --- a/_sources/docs/review/GLIDE.md +++ b/_sources/docs/review/GLIDE.md @@ -1,187 +1,187 @@ -``` {admonition} Information -- **Title:** GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models (ICML 2022) - -- **Reference** - - Paper: [https://arxiv.org/abs/2112.10741](https://arxiv.org/abs/2112.10741) - -- **Author:** Sehwan Park - -- **Last updated on Oct. 20, 2023** -``` - - - -# GLIDE - -## Abstract - -* GLIDE 기법이 DALL-E보다 human-evaluator 평가가 더 우수하다고 한다. - -* classifier-free Guidance vs CLIP-Guidance(classifier-free Guidance를 결국 사용.) - -* powerful한 text-driven image editing이 가능. - - - -## 1. Introduction - - Natural language로 부터 realistic한 image를 만드는 많은 방법들이 생겨나고 있다. 하지만 text prompts에 정확히 대응하는 photorealistic한 image를 생성하기에는 어려움을 겪고 있다. - - Diffusion model이 DDPM, DDIM 논문을 통해 생성모델의 중심으로 떠오르며 unconditional한 image에 대해서는 SOTA를 찍었다고 한다. 자연스럽게 class-conditional한 image 생성에 대해서도 연구가 이루어졌는데, Diffusion models beat gans on image synthesis라는 논문에서 저자들은 noise한 image에 대해 class를 예측하는 classifier를 추가하여 sampling과정에서 label에 해당하는 이미지를 생성하도록 gradient를 control시키는 classifier guidance 방법을 소개한다. 이후, classifier없이 guidance를 줄 수 있는 classifier-free guidance 방법이 소개되었다. - -이 논문에서는 classifier-free guidance 방법과 기존 diffusion model을 활용하여 text-conditional image synthesis를 잘 수행했다고 보여준다. 추가적으로 pretrained CLIP 모델을 활용하여 CLIP guidance라는 방법을 제시하며 classifier-free guidance와 비교를 한다. 결과적으로는 classifier-free guidance가 더 좋은 성능을 보인다고 한다. - -text prompt를 zero-shot으로 생성하는데에 있어 좋은 성능을 보였으나, 복잡한 prompt에 대한 photorealistc한 image를 생성하는데는 어려움을 겪을 수 있다고 한다. 그래서 이 논문에서는 text-conditional image generation뿐만 아니라 기존 image를 text-prompt를 통해 편집할 수 있는 image impainting기능도 가능하도록 했다고 한다. - -:::{figure-md} - -GLIDE_1 - -GLIDE text to image -::: - -:::{figure-md} - -GLIDE_1 - -GLIDE image impainting -::: - -## 2. Background - -### 2.1 Diffusion Models - -* DDPM - -DDPM에서는 임의의 time step t로 부터 noise가 껴있는 image $x_t$의 $\epsilon_t$가 얼만큼인지 예측한다. 예측한 $\epsilon_t$를 이용하여 noise가 일부 제거된 이전 step의 mean($\mu_{\theta}(x_t)$)을 구할 수 있고 variance($\sum_{\theta}(x_t)$)는 constant한 값으로 고정시킨다. DDPM에서 제시한 forward process와 reverse process는 다음과 같다. - -$$ -q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_{t}}x_{t-1}, (1-\alpha_t)\mathcal{I}) -$$ -$$ -p_{\theta}(x_{t-1}|x_t) := \mathcal{N}(\mu_{\theta}(x_t), \sum_{\theta}(x_t)) -$$ - -* Score-based generative modeling through stochastic differential equations - -해당 논문에서는 결국 score를 구하는 것과 epsilon을 구하는 것이 결국 같은 방향성을 띤다라고 주장한다. - -:::{figure-md} - -GLIDE_1 - -Proof of proportional relationship to finding score and epsilon -::: - -* Improved-DDPM - -$\sum_{\theta}$를 constant값으로 고정시킨 이전 DDPM과 달리 해당 논문에서는 $\sum_{\theta}$ learnable parameter로 설정하여 더 적은 diffusion step만으로 더 좋은 quality의 sample을 만들어낼 수 있다고 제시한다. - -### 2.2 Guided Diffusion - -Diffusion model beat GANS on Image Synthesis(Dharwial et al.)에서는 diffusion model을 통해 class-conditional한 image생성을 제시한다. 이 논문에서의 가장 핵심적인 기술이 classifier-guidance이다. noise한 image로부터 epsilon을 예측하는 model은 그대로 유지하되, 해당 noise image가 어떤 class에 속하는지 분류하는 별도의 classifier를 설정한다. 이 classifier의 score를 통해 class-conditional한 전체 과정의 score에게 guide를 주는 방법을 제시한다. - -:::{figure-md} - -GLIDE_1 - -Classifier guidance -::: - -:::{figure-md} - -GLIDE_1 - -Classifier guidance -::: - -### 2.3 Classifier-free guidance - -classifier를 통해 class-conditional한 image생성을 하는 방법이 위에 소개되었는데, 이 방법은 noise한 image에 대해서 classifiy를 해야하므로 pretrained model을 사용할 수 없고 모델 규모가 너무 heavy해지는 등 몇몇 문제점을 가지고 있었다. 이 방법에 대한 개선점을 Classifier-Free Diffusion Guidance(Ho et al.)에서 Classifer-free guidance라는 기법으로 제시한다. 위의 score 식에서 약간의 변형을 통해 classifier 없이 단일 model만으로 guidance를 줄 수 있는 방법을 제시한다. - -:::{figure-md} - -GLIDE_1 - -Classifier-free guidance -::: - -### 2.4 CLIP guidance - -CLIP은 텍스트와 이미지 사이의 joint representation을 학습할 수 있는 모델이다. Image encoder f(x)와 Text encoder g(c)로 이루어져 있다. (x,c) 즉 이미지와 이미지 캡션 쌍으로 이루어진 대규모 데이터를 이용해 contrastive learning을 진행시킨 모델이다. 같은 의미를 가진 positive pair에 대해서는 f(x) · g(c)(유사도)가 커지도록 negative pair에 대해서는 f(x) · g(c)가 작아지도록 하는 것이다. CLIP guidance에서는 classifier guidance에서 classifier대신에 pretrained CLIP모델을 사용한다. 따라서 guidance를 주는 방식도 classifier대신 CLIP모델을 통해 구한 noise한 image x와 주어진 text간의 유사도를 이용한다. - -:::{figure-md} - -GLIDE_1 - -CLIP -::: - -:::{figure-md} - -GLIDE_1 - -CLIP guidance -::: - -## 3. Training - -실험에서 3.5 billion parameter의 text-conditional diffusion model을 64x64 resolution을 위해 사용했고 또다른 1.5 billion parameter의 text-conditional upsampling diffusion model을 256x256으로 resolution을 증가시키는데 사용하였다고 한다. 또한, CLIP guidance를 위해 noised 64x64 ViT-L CLIP model을 사용했다고 한다. - -### 3.1 Text-Conditional Diffusion Models - -Improved DDPM의 ADM model을 base로 text-conditioning을 추가하여 학습을 진행하였다. 주어진 noised image $x_t$로부터 $x_{t-1}$을 예측하는 $p_{\theta}(x_{t-1}|x_t,c)$를 수행해야한다. text를 condition으로 주기 위해서 우선 주어진 text를 K개의 token으로 encoding한 후, Transformer model에 input값으로 넣어준다. Transformer output의 마지막 embedding token과 positional encoding을 통해 나온 time step embedding token을 연산하고자 하는 크기에 맞게 linear projection하여 더한 후, residual block을 거친 image와 AdaIN기법을 통해 residual block의 output을 도출한다. Transformer output의 마지막 layer는 연산하고자 하는 크기에 맞게 linear projection하여 residual block뒤에 붙는 attention block에 이용한다. - -학습 데이터셋은 DALL-E와 같은 데이터셋을 사용하였고 model architecture로는 기존 ADM model보다 더 scale up된 model과 1.2B paremeters를 갖는 Transformer를 사용했다고 한다. 게다가 64x64 image를 256x256 image로 upsampling하는 Upsampler model도 학습시켰다고 한다. upsampler model은 Improved DDPM에서의 ImageNet Upsampler와 거의 비슷하다고 한다. - -### 3.2. Fine-tuning for classifier-free guidance - -처음 training을 진행했을때는, text를 condition으로 준 conditional image generation에 맞춰 training을 진행했다고 한다. 이 후, unconditional image generation의 성능을 위해 데이터셋의 약 20%의 text condition에 empty sequence를 주고 training을 진행했다고 한다. - -### 3.3. Image Inpainting - -이전 연구에서는, impainting을 위해 diffusion model로 학습시키는 과정을 거치지 않았다. diffusion model로 sampling을 한 후, 알려진 영역에 대해서는 $q(x_t|x_0)$로 대체하는 방식을 사용했기에 model이 sampling을 하는 과정에서 전체 context를 참조할 수 없다는 단점이 있었다. - -이 논문에서는 fine-tuning과정에서 training example의 임의의 부분을 지운다음, 남은 부분은 모델에 추가적인 조건 정보로서 마스크 채널과 함께 입력되도록 설계하였다. - -### 3.4. Noised CLIP models - -classifier guidance에 더 적합하게 훈련시키기 위해 clip guidance를 사용해서 classifier-free guidance와 비교했음을 위에서 언급했다. clip guidance를 사용하기 위해 저자들은 noise image에 대해 학습시킨 Noised CLIP models를 사용했음을 밝힌다. 위에서 언급했듯이 결과는 classifier-free guidance가 더 좋았다고 한다. - -:::{figure-md} - -GLIDE_1 - -comparison between CLIP guidance and classifier-free guidance -::: - -## 4. Results - -:::{figure-md} - -GLIDE_1 - -Quantitive Results -::: - -논문에서는 classifier-free guidance와 CLIP guidance에 대해 Precision과 Recall, FID와 IS, CLIP score와 FID 간의 명확한 trade-off 를 관찰하고 있다고 언급한다. - -위의 (a)와 (b)에 대해서는 classifier-free guidance가 거의 최적으로 수행되었으며, classifier-free guidance가 훨씬 강력한 방법임을 보여주고 있다. 반면, (c)에서는 CLIP guidance가 CLIP 점수를 classifier-free guidance에 비해 상당히 향상시킬 수 있는 것으로 보인다. 저자들은 CLIP guidance가 주로 CLIP 모델의 평가에 따라 이미지를 생성하는 데 중점을 둘 수 있지만, 특정 prompt 또는 caption과 일치시키는 데 뛰어나지 않을 수 있다는 가설을 제시한다. 이 가설을 확인하기 위해 저자들은 인간 평가자를 활용한 실험을 진행하였고 인간들이 CLIP 점수와 다른 의견을 가지며, classifier-free guida nce가 해당 prompt와 더 일치하는 더 높은 품질의 샘플을 생성한다고 판단했다. - -:::{figure-md} - -GLIDE_1 - -Zero-shot FID results -::: - -Table1은 Unguided, CLIP guidance, Classifier-free guidance 기법을 각각 적용한 256x256 resolution image에 대해 human evaluation을 진행한 결과이다. Classifier-free guidance를 적용한 결과가 photorealism, caption 항목에 대해 압도적인 결과를 보임을 알 수 있다. - -Table2는 GLIDE와 다른 text-conditional image generation model들을 비교한 표이다. MS-COCO dataset에 대해 생성된 image의 FID score를 구하였다. GLIDE model이 MS-COCO에 대해 학습한 경험이 없음에도 불구하고 Zero-shot FID 부분을 보면 상당히 좋은 result를 보임을 알 수 있다. - -:::{figure-md} - -GLIDE_1 - -final results -::: +``` {admonition} Information +- **Title:** GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models (ICML 2022) + +- **Reference** + - Paper: [https://arxiv.org/abs/2112.10741](https://arxiv.org/abs/2112.10741) + +- **Author:** Sehwan Park + +- **Last updated on Oct. 20, 2023** +``` + + + +# GLIDE + +## Abstract + +* GLIDE 기법이 DALL-E보다 human-evaluator 평가가 더 우수하다고 한다. + +* classifier-free Guidance vs CLIP-Guidance(classifier-free Guidance를 결국 사용.) + +* powerful한 text-driven image editing이 가능. + + + +## 1. Introduction + + Natural language로 부터 realistic한 image를 만드는 많은 방법들이 생겨나고 있다. 하지만 text prompts에 정확히 대응하는 photorealistic한 image를 생성하기에는 어려움을 겪고 있다. + + Diffusion model이 DDPM, DDIM 논문을 통해 생성모델의 중심으로 떠오르며 unconditional한 image에 대해서는 SOTA를 찍었다고 한다. 자연스럽게 class-conditional한 image 생성에 대해서도 연구가 이루어졌는데, Diffusion models beat gans on image synthesis라는 논문에서 저자들은 noise한 image에 대해 class를 예측하는 classifier를 추가하여 sampling과정에서 label에 해당하는 이미지를 생성하도록 gradient를 control시키는 classifier guidance 방법을 소개한다. 이후, classifier없이 guidance를 줄 수 있는 classifier-free guidance 방법이 소개되었다. + +이 논문에서는 classifier-free guidance 방법과 기존 diffusion model을 활용하여 text-conditional image synthesis를 잘 수행했다고 보여준다. 추가적으로 pretrained CLIP 모델을 활용하여 CLIP guidance라는 방법을 제시하며 classifier-free guidance와 비교를 한다. 결과적으로는 classifier-free guidance가 더 좋은 성능을 보인다고 한다. + +text prompt를 zero-shot으로 생성하는데에 있어 좋은 성능을 보였으나, 복잡한 prompt에 대한 photorealistc한 image를 생성하는데는 어려움을 겪을 수 있다고 한다. 그래서 이 논문에서는 text-conditional image generation뿐만 아니라 기존 image를 text-prompt를 통해 편집할 수 있는 image impainting기능도 가능하도록 했다고 한다. + +:::{figure-md} + +GLIDE_1 + +GLIDE text to image +::: + +:::{figure-md} + +GLIDE_1 + +GLIDE image impainting +::: + +## 2. Background + +### 2.1 Diffusion Models + +* DDPM + +DDPM에서는 임의의 time step t로 부터 noise가 껴있는 image $x_t$의 $\epsilon_t$가 얼만큼인지 예측한다. 예측한 $\epsilon_t$를 이용하여 noise가 일부 제거된 이전 step의 mean($\mu_{\theta}(x_t)$)을 구할 수 있고 variance($\sum_{\theta}(x_t)$)는 constant한 값으로 고정시킨다. DDPM에서 제시한 forward process와 reverse process는 다음과 같다. + +$$ +q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_{t}}x_{t-1}, (1-\alpha_t)\mathcal{I}) +$$ +$$ +p_{\theta}(x_{t-1}|x_t) := \mathcal{N}(\mu_{\theta}(x_t), \sum_{\theta}(x_t)) +$$ + +* Score-based generative modeling through stochastic differential equations + +해당 논문에서는 결국 score를 구하는 것과 epsilon을 구하는 것이 결국 같은 방향성을 띤다라고 주장한다. + +:::{figure-md} + +GLIDE_1 + +Proof of proportional relationship to finding score and epsilon +::: + +* Improved-DDPM + +$\sum_{\theta}$를 constant값으로 고정시킨 이전 DDPM과 달리 해당 논문에서는 $\sum_{\theta}$ learnable parameter로 설정하여 더 적은 diffusion step만으로 더 좋은 quality의 sample을 만들어낼 수 있다고 제시한다. + +### 2.2 Guided Diffusion + +Diffusion model beat GANS on Image Synthesis(Dharwial et al.)에서는 diffusion model을 통해 class-conditional한 image생성을 제시한다. 이 논문에서의 가장 핵심적인 기술이 classifier-guidance이다. noise한 image로부터 epsilon을 예측하는 model은 그대로 유지하되, 해당 noise image가 어떤 class에 속하는지 분류하는 별도의 classifier를 설정한다. 이 classifier의 score를 통해 class-conditional한 전체 과정의 score에게 guide를 주는 방법을 제시한다. + +:::{figure-md} + +GLIDE_1 + +Classifier guidance +::: + +:::{figure-md} + +GLIDE_1 + +Classifier guidance +::: + +### 2.3 Classifier-free guidance + +classifier를 통해 class-conditional한 image생성을 하는 방법이 위에 소개되었는데, 이 방법은 noise한 image에 대해서 classifiy를 해야하므로 pretrained model을 사용할 수 없고 모델 규모가 너무 heavy해지는 등 몇몇 문제점을 가지고 있었다. 이 방법에 대한 개선점을 Classifier-Free Diffusion Guidance(Ho et al.)에서 Classifer-free guidance라는 기법으로 제시한다. 위의 score 식에서 약간의 변형을 통해 classifier 없이 단일 model만으로 guidance를 줄 수 있는 방법을 제시한다. + +:::{figure-md} + +GLIDE_1 + +Classifier-free guidance +::: + +### 2.4 CLIP guidance + +CLIP은 텍스트와 이미지 사이의 joint representation을 학습할 수 있는 모델이다. Image encoder f(x)와 Text encoder g(c)로 이루어져 있다. (x,c) 즉 이미지와 이미지 캡션 쌍으로 이루어진 대규모 데이터를 이용해 contrastive learning을 진행시킨 모델이다. 같은 의미를 가진 positive pair에 대해서는 f(x) · g(c)(유사도)가 커지도록 negative pair에 대해서는 f(x) · g(c)가 작아지도록 하는 것이다. CLIP guidance에서는 classifier guidance에서 classifier대신에 pretrained CLIP모델을 사용한다. 따라서 guidance를 주는 방식도 classifier대신 CLIP모델을 통해 구한 noise한 image x와 주어진 text간의 유사도를 이용한다. + +:::{figure-md} + +GLIDE_1 + +CLIP +::: + +:::{figure-md} + +GLIDE_1 + +CLIP guidance +::: + +## 3. Training + +실험에서 3.5 billion parameter의 text-conditional diffusion model을 64x64 resolution을 위해 사용했고 또다른 1.5 billion parameter의 text-conditional upsampling diffusion model을 256x256으로 resolution을 증가시키는데 사용하였다고 한다. 또한, CLIP guidance를 위해 noised 64x64 ViT-L CLIP model을 사용했다고 한다. + +### 3.1 Text-Conditional Diffusion Models + +Improved DDPM의 ADM model을 base로 text-conditioning을 추가하여 학습을 진행하였다. 주어진 noised image $x_t$로부터 $x_{t-1}$을 예측하는 $p_{\theta}(x_{t-1}|x_t,c)$를 수행해야한다. text를 condition으로 주기 위해서 우선 주어진 text를 K개의 token으로 encoding한 후, Transformer model에 input값으로 넣어준다. Transformer output의 마지막 embedding token과 positional encoding을 통해 나온 time step embedding token을 연산하고자 하는 크기에 맞게 linear projection하여 더한 후, residual block을 거친 image와 AdaIN기법을 통해 residual block의 output을 도출한다. Transformer output의 마지막 layer는 연산하고자 하는 크기에 맞게 linear projection하여 residual block뒤에 붙는 attention block에 이용한다. + +학습 데이터셋은 DALL-E와 같은 데이터셋을 사용하였고 model architecture로는 기존 ADM model보다 더 scale up된 model과 1.2B paremeters를 갖는 Transformer를 사용했다고 한다. 게다가 64x64 image를 256x256 image로 upsampling하는 Upsampler model도 학습시켰다고 한다. upsampler model은 Improved DDPM에서의 ImageNet Upsampler와 거의 비슷하다고 한다. + +### 3.2. Fine-tuning for classifier-free guidance + +처음 training을 진행했을때는, text를 condition으로 준 conditional image generation에 맞춰 training을 진행했다고 한다. 이 후, unconditional image generation의 성능을 위해 데이터셋의 약 20%의 text condition에 empty sequence를 주고 training을 진행했다고 한다. + +### 3.3. Image Inpainting + +이전 연구에서는, impainting을 위해 diffusion model로 학습시키는 과정을 거치지 않았다. diffusion model로 sampling을 한 후, 알려진 영역에 대해서는 $q(x_t|x_0)$로 대체하는 방식을 사용했기에 model이 sampling을 하는 과정에서 전체 context를 참조할 수 없다는 단점이 있었다. + +이 논문에서는 fine-tuning과정에서 training example의 임의의 부분을 지운다음, 남은 부분은 모델에 추가적인 조건 정보로서 마스크 채널과 함께 입력되도록 설계하였다. + +### 3.4. Noised CLIP models + +classifier guidance에 더 적합하게 훈련시키기 위해 clip guidance를 사용해서 classifier-free guidance와 비교했음을 위에서 언급했다. clip guidance를 사용하기 위해 저자들은 noise image에 대해 학습시킨 Noised CLIP models를 사용했음을 밝힌다. 위에서 언급했듯이 결과는 classifier-free guidance가 더 좋았다고 한다. + +:::{figure-md} + +GLIDE_1 + +comparison between CLIP guidance and classifier-free guidance +::: + +## 4. Results + +:::{figure-md} + +GLIDE_1 + +Quantitive Results +::: + +논문에서는 classifier-free guidance와 CLIP guidance에 대해 Precision과 Recall, FID와 IS, CLIP score와 FID 간의 명확한 trade-off 를 관찰하고 있다고 언급한다. + +위의 (a)와 (b)에 대해서는 classifier-free guidance가 거의 최적으로 수행되었으며, classifier-free guidance가 훨씬 강력한 방법임을 보여주고 있다. 반면, (c)에서는 CLIP guidance가 CLIP 점수를 classifier-free guidance에 비해 상당히 향상시킬 수 있는 것으로 보인다. 저자들은 CLIP guidance가 주로 CLIP 모델의 평가에 따라 이미지를 생성하는 데 중점을 둘 수 있지만, 특정 prompt 또는 caption과 일치시키는 데 뛰어나지 않을 수 있다는 가설을 제시한다. 이 가설을 확인하기 위해 저자들은 인간 평가자를 활용한 실험을 진행하였고 인간들이 CLIP 점수와 다른 의견을 가지며, classifier-free guida nce가 해당 prompt와 더 일치하는 더 높은 품질의 샘플을 생성한다고 판단했다. + +:::{figure-md} + +GLIDE_1 + +Zero-shot FID results +::: + +Table1은 Unguided, CLIP guidance, Classifier-free guidance 기법을 각각 적용한 256x256 resolution image에 대해 human evaluation을 진행한 결과이다. Classifier-free guidance를 적용한 결과가 photorealism, caption 항목에 대해 압도적인 결과를 보임을 알 수 있다. + +Table2는 GLIDE와 다른 text-conditional image generation model들을 비교한 표이다. MS-COCO dataset에 대해 생성된 image의 FID score를 구하였다. GLIDE model이 MS-COCO에 대해 학습한 경험이 없음에도 불구하고 Zero-shot FID 부분을 보면 상당히 좋은 result를 보임을 알 수 있다. + +:::{figure-md} + +GLIDE_1 + +final results +::: diff --git a/_sources/docs/review/HyperDreamBooth.md b/_sources/docs/review/HyperDreamBooth.md old mode 100644 new mode 100755 index 19eb7e26..8be0e639 --- a/_sources/docs/review/HyperDreamBooth.md +++ b/_sources/docs/review/HyperDreamBooth.md @@ -1,175 +1,175 @@ -``` {admonition} Information -- **Title:** HyperDreamBooth: HyperNetworks for Fast Personalization of Text-to-Image Models - -- **Reference** - - Paper: [https://arxiv.org/pdf/2307.06949.pdf](https://arxiv.org/pdf/2307.06949.pdf) - -- **Author:** Hyoungseo Cho - -- **Last updated on Oct. 10, 2023** -``` - -# HyperDreamBooth - -## Introduction - -Personalization 는 Generative AI 분야에서 떠오르고 있는 주제입니다. 이는 high-fidelity와 identity를 유지한 상태로 다양한 맥락과 스타일을 생성할 수 있도록 합니다. 본 논문은 [Dreambooth](https://pseudo-lab.github.io/text-to-image-generation-feat-diffusion/docs/review/dreambooth.html) 를 기반으로 진행되었기 때문에 [Dreambooth](https://pseudo-lab.github.io/text-to-image-generation-feat-diffusion/docs/review/dreambooth.html) 논문을 먼저 읽어 보시기를 추천드립니다. - -:::{figure-md} -hyperdreambooth_01 - -HyperDreamBooth -::: - -## Contribution - -본 논문의 Contribution은 크게 3가지로 볼 수 있습니다. Lighweight DreamBooth (LiDB), New HyperNetwork architecture 그리고 rank-relaxed finetuning 입니다. 위 3가지 방법을 활용하여 기존 DreamBooth의 핵심 능력을 유지하면서 크기를 줄이고 속도를 높일 수 있었습니다. - -## Related Work - -**Text-to-image Models**
-본 논문에서는 Stable Diffusion 모델을 활용하여 HyperDreamBooth를 구현했지만, 이 부분은 다른 텍스트-이미지 모델 (Imagen, DALL-E2 등) 도 적용이 가능합니다. - -**Personalization of Generative Models**
-Generative Adversarial Network 기반의 기술들은 fidelity가 떨어지거나 다양한 문맥을 제공하지 못하는 문제가 있습니다. 이에 따라 HyperNetwork를 도입한 연구를 진행했습니다. - -**T2I Personalization via Finetuning**
-다음으로, text-to-image personalization을 위한 Finetuning에 대한 연구가 있습니다. CustomDiffusion, SVDiff, LoRA, StyleDrop, DreamArtist 등의 예시가 있습니다. 하지만 이는 속도 측면에서 느리다는 단점을 가지고 있습니다. - -이러한 관련 연구들을 볼 때, HyperDreamBooth는 속도와 효율성 측면에서 큰 발전을 이루었다고 볼 수 있습니다. - -:::{figure-md} -hyperdreambooth_01 - -HyperDreamBooth Training and Fast Fine-Tuning -::: - -## Prelimiaries - -**Latent Diffusion Models (LDM)**
-본 논문에서는 Stable Diffusion 모델을 활용하여 HyperDreamBooth를 구현했지만, 이 부분은 다른 텍스트-이미지 모델 (Imagen, DALL-E2 등) 도 적용이 가능합니다. - -**DreamBooth**
-이전에 나온 DreamBooth는 특정 주제의 이미지를 생성하기 위해 T2I denoising 네트워크를 finetuning하는 전략을 활용했습니다. 이 방법은 HyperDreamBooth의 영감원 중 하나로 활용되었습니다. - -**Low Rank Adaptation (LoRA)**
-LoRA는 모델의 가중치를 낮은 랭크의 행렬로 근사화하여 모델의 크기와 복잡성을 줄이는 방법입니다. 본 논문에서는 이 LoRA 기술을 활용하여 더 빠르고 효율적인 personalization이 가능하도록 합니다. - -## Method - -위에서 살펴 본 Contribution의 내용을 자세히 살펴보도록 하겠습니다. - -### Lightweight DreamBooth (LiDB) - -HyperdreamBooth 의 핵심 기술 중 하나인 Lightweight DreamBooth, 줄여서 LiDB에 대해 설명드리겠습니다. LiDB는 rank-1 LoRA residuals의 가중치 공간을 더 세분화하는 것이 핵심 아이디어입니다. 분해 과정에서 rank-1 LoRA weight-space 내에서 random orthogonal basis를 활용하여 decompose 합니다. - -:::{figure-md} -hyperdreambooth_01 - -Lightweight DreamBooth -::: - -이 접근 방식은 LoRA의 A와 B 행렬을 각각 두 개의 행렬로 분해하는 것으로도 이해할 수 있습니다. 더 구체적으로 살펴보면, A 행렬은 $A_{aux}$ 와 $A_{train}$ 으로 분해되며, B 행렬은 $B_{aux}$ 와 $B_{train}$ 으로 분해할 수 있습니다. 여기서 $aux$ 레이어는 행별로 직교하는 벡터로 무작위 초기화되고 freeze 되어 있으며, $train$ 레이어는 학습되는 가중치입니다. 따라서 LiDB 선형 레이어의 weight-residual은 다음과 같이 표현할 수 있습니다. - -$$ -\Delta W_x = A_{aux} A_{train} B_{train} B_{aux} -$$ - -여기서 $aux$ 레이어는 experimentally fix 되었으며 이 과정을 통해 trainable parameter 개수는 약 30K개, 사이즈는 약 120KB로 경량화 할 수 있습니다. 이렇게 작은 크기와 변수만으로 fidelity, editability, style 그리고 diversity 등을 유지할 수 있다는 것이 포인트입니다. - -### HyperNetwork - -:::{figure-md} -hyperdreambooth_01 - -HyperNetwork Architecture -::: - -다음은 Hypernetwork 입니다. 본 논문에서는 사전에 훈련된 T2I 모델을 빠르게 personalization 하기 위해 HyperNetwork를 제안합니다. 여기서 $\tilde{\theta}$ 는 모든 LiDB residual 행렬을 나타내며, 각 T2I 모델의 cross-attention 및 self-attention 레이어에 대한 $A_{train}$ 및 $B_{train}$ 입니다. 이 핵심 아이디어는 주어진 이미지 x를 입력으로 받고, 이 이미지를 사용하여 LiDB의 low-rank residual인 $\hat{\theta}$ 을 예측하는 HyperNetwork $H_{\eta}$ 를 돌입하는 것입니다.HyperNetwork는 도메인 특화 이미지 데이터셋에서 훈련되며, 일반적인 확산 노이즈 제거 손실과 가중치 공간 손실을 가지고 있습니다. - -$$ -L(x) = \alpha \left\| D_\hat{\theta} (x + {\epsilon} , c) - x \right\|_{2}^{2} + \beta \left\|\hat{\theta} - {\theta} \right\|_{2}^{2} -$$ - -여기서 $x$ 는 reference image를 의미합니다. HyperDreamBooth의 목표는 주어진 참조 이미지 x를 기반으로 해당 이미지와 유사한 새로운 이미지를 생성하는 것입니다. $\theta$ 는 $x$ 에 대한 pre-optimized 된 가중치 paramters입니다. 이러한 가중치는 HyperDreamBooth 모델을 personalization 하기 위해 이미지 $x$ 와 관련된 텍스트와 함께 조정됩니다. $D_{\theta}$ 는 diffusion model을 나타냅니다. 이 모델은 이미지 $x + \epsilon$ 및 Supervisory Text Prompt $c$ 로 조건이 설정된 상태에서 사용됩니다. 이 모델은 이미지 생성 및 개인화에 사용됩니다. $\alpha$ 와 $\beta$ 는 상대적인 loss의 가중치를 제어하기 위한 hyperparameters 입니다. 이러한 hyperparameters 는 각 loss 항목의 중요성을 조절하는 데 사용됩니다. - - -**Supervisory Text Prompt**
-Supervisory Text Prompt는 이미지 생성을 지원하기 위한 텍스트 입력입니다. 주어진 텍스트 프롬프트는 이미지 생성에 대한 지시사항 또는 조건을 제공합니다. HyperDreamBooth에서는 "a [V] face" 와 같은 텍스트 프롬프트를 사용하여 개인화된 이미지를 생성합니다. [V] 는 드물지만 다양한 의미 수정을 삽입할 수 있는 역할을 합니다. - -**HyperNetwork Architecture**
-HyperNetwork는 HyperDreamBooth에서 사용되는 모델로, 개인화된 이미지 생성을 위한 가중치를 예측하는 역할을 합니다. HyperNetwork는 보통 다른 신경망 구조로 구성되며, 주어진 이미지를 입력으로 받아서 T2I 모델의 가중치를 예측합니다. 이러한 개인화된 이미지 생성을 위한 핵심 구성 요소 중 하나입니다. 여기서 예측한 가중치를 이후 Stable Diffusion 모델의 가중치에 더하여 개인화를 실행합니다. - -**Iterative Prediction**
-HyperDreamBooth에서 사용되는 HyperNetwork는 반복적 예측을 수행합니다. 이것은 HyperNetwork가 초기 예측을 한 후에도 추가 반복적인 예측 단계를 통해 결과를 개선하려고 시도하는 것을 의미합니다. 초기 HyperNetwork 예측은 방향성이 올바르고 대상과 얼굴과 유사한 semantic 특성을 생성하지만 미세만 세부 정보를 충분히 잡아내지 못할 수 있습니다. 따라서 반복적인 예측을 통해 초기 예측을 fine-tuning하고 더 나은 이미지를 생성합니다. 이 때에 image encoding은 단 한 번만 수행되며, 추출된 특징 f는 반복적인 예측 과정에서 사용됩니다. - -:::{figure-md} -hyperdreambooth_01 - -HyperNetwork + Fast Finetuning -::: - -### Rank-Relaxed Fast Finetuning -초기 HyperNetwork를 실행하고 나면 semantic 속성과 방향성에 대해서 올바르게 생성이 되지만 세부적인 detail은 잘 잡아내지 못합니다. 이를 위해 마지막으로 fast finetuning 단계를 제안합니다. 이 단계를 통해, DreamBooth보다 훨씬 빠르지만 강한 subject fidelity, editability 그리고 style diversity를 동일하게 유지할 수 있습니다. -먼저 HyperNetwork를 사용하여 개인화된 diffusion model 가중치를 예측합니다. 이후 diffusion model의 가중치를 초기화된 이미지 x와 함께 주어진 텍스트 지시어 c에 대한 diffusion noise loss $L(x)$ 를 최소화하도록 조정합니다. 여기서 주요한 점은 ***rank-relaxed*** 의 개념입니다. 이것은 초기 모델의 rank(주로 1)를 완화하여 더 높은 rank로 LoRA 모델을 fine tuning 하는 것을 의미합니다. 구체적으로, HyperNetwork의 예측된 가중치 모델의 전체 가중치에 추가하고 더 높은 rank로 LoRA fine tuning을 수행합니다. 이를 통해 모델은 주체의 고주파수 세부 사항을 더 잘 근사화할 수 있으며 이로 인해 다른 낮은 rank로 제한된 업데이트보다 더 높은 주제 충실도를 달성할 수 있습니다. 이러한 rank-relaxed의 개념은 HyperDreamBooth를 다른 방식보다 더 우수하게 만드는 요인입니다. 여기서도 동일한 Supervisory Text Prompt "a [V] face" 를 사용하는데 이 프롬프트는 이미지 개인화를 지원하며 모델이 얼굴에 관련된 다양한 특성과 스타일을 캡처하는 데 도움이 됩니다. 그리고 HyperNetwork의 초기화된 가중치를 고려할 때, fast finetuning 단계를 40번의 반복으로 완료할 수 있습니다. 이는 DreamBooth 및 LoRA DreamBooth와 비교했을 때 25배 빠른 속도라는 것을 의미합니다. - -## Experiments - -본 HyperDreamBooth는 Stable Diffusion v1.5 을 활용하여 구현했습니다. 이 모델에서는 Stable Diffusion v1.5의 다양한 요소 중 하나인 diffusion UNet의 cross and self-attention 레이어에 대한 LoRA 가중치를 예측합니다. 또한 텍스트 정보를 활용하기 위해 CLIP 텍스트 인코더도 예측합니다. 이미지 생성 모델을 개인화하기 위해 시각화에 사용되는 모든 얼굴 이미지는 SFHQ(Synthetic Face Headquarters) 데이터셋을 활용했습니다. 모델을 훈련시키기 위해 CelebA-HQ 데이터셋에서 15,000개의 실제 얼굴 이미지가 활용되었습니다. - -:::{figure-md} -hyperdreambooth_01 - -Result Gallery -::: - -왼쪽 위에서 오른쪽 아래로 "인스타그램 셀카 [V] 얼굴", "Pixar 캐릭터 [V] 얼굴", "bark skin의 [V] 얼굴", "록 스타 [V] 얼굴", 가장 오른쪽: " 전문적인 [V] 얼굴 촬영" 프롬프트를 활용했습니다. - -:::{figure-md} -hyperdreambooth_01 - -Qualitative Comparison -::: - -:::{figure-md} -hyperdreambooth_01 - -Comparisons Table -::: - -## Comparisons - -Hyperdreambooth, DreamBooth 그리고 Textual Inversion의 무작위 생성된 샘플을 비교한 이미지와 표입니다. 정량적 평가를 위해 DINO와 같은 지표를 활용했습니다. - -:::{figure-md} -hyperdreambooth_01 - -Comparisons with DreamBooth -::: - -위 표는 DreamBooth와 비교하는 부분입니다. DreamBooth의 hyperparameter를 다르게 조정하여 비교했습니다. 그 결과 학습률을 증가시키고 반복 횟수(iterations)를 감소시키면 결과의 저하가 있었습니다. DreamBooth-Agg-1은 400번의 반복을 시행하고, DreamBooth-Agg-2는 일반적인 Dreambooth의 1200번 대신 40번의 반복을 사용했습니다. - - -:::{figure-md} -hyperdreambooth_01 - -HyperNetwork Ablation -::: - -위 부분은 여러 가지 구성 요소로 나누어 실험한 표입니다. 실험 중에는 하이퍼네트워크를 사용하지 않는 경우, 하이퍼네트워크 예측만 사용하고 fast-finetuning을 사용하지 않은 경우, 반복 예측 없이 전체 방법을 1번만 사용한 경우를 비교합니다. 결과적으로 전체 방법이 모든 신뢰성 지표에서 가장 우수한 결과를 달성한다는 것을 보여주고 있습니다. - -:::{figure-md} -hyperdreambooth_01 - -User Study -::: - -얼굴 인식 메트릭 이 특정 시나리오에서 상대적으로 약하다고 합니다. 얼굴 인식 네트워크가 실제 이미지에만 훈련되어 있고 다양한 스타일에서 동일한 사람을 인식하도록 훈련되어 있지 않기 때문이라고 주장하며 이를 보완하기 위해 user study를 진행했습니다. 여기서도 HyperDreamBooth, DreamBooth, Textual Inversion을 비교하고 사용자들의 평가를 받았습니다. - -## Follow-ups - -하지만 여전히 follow-ups가 존재합니다. 먼저 **semantic directional error** 라고 하는 초기 예측에서 잘못된 시맨틱 정보가 나올 수 있는 에러입니다. 잘못된 눈 색깔이나 헤어 타입, 성별 등이 나올 수 있습니다. 다음으로 **incorrect subject detail capture** 라는 오류가 있습니다. 다음은 **underfitting** 입니다. Fast finetuning 단계에서 identity는 지켜지더라도 유사하지 않은 샘플이 생성될 수 있습니다. 다음으로 HyperNetwork와 fast-finetuning 모두 일부 스타일에 대해 낮은 editability 가 나올 수 있습니다. 이러한 문제점은 빛, 포즈 등으로 인해 OOD인 샘플에서 나타날 수 있습니다. - -## Conclusion - +``` {admonition} Information +- **Title:** HyperDreamBooth: HyperNetworks for Fast Personalization of Text-to-Image Models + +- **Reference** + - Paper: [https://arxiv.org/pdf/2307.06949.pdf](https://arxiv.org/pdf/2307.06949.pdf) + +- **Author:** Hyoungseo Cho + +- **Last updated on Oct. 10, 2023** +``` + +# HyperDreamBooth + +## Introduction + +Personalization 는 Generative AI 분야에서 떠오르고 있는 주제입니다. 이는 high-fidelity와 identity를 유지한 상태로 다양한 맥락과 스타일을 생성할 수 있도록 합니다. 본 논문은 [Dreambooth](https://pseudo-lab.github.io/text-to-image-generation-feat-diffusion/docs/review/dreambooth.html) 를 기반으로 진행되었기 때문에 [Dreambooth](https://pseudo-lab.github.io/text-to-image-generation-feat-diffusion/docs/review/dreambooth.html) 논문을 먼저 읽어 보시기를 추천드립니다. + +:::{figure-md} +hyperdreambooth_01 + +HyperDreamBooth +::: + +## Contribution + +본 논문의 Contribution은 크게 3가지로 볼 수 있습니다. Lighweight DreamBooth (LiDB), New HyperNetwork architecture 그리고 rank-relaxed finetuning 입니다. 위 3가지 방법을 활용하여 기존 DreamBooth의 핵심 능력을 유지하면서 크기를 줄이고 속도를 높일 수 있었습니다. + +## Related Work + +**Text-to-image Models**
+본 논문에서는 Stable Diffusion 모델을 활용하여 HyperDreamBooth를 구현했지만, 이 부분은 다른 텍스트-이미지 모델 (Imagen, DALL-E2 등) 도 적용이 가능합니다. + +**Personalization of Generative Models**
+Generative Adversarial Network 기반의 기술들은 fidelity가 떨어지거나 다양한 문맥을 제공하지 못하는 문제가 있습니다. 이에 따라 HyperNetwork를 도입한 연구를 진행했습니다. + +**T2I Personalization via Finetuning**
+다음으로, text-to-image personalization을 위한 Finetuning에 대한 연구가 있습니다. CustomDiffusion, SVDiff, LoRA, StyleDrop, DreamArtist 등의 예시가 있습니다. 하지만 이는 속도 측면에서 느리다는 단점을 가지고 있습니다. + +이러한 관련 연구들을 볼 때, HyperDreamBooth는 속도와 효율성 측면에서 큰 발전을 이루었다고 볼 수 있습니다. + +:::{figure-md} +hyperdreambooth_01 + +HyperDreamBooth Training and Fast Fine-Tuning +::: + +## Prelimiaries + +**Latent Diffusion Models (LDM)**
+본 논문에서는 Stable Diffusion 모델을 활용하여 HyperDreamBooth를 구현했지만, 이 부분은 다른 텍스트-이미지 모델 (Imagen, DALL-E2 등) 도 적용이 가능합니다. + +**DreamBooth**
+이전에 나온 DreamBooth는 특정 주제의 이미지를 생성하기 위해 T2I denoising 네트워크를 finetuning하는 전략을 활용했습니다. 이 방법은 HyperDreamBooth의 영감원 중 하나로 활용되었습니다. + +**Low Rank Adaptation (LoRA)**
+LoRA는 모델의 가중치를 낮은 랭크의 행렬로 근사화하여 모델의 크기와 복잡성을 줄이는 방법입니다. 본 논문에서는 이 LoRA 기술을 활용하여 더 빠르고 효율적인 personalization이 가능하도록 합니다. + +## Method + +위에서 살펴 본 Contribution의 내용을 자세히 살펴보도록 하겠습니다. + +### Lightweight DreamBooth (LiDB) + +HyperdreamBooth 의 핵심 기술 중 하나인 Lightweight DreamBooth, 줄여서 LiDB에 대해 설명드리겠습니다. LiDB는 rank-1 LoRA residuals의 가중치 공간을 더 세분화하는 것이 핵심 아이디어입니다. 분해 과정에서 rank-1 LoRA weight-space 내에서 random orthogonal basis를 활용하여 decompose 합니다. + +:::{figure-md} +hyperdreambooth_01 + +Lightweight DreamBooth +::: + +이 접근 방식은 LoRA의 A와 B 행렬을 각각 두 개의 행렬로 분해하는 것으로도 이해할 수 있습니다. 더 구체적으로 살펴보면, A 행렬은 $A_{aux}$ 와 $A_{train}$ 으로 분해되며, B 행렬은 $B_{aux}$ 와 $B_{train}$ 으로 분해할 수 있습니다. 여기서 $aux$ 레이어는 행별로 직교하는 벡터로 무작위 초기화되고 freeze 되어 있으며, $train$ 레이어는 학습되는 가중치입니다. 따라서 LiDB 선형 레이어의 weight-residual은 다음과 같이 표현할 수 있습니다. + +$$ +\Delta W_x = A_{aux} A_{train} B_{train} B_{aux} +$$ + +여기서 $aux$ 레이어는 experimentally fix 되었으며 이 과정을 통해 trainable parameter 개수는 약 30K개, 사이즈는 약 120KB로 경량화 할 수 있습니다. 이렇게 작은 크기와 변수만으로 fidelity, editability, style 그리고 diversity 등을 유지할 수 있다는 것이 포인트입니다. + +### HyperNetwork + +:::{figure-md} +hyperdreambooth_01 + +HyperNetwork Architecture +::: + +다음은 Hypernetwork 입니다. 본 논문에서는 사전에 훈련된 T2I 모델을 빠르게 personalization 하기 위해 HyperNetwork를 제안합니다. 여기서 $\tilde{\theta}$ 는 모든 LiDB residual 행렬을 나타내며, 각 T2I 모델의 cross-attention 및 self-attention 레이어에 대한 $A_{train}$ 및 $B_{train}$ 입니다. 이 핵심 아이디어는 주어진 이미지 x를 입력으로 받고, 이 이미지를 사용하여 LiDB의 low-rank residual인 $\hat{\theta}$ 을 예측하는 HyperNetwork $H_{\eta}$ 를 돌입하는 것입니다.HyperNetwork는 도메인 특화 이미지 데이터셋에서 훈련되며, 일반적인 확산 노이즈 제거 손실과 가중치 공간 손실을 가지고 있습니다. + +$$ +L(x) = \alpha \left\| D_\hat{\theta} (x + {\epsilon} , c) - x \right\|_{2}^{2} + \beta \left\|\hat{\theta} - {\theta} \right\|_{2}^{2} +$$ + +여기서 $x$ 는 reference image를 의미합니다. HyperDreamBooth의 목표는 주어진 참조 이미지 x를 기반으로 해당 이미지와 유사한 새로운 이미지를 생성하는 것입니다. $\theta$ 는 $x$ 에 대한 pre-optimized 된 가중치 paramters입니다. 이러한 가중치는 HyperDreamBooth 모델을 personalization 하기 위해 이미지 $x$ 와 관련된 텍스트와 함께 조정됩니다. $D_{\theta}$ 는 diffusion model을 나타냅니다. 이 모델은 이미지 $x + \epsilon$ 및 Supervisory Text Prompt $c$ 로 조건이 설정된 상태에서 사용됩니다. 이 모델은 이미지 생성 및 개인화에 사용됩니다. $\alpha$ 와 $\beta$ 는 상대적인 loss의 가중치를 제어하기 위한 hyperparameters 입니다. 이러한 hyperparameters 는 각 loss 항목의 중요성을 조절하는 데 사용됩니다. + + +**Supervisory Text Prompt**
+Supervisory Text Prompt는 이미지 생성을 지원하기 위한 텍스트 입력입니다. 주어진 텍스트 프롬프트는 이미지 생성에 대한 지시사항 또는 조건을 제공합니다. HyperDreamBooth에서는 "a [V] face" 와 같은 텍스트 프롬프트를 사용하여 개인화된 이미지를 생성합니다. [V] 는 드물지만 다양한 의미 수정을 삽입할 수 있는 역할을 합니다. + +**HyperNetwork Architecture**
+HyperNetwork는 HyperDreamBooth에서 사용되는 모델로, 개인화된 이미지 생성을 위한 가중치를 예측하는 역할을 합니다. HyperNetwork는 보통 다른 신경망 구조로 구성되며, 주어진 이미지를 입력으로 받아서 T2I 모델의 가중치를 예측합니다. 이러한 개인화된 이미지 생성을 위한 핵심 구성 요소 중 하나입니다. 여기서 예측한 가중치를 이후 Stable Diffusion 모델의 가중치에 더하여 개인화를 실행합니다. + +**Iterative Prediction**
+HyperDreamBooth에서 사용되는 HyperNetwork는 반복적 예측을 수행합니다. 이것은 HyperNetwork가 초기 예측을 한 후에도 추가 반복적인 예측 단계를 통해 결과를 개선하려고 시도하는 것을 의미합니다. 초기 HyperNetwork 예측은 방향성이 올바르고 대상과 얼굴과 유사한 semantic 특성을 생성하지만 미세만 세부 정보를 충분히 잡아내지 못할 수 있습니다. 따라서 반복적인 예측을 통해 초기 예측을 fine-tuning하고 더 나은 이미지를 생성합니다. 이 때에 image encoding은 단 한 번만 수행되며, 추출된 특징 f는 반복적인 예측 과정에서 사용됩니다. + +:::{figure-md} +hyperdreambooth_01 + +HyperNetwork + Fast Finetuning +::: + +### Rank-Relaxed Fast Finetuning +초기 HyperNetwork를 실행하고 나면 semantic 속성과 방향성에 대해서 올바르게 생성이 되지만 세부적인 detail은 잘 잡아내지 못합니다. 이를 위해 마지막으로 fast finetuning 단계를 제안합니다. 이 단계를 통해, DreamBooth보다 훨씬 빠르지만 강한 subject fidelity, editability 그리고 style diversity를 동일하게 유지할 수 있습니다. +먼저 HyperNetwork를 사용하여 개인화된 diffusion model 가중치를 예측합니다. 이후 diffusion model의 가중치를 초기화된 이미지 x와 함께 주어진 텍스트 지시어 c에 대한 diffusion noise loss $L(x)$ 를 최소화하도록 조정합니다. 여기서 주요한 점은 ***rank-relaxed*** 의 개념입니다. 이것은 초기 모델의 rank(주로 1)를 완화하여 더 높은 rank로 LoRA 모델을 fine tuning 하는 것을 의미합니다. 구체적으로, HyperNetwork의 예측된 가중치 모델의 전체 가중치에 추가하고 더 높은 rank로 LoRA fine tuning을 수행합니다. 이를 통해 모델은 주체의 고주파수 세부 사항을 더 잘 근사화할 수 있으며 이로 인해 다른 낮은 rank로 제한된 업데이트보다 더 높은 주제 충실도를 달성할 수 있습니다. 이러한 rank-relaxed의 개념은 HyperDreamBooth를 다른 방식보다 더 우수하게 만드는 요인입니다. 여기서도 동일한 Supervisory Text Prompt "a [V] face" 를 사용하는데 이 프롬프트는 이미지 개인화를 지원하며 모델이 얼굴에 관련된 다양한 특성과 스타일을 캡처하는 데 도움이 됩니다. 그리고 HyperNetwork의 초기화된 가중치를 고려할 때, fast finetuning 단계를 40번의 반복으로 완료할 수 있습니다. 이는 DreamBooth 및 LoRA DreamBooth와 비교했을 때 25배 빠른 속도라는 것을 의미합니다. + +## Experiments + +본 HyperDreamBooth는 Stable Diffusion v1.5 을 활용하여 구현했습니다. 이 모델에서는 Stable Diffusion v1.5의 다양한 요소 중 하나인 diffusion UNet의 cross and self-attention 레이어에 대한 LoRA 가중치를 예측합니다. 또한 텍스트 정보를 활용하기 위해 CLIP 텍스트 인코더도 예측합니다. 이미지 생성 모델을 개인화하기 위해 시각화에 사용되는 모든 얼굴 이미지는 SFHQ(Synthetic Face Headquarters) 데이터셋을 활용했습니다. 모델을 훈련시키기 위해 CelebA-HQ 데이터셋에서 15,000개의 실제 얼굴 이미지가 활용되었습니다. + +:::{figure-md} +hyperdreambooth_01 + +Result Gallery +::: + +왼쪽 위에서 오른쪽 아래로 "인스타그램 셀카 [V] 얼굴", "Pixar 캐릭터 [V] 얼굴", "bark skin의 [V] 얼굴", "록 스타 [V] 얼굴", 가장 오른쪽: " 전문적인 [V] 얼굴 촬영" 프롬프트를 활용했습니다. + +:::{figure-md} +hyperdreambooth_01 + +Qualitative Comparison +::: + +:::{figure-md} +hyperdreambooth_01 + +Comparisons Table +::: + +## Comparisons + +Hyperdreambooth, DreamBooth 그리고 Textual Inversion의 무작위 생성된 샘플을 비교한 이미지와 표입니다. 정량적 평가를 위해 DINO와 같은 지표를 활용했습니다. + +:::{figure-md} +hyperdreambooth_01 + +Comparisons with DreamBooth +::: + +위 표는 DreamBooth와 비교하는 부분입니다. DreamBooth의 hyperparameter를 다르게 조정하여 비교했습니다. 그 결과 학습률을 증가시키고 반복 횟수(iterations)를 감소시키면 결과의 저하가 있었습니다. DreamBooth-Agg-1은 400번의 반복을 시행하고, DreamBooth-Agg-2는 일반적인 Dreambooth의 1200번 대신 40번의 반복을 사용했습니다. + + +:::{figure-md} +hyperdreambooth_01 + +HyperNetwork Ablation +::: + +위 부분은 여러 가지 구성 요소로 나누어 실험한 표입니다. 실험 중에는 하이퍼네트워크를 사용하지 않는 경우, 하이퍼네트워크 예측만 사용하고 fast-finetuning을 사용하지 않은 경우, 반복 예측 없이 전체 방법을 1번만 사용한 경우를 비교합니다. 결과적으로 전체 방법이 모든 신뢰성 지표에서 가장 우수한 결과를 달성한다는 것을 보여주고 있습니다. + +:::{figure-md} +hyperdreambooth_01 + +User Study +::: + +얼굴 인식 메트릭 이 특정 시나리오에서 상대적으로 약하다고 합니다. 얼굴 인식 네트워크가 실제 이미지에만 훈련되어 있고 다양한 스타일에서 동일한 사람을 인식하도록 훈련되어 있지 않기 때문이라고 주장하며 이를 보완하기 위해 user study를 진행했습니다. 여기서도 HyperDreamBooth, DreamBooth, Textual Inversion을 비교하고 사용자들의 평가를 받았습니다. + +## Follow-ups + +하지만 여전히 follow-ups가 존재합니다. 먼저 **semantic directional error** 라고 하는 초기 예측에서 잘못된 시맨틱 정보가 나올 수 있는 에러입니다. 잘못된 눈 색깔이나 헤어 타입, 성별 등이 나올 수 있습니다. 다음으로 **incorrect subject detail capture** 라는 오류가 있습니다. 다음은 **underfitting** 입니다. Fast finetuning 단계에서 identity는 지켜지더라도 유사하지 않은 샘플이 생성될 수 있습니다. 다음으로 HyperNetwork와 fast-finetuning 모두 일부 스타일에 대해 낮은 editability 가 나올 수 있습니다. 이러한 문제점은 빛, 포즈 등으로 인해 OOD인 샘플에서 나타날 수 있습니다. + +## Conclusion + 본 연구에서는 HyperDreamBooth라는 새로운 방법을 소개했습니다. 이 방법은 텍스트에서 이미지로 변환하는 diffusion model을 빠르고 가벼운 방식으로 개인화하는 것을 목표로 합니다. HyperDreamBooth는 HyperNetwork라는 구성 요소를 활용하여 diffusion model의 가벼운 파라미터인 LiDB(Lightweight DreamBooth)파라미터를 생성하며, 이어서 DreamBooth 및 기타 최적화 기반 개인화 작업에 비해 크기와 속도를 상당히 줄이면서 fast rank-relaxed fine tuning을 수행합니다. 이를 통해 모델의 무결성을 유지하면서 다양한 스타일과 의미적 수정이 적용된 다양한 고품질 이미지를 생성할 수 있음을 입증하였습니다. \ No newline at end of file diff --git a/_sources/docs/review/I-DDPM.md b/_sources/docs/review/I-DDPM.md old mode 100644 new mode 100755 index ea072620..e26ff1cc --- a/_sources/docs/review/I-DDPM.md +++ b/_sources/docs/review/I-DDPM.md @@ -1,220 +1,220 @@ -```{admonition} Information -- **Title:** Improved Denoising Diffusion Probabilistic Models (CVPR 2021) - -- **Reference** - - Paper: [https://arxiv.org/abs/2102.09672](https://arxiv.org/abs/2102.09672) - -- **Author:** Seunghwan Ji - -- **Last updated on Aug. 6, 2023** -``` -# I-DDPM - -## Abstract - -- DDPM을 약간 수정함으로써 High Quality를 유지하고, Log Likelihood수치도 개선할 수 있는 향상된 모델을 제안 -- Sampling시 Base 보다 더 적은 Step으로 비슷한 퀄리티의 결과를 낼 수 있는 방법을 제안 -- Model의 Scale과 Diffusion Step에 따른 Sample Quailty와 Likelihood 수치간의 관계를 연구 - -## 1. Introduction - -- 최근 DDPM(Ho et al.) 모델은 Generate 분야에서 High Quality의 이미지를 생성해내는 수준까지 왔다. -- 하지만, Image의 Quality에 반해 log-likelihood 수치는 다른 generative 모델에비해 현저히 떨어졌다. (e.g. VAE) -- 또 DDPM이 Diversity가 낮은 Dataset(CIFAR-10, LSUN)에서는 잘 동작했지만, High Diversity Dataset에서의 동작은 증명되지 못했다. -- I-DDPM에서는 - 1. Log-Likelihood 수치 개선 - 2. ImageNet같은 Diversity가 높은 Dataset에서도 잘 동작 - 3. Reverse Process에서의 Loss Term 개선 - - 한 모델을 제안하였다. - -- 추가로 연구 과정 중, I-DDPM이 Base (DDPM) 모델에 비해 훨씬 더 적은 Step으로 비슷한 Quality를 내는 것을 확인 - -**Log-Likelihood 값이 중요한 이유** - -- 기존 연구들에서 Loglikelihood 수치와 Sample의 Quality간의 연관성을 보이는 연구들이 많았다. - - *Data의 Distribution에 대해 Model이 학습한 정도를 수치화한 느낌* -- 수치가 좋아지면 Sample Quality도 따라 증가하는 경향을 보였다. -- 따라서 DDPM에서도 LogLikelihood 수치를 개선한다면 Sample Quality도 따라서 더 증가할 가능성이 있지 않을까? -- [https://angeloyeo.github.io/2020/07/17/MLE.html](https://angeloyeo.github.io/2020/07/17/MLE.html) - -## 2. Denoising Diffusion Probabilistic Models - -**DDPM** - -- Process - - Forward Process - :::{figure-md} - I-DDPM_00 - - Equation 1 - ::: - - Reverse Process - :::{figure-md} - I-DDPM_01 - - Equation 2 - ::: - - -- Forward Process에서 입힌 Noise를 Neural Model의 Reverse Process로 예측하도록 학습하는 형태 -- 이 때 Noising & Denoising에 관한 (Hyper) Parameter로 ${B_{t}}$와 $\tilde{B_{t}}$를 사용 - - ${B_{t}}$ : time step 에 따른 noising할 정도 - - $\tilde{B_{t}}$ : Reverse Step에서 Denoising을 위한 Parameter로 아래와같이 정의 - :::{figure-md} - I-DDPM_02 - - Equation 3 - ::: - -- 하지만 DDPM에서는 $\tilde{B_{t}}$ 대신 ${B_{t}}$를 사용해도 비슷한 수치를 보여서 ${B_{t}}$ (constant)로 고정 - -## 3. Improving the Log-likelihood - -- 위의 문장 ($\tilde{B_{t}}$ 대신 ${B_{t}}$를 사용)에서 의문점 - - 사실 ${B_{t}}$와 $\tilde{B_{t}}$는 정 반대의 역할을 하는 Parameter인데 왜 비슷한 결과를 보였고, 결국 같은 값으로 Fix를 하는게 맞을까? - :::{figure-md} - I-DDPM_03 - - Figure 1 - ::: - - - Diffusion Step간 ${B_{t}}$와 $\tilde{B_{t}}$의 차이를 비교해보면 Diffusion Step이 커질수록 두개의 값은 거의 동일해진다. (Figure.1) - :::{figure-md} - I-DDPM_04 - - Figure 2 - ::: - - - 하지만 Figure.2를 보면 모델의 성능은 대부분 Step 초반에 결정되는데, Step 초반에는 두 값의 차이가 큰 것을 확인할 수 있다. - - *Model의 성능이 결정되는 부분 = Loss 가 급격하게 떨어지는 부분* - - ⇒ 따라서, ${B_{t}}$와 $\tilde{B_{t}}$를 동일한 값으로 두고 $\tilde{B_{t}}$를 Non Trainable Parameter로 두는것은 설계의 Miss - - - 하지만, $\tilde{B_{t}}$ 자체를 학습하기에는 값의 범위가 너무 작아서 ${B_{t}}$와 $\tilde{B_{t}}$의 Interpolation 값을 Predict하도록 설계 - :::{figure-md} - I-DDPM_05 - - Figure 3 - ::: - - - Hybrid Loss - - $L_{hyprid} = L_{simple} + λL_{vlb}$ -- Noise Schedule - - DDPM의 경우 High Resolution 이미지에대해 잘 동작하지만, Low-Resolution (e.g. 32x32, 64x64)의 이미지에 대해서는 잘 동작하지 않는것을 확인 - - Noise Scheduling에서 Linear mode의 Limitation이 있음을 지적 - :::{figure-md} - I-DDPM_06 - - Equation 4 - ::: - - - Step이 거듭날수록 Linear schedule(상단)의 이미지가 너무 빠르게 Noisy해짐 - - 추가로 Reverse Process의 20%를 Skip해도 성능에 큰 영향이 없음을 확인 - - ⇒ 결국 Linear mode를 사용하면 특정 Step 이후의 Noise는 학습에 의미있는 영향을 미치지 못한다. - - - I-DDPM에서는 이러한 scheduling Equation을 새로 정의 - :::{figure-md} - I-DDPM_07 - - Equation 5 - ::: - - - 새로 정의한 식은 중간 단계에서는 Noise가 강하게 입혀지지만 0과 T 부근에서는 비교적 덜 Noisy해짐 - :::{figure-md} - I-DDPM_08 - - Figure 3 - ::: - -- Gradient Noise - - Model을 $L_{vlb}$를 Direct로 최적화하도록 설계하면 Best - - 하지만 아래 이미지와같이 Loss 자체가 unstable해서 직접 최적화에는 어려움이 있음 - :::{figure-md} - I-DDPM_09 - - Figure 4 - ::: - - - 따라서 $L_{vlb}$의 Variance를 줄이기위해(=stable) Importance Sampling 기법을 도입 - - 위 Fig.2에서 보면 학습 말기는 Loss의 변화에 큰 영향이 없으므로 확률적으로 학습 초반의 데이터를 좀더 sampling해서 학습하도록 설계 - - 실제로 적용해본 결과 $L_{hybrid}$보다 더 낮은 Loss 를 보임 - - $L_{hybrid}$에 Importance Sampling을 적용하면? - - 적용 전보다 좋지 않은 결과를 보인다.. - -**Result** - -:::{figure-md} -I-DDPM_10 - -Table 1 -::: - -:::{figure-md} -I-DDPM_11 - -Table 2 -::: - -- DDPM에서 다소 취약했던 ImageNet 64x64와 CIDAR-10 데이터를 기준 - - $L_{vlb}$의 경우 Importance sampling을 적용한 결과 - -:::{figure-md} -I-DDPM_12 - -Table 3 -::: - -- Convolution 모델이나 Diffusion 모델중에서는 뛰어나지만, Fully Transformer 모델에 비해서는 다소 부족한 면이 있음 - -## 4. Improcing Sampling Speed - -- Sampling Speed를 높이기 위한 방법을 제안 - - Training 시에는 전체 Step(1, … , T)을 학습 - - Sampling 시에는 몇몇 Step만 Sampling -- 결과는? - -:::{figure-md} -I-DDPM_13 - -Figure 5 -::: - -:::{figure-md} -I-DDPM_14 - -Figure 6 -::: - -⇒ 100 Step만 가도 Full Model과 비슷한 FiD값을 보임 - -## 5. Comparison to GANs - -- Class Conditional Generation + P&R Metric으로 GAN 모델(BigGAN)과 성능을 비교 - :::{figure-md} - I-DDPM_15 - - Figure 7 - ::: - - - - Big-GAN Deep 모델보다 생성 타겟에 대한 FiD 수치나 Recall metric에서 더 뛰어난 성능을 보임 - -## 6. Scaling Model Size - -- 다양한 Capacity를 가진 모델의 FiD와 NLL 값을 비교 - -:::{figure-md} -I-DDPM_16 - -Figure 8 -::: - -:::{figure-md} -I-DDPM_17 - -Figure 9 -::: - -⇒ 모델의 크기와 학습량 모두 Step에 어느정도 비례함 +```{admonition} Information +- **Title:** Improved Denoising Diffusion Probabilistic Models (CVPR 2021) + +- **Reference** + - Paper: [https://arxiv.org/abs/2102.09672](https://arxiv.org/abs/2102.09672) + +- **Author:** Seunghwan Ji + +- **Last updated on Aug. 6, 2023** +``` +# I-DDPM + +## Abstract + +- DDPM을 약간 수정함으로써 High Quality를 유지하고, Log Likelihood수치도 개선할 수 있는 향상된 모델을 제안 +- Sampling시 Base 보다 더 적은 Step으로 비슷한 퀄리티의 결과를 낼 수 있는 방법을 제안 +- Model의 Scale과 Diffusion Step에 따른 Sample Quailty와 Likelihood 수치간의 관계를 연구 + +## 1. Introduction + +- 최근 DDPM(Ho et al.) 모델은 Generate 분야에서 High Quality의 이미지를 생성해내는 수준까지 왔다. +- 하지만, Image의 Quality에 반해 log-likelihood 수치는 다른 generative 모델에비해 현저히 떨어졌다. (e.g. VAE) +- 또 DDPM이 Diversity가 낮은 Dataset(CIFAR-10, LSUN)에서는 잘 동작했지만, High Diversity Dataset에서의 동작은 증명되지 못했다. +- I-DDPM에서는 + 1. Log-Likelihood 수치 개선 + 2. ImageNet같은 Diversity가 높은 Dataset에서도 잘 동작 + 3. Reverse Process에서의 Loss Term 개선 + + 한 모델을 제안하였다. + +- 추가로 연구 과정 중, I-DDPM이 Base (DDPM) 모델에 비해 훨씬 더 적은 Step으로 비슷한 Quality를 내는 것을 확인 + +**Log-Likelihood 값이 중요한 이유** + +- 기존 연구들에서 Loglikelihood 수치와 Sample의 Quality간의 연관성을 보이는 연구들이 많았다. + - *Data의 Distribution에 대해 Model이 학습한 정도를 수치화한 느낌* +- 수치가 좋아지면 Sample Quality도 따라 증가하는 경향을 보였다. +- 따라서 DDPM에서도 LogLikelihood 수치를 개선한다면 Sample Quality도 따라서 더 증가할 가능성이 있지 않을까? +- [https://angeloyeo.github.io/2020/07/17/MLE.html](https://angeloyeo.github.io/2020/07/17/MLE.html) + +## 2. Denoising Diffusion Probabilistic Models + +**DDPM** + +- Process + - Forward Process + :::{figure-md} + I-DDPM_00 + + Equation 1 + ::: + - Reverse Process + :::{figure-md} + I-DDPM_01 + + Equation 2 + ::: + + +- Forward Process에서 입힌 Noise를 Neural Model의 Reverse Process로 예측하도록 학습하는 형태 +- 이 때 Noising & Denoising에 관한 (Hyper) Parameter로 ${B_{t}}$와 $\tilde{B_{t}}$를 사용 + - ${B_{t}}$ : time step 에 따른 noising할 정도 + - $\tilde{B_{t}}$ : Reverse Step에서 Denoising을 위한 Parameter로 아래와같이 정의 + :::{figure-md} + I-DDPM_02 + + Equation 3 + ::: + +- 하지만 DDPM에서는 $\tilde{B_{t}}$ 대신 ${B_{t}}$를 사용해도 비슷한 수치를 보여서 ${B_{t}}$ (constant)로 고정 + +## 3. Improving the Log-likelihood + +- 위의 문장 ($\tilde{B_{t}}$ 대신 ${B_{t}}$를 사용)에서 의문점 + - 사실 ${B_{t}}$와 $\tilde{B_{t}}$는 정 반대의 역할을 하는 Parameter인데 왜 비슷한 결과를 보였고, 결국 같은 값으로 Fix를 하는게 맞을까? + :::{figure-md} + I-DDPM_03 + + Figure 1 + ::: + + - Diffusion Step간 ${B_{t}}$와 $\tilde{B_{t}}$의 차이를 비교해보면 Diffusion Step이 커질수록 두개의 값은 거의 동일해진다. (Figure.1) + :::{figure-md} + I-DDPM_04 + + Figure 2 + ::: + + - 하지만 Figure.2를 보면 모델의 성능은 대부분 Step 초반에 결정되는데, Step 초반에는 두 값의 차이가 큰 것을 확인할 수 있다. + - *Model의 성능이 결정되는 부분 = Loss 가 급격하게 떨어지는 부분* + + ⇒ 따라서, ${B_{t}}$와 $\tilde{B_{t}}$를 동일한 값으로 두고 $\tilde{B_{t}}$를 Non Trainable Parameter로 두는것은 설계의 Miss + + - 하지만, $\tilde{B_{t}}$ 자체를 학습하기에는 값의 범위가 너무 작아서 ${B_{t}}$와 $\tilde{B_{t}}$의 Interpolation 값을 Predict하도록 설계 + :::{figure-md} + I-DDPM_05 + + Figure 3 + ::: + + - Hybrid Loss + - $L_{hyprid} = L_{simple} + λL_{vlb}$ +- Noise Schedule + - DDPM의 경우 High Resolution 이미지에대해 잘 동작하지만, Low-Resolution (e.g. 32x32, 64x64)의 이미지에 대해서는 잘 동작하지 않는것을 확인 + - Noise Scheduling에서 Linear mode의 Limitation이 있음을 지적 + :::{figure-md} + I-DDPM_06 + + Equation 4 + ::: + + - Step이 거듭날수록 Linear schedule(상단)의 이미지가 너무 빠르게 Noisy해짐 + - 추가로 Reverse Process의 20%를 Skip해도 성능에 큰 영향이 없음을 확인 + + ⇒ 결국 Linear mode를 사용하면 특정 Step 이후의 Noise는 학습에 의미있는 영향을 미치지 못한다. + + - I-DDPM에서는 이러한 scheduling Equation을 새로 정의 + :::{figure-md} + I-DDPM_07 + + Equation 5 + ::: + + - 새로 정의한 식은 중간 단계에서는 Noise가 강하게 입혀지지만 0과 T 부근에서는 비교적 덜 Noisy해짐 + :::{figure-md} + I-DDPM_08 + + Figure 3 + ::: + +- Gradient Noise + - Model을 $L_{vlb}$를 Direct로 최적화하도록 설계하면 Best + - 하지만 아래 이미지와같이 Loss 자체가 unstable해서 직접 최적화에는 어려움이 있음 + :::{figure-md} + I-DDPM_09 + + Figure 4 + ::: + + - 따라서 $L_{vlb}$의 Variance를 줄이기위해(=stable) Importance Sampling 기법을 도입 + - 위 Fig.2에서 보면 학습 말기는 Loss의 변화에 큰 영향이 없으므로 확률적으로 학습 초반의 데이터를 좀더 sampling해서 학습하도록 설계 + - 실제로 적용해본 결과 $L_{hybrid}$보다 더 낮은 Loss 를 보임 + - $L_{hybrid}$에 Importance Sampling을 적용하면? + - 적용 전보다 좋지 않은 결과를 보인다.. + +**Result** + +:::{figure-md} +I-DDPM_10 + +Table 1 +::: + +:::{figure-md} +I-DDPM_11 + +Table 2 +::: + +- DDPM에서 다소 취약했던 ImageNet 64x64와 CIDAR-10 데이터를 기준 + - $L_{vlb}$의 경우 Importance sampling을 적용한 결과 + +:::{figure-md} +I-DDPM_12 + +Table 3 +::: + +- Convolution 모델이나 Diffusion 모델중에서는 뛰어나지만, Fully Transformer 모델에 비해서는 다소 부족한 면이 있음 + +## 4. Improcing Sampling Speed + +- Sampling Speed를 높이기 위한 방법을 제안 + - Training 시에는 전체 Step(1, … , T)을 학습 + - Sampling 시에는 몇몇 Step만 Sampling +- 결과는? + +:::{figure-md} +I-DDPM_13 + +Figure 5 +::: + +:::{figure-md} +I-DDPM_14 + +Figure 6 +::: + +⇒ 100 Step만 가도 Full Model과 비슷한 FiD값을 보임 + +## 5. Comparison to GANs + +- Class Conditional Generation + P&R Metric으로 GAN 모델(BigGAN)과 성능을 비교 + :::{figure-md} + I-DDPM_15 + + Figure 7 + ::: + + + - Big-GAN Deep 모델보다 생성 타겟에 대한 FiD 수치나 Recall metric에서 더 뛰어난 성능을 보임 + +## 6. Scaling Model Size + +- 다양한 Capacity를 가진 모델의 FiD와 NLL 값을 비교 + +:::{figure-md} +I-DDPM_16 + +Figure 8 +::: + +:::{figure-md} +I-DDPM_17 + +Figure 9 +::: + +⇒ 모델의 크기와 학습량 모두 Step에 어느정도 비례함 diff --git a/_sources/docs/review/Latent_Diffusion_Model.md b/_sources/docs/review/Latent_Diffusion_Model.md old mode 100644 new mode 100755 index 3162ddf6..355e6a2b --- a/_sources/docs/review/Latent_Diffusion_Model.md +++ b/_sources/docs/review/Latent_Diffusion_Model.md @@ -1,89 +1,89 @@ -```{admonition} Information -- **Title:** High-Resolution Image Synthesis with Latent Diffusion Models (CVPR 2022) - -- **Reference** - - Paper: [https://arxiv.org/abs/2112.10752](https://arxiv.org/abs/2112.10752) - - Code: [https://github.com/CompVis/latent-diffusion](https://github.com/CompVis/latent-diffusion) - -- **Author:** Namkyeong Cho - -- **Last updated on May. 31, 2023** -``` - -# Latent Diffusion Model - -오늘 알아볼 모델은 Latent Diffusion Model입니다. -기존에 다뤘던 Diffusion Model과 유사하게 동작하는 생성 모델입니다. 이 논문에서는 컴퓨터 자원의 소모를 줄이면서 Diffusion Model과 유사한 성능을 얻는것이 그 목표입니다. - -Latent Diffusion Model은 전반적으로 아래와 같은 구조를 가집니다. - -:::{figure-md} - - -Structure of Latent Diffusion Model -::: -$x \in \mathbb{R}^{H\times W \times 3}$이 input으로 주어졌을때 이를 encoder $\mathcal{E}$를 통해서 $z=\mathcal{E}(x) \in \mathbb{R}^{h\times w\times c }$로 인코딩 하고 $\hat{x}=\mathcal{D}(z)$ -로 디코딩을 한다. 이 논문에서 $f=H/h=W/w=2^m$, $m\in \mathbb{N}$이 되도록 여러 $m$에 대해서 테스트를 진행하였다. 또한 Latent space에서 분산이 커지지 않도록 KL divergence와 vector quantization(VQ)을 활용하였다. -이미지외 텍스트나, sematic map과 같이 추가적인 정보는 $\tau_\theta$를 통해서 전달을 하였고, - -$$ Q=W^{(i)}_Q \phi_i(z_i), K=W^{(i)}_K \phi_i(z_i), V=W^{(i)}_V \phi_i(z_i) $$ - -로 정의되고 $\phi_i(z_i)$는 $U$-Net 중간의 representation, $W^{i}_V, W^{i}_K, W^{i}_Q$는 학습 가능한 projection matrix이다. -$Q, K, V$ 는 attention의 query, key, value에 해당하며 - -$$ -Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d}})\cdot V -$$ - -로 연산이 진행된다. 학습을 위한 loss 함수는 다음과 같이표현된다. - -$$ -\mathcal{L}_{LDM} = \mathbb{E}_{\mathcal{E}(x), -\epsilon \sim \mathcal{N}(0,1),t} \left[ \|\epsilon-\epsilon_{\theta}(z_t,t) \|_{2}^{2}\right]. -$$ - -여기서 주목할만한 부분은 기존 Diffusion Model에서 - -$$ -\mathcal{L}_{DM} = \mathbb{E}_{x, -\epsilon \sim \mathcal{N}(0,1),t} \left[ \|\epsilon-\epsilon_{\theta}(x_t,t) \|_{2}^{2}\right]. -$$ - -와 같은 loss function으로 학습을 진행시키는데 $x_t$를 $z_t$로 바꾸면서 연산의 양을 줄였다는 점이다. - - -# Experiments - -해당 논문에서는 다양한 task에 대해서 실험을 진행하였는데, 그중 일부만 소개하도록 하겠다. -아래의 그림은 다양한 dataset에서 뽑은 샘플과 text to image sample들입니다. - -:::{figure-md} - - -Sample images -::: - - -:::{figure-md} - - -text to image on LAION -::: - -실험을 통해서 나온 결과 $m=2,3,4$ 혹은 $f=4, 8, 16$인 경우 적절한 FID 점수와 효율성을 보여주었습니다. - -:::{figure-md} - - -text to image on LAION -::: - -Layout이 주어졌을 때, 이를 기반으로 image를 생성하는 layout-to-image의 샘플 결과입니다. -:::{figure-md} - - -layout-to-image -::: - - - +```{admonition} Information +- **Title:** High-Resolution Image Synthesis with Latent Diffusion Models (CVPR 2022) + +- **Reference** + - Paper: [https://arxiv.org/abs/2112.10752](https://arxiv.org/abs/2112.10752) + - Code: [https://github.com/CompVis/latent-diffusion](https://github.com/CompVis/latent-diffusion) + +- **Author:** Namkyeong Cho + +- **Last updated on May. 31, 2023** +``` + +# Latent Diffusion Model + +오늘 알아볼 모델은 Latent Diffusion Model입니다. +기존에 다뤘던 Diffusion Model과 유사하게 동작하는 생성 모델입니다. 이 논문에서는 컴퓨터 자원의 소모를 줄이면서 Diffusion Model과 유사한 성능을 얻는것이 그 목표입니다. + +Latent Diffusion Model은 전반적으로 아래와 같은 구조를 가집니다. + +:::{figure-md} + + +Structure of Latent Diffusion Model +::: +$x \in \mathbb{R}^{H\times W \times 3}$이 input으로 주어졌을때 이를 encoder $\mathcal{E}$를 통해서 $z=\mathcal{E}(x) \in \mathbb{R}^{h\times w\times c }$로 인코딩 하고 $\hat{x}=\mathcal{D}(z)$ +로 디코딩을 한다. 이 논문에서 $f=H/h=W/w=2^m$, $m\in \mathbb{N}$이 되도록 여러 $m$에 대해서 테스트를 진행하였다. 또한 Latent space에서 분산이 커지지 않도록 KL divergence와 vector quantization(VQ)을 활용하였다. +이미지외 텍스트나, sematic map과 같이 추가적인 정보는 $\tau_\theta$를 통해서 전달을 하였고, + +$$ Q=W^{(i)}_Q \phi_i(z_i), K=W^{(i)}_K \phi_i(z_i), V=W^{(i)}_V \phi_i(z_i) $$ + +로 정의되고 $\phi_i(z_i)$는 $U$-Net 중간의 representation, $W^{i}_V, W^{i}_K, W^{i}_Q$는 학습 가능한 projection matrix이다. +$Q, K, V$ 는 attention의 query, key, value에 해당하며 + +$$ +Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d}})\cdot V +$$ + +로 연산이 진행된다. 학습을 위한 loss 함수는 다음과 같이표현된다. + +$$ +\mathcal{L}_{LDM} = \mathbb{E}_{\mathcal{E}(x), +\epsilon \sim \mathcal{N}(0,1),t} \left[ \|\epsilon-\epsilon_{\theta}(z_t,t) \|_{2}^{2}\right]. +$$ + +여기서 주목할만한 부분은 기존 Diffusion Model에서 + +$$ +\mathcal{L}_{DM} = \mathbb{E}_{x, +\epsilon \sim \mathcal{N}(0,1),t} \left[ \|\epsilon-\epsilon_{\theta}(x_t,t) \|_{2}^{2}\right]. +$$ + +와 같은 loss function으로 학습을 진행시키는데 $x_t$를 $z_t$로 바꾸면서 연산의 양을 줄였다는 점이다. + + +# Experiments + +해당 논문에서는 다양한 task에 대해서 실험을 진행하였는데, 그중 일부만 소개하도록 하겠다. +아래의 그림은 다양한 dataset에서 뽑은 샘플과 text to image sample들입니다. + +:::{figure-md} + + +Sample images +::: + + +:::{figure-md} + + +text to image on LAION +::: + +실험을 통해서 나온 결과 $m=2,3,4$ 혹은 $f=4, 8, 16$인 경우 적절한 FID 점수와 효율성을 보여주었습니다. + +:::{figure-md} + + +text to image on LAION +::: + +Layout이 주어졌을 때, 이를 기반으로 image를 생성하는 layout-to-image의 샘플 결과입니다. +:::{figure-md} + + +layout-to-image +::: + + + diff --git a/_sources/docs/review/LoRA.md b/_sources/docs/review/LoRA.md old mode 100644 new mode 100755 index 246ef429..02e3ce3c --- a/_sources/docs/review/LoRA.md +++ b/_sources/docs/review/LoRA.md @@ -1,290 +1,290 @@ -```{admonition} Information -- **Title:** Denoising Diffusion Probabilistic Models (ICLR 2021) - -- **Reference** - - Paper: [https://arxiv.org/abs/2006.11239](https://arxiv.org/abs/2006.11239) - - Code: [PyTorch implementation:](https://github.com/lucidrains/denoising-diffusion-pytorch) - - Review: [PR-409: Denoising Diffusion Probabilistic Models](https://www.youtube.com/watch?v=1j0W_lu55nc) - -- **Author:** Beomsoo Park - -- **Last updated on Apr. 19, 2023** -``` - - -# LoRA - -# 0. Abstract - -LoRA는 **PEFT(Parameter Effecient Fine-Tuning)의 기법 중 하나**이다. Pre-trained model의 weight는 고정한 채로, **몇 개의 dense(fc) layer만 학습시켜 downstream task의 연산량을 줄일 수 있다.** GPT-3을 기준으로 parameter는 10000배, GPU 메모리는 3배를 줄일 수 있다. 또한 inference 과정에서 추가적인 latency가 없음 - -> - PEFT: 모델의 모든 파라미터를 튜닝하는 것이 아닌 일부 파라미터만을 튜닝함으로써 모델의 성능을 적은 자원으로도 높게 유지하는 방법론 -- Downstream task: pre-trained model을 사용해, 어떤 문제를 해결하기 위해 fine-tuning 하는것 -- Upstream task: Pre-train model을 학습시키는것 -- Latency: 어떤 요청의 시작부터 완료까지 걸리는 시간 - ---- - -# 1. Introduction - -LLM은 기본적으로 pre-trained model을 특정 task에 맞게 fine-tuning을 시킴. 하지만 fine-tuning에서 모든 weight를 다시 학습시키면 GPT-2, GPT-3, RoBERTa 등 큰 모델의 경우 학습에 몇 달이 걸림. - -이전 연구에서 over-parameterized model들은 low intrinsic dimension에 기반하고 있다는 사실에 기반해, 저자는 학습 과정에서도 모델은 `low intrinsic rank`을 갖고 있을 것이라 가정함. - -**LoRA는 기존 pre-trained weight는 고정하고, 몇 개의 dense layer만 rank decomposition matrices를 최적화하는 방식으로 학습**시키기로 함. - -:::{figure-md} -LoRA_00 - -LoRA structure -::: - -:::{figure-md} -LoRA_01 - -LoRA structure 2 -::: - - -위 그림처럼 **기존 pre-trained weight $W$는 고정하고 low rank decomposition된 weight $A, B$만 학습시켜 $W$에 더해줌**. $A, B$의 크기는 $W$보다 작아 time, computational cost를 최대 3배까지 줄일 수 있음. 또한 task에 따라 LoRA module($A, B$)만 바꿔주면 되기 때문에 storage requirement, task-switching overhead를 줄일 수 있음. 이 외에도 추가적인 inference latency가 없다, 다른 기법들과 함께 적용이 가능하다는 장점이 있음. - -## 1.1. Terminologies and Conventions - -- $d_{model}$: Transformer의 input/output dimension size -- $W_q, W_k, W_v, W_o$: Self-attention module의 query/key/value/output projection matrices -- $W, W_0$: Pre-trained weight -- $\Delta W$: Adaptation 중 accumulated된 gradient update -- $r$: LoRA module의 rank -- 이전 연구의 convention을 사용하고 optimizer는 Adam을 이용 -- Transformer MLP feedforward dimension $d_{ffn} = 4 \times d_{model}$ - ---- - -# 2. Problem Statement - -LoRA는 agnostic하지만 본 논문에서는 language model에 집중함. - -> - agnostic: model에 구애받지 않고 해석이 가능함 - -$$ -\max _{\Phi} \sum_{(x, y) \in \mathcal{Z}} \sum_{t=1}^{|y|} \log \left(P_{\Phi}\left(y_t \mid x, y_{ - -Performance Comparison -::: - -하지만 adapter layer를 추가하는 방식은 hardware parellelism이 없다면 작은 bottleneck layer만 추가해도 latency가 상당히 증가해 사용하기 어려웠음. - -Prefix tuning은 optimize가 어려웠음. - ---- - -# 4. Our Method -## 4.1. Low-Rank-Parameterized Update Matrices - -$$ -h=W_0 x+\Delta W x=W_0 x+B A x -$$ - -- $W_0 \in \mathbb{R}^{d \times k}$ -- $B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times k}$ -- $r \ll min(d,k)$ - - -$W_0$는 고정하고 $A, B$만 학습. 이후 $W_0$와 $\Delta W = BA$는 같은 input $x$에 곱해진 후 output vector끼리 coordinate-wise하게 sum. - -$A$는 random Gaussian init., $B$는 zero-init.이라 $\Delta W$ 또한 처음에는 zero-init. $\Delta W x$는 $\alpha/x$로 scaling됨. $\alpha$는 learning rate처럼 tuning해서 r과 같은 값으로 설정. 실제 코드에서는 보통 $r, \alpha$는 (8, 16)이나 (16,32)를 사용한다고 함. - -```python - ... - # Actual trainable parameters - # define A, B - if r > 0: - self.lora_A = nn.Parameter(self.weight.new_zeros((r, num_embeddings))) - self.lora_B = nn.Parameter(self.weight.new_zeros((embedding_dim, r))) - self.scaling = self.lora_alpha / self.r - # Freezing the pre-trained weight matrix - self.weight.requires_grad = False - self.reset_parameters() - - # initialize A, B - def reset_parameters(self): - nn.Embedding.reset_parameters(self) - if hasattr(self, 'lora_A'): - # initialize A the same way as the default for nn.Linear and B to zero - nn.init.zeros_(self.lora_A) - nn.init.normal_(self.lora_B) - - def train(self, mode: bool = True): - nn.Embedding.train(self, mode) - if mode: - if self.merge_weights and self.merged: - # Make sure that the weights are not merged - if self.r > 0: - self.weight.data -= (self.lora_B @ self.lora_A).transpose(0, 1) * self.scaling - self.merged = False - else: - if self.merge_weights and not self.merged: - # Merge the weights and mark it - if self.r > 0: - self.weight.data += (self.lora_B @ self.lora_A).transpose(0, 1) * self.scaling - self.merged = True - - def forward(self, x: torch.Tensor): - if self.r > 0 and not self.merged: - # pre-trained weight W_0 * x - result = nn.Embedding.forward(self, x) - if self.r > 0: - # BA * x - after_A = F.embedding( - x, self.lora_A.transpose(0, 1), self.padding_idx, self.max_norm, - self.norm_type, self.scale_grad_by_freq, self.sparse - ) - # W_0x + BAx - result += (after_A @ self.lora_B.transpose(0, 1)) * self.scaling - return result - else: - return nn.Embedding.forward(self, x) - -``` - -### 4.1.1. No Additional Inference Latency - -LoRA를 이용하면 inference시 latency 성능 하락이 없음. 또한 다른 task에 사용할 경우엔 $BA$만 제외하고 $W_0$로 학습한 다른 $B'A'$만 추가하면 되기 때문에 memory overhead가 낮음. - -## 4.2. Applying LoRA to Transformer - -본 논문에서는 trainable weight를 최소화하기 위해 LoRA를 attention weight만 적용하고 MLP module은 고정함. 이를 통해 GPT-3 175B를 기준으로 VRAM은 1.2TB에서 350GB, checkpoint size는 350GB에서 35MB로 줄임. 또한 학습 속도 또한 25% 정도 빨라짐. - - ---- -# 5.Empirical Experiments - -:::{figure-md} -LoRA_03 - -Performance on BERT -::: - -:::{figure-md} -LoRA_04 - -Performance on GPT-2 -::: - -:::{figure-md} -LoRA_05 - -Performance on GPT-3 -::: - - -대부분의 경우에서 성능이 좋음 - -:::{figure-md} -LoRA_06 - -Validation accuracy table with different hyper-parameters -::: - -:::{figure-md} -LoRA_07 - -Validation accuracy table with different hyper-parameters -::: - -Transformer에서 한 projection matrix에 큰 r을 적용하는 것보다 모든 matrices에 작은 r을 적용하는 것이 더 성능이 좋았음. - ---- -# +a) IA3 - -:::{figure-md} -LoRA_08 - -IA3 structure -::: - -뉴럴네트워크의 Inner Activation을 줄이기도하고 늘리기도하는 어댑터를 중간에 삽입하는 방법론. 기존에 공개된 LoRA보다 적은 파라미터를 사용하면서 높은 성능을 내는 것으로 알려져있으며, GPT-3를 in-context learning 했을때 보다도 성능이 좋다 라고 주장하고 있음. 학습시간도 매우 짧아 A100 GPU 하나로 30분만에 튜닝할 수 있었다고 함. - ---- -# +aa) LoRA 사용법 - -1. `loralib` 설치 - -```python -pip install loralib -# Alternatively -# pip install git+https://github.com/microsoft/LoRA -``` - -2. 기존 `nn.Linear`, `nn.Embedding`, `nn.Conv2d`를 `lora.~`로 대체 - -```python -# ===== Before ===== -# layer = nn.Linear(in_features, out_features) - -# ===== After ====== -import loralib as lora -# Add a pair of low-rank adaptation matrices with rank r=16 -layer = lora.Linear(in_features, out_features, r=16) -``` - -3. 학습 전, lora parameter만 학습 가능하게 설정 -```python -import loralib as lora -model = BigModel() -# This sets requires_grad to False for all parameters without the string "lora_" in their names -lora.mark_only_lora_as_trainable(model) -# Training loop -for batch in dataloader: - ... -``` - -4. checkpoint를 저장할 때엔 `state_dict`가 LoRA parameter만 저장하게 함. -```python -# ===== Before ===== -# torch.save(model.state_dict(), checkpoint_path) -# ===== After ===== -torch.save(lora.lora_state_dict(model), checkpoint_path) -``` - -5. checkpoint를 불러올 때엔 `load_state_dict`에서 `strict=False`로 설정. -```python -# Load the pretrained checkpoint first -model.load_state_dict(torch.load('ckpt_pretrained.pt'), strict=False) -# Then load the LoRA checkpoint -model.load_state_dict(torch.load('ckpt_lora.pt'), strict=False) -``` - - ---- -# Reference - -- [LoRA 논문 리뷰](https://da2so.tistory.com/79) -- [LLM 모델 튜닝, 하나의 GPU로 가능할까? Parameter Efficient Fine-Tuning(PEFT)을 소개합니다!](https://devocean.sk.com/blog/techBoardDetail.do?ID=164779&boardType=techBlog) -- [Stable Diffusion LoRA 생성 및 사용법](https://zzambab98.tistory.com/226) -- [Stable Diffusion - LoRA 모델 사용법 -](https://www.internetmap.kr/entry/How-to-LoRA-Model) -- [LoRA github](https://github.com/microsoft/LoRA) -- https://www.youtube.com/watch?v=dA-NhCtrrVE +```{admonition} Information +- **Title:** Denoising Diffusion Probabilistic Models (ICLR 2021) + +- **Reference** + - Paper: [https://arxiv.org/abs/2006.11239](https://arxiv.org/abs/2006.11239) + - Code: [PyTorch implementation:](https://github.com/lucidrains/denoising-diffusion-pytorch) + - Review: [PR-409: Denoising Diffusion Probabilistic Models](https://www.youtube.com/watch?v=1j0W_lu55nc) + +- **Author:** Beomsoo Park + +- **Last updated on Apr. 19, 2023** +``` + + +# LoRA + +# 0. Abstract + +LoRA는 **PEFT(Parameter Effecient Fine-Tuning)의 기법 중 하나**이다. Pre-trained model의 weight는 고정한 채로, **몇 개의 dense(fc) layer만 학습시켜 downstream task의 연산량을 줄일 수 있다.** GPT-3을 기준으로 parameter는 10000배, GPU 메모리는 3배를 줄일 수 있다. 또한 inference 과정에서 추가적인 latency가 없음 + +> - PEFT: 모델의 모든 파라미터를 튜닝하는 것이 아닌 일부 파라미터만을 튜닝함으로써 모델의 성능을 적은 자원으로도 높게 유지하는 방법론 +- Downstream task: pre-trained model을 사용해, 어떤 문제를 해결하기 위해 fine-tuning 하는것 +- Upstream task: Pre-train model을 학습시키는것 +- Latency: 어떤 요청의 시작부터 완료까지 걸리는 시간 + +--- + +# 1. Introduction + +LLM은 기본적으로 pre-trained model을 특정 task에 맞게 fine-tuning을 시킴. 하지만 fine-tuning에서 모든 weight를 다시 학습시키면 GPT-2, GPT-3, RoBERTa 등 큰 모델의 경우 학습에 몇 달이 걸림. + +이전 연구에서 over-parameterized model들은 low intrinsic dimension에 기반하고 있다는 사실에 기반해, 저자는 학습 과정에서도 모델은 `low intrinsic rank`을 갖고 있을 것이라 가정함. + +**LoRA는 기존 pre-trained weight는 고정하고, 몇 개의 dense layer만 rank decomposition matrices를 최적화하는 방식으로 학습**시키기로 함. + +:::{figure-md} +LoRA_00 + +LoRA structure +::: + +:::{figure-md} +LoRA_01 + +LoRA structure 2 +::: + + +위 그림처럼 **기존 pre-trained weight $W$는 고정하고 low rank decomposition된 weight $A, B$만 학습시켜 $W$에 더해줌**. $A, B$의 크기는 $W$보다 작아 time, computational cost를 최대 3배까지 줄일 수 있음. 또한 task에 따라 LoRA module($A, B$)만 바꿔주면 되기 때문에 storage requirement, task-switching overhead를 줄일 수 있음. 이 외에도 추가적인 inference latency가 없다, 다른 기법들과 함께 적용이 가능하다는 장점이 있음. + +## 1.1. Terminologies and Conventions + +- $d_{model}$: Transformer의 input/output dimension size +- $W_q, W_k, W_v, W_o$: Self-attention module의 query/key/value/output projection matrices +- $W, W_0$: Pre-trained weight +- $\Delta W$: Adaptation 중 accumulated된 gradient update +- $r$: LoRA module의 rank +- 이전 연구의 convention을 사용하고 optimizer는 Adam을 이용 +- Transformer MLP feedforward dimension $d_{ffn} = 4 \times d_{model}$ + +--- + +# 2. Problem Statement + +LoRA는 agnostic하지만 본 논문에서는 language model에 집중함. + +> - agnostic: model에 구애받지 않고 해석이 가능함 + +$$ +\max _{\Phi} \sum_{(x, y) \in \mathcal{Z}} \sum_{t=1}^{|y|} \log \left(P_{\Phi}\left(y_t \mid x, y_{ + +Performance Comparison +::: + +하지만 adapter layer를 추가하는 방식은 hardware parellelism이 없다면 작은 bottleneck layer만 추가해도 latency가 상당히 증가해 사용하기 어려웠음. + +Prefix tuning은 optimize가 어려웠음. + +--- + +# 4. Our Method +## 4.1. Low-Rank-Parameterized Update Matrices + +$$ +h=W_0 x+\Delta W x=W_0 x+B A x +$$ + +- $W_0 \in \mathbb{R}^{d \times k}$ +- $B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times k}$ +- $r \ll min(d,k)$ + + +$W_0$는 고정하고 $A, B$만 학습. 이후 $W_0$와 $\Delta W = BA$는 같은 input $x$에 곱해진 후 output vector끼리 coordinate-wise하게 sum. + +$A$는 random Gaussian init., $B$는 zero-init.이라 $\Delta W$ 또한 처음에는 zero-init. $\Delta W x$는 $\alpha/x$로 scaling됨. $\alpha$는 learning rate처럼 tuning해서 r과 같은 값으로 설정. 실제 코드에서는 보통 $r, \alpha$는 (8, 16)이나 (16,32)를 사용한다고 함. + +```python + ... + # Actual trainable parameters + # define A, B + if r > 0: + self.lora_A = nn.Parameter(self.weight.new_zeros((r, num_embeddings))) + self.lora_B = nn.Parameter(self.weight.new_zeros((embedding_dim, r))) + self.scaling = self.lora_alpha / self.r + # Freezing the pre-trained weight matrix + self.weight.requires_grad = False + self.reset_parameters() + + # initialize A, B + def reset_parameters(self): + nn.Embedding.reset_parameters(self) + if hasattr(self, 'lora_A'): + # initialize A the same way as the default for nn.Linear and B to zero + nn.init.zeros_(self.lora_A) + nn.init.normal_(self.lora_B) + + def train(self, mode: bool = True): + nn.Embedding.train(self, mode) + if mode: + if self.merge_weights and self.merged: + # Make sure that the weights are not merged + if self.r > 0: + self.weight.data -= (self.lora_B @ self.lora_A).transpose(0, 1) * self.scaling + self.merged = False + else: + if self.merge_weights and not self.merged: + # Merge the weights and mark it + if self.r > 0: + self.weight.data += (self.lora_B @ self.lora_A).transpose(0, 1) * self.scaling + self.merged = True + + def forward(self, x: torch.Tensor): + if self.r > 0 and not self.merged: + # pre-trained weight W_0 * x + result = nn.Embedding.forward(self, x) + if self.r > 0: + # BA * x + after_A = F.embedding( + x, self.lora_A.transpose(0, 1), self.padding_idx, self.max_norm, + self.norm_type, self.scale_grad_by_freq, self.sparse + ) + # W_0x + BAx + result += (after_A @ self.lora_B.transpose(0, 1)) * self.scaling + return result + else: + return nn.Embedding.forward(self, x) + +``` + +### 4.1.1. No Additional Inference Latency + +LoRA를 이용하면 inference시 latency 성능 하락이 없음. 또한 다른 task에 사용할 경우엔 $BA$만 제외하고 $W_0$로 학습한 다른 $B'A'$만 추가하면 되기 때문에 memory overhead가 낮음. + +## 4.2. Applying LoRA to Transformer + +본 논문에서는 trainable weight를 최소화하기 위해 LoRA를 attention weight만 적용하고 MLP module은 고정함. 이를 통해 GPT-3 175B를 기준으로 VRAM은 1.2TB에서 350GB, checkpoint size는 350GB에서 35MB로 줄임. 또한 학습 속도 또한 25% 정도 빨라짐. + + +--- +# 5.Empirical Experiments + +:::{figure-md} +LoRA_03 + +Performance on BERT +::: + +:::{figure-md} +LoRA_04 + +Performance on GPT-2 +::: + +:::{figure-md} +LoRA_05 + +Performance on GPT-3 +::: + + +대부분의 경우에서 성능이 좋음 + +:::{figure-md} +LoRA_06 + +Validation accuracy table with different hyper-parameters +::: + +:::{figure-md} +LoRA_07 + +Validation accuracy table with different hyper-parameters +::: + +Transformer에서 한 projection matrix에 큰 r을 적용하는 것보다 모든 matrices에 작은 r을 적용하는 것이 더 성능이 좋았음. + +--- +# +a) IA3 + +:::{figure-md} +LoRA_08 + +IA3 structure +::: + +뉴럴네트워크의 Inner Activation을 줄이기도하고 늘리기도하는 어댑터를 중간에 삽입하는 방법론. 기존에 공개된 LoRA보다 적은 파라미터를 사용하면서 높은 성능을 내는 것으로 알려져있으며, GPT-3를 in-context learning 했을때 보다도 성능이 좋다 라고 주장하고 있음. 학습시간도 매우 짧아 A100 GPU 하나로 30분만에 튜닝할 수 있었다고 함. + +--- +# +aa) LoRA 사용법 + +1. `loralib` 설치 + +```python +pip install loralib +# Alternatively +# pip install git+https://github.com/microsoft/LoRA +``` + +2. 기존 `nn.Linear`, `nn.Embedding`, `nn.Conv2d`를 `lora.~`로 대체 + +```python +# ===== Before ===== +# layer = nn.Linear(in_features, out_features) + +# ===== After ====== +import loralib as lora +# Add a pair of low-rank adaptation matrices with rank r=16 +layer = lora.Linear(in_features, out_features, r=16) +``` + +3. 학습 전, lora parameter만 학습 가능하게 설정 +```python +import loralib as lora +model = BigModel() +# This sets requires_grad to False for all parameters without the string "lora_" in their names +lora.mark_only_lora_as_trainable(model) +# Training loop +for batch in dataloader: + ... +``` + +4. checkpoint를 저장할 때엔 `state_dict`가 LoRA parameter만 저장하게 함. +```python +# ===== Before ===== +# torch.save(model.state_dict(), checkpoint_path) +# ===== After ===== +torch.save(lora.lora_state_dict(model), checkpoint_path) +``` + +5. checkpoint를 불러올 때엔 `load_state_dict`에서 `strict=False`로 설정. +```python +# Load the pretrained checkpoint first +model.load_state_dict(torch.load('ckpt_pretrained.pt'), strict=False) +# Then load the LoRA checkpoint +model.load_state_dict(torch.load('ckpt_lora.pt'), strict=False) +``` + + +--- +# Reference + +- [LoRA 논문 리뷰](https://da2so.tistory.com/79) +- [LLM 모델 튜닝, 하나의 GPU로 가능할까? Parameter Efficient Fine-Tuning(PEFT)을 소개합니다!](https://devocean.sk.com/blog/techBoardDetail.do?ID=164779&boardType=techBlog) +- [Stable Diffusion LoRA 생성 및 사용법](https://zzambab98.tistory.com/226) +- [Stable Diffusion - LoRA 모델 사용법 +](https://www.internetmap.kr/entry/How-to-LoRA-Model) +- [LoRA github](https://github.com/microsoft/LoRA) +- https://www.youtube.com/watch?v=dA-NhCtrrVE diff --git a/_sources/docs/review/Make_A_Video.md b/_sources/docs/review/Make_A_Video.md old mode 100644 new mode 100755 index 2d519d35..15c2f1b4 --- a/_sources/docs/review/Make_A_Video.md +++ b/_sources/docs/review/Make_A_Video.md @@ -1,401 +1,401 @@ -```{admonition} Information -- **Title:** Make-A-Video: Text-to-Video Generation without Text-Video Data - -- **Reference** - - Paper: [https://arxiv.org/abs/2209.14792](https://arxiv.org/abs/2209.14792) - -- **Author:** [Jeonghwa Yoo](https://www.linkedin.com/in/jeonghwa-yoo-8403a716b) - -- **Last updated on Nov. 26, 2023** -``` - -# Make A Video -- 참고 코드: [https://github.com/lucidrains/make-a-video-pytorch](https://github.com/lucidrains/make-a-video-pytorch) - - - - -## 1. Introduction - -### Make-A-video 제안 배경 - -- T2I 모델링을 할 수 있는 데이터는 인터넷을 통해 확보될 수 있으나, 비슷한 규모의 텍스트 비디오 데이터셋을 수집하기는 어렵다. -- T2I 모델이 존재하는데 T2V 모델을 처음부터 학습 시키는 것은 낭비일 수 있다. -- 비지도 학습을 사용하여 더 많은 데이터를 학습할 수 있다. - -### Make-A-video 특성 - -- T2I 모델을 활용하여, 레이블이 지정되지 않은 비디오 데이터에 대해 비지도 학습을 사용하여 학습한다 → 페어링된 텍스트-비디오 데이터 없이도 텍스트에서 비디오를 생성할 수 있다. -- 텍스트 없이도 비지도 비디오만으로 세상의 다양한 개체가 어떻게 움직이고 상호 작용하는지 학습할 수 있다. - -### Contribution - -- 디퓨전 기반의 T2I 모델을 T2V로 확장하는 효과적인 방법인 Make-A-Video를 소개한다. -- Text-to-image 를 prior로 사용하여 text-video 데이터의 필요성을 우회한다. -- 고화질, 고프레임률 비디오를 생성하는 super-resolution 전략을 제안한다. -- Make-A-Video를 기존 T2V 시스템과 비교하여 평가한다. 또한, 제로샷 T2V human evaluation을 위해 300개의 프롬프트 테스트 세트를 수집하여 공개할 계획이다. - -## 2. Previous Work - -## 3. Method - -- Make-A-Video의 주요 요소 - 1. 텍스트-이미지 쌍으로 학습된 base T2I 모델 - 2. 신경망의 블록을 시간 차원으로 확장하는 시공간 convolution 및 attention layer - 3. 두 시공간 layer로 구성된 시공간 신경망과 높은 프레임 속도 생성을 위한 frame interpolation network - -- Make-A-Video의 최종 inference 수식 - - :::{figure-md} - make_a_video_00 - - 최종 inference 수식 - ::: - - - $SR_h$: spatial super-resolution network - - $SR^t_l$: spatiotemporal super-resolution network - - $\uparrow_{F}$: frame interpolation network - - $D^t$: spatiotemporal decoder - - $P$: prior network - - $\hat{x}$: BPE-encoded text - - $C_x$: CLIP text encoder - - $x$: input text - -### 3.1. Text-To-Image Model - -- [“Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding(Imagen)”](https://arxiv.org/abs/2205.11487)와 연구 내용을 공유하였다. -- Imagen - - :::{figure-md} - make_a_video_01 - - Imagen 구조 - ::: - - -- 고해상도 이미지를 만들기 위해 사용한 네트워크 - - A prior Network $P$: 텍스트 임베딩 $x_e$와 BPE encoded text tokens $\hat{x}$이 주어졌을 때 이미지 임베딩 $y_e$를 생성하는 네트워크 - - Decoder Network $D$: 이미지 임베딩 $y_e$로부터 저해상도 64X64 RGB 이미지 $\hat{y}_l$를 생성하는 네트워크 - - Super-resolution network $SR_l$, $SR_h$: D에서 생성된 이미지 64X64 저해상도 이미지 $\hat{y}_l$를 256X256, 768X768 픽셀로 증가시켜 최종 이미지 $\hat{y}$를 만드는 네트워크 - - :::{figure-md} - make_a_video_02 - - text $x$가 prior $P$를 통해 image embedding 변환된다. - fps: desired frame rate - ::: - - -### 3.2. Spatiotemporal Layers - -- 2차원 조건부 네트워크를 시간적 차원으로 확장하기 위해 다음의 구성 요소를 수정한다. - - Convolutional layers - - Attention layers -- Fully-connected layers는 특별한 수정을 할 필요 없이 시간 정보만 추가해주면 된다. -- 구성 요소 수정 결과 $D^t$는 64X64 사이즈의 16 RGB frame을 만들게 된다. -- Frame interpolation network $\uparrow_{F}$가 생성된 16개의 프레임과 super-resolution 네트워크 $SR^t_l$ 사이를 보간하여 프레임 속도를 증가시킨다. -- Super-resolution 네트워크에는 hallucinating information(환각 정보)가 포함 된다. 깜박이는 잔상이 생기지 않으려면, 환각이 프레임 전체에 걸쳐 일관성을 유지해야 한다. - - Hallucinating information - - 실제로 존재하지 않는 정보나 세부 사항을 생성하거나 가상으로 추가하는 것 - -- 프레임당 super resolution을 수행하는 것보다 spatiotemporal 모듈인 $SR^t_l$가 더 좋은 성능을 보였다. -- 하지만, $SR_h$를 위와 같은 모듈로 만들기엔 메모리 및 컴퓨팅 제약과 고해상도 비디오 데이터의 부족으로 $SR_h$를 위와 같이 시간적 차원으로 확장하는 것은 어려웠다 → $SR_h$는 공간적 차원에서 작동한다.( 각 프레임에 대해 동일한 노이즈 초기화를 사용하여 프레임 전반에 걸쳐 일관된 환각을 제공함) - -#### 3.2.1 Pseudo-3D convolutional layers - -:::{figure-md} -make_a_video_03 - -Architecture of Pseudo-3D convolutional layers -::: - -- 2D 컨벌루션 레이어 다음에 1D 컨벌루션을 쌓는다 (Cf:separable convolution) - - 3D 컨벌루션의 계산 load를 줄일 수 있다. - - 사전 학습된 2D 컨볼루션 레이어와 새로 초기화된 1D 컨벌루션 레이어 사이에 명확한 경계를 생성하여, spatial information을 유지한 채 temporal convolution을 처음부터 학습할 수 있게 한다. -- Pseudo-3D convolutional layer - - :::{figure-md} - make_a_video_04 - - Pseudo-3D convolutional layer - ::: - - - $h$: 입력 텐서 (dimension: $B$(batch),$C$(channels),$F$(frames),$H$(height),$W$(width)) - - $\text{o}T$: transpose operator (spatial ↔ temporal) - - $Conv_{2_D}$는 pretrained T2I 모델에서 초기화 되고, $Conv_{1_D}$는 identity 함수로 초기화 된다. - -#### 3.2.2. Psuedo-3D attention layers - -:::{figure-md} -make_a_video_05 - -Architecture of Pseudo-3D attention layers -::: - -- [“Video Diffusion Models**”**](https://arxiv.org/abs/2204.03458)에 영감을 받아 dimension decomposition 전략을 attention layer에 확장하였다. -- Pseudo-3D convolutional layer처럼 각각의 spatial attenion layer를 쌓아, 전체 spatiotemporal attention layer를 근사화하는 temporal attention layer를 쌓는다. -- Pseudo-3D attention layer - :::{figure-md} - make_a_video_06 - - Pseudo-3D attention layer - ::: - - - $h$: 입력 텐서 (dimension: $B$(batch),$C$(channels),$F$(frames),$H$(height),$W$(width)) - - flatten: spatial dimension 축에 대해 flatten하는 연산 (결과 dimension: $B$,$C$,$F$,$HW$) - - $ATTN_{2D}$는 pretrained T2I 모델에서 초기화되고, $ATTN_{1D}$는 identity function으로 초기화 된다. - - Code - - ```python - class SpatioTemporalAttention(nn.Module): - def __init__( - self, - dim, - *, - dim_head = 64, - heads = 8, - add_feed_forward = True, - ff_mult = 4, - pos_bias = True, - flash = False, - causal_time_attn = False - ): - super().__init__() - assert not (flash and pos_bias), 'learned positional attention bias is not compatible with flash attention' - - self.spatial_attn = Attention(dim = dim, dim_head = dim_head, heads = heads, flash = flash) - self.spatial_rel_pos_bias = ContinuousPositionBias(dim = dim // 2, heads = heads, num_dims = 2) if pos_bias else None - - self.temporal_attn = Attention(dim = dim, dim_head = dim_head, heads = heads, flash = flash, causal = causal_time_attn) - self.temporal_rel_pos_bias = ContinuousPositionBias(dim = dim // 2, heads = heads, num_dims = 1) if pos_bias else None - - self.has_feed_forward = add_feed_forward - if not add_feed_forward: - return - - self.ff = FeedForward(dim = dim, mult = ff_mult) - - def forward( - self, - x, - enable_time = True - ): - b, c, *_, h, w = x.shape - is_video = x.ndim == 5 - enable_time &= is_video - - if is_video: - x = rearrange(x, 'b c f h w -> (b f) (h w) c') #[bXf, hXw, c] - else: - x = rearrange(x, 'b c h w -> b (h w) c')#[b, hXw, c] - - space_rel_pos_bias = self.spatial_rel_pos_bias(h, w) if exists(self.spatial_rel_pos_bias) else None - - x = self.spatial_attn(x, rel_pos_bias = space_rel_pos_bias) + x - - if is_video: - x = rearrange(x, '(b f) (h w) c -> b c f h w', b = b, h = h, w = w) - else: - x = rearrange(x, 'b (h w) c -> b c h w', h = h, w = w) - - if enable_time: - - x = rearrange(x, 'b c f h w -> (b h w) f c') #[bXhXw, f, c] - - time_rel_pos_bias = self.temporal_rel_pos_bias(x.shape[1]) if exists(self.temporal_rel_pos_bias) else None - - x = self.temporal_attn(x, rel_pos_bias = time_rel_pos_bias) + x - - x = rearrange(x, '(b h w) f c -> b c f h w', w = w, h = h) - - if self.has_feed_forward: - x = self.ff(x, enable_time = enable_time) + x - - return x - ``` - -- Frame rate conditioning - - 비디오의 초당 프레임 수를 나타내는 추가 컨디셔닝 파라미터 $fps$를 추가한다. - -### 3.3 Frame Interpolation Network - -- ↑F (Frame Interpolation Network)란? - - 생성된 프레임 수를 증가시켜, 생성된 비디오를 더 부드럽게 만들고 비디오 길이를 연장 시킬 수 있는 네트워크 - - 프레임을 보간하고 extrapolation을 하는 네트워크 - - Extrapolation: 주어진 데이터 또는 정보를 사용하여 미래의 값을 예측하거나 확장 -- ↑F (Frame Interpolation Network) 동작 - - Spatialtemporal decoder $D^t$에서 마스크 처리된 입력 프레임을 제로 패딩하고 비디오 업샘플링을 적용하여 masked frame interpolation을 파인 튜닝한다. - - 파인 튜닝할 때 U-Net의 입력에 4개의 채널을 추가한다. - - RGB 마스킹 비디오 입력을 위한 3개의 채널과 마스킹되는 프레임을 나타내는 추가 바이너리 채널 - - 다양한 frame-skips과 $fps$에 대해 파인튜닝하여 추론시 여러 temporal upsample rate를 제공한다. -- 본 논문의 모든 실험에서는 ↑F를 frame skip 5로 적용하여 16프레임 비디오를 76프레임((16-1)X5+1)으로 업샘플링 하였다. -- 비디오 시작 또는 끝 프레임을 마스킹하여 비디오 추정 또는 이미지 애니메이션에도 사용할 수 있다. - -### 3.4 Training - -- 위에서 설명한 구성 요소들은 독립적으로 학습 된다. -- 훈련 과정 - 1. Prior $P$ 훈련 (text-image 데이터 이용) - - → 텍스트를 입력으로 받는 prior $P$는 text-image 데이터에 대해서만 학습 되고 비디오에 대해서는 파인 튜닝하지 않는다. - - 2. 이미지를 이용한 학습 - - → Decoder, prior, 두개의 super-resolution 요소들은 먼저 텍스트 없이 이미지 만으로 학습 된다. - - → Decoder는 Clip image embedding을 입력으로 받고, super-resolution 요소들은 학습 중에 입력으로 들어온 downsampled image를 입력으로 받는다. - - 3. 비디오를 이용한 학습 - - 이미지에 대한 훈련이 끝나면 새로운 시간 레이어를 추가하고 초기화하여 레이블이 지정되지 않은 비디오 데이터에 대해 파인 튜닝한다. - - 원본 비디오에서 16프레임이 샘플링 되며, 1에서 30 사이의 랜덤 $fps$를 사용한다. - - 디코더를 학습하는 동안 훈련 초기에는 더 높은 $fps$ 범위(모션이 적은)에서 시작하고, 이후에는 더 작은 $fps$ 범위(모션이 많은)로 전환한다. - - Masked-frame interpolation 네트워크는 temporal 디코더로부터 파인 튜닝된다. - -## 4. Experiments - -### 4.1 Dataset and Settings - -#### Datasets - -- Image, Text - - LAION-5B 데이터셋의 일부 2.3B의 데이터를 사용하였다. - - NSFW 이미지, 텍스트의 유해한 단어 또는 워터마크 확률이 0.5보다 큰 이미지가 있는 샘플 쌍을 필터링하였다. **** - - NSFW: Not Safe For Work, 선정적이거나 음란하거나 폭력적인 내용을 포함한 콘텐츠 -- Video - - WebVid-10M과, HD-VILA-100M 데이터셋의 일부 10M 데이터를 사용하였다. - - Decoder $D^t$, interpolation 모델 → WebVid-10M을 이용하여 학습 - - $SR^t_l$ → WebVid-10M, HD-VILA-100M을 이용하여 학습 -- Zero-shot test 데이터 - - UCF-101, MSR-VTT - - UCF-101: 액션 인식 연구를 위해 고안되었으며, 다양한 동작 및 환경에서 촬영된 비디오 클립 데이터셋 - - MSR-VTT: 비디오와 해당 비디오에 대한 텍스트 설명 또는 캡션을 포함하는 데이터셋 - -#### Automatic Metrics - -- UCF-101 - - 각 클래스에 대해 하나의 템플릿 문장을 작성하고 평가를 위해 수정한다. - - 10K 샘플에 대해 Fretchet Video Distance(FVD)와 Inception Score(IS)를 측정한다. - - Train셋과 동일한 클래스 분포를 따르는 샘플을 생성한다. -- MSR-VTT - - 테스트 세트의 모든 59,794 캡션에 대한 FID와 CLIPSIM(비디오 프레임과 텍스트 간의 평균 CLIP 유사도)를 측정한다. - -#### Human Evaluation Set and Metrics - -- Amazon Mechanical Turk(AMT)에서 300개의 프롬프트로 이루어진 평가 세트를 수집하였다. -- Annotator들에게 T2V 시스템이 있다면 어떤 것을 생성하고 싶은지 물어봤다. -- 불완전하거나, 너무 추상적이거나, 불쾌감을 주는 프롬프트를 필터링 하였다. -- 5가지 카테고리(동물, 판타지, 사람, 자연 및 풍경, 음식 및 음료)를 식별하고 해당 카테고리에 맞는 프롬프트를 선택하였다. -- 이러한 프롬프트는 동영상을 만드는 데에 사용되지 않고 선택 되었으며, 고정된 상태로 유지했다. -- Human evaluation을 위해 Imagen의 DrawBench 프롬프트도 사용하였다. -- 비디오 품질과 text-vedio faithfulness를 평가하였다. - - 비디오 품질 → 두 개의 비디오를 랜덤 순서로 보여주고 어떤 비디오의 품질이 더 좋은지 annotator에게 물어본다. - - Text-vdeio faithfulness → 텍스트를 추가로 보여주고 어떤 비디오가 텍스트와 더 잘 일치하는지 annotator에게 물어본다. -- 보간 모델과 FILM의 비디오 모션 사실감을 비교하기 위한 평가도 진행하였다. -- 5명의 각기 다른 annotator의 다수 득표를 최종 결과로 사용하였다. - -### 4.2 Quantitative Results - -#### Automatic Evaluaton on MSR-VTT - -- MSR-VTT에 대해 성능을 보고하는 GODIVA, NUWA 외에도, 중국어와 영어를 모두 입력으로 받는 CogVideo 모델에 대해서도 추론을 수행하였다. - -:::{figure-md} -make_a_video_06 - -Automatic Evaluaton on MSR-VTT -::: - - -→ 가장 우수한 성능을 보인다. - -### Automatic Evluation on UCF-101 - -:::{figure-md} -make_a_video_06 - -Automatic Evluation on UCF-101 -::: - -→ Make-A-Video의 제로 샷 성능이 다른 방법보다 우수하다. Finetunning을 한 결과에서도 SOTA를 달성하였다. - - -#### Human Evaluation - -- DrawBench와 테스트셋에 대해서 CogVideo와 성능을 비교한다. -- 또한, VDM의 웹 페이지에 표시된 28개의 동영상에 대해서도 평가한다. -- 각 입력에 대해 8개의 동영상을 무작위로 생성하고, 8번 평가하여 평균 결과를 낸다. -- 사람의 평가를 위해 76x256x256 해상도로 동영상을 생성한다. - -:::{figure-md} -make_a_video_06 - -Human Evaluation -::: - -→ 평가자가 Make-A-Video 모델의 결과가 더 낫다고 투표한 퍼센트 비율. 대부분 평가자가 모든 벤치마크에서 Make-A-Video가 더 낫다고 평가하였다. - -- Frame Interpolation Network와 FILM을 비교 평가하기 - - DrawBench의 텍스트 프롬프트와 평가 세트에서 저프레임률 비디오(1 FPS)를 생성한 다음, 4FPS까지 업샘플링한다. - - 평가자들은 eval set에 대해서는 62%, DrawBench에 대해서는 54%로 Make-A-Video가 더 낫다고 평가하였다. - - 프레임 간의 차이가 커서 물체가 어떻게 움직이는지에 대한 real-world 지식이 중요한 경우에는 본 논문에 방법이 더 뛰어난 것으로 관찰 되었다. - -### 4.3 Qualitative Results - -:::{figure-md} -make_a_video_06 - -T2V Generation 결과. 맨 위: VDM, 가운데: CogVideo, 맨 아래: Make-A-Video -→ Make-A-Video가 모션의 일관성을 유지하면서 더 풍부한 콘텐츠를 생성할 수 있다. -::: - -:::{figure-md} -make_a_video_06 - -이미지에 mask frame interpolation 및 extrpolation network ↑F를 적용한 결과. -가장 왼쪽에 입력 이미지가 주어지면, 이를 동영상으로 애니메이션화 함. -사용자는 자신의 이미지를 사용하여 동영상을 생성할 수 있으며, 생성된 동영상을 개인화하고 직접 제어할 수 있음. -::: - -:::{figure-md} -make_a_video_06 - -두 이미지 사이의 interpolation 결과. 왼쪽: FILM, 오른쪽: 본 논문의 approach -FILM → 실제 움직이는 object에 대한 이해 없이 프레임을 부드럽게 전환하기만 함. -본 논문의 approach → 의미론적으로 더 의미있는 interpolation을 만듬. -::: - -:::{figure-md} -make_a_video_06 - -비디오 변형 예시. 위: 원본 비디오, 아래: 새로운 비디오 -::: - - -- 기타 결과: [https://make-a-video.github.io/](https://make-a-video.github.io/) - -## 5. 결론 - -- 주변 세계로부터 지식을 배우는 human intelligence처럼 generative system도 인간의 학습 방식을 모방할 수 있다면, 더욱 창의적이고 유용할 것이다. -- 연구자들은 비지도 학습을 통해 훨씬 더 많은 동영상에서 세계의 dynamic을 학습함으로써 기존의 한계를 극복할 수 있다. +```{admonition} Information +- **Title:** Make-A-Video: Text-to-Video Generation without Text-Video Data + +- **Reference** + - Paper: [https://arxiv.org/abs/2209.14792](https://arxiv.org/abs/2209.14792) + +- **Author:** [Jeonghwa Yoo](https://www.linkedin.com/in/jeonghwa-yoo-8403a716b) + +- **Last updated on Nov. 26, 2023** +``` + +# Make A Video +- 참고 코드: [https://github.com/lucidrains/make-a-video-pytorch](https://github.com/lucidrains/make-a-video-pytorch) + + + + +## 1. Introduction + +### Make-A-video 제안 배경 + +- T2I 모델링을 할 수 있는 데이터는 인터넷을 통해 확보될 수 있으나, 비슷한 규모의 텍스트 비디오 데이터셋을 수집하기는 어렵다. +- T2I 모델이 존재하는데 T2V 모델을 처음부터 학습 시키는 것은 낭비일 수 있다. +- 비지도 학습을 사용하여 더 많은 데이터를 학습할 수 있다. + +### Make-A-video 특성 + +- T2I 모델을 활용하여, 레이블이 지정되지 않은 비디오 데이터에 대해 비지도 학습을 사용하여 학습한다 → 페어링된 텍스트-비디오 데이터 없이도 텍스트에서 비디오를 생성할 수 있다. +- 텍스트 없이도 비지도 비디오만으로 세상의 다양한 개체가 어떻게 움직이고 상호 작용하는지 학습할 수 있다. + +### Contribution + +- 디퓨전 기반의 T2I 모델을 T2V로 확장하는 효과적인 방법인 Make-A-Video를 소개한다. +- Text-to-image 를 prior로 사용하여 text-video 데이터의 필요성을 우회한다. +- 고화질, 고프레임률 비디오를 생성하는 super-resolution 전략을 제안한다. +- Make-A-Video를 기존 T2V 시스템과 비교하여 평가한다. 또한, 제로샷 T2V human evaluation을 위해 300개의 프롬프트 테스트 세트를 수집하여 공개할 계획이다. + +## 2. Previous Work + +## 3. Method + +- Make-A-Video의 주요 요소 + 1. 텍스트-이미지 쌍으로 학습된 base T2I 모델 + 2. 신경망의 블록을 시간 차원으로 확장하는 시공간 convolution 및 attention layer + 3. 두 시공간 layer로 구성된 시공간 신경망과 높은 프레임 속도 생성을 위한 frame interpolation network + +- Make-A-Video의 최종 inference 수식 + + :::{figure-md} + make_a_video_00 + + 최종 inference 수식 + ::: + + - $SR_h$: spatial super-resolution network + - $SR^t_l$: spatiotemporal super-resolution network + - $\uparrow_{F}$: frame interpolation network + - $D^t$: spatiotemporal decoder + - $P$: prior network + - $\hat{x}$: BPE-encoded text + - $C_x$: CLIP text encoder + - $x$: input text + +### 3.1. Text-To-Image Model + +- [“Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding(Imagen)”](https://arxiv.org/abs/2205.11487)와 연구 내용을 공유하였다. +- Imagen + + :::{figure-md} + make_a_video_01 + + Imagen 구조 + ::: + + +- 고해상도 이미지를 만들기 위해 사용한 네트워크 + - A prior Network $P$: 텍스트 임베딩 $x_e$와 BPE encoded text tokens $\hat{x}$이 주어졌을 때 이미지 임베딩 $y_e$를 생성하는 네트워크 + - Decoder Network $D$: 이미지 임베딩 $y_e$로부터 저해상도 64X64 RGB 이미지 $\hat{y}_l$를 생성하는 네트워크 + - Super-resolution network $SR_l$, $SR_h$: D에서 생성된 이미지 64X64 저해상도 이미지 $\hat{y}_l$를 256X256, 768X768 픽셀로 증가시켜 최종 이미지 $\hat{y}$를 만드는 네트워크 + + :::{figure-md} + make_a_video_02 + + text $x$가 prior $P$를 통해 image embedding 변환된다. + fps: desired frame rate + ::: + + +### 3.2. Spatiotemporal Layers + +- 2차원 조건부 네트워크를 시간적 차원으로 확장하기 위해 다음의 구성 요소를 수정한다. + - Convolutional layers + - Attention layers +- Fully-connected layers는 특별한 수정을 할 필요 없이 시간 정보만 추가해주면 된다. +- 구성 요소 수정 결과 $D^t$는 64X64 사이즈의 16 RGB frame을 만들게 된다. +- Frame interpolation network $\uparrow_{F}$가 생성된 16개의 프레임과 super-resolution 네트워크 $SR^t_l$ 사이를 보간하여 프레임 속도를 증가시킨다. +- Super-resolution 네트워크에는 hallucinating information(환각 정보)가 포함 된다. 깜박이는 잔상이 생기지 않으려면, 환각이 프레임 전체에 걸쳐 일관성을 유지해야 한다. + - Hallucinating information + + 실제로 존재하지 않는 정보나 세부 사항을 생성하거나 가상으로 추가하는 것 + +- 프레임당 super resolution을 수행하는 것보다 spatiotemporal 모듈인 $SR^t_l$가 더 좋은 성능을 보였다. +- 하지만, $SR_h$를 위와 같은 모듈로 만들기엔 메모리 및 컴퓨팅 제약과 고해상도 비디오 데이터의 부족으로 $SR_h$를 위와 같이 시간적 차원으로 확장하는 것은 어려웠다 → $SR_h$는 공간적 차원에서 작동한다.( 각 프레임에 대해 동일한 노이즈 초기화를 사용하여 프레임 전반에 걸쳐 일관된 환각을 제공함) + +#### 3.2.1 Pseudo-3D convolutional layers + +:::{figure-md} +make_a_video_03 + +Architecture of Pseudo-3D convolutional layers +::: + +- 2D 컨벌루션 레이어 다음에 1D 컨벌루션을 쌓는다 (Cf:separable convolution) + - 3D 컨벌루션의 계산 load를 줄일 수 있다. + - 사전 학습된 2D 컨볼루션 레이어와 새로 초기화된 1D 컨벌루션 레이어 사이에 명확한 경계를 생성하여, spatial information을 유지한 채 temporal convolution을 처음부터 학습할 수 있게 한다. +- Pseudo-3D convolutional layer + + :::{figure-md} + make_a_video_04 + + Pseudo-3D convolutional layer + ::: + + - $h$: 입력 텐서 (dimension: $B$(batch),$C$(channels),$F$(frames),$H$(height),$W$(width)) + - $\text{o}T$: transpose operator (spatial ↔ temporal) + - $Conv_{2_D}$는 pretrained T2I 모델에서 초기화 되고, $Conv_{1_D}$는 identity 함수로 초기화 된다. + +#### 3.2.2. Psuedo-3D attention layers + +:::{figure-md} +make_a_video_05 + +Architecture of Pseudo-3D attention layers +::: + +- [“Video Diffusion Models**”**](https://arxiv.org/abs/2204.03458)에 영감을 받아 dimension decomposition 전략을 attention layer에 확장하였다. +- Pseudo-3D convolutional layer처럼 각각의 spatial attenion layer를 쌓아, 전체 spatiotemporal attention layer를 근사화하는 temporal attention layer를 쌓는다. +- Pseudo-3D attention layer + :::{figure-md} + make_a_video_06 + + Pseudo-3D attention layer + ::: + + - $h$: 입력 텐서 (dimension: $B$(batch),$C$(channels),$F$(frames),$H$(height),$W$(width)) + - flatten: spatial dimension 축에 대해 flatten하는 연산 (결과 dimension: $B$,$C$,$F$,$HW$) + - $ATTN_{2D}$는 pretrained T2I 모델에서 초기화되고, $ATTN_{1D}$는 identity function으로 초기화 된다. + - Code + + ```python + class SpatioTemporalAttention(nn.Module): + def __init__( + self, + dim, + *, + dim_head = 64, + heads = 8, + add_feed_forward = True, + ff_mult = 4, + pos_bias = True, + flash = False, + causal_time_attn = False + ): + super().__init__() + assert not (flash and pos_bias), 'learned positional attention bias is not compatible with flash attention' + + self.spatial_attn = Attention(dim = dim, dim_head = dim_head, heads = heads, flash = flash) + self.spatial_rel_pos_bias = ContinuousPositionBias(dim = dim // 2, heads = heads, num_dims = 2) if pos_bias else None + + self.temporal_attn = Attention(dim = dim, dim_head = dim_head, heads = heads, flash = flash, causal = causal_time_attn) + self.temporal_rel_pos_bias = ContinuousPositionBias(dim = dim // 2, heads = heads, num_dims = 1) if pos_bias else None + + self.has_feed_forward = add_feed_forward + if not add_feed_forward: + return + + self.ff = FeedForward(dim = dim, mult = ff_mult) + + def forward( + self, + x, + enable_time = True + ): + b, c, *_, h, w = x.shape + is_video = x.ndim == 5 + enable_time &= is_video + + if is_video: + x = rearrange(x, 'b c f h w -> (b f) (h w) c') #[bXf, hXw, c] + else: + x = rearrange(x, 'b c h w -> b (h w) c')#[b, hXw, c] + + space_rel_pos_bias = self.spatial_rel_pos_bias(h, w) if exists(self.spatial_rel_pos_bias) else None + + x = self.spatial_attn(x, rel_pos_bias = space_rel_pos_bias) + x + + if is_video: + x = rearrange(x, '(b f) (h w) c -> b c f h w', b = b, h = h, w = w) + else: + x = rearrange(x, 'b (h w) c -> b c h w', h = h, w = w) + + if enable_time: + + x = rearrange(x, 'b c f h w -> (b h w) f c') #[bXhXw, f, c] + + time_rel_pos_bias = self.temporal_rel_pos_bias(x.shape[1]) if exists(self.temporal_rel_pos_bias) else None + + x = self.temporal_attn(x, rel_pos_bias = time_rel_pos_bias) + x + + x = rearrange(x, '(b h w) f c -> b c f h w', w = w, h = h) + + if self.has_feed_forward: + x = self.ff(x, enable_time = enable_time) + x + + return x + ``` + +- Frame rate conditioning + - 비디오의 초당 프레임 수를 나타내는 추가 컨디셔닝 파라미터 $fps$를 추가한다. + +### 3.3 Frame Interpolation Network + +- ↑F (Frame Interpolation Network)란? + - 생성된 프레임 수를 증가시켜, 생성된 비디오를 더 부드럽게 만들고 비디오 길이를 연장 시킬 수 있는 네트워크 + - 프레임을 보간하고 extrapolation을 하는 네트워크 + - Extrapolation: 주어진 데이터 또는 정보를 사용하여 미래의 값을 예측하거나 확장 +- ↑F (Frame Interpolation Network) 동작 + - Spatialtemporal decoder $D^t$에서 마스크 처리된 입력 프레임을 제로 패딩하고 비디오 업샘플링을 적용하여 masked frame interpolation을 파인 튜닝한다. + - 파인 튜닝할 때 U-Net의 입력에 4개의 채널을 추가한다. + - RGB 마스킹 비디오 입력을 위한 3개의 채널과 마스킹되는 프레임을 나타내는 추가 바이너리 채널 + - 다양한 frame-skips과 $fps$에 대해 파인튜닝하여 추론시 여러 temporal upsample rate를 제공한다. +- 본 논문의 모든 실험에서는 ↑F를 frame skip 5로 적용하여 16프레임 비디오를 76프레임((16-1)X5+1)으로 업샘플링 하였다. +- 비디오 시작 또는 끝 프레임을 마스킹하여 비디오 추정 또는 이미지 애니메이션에도 사용할 수 있다. + +### 3.4 Training + +- 위에서 설명한 구성 요소들은 독립적으로 학습 된다. +- 훈련 과정 + 1. Prior $P$ 훈련 (text-image 데이터 이용) + + → 텍스트를 입력으로 받는 prior $P$는 text-image 데이터에 대해서만 학습 되고 비디오에 대해서는 파인 튜닝하지 않는다. + + 2. 이미지를 이용한 학습 + + → Decoder, prior, 두개의 super-resolution 요소들은 먼저 텍스트 없이 이미지 만으로 학습 된다. + + → Decoder는 Clip image embedding을 입력으로 받고, super-resolution 요소들은 학습 중에 입력으로 들어온 downsampled image를 입력으로 받는다. + + 3. 비디오를 이용한 학습 + - 이미지에 대한 훈련이 끝나면 새로운 시간 레이어를 추가하고 초기화하여 레이블이 지정되지 않은 비디오 데이터에 대해 파인 튜닝한다. + - 원본 비디오에서 16프레임이 샘플링 되며, 1에서 30 사이의 랜덤 $fps$를 사용한다. + - 디코더를 학습하는 동안 훈련 초기에는 더 높은 $fps$ 범위(모션이 적은)에서 시작하고, 이후에는 더 작은 $fps$ 범위(모션이 많은)로 전환한다. + - Masked-frame interpolation 네트워크는 temporal 디코더로부터 파인 튜닝된다. + +## 4. Experiments + +### 4.1 Dataset and Settings + +#### Datasets + +- Image, Text + - LAION-5B 데이터셋의 일부 2.3B의 데이터를 사용하였다. + - NSFW 이미지, 텍스트의 유해한 단어 또는 워터마크 확률이 0.5보다 큰 이미지가 있는 샘플 쌍을 필터링하였다. **** + - NSFW: Not Safe For Work, 선정적이거나 음란하거나 폭력적인 내용을 포함한 콘텐츠 +- Video + - WebVid-10M과, HD-VILA-100M 데이터셋의 일부 10M 데이터를 사용하였다. + - Decoder $D^t$, interpolation 모델 → WebVid-10M을 이용하여 학습 + - $SR^t_l$ → WebVid-10M, HD-VILA-100M을 이용하여 학습 +- Zero-shot test 데이터 + - UCF-101, MSR-VTT + - UCF-101: 액션 인식 연구를 위해 고안되었으며, 다양한 동작 및 환경에서 촬영된 비디오 클립 데이터셋 + - MSR-VTT: 비디오와 해당 비디오에 대한 텍스트 설명 또는 캡션을 포함하는 데이터셋 + +#### Automatic Metrics + +- UCF-101 + - 각 클래스에 대해 하나의 템플릿 문장을 작성하고 평가를 위해 수정한다. + - 10K 샘플에 대해 Fretchet Video Distance(FVD)와 Inception Score(IS)를 측정한다. + - Train셋과 동일한 클래스 분포를 따르는 샘플을 생성한다. +- MSR-VTT + - 테스트 세트의 모든 59,794 캡션에 대한 FID와 CLIPSIM(비디오 프레임과 텍스트 간의 평균 CLIP 유사도)를 측정한다. + +#### Human Evaluation Set and Metrics + +- Amazon Mechanical Turk(AMT)에서 300개의 프롬프트로 이루어진 평가 세트를 수집하였다. +- Annotator들에게 T2V 시스템이 있다면 어떤 것을 생성하고 싶은지 물어봤다. +- 불완전하거나, 너무 추상적이거나, 불쾌감을 주는 프롬프트를 필터링 하였다. +- 5가지 카테고리(동물, 판타지, 사람, 자연 및 풍경, 음식 및 음료)를 식별하고 해당 카테고리에 맞는 프롬프트를 선택하였다. +- 이러한 프롬프트는 동영상을 만드는 데에 사용되지 않고 선택 되었으며, 고정된 상태로 유지했다. +- Human evaluation을 위해 Imagen의 DrawBench 프롬프트도 사용하였다. +- 비디오 품질과 text-vedio faithfulness를 평가하였다. + - 비디오 품질 → 두 개의 비디오를 랜덤 순서로 보여주고 어떤 비디오의 품질이 더 좋은지 annotator에게 물어본다. + - Text-vdeio faithfulness → 텍스트를 추가로 보여주고 어떤 비디오가 텍스트와 더 잘 일치하는지 annotator에게 물어본다. +- 보간 모델과 FILM의 비디오 모션 사실감을 비교하기 위한 평가도 진행하였다. +- 5명의 각기 다른 annotator의 다수 득표를 최종 결과로 사용하였다. + +### 4.2 Quantitative Results + +#### Automatic Evaluaton on MSR-VTT + +- MSR-VTT에 대해 성능을 보고하는 GODIVA, NUWA 외에도, 중국어와 영어를 모두 입력으로 받는 CogVideo 모델에 대해서도 추론을 수행하였다. + +:::{figure-md} +make_a_video_06 + +Automatic Evaluaton on MSR-VTT +::: + + +→ 가장 우수한 성능을 보인다. + +### Automatic Evluation on UCF-101 + +:::{figure-md} +make_a_video_06 + +Automatic Evluation on UCF-101 +::: + +→ Make-A-Video의 제로 샷 성능이 다른 방법보다 우수하다. Finetunning을 한 결과에서도 SOTA를 달성하였다. + + +#### Human Evaluation + +- DrawBench와 테스트셋에 대해서 CogVideo와 성능을 비교한다. +- 또한, VDM의 웹 페이지에 표시된 28개의 동영상에 대해서도 평가한다. +- 각 입력에 대해 8개의 동영상을 무작위로 생성하고, 8번 평가하여 평균 결과를 낸다. +- 사람의 평가를 위해 76x256x256 해상도로 동영상을 생성한다. + +:::{figure-md} +make_a_video_06 + +Human Evaluation +::: + +→ 평가자가 Make-A-Video 모델의 결과가 더 낫다고 투표한 퍼센트 비율. 대부분 평가자가 모든 벤치마크에서 Make-A-Video가 더 낫다고 평가하였다. + +- Frame Interpolation Network와 FILM을 비교 평가하기 + - DrawBench의 텍스트 프롬프트와 평가 세트에서 저프레임률 비디오(1 FPS)를 생성한 다음, 4FPS까지 업샘플링한다. + - 평가자들은 eval set에 대해서는 62%, DrawBench에 대해서는 54%로 Make-A-Video가 더 낫다고 평가하였다. + - 프레임 간의 차이가 커서 물체가 어떻게 움직이는지에 대한 real-world 지식이 중요한 경우에는 본 논문에 방법이 더 뛰어난 것으로 관찰 되었다. + +### 4.3 Qualitative Results + +:::{figure-md} +make_a_video_06 + +T2V Generation 결과. 맨 위: VDM, 가운데: CogVideo, 맨 아래: Make-A-Video +→ Make-A-Video가 모션의 일관성을 유지하면서 더 풍부한 콘텐츠를 생성할 수 있다. +::: + +:::{figure-md} +make_a_video_06 + +이미지에 mask frame interpolation 및 extrpolation network ↑F를 적용한 결과. +가장 왼쪽에 입력 이미지가 주어지면, 이를 동영상으로 애니메이션화 함. +사용자는 자신의 이미지를 사용하여 동영상을 생성할 수 있으며, 생성된 동영상을 개인화하고 직접 제어할 수 있음. +::: + +:::{figure-md} +make_a_video_06 + +두 이미지 사이의 interpolation 결과. 왼쪽: FILM, 오른쪽: 본 논문의 approach +FILM → 실제 움직이는 object에 대한 이해 없이 프레임을 부드럽게 전환하기만 함. +본 논문의 approach → 의미론적으로 더 의미있는 interpolation을 만듬. +::: + +:::{figure-md} +make_a_video_06 + +비디오 변형 예시. 위: 원본 비디오, 아래: 새로운 비디오 +::: + + +- 기타 결과: [https://make-a-video.github.io/](https://make-a-video.github.io/) + +## 5. 결론 + +- 주변 세계로부터 지식을 배우는 human intelligence처럼 generative system도 인간의 학습 방식을 모방할 수 있다면, 더욱 창의적이고 유용할 것이다. +- 연구자들은 비지도 학습을 통해 훨씬 더 많은 동영상에서 세계의 dynamic을 학습함으로써 기존의 한계를 극복할 수 있다. diff --git a/_sources/docs/review/Muse.md b/_sources/docs/review/Muse.md old mode 100644 new mode 100755 index 1e547cf6..d10acdad --- a/_sources/docs/review/Muse.md +++ b/_sources/docs/review/Muse.md @@ -1,235 +1,235 @@ -```{admonition} Information -- **Title:** Muse: Text-To-Image Generation via Masked Generative Transformers - -- **Reference** - - Paper: [https://arxiv.org/pdf/2301.00704.pdf](https://arxiv.org/pdf/2301.00704.pdf) - - Code: X - -- **Author:** Jun-Hyoung Lee - -- **Last updated on Mar. 25. 2024** -``` - -# Muse - -:::{figure-md} -fig_1 - -Figure 1 -::: - -- **Muse: T2I transformer model + Masked Modeling** - - diffusion, autoregressive model 보다 효과적인 성능을 냄 - - **discrete token space 에서 masked modeling 방식으로 학습** - - pretrained LLM(***T5-XXL***) 으로 부터 추출된 text embedding이 주어지고, 랜덤하게 masked image token 을 예측하는 방식으로 학습 - - Imagen, DALL-E 2 와 비교할 때, sampling iteration이 적어 **빠른 inference** 수행 가능 - - LLM 을 사용해 **fine-grained 한 정보**를 추출하여 high-fidelity 이미지 생성을 할 수 있고, 시각적 concept(object, spatial 관계, 자세, 등)을 더 잘 이해할 수 있음 - - Muse-900M, CC3M 에서 SOTA 달성, FID 6.06 - - Muse-3B, zero-shot COCO 에서 FID 7.88 달성, CLIP score 0.32 - - 따로 **파인튜닝 없이** inpainting, outpainting, mask-free editing 이 가능함 - -## 1. Masked modeling - -- [22.02] MaskGIT: Masked Generative Image Transformer - - - CVPR 2022, Google Research - -:::{figure-md} -fig_1 - -maskgit 1 -::: - -:::{figure-md} -fig_1 - -maskgit 2 -::: - -- **VQGAN** 사용, **non-autoregressive** 디코딩 방식 -- inference 시에 모든 마스킹된 토큰을 예측하지만, 신뢰도가 높은 토큰만 실제 디코딩됨 - - 따라서 autoregressive 모델의 **256 step → 8 step** 으로 줄여 inference 속도가 향상 - -## 2. Model Architecture - -:::{figure-md} -fig_1 - -Figure 3 -::: - -1. **VQGAN tokenizer model 사용** - - input image 가 discrete token 으로 인코딩되고, 그 후 디코딩되어 input 이미지와 유사하게 잘 복원되는 모델 - - 두 개의 VQGAN 사용 (256x256 저해상도 + 512x512 고해상도) - - 첫 학습은 **256x256 저해상도**(16x16 latent) 학습 - - 이후 **512x512 고해상도**(64x64 latent) 학습 진행 -2. **Masked image model 사용** - - Muse 파라미터의 대부분이 masked image model 파라미터로 구성 - - unmaked 토큰과 T5XXL text embedding 을 condition으로 masked 저해상도 토큰에 대해 예측 진행 -3. **“Super-res” transformer model 사용** - - T5XXL text embedding 을 condition으로 저해상도 토큰을 고해상도 토큰으로 바꾸는데 사용 - -### 2.1. Pre-trained Text Encoders - -- [Imagen](https://arxiv.org/abs/2205.11487) 에서 pretrained LLM 사용하면 효과적인 high-quality 의 이미지 생성 가능 -- **풍부한 visual, semantic 정보를 추출**할 수 있는 T5-XXL 사용 - - objects (nouns), actions (verbs), visual properties (adjectives), spatial relationships (prepositions) - - Muse 가 이러한 정보를 이미지 생성을 위한 LLM embedding 에서 잘 mapping 을 할 수 있을 것이라고 가정 - - [Linearly mapping from image to text space](https://arxiv.org/abs/2209.15162) 에서 선행 연구 진행 -- 인코딩 과정 - 1. 4096 차원의 embedding vector를 얻음 - 2. linearly projection 진행되어 base, super-res transformer에 입력되게 차원을 맞춤 - -### 2.2. Semantic Tokenization using VQGAN - -- VQGAN - - encoder + decoder - - encoder feature 를 vector quantization 이 진행된 후, codebook 으로 부터 매핑을 통해 디코딩이 진행 -- 다른 해상도의 이미지를 인코딩할 수 있도록 encoder와 decoder 모두 **convolutional layer** 로 구성 -- 256x256 픽셀 이미지에 맞는 VQGAN 모델(base model)과 512x512 픽셀 이미지에 맞는 VQGAN 모델(super-res model) 구성 -- [Taming transformers for high-resolution image synthesis](https://arxiv.org/abs/2012.09841) 에서 **인코딩된 discrete 토큰이 low level noise를 무시하면서 high level semantic 함을 더 잘 capture 한다는 것을 연구 진행** - - 이 때문에, **cross-entropy loss 를 통해 masked 토큰을 예측**하는데 사용할 수 있게됨 - -### 2.3. Base Model - -- base model - - projected T5 embedding + 이미지 토큰을 입력으로 한 [masked transformer](https://arxiv.org/abs/2202.04200) 로 구성 - - text embedding 은 unmasked, 이미지 토큰은 랜덤하게 masking 진행 → [MASK] 토큰으로 교체 -- 이미지 토큰을 embedding 으로 선형적으로 mapping 진행(transformer 의 input/hidden 사이즈에 맞게) + positional embedding 도 포함 -- transformer layer는 self-attention, cross-attention, MLP 블럭이 포함 - - MLP 는 masked image embedding 을 logit 값으로 변경하는데 사용되고 - - cross-entropy loss 는 ground truth 토큰과 함께 오차를 계산함 -- 학습 때, base model은 각 step 마다 모든 masked tokens를 예측하지만, - - inference 에서는 퀄리티를 증가하기 위한 iterative 방식으로 mask 예측 진행 - -### 2.4. Super-Resolution Model - -:::{figure-md} -fig_1 - -Figure 4 -::: - -- 바로 512x512 로 예측하도록 모델을 구성했을 때, **low level detail 에 더 포커싱**되어 학습이 진행됨. → 따라서 위의 그림과 같이 계층적으로 설계했음 - -- base model은 16x16 latent map 을 생성하고, super resolution 모델이 base latent map 을 **64x64 latent map 으로 upsampling** 함 - - - base 모델이 학습이 완료되면, 그 이후에 super resolution 모델 학습 진행 - -- Architecture - - :::{figure-md} - fig_1 - - Table 6 - ::: - -### 2.5. Decoder Finetuning - -- 디테일을 높이기 위해 residual layer를 더 추가하고 channel 늘림 - - residual layer: **2개 → 4개**, channel: **128 → 256** -- encoder weight, codebook, base, super-res transformer 모델은 freezing - -:::{figure-md} -fig_1 - -Figure 13 -::: - -- 해당 그림에서는 표지판이 더 finetuned decoder 가 복원이 잘 됐음 - -### 2.7. Classifier Free Guidance - -- 이미지 생성 퀄리티와 text-image alignment 향상을 위해 도입 -- 학습 때, 랜덤하게 10% 만 text conditioning 을 제거 - - inference - - $\ell_g=(1+t) \ell_c-t \ell_u$ - - $l_c$: conditional logit / $l_u$: unconditional logit / $t$: guidance scale -- **CFG 는 diversity ↔ fidelity 의 trade-off 관계** - - Muse 에서는 t 를 선형적으로 증가시키는 샘플링 과정을 거쳐 diversity 의 한계를 극복 - - 초반에는 guidance 가 없거나 낮게 해서 logit 값을 설정하고, 후반에는 conditional prompt 가 가능하게 많은 가중치를 주게 된다. - - unconditional logit → negative prompt 로도 사용 가능 - -### 2.8. Iterative Parallel Decoding at Inference - -- Muse 의 시간 효율성 - - parallel decoding 으로 인해 **한 번의 foward 연산으로 multiple token 을 예측**하는 방식으로 동작함 - - Markovian 속성: 많은 토큰이 주어진 다른 토큰에 대해 conditionally independent 함 - → parallel decoding 가능 -- [Maskgit](https://arxiv.org/abs/2202.04200) 논문 에서 Decoding 은 cosine schedule 에 의해 수행됨 - - 해당 step 에서 예측되는 가장 높은 신뢰도의 masked 토큰을 선택해 decoding 진행됨 - - 그 후 decoding 된 것은 masking 이 해제되는 방식 -- 이러한 절차를 따라서, Muse 에서는 base 모델의 256 토큰은 24 step 을 사용하고, super-res 모델의 4096 토큰은 8 step 만 사용 - - [Scaling Autoregressive Models for Content-Rich Text-to-Image Generation](https://arxiv.org/pdf/2206.10789.pdf) 에서는 256 or 4096 step 이 필요하고, - - diffusion 모델에서는 수백번의 step 이 필요한 것에 비해 Muse 가 빠른 inference 를 수행 가능 - -:::{figure-md} -fig_1 - -Figure 5 -::: - -## 3. Results - -- Imagen dataset - - 460M text-image pairs -- train step: 1M -- train time: 1 week -- batch size: 512 on 512-core TPU-v4 chips -- Adafactor optimizer - -:::{figure-md} -fig_1 - -Figure 6 -::: - -- cardinality: 동일한 객체를 여러 번 생성할 때, Muse 는 크기, 색상, 회전된 모습 - -:::{figure-md} -fig_1 - -Figure 7 -::: - -- 정량적 평가 - -        :::{figure-md} -fig_1        Table 6 -        ::: - -- FID(diversity) ↔ CLIP score(image-text alignment) - - :::{figure-md} - fig_1 - - Figure 8 - ::: - -- inpainting, outpainting - - :::{figure-md} - fig_1 - - Figure 10 - ::: - -# Contribution - -1. **FID, CLIP score** 기반으로 text-to-image 모델에 대한 SOTA 를 달성 - - 이미지 생성 퀄리티, 다양성, text prompt와의 alignment 측정했음 -2. quantized 이미지 토큰과 **parallel decoding** 으로 인해 **빠른 inference** 가 가능 -3. inpainting, outpainting, mask-free editing 을 포함한 **zero-shot editing** 가능 - -# Q&A - -1. Muse 와 같은 transformer 기반의 generation 모델에서는 어떻게 **diversity** 한 결과를 가져올 수 있나요? - 1. 아무래도 Muse 는 random latent 에서 생성하는 것이 아니라 text-to-image 모델이라, text 에 따라서 다양한 이미지 생성 결과가 나타날 수 있을 것 같습니다. -2. Muse 는 결국 GAN 모델인가요? - 1. 기준점이 어떻냐에 따라 GAN 이다, 아니다, 라고 정하기 어려울 것 같습니다. VQGAN을 사용해서 GAN이라고 생각할 수 도 있고, GAN 처럼 random latent 결과에 따라 이미지 생성이 달라질 수 있는 관점에서 생각하면 아니다라고 말할 수 있을 것 같습니다. -3. Token 은 어떤 의미를 갖나요? - 1. VQGAN에서 input 이미지를 인코딩하고, vector-quantization 과정을 거쳐 압축 후, codebook의 값을 가져와 feature를 구성하는데요, 이때 feature에 포함되어 있는 하나의 포인트에 해당하는 것이 token이라고 생각하시면 될 것 같습니다. -4. 텍스트 프롬프트를 넣었을때 실제 이미지 생성은 어떻게 이뤄지나요? Inference에서는 입력 이미지가 없는데 base transformer에 입력 이미지에 대한 masked token대신 뭐가 들어가게 되나요? - 1. 실제 inference 과정에서는 input 이미지가 없기 때문에 모두 마스크된 형태로 입력되게 됩니다. text prompt 의 condition 에 따라 각 step을 거쳐 decoding 이 수행됩니다. -5. text embedding이 어떻게 objective function 수식에 들어가나요? - 1. base transformer 에 대해 text embedding 값이 key, value로 입력되어 cross-attention 이 수행되게 됩니다. 그렇게 예측된 feature와 GT의 feature 끼리 cross entropy loss를 통해 마스크 예측할 수 있는 base transformer 가 학습이 됩니다. +```{admonition} Information +- **Title:** Muse: Text-To-Image Generation via Masked Generative Transformers + +- **Reference** + - Paper: [https://arxiv.org/pdf/2301.00704.pdf](https://arxiv.org/pdf/2301.00704.pdf) + - Code: X + +- **Author:** Jun-Hyoung Lee + +- **Last updated on Mar. 25. 2024** +``` + +# Muse + +:::{figure-md} +fig_1 + +Figure 1 +::: + +- **Muse: T2I transformer model + Masked Modeling** + - diffusion, autoregressive model 보다 효과적인 성능을 냄 + - **discrete token space 에서 masked modeling 방식으로 학습** + - pretrained LLM(***T5-XXL***) 으로 부터 추출된 text embedding이 주어지고, 랜덤하게 masked image token 을 예측하는 방식으로 학습 + - Imagen, DALL-E 2 와 비교할 때, sampling iteration이 적어 **빠른 inference** 수행 가능 + - LLM 을 사용해 **fine-grained 한 정보**를 추출하여 high-fidelity 이미지 생성을 할 수 있고, 시각적 concept(object, spatial 관계, 자세, 등)을 더 잘 이해할 수 있음 + - Muse-900M, CC3M 에서 SOTA 달성, FID 6.06 + - Muse-3B, zero-shot COCO 에서 FID 7.88 달성, CLIP score 0.32 + - 따로 **파인튜닝 없이** inpainting, outpainting, mask-free editing 이 가능함 + +## 1. Masked modeling + +- [22.02] MaskGIT: Masked Generative Image Transformer + + - CVPR 2022, Google Research + +:::{figure-md} +fig_1 + +maskgit 1 +::: + +:::{figure-md} +fig_1 + +maskgit 2 +::: + +- **VQGAN** 사용, **non-autoregressive** 디코딩 방식 +- inference 시에 모든 마스킹된 토큰을 예측하지만, 신뢰도가 높은 토큰만 실제 디코딩됨 + - 따라서 autoregressive 모델의 **256 step → 8 step** 으로 줄여 inference 속도가 향상 + +## 2. Model Architecture + +:::{figure-md} +fig_1 + +Figure 3 +::: + +1. **VQGAN tokenizer model 사용** + - input image 가 discrete token 으로 인코딩되고, 그 후 디코딩되어 input 이미지와 유사하게 잘 복원되는 모델 + - 두 개의 VQGAN 사용 (256x256 저해상도 + 512x512 고해상도) + - 첫 학습은 **256x256 저해상도**(16x16 latent) 학습 + - 이후 **512x512 고해상도**(64x64 latent) 학습 진행 +2. **Masked image model 사용** + - Muse 파라미터의 대부분이 masked image model 파라미터로 구성 + - unmaked 토큰과 T5XXL text embedding 을 condition으로 masked 저해상도 토큰에 대해 예측 진행 +3. **“Super-res” transformer model 사용** + - T5XXL text embedding 을 condition으로 저해상도 토큰을 고해상도 토큰으로 바꾸는데 사용 + +### 2.1. Pre-trained Text Encoders + +- [Imagen](https://arxiv.org/abs/2205.11487) 에서 pretrained LLM 사용하면 효과적인 high-quality 의 이미지 생성 가능 +- **풍부한 visual, semantic 정보를 추출**할 수 있는 T5-XXL 사용 + - objects (nouns), actions (verbs), visual properties (adjectives), spatial relationships (prepositions) + - Muse 가 이러한 정보를 이미지 생성을 위한 LLM embedding 에서 잘 mapping 을 할 수 있을 것이라고 가정 + - [Linearly mapping from image to text space](https://arxiv.org/abs/2209.15162) 에서 선행 연구 진행 +- 인코딩 과정 + 1. 4096 차원의 embedding vector를 얻음 + 2. linearly projection 진행되어 base, super-res transformer에 입력되게 차원을 맞춤 + +### 2.2. Semantic Tokenization using VQGAN + +- VQGAN + - encoder + decoder + - encoder feature 를 vector quantization 이 진행된 후, codebook 으로 부터 매핑을 통해 디코딩이 진행 +- 다른 해상도의 이미지를 인코딩할 수 있도록 encoder와 decoder 모두 **convolutional layer** 로 구성 +- 256x256 픽셀 이미지에 맞는 VQGAN 모델(base model)과 512x512 픽셀 이미지에 맞는 VQGAN 모델(super-res model) 구성 +- [Taming transformers for high-resolution image synthesis](https://arxiv.org/abs/2012.09841) 에서 **인코딩된 discrete 토큰이 low level noise를 무시하면서 high level semantic 함을 더 잘 capture 한다는 것을 연구 진행** + - 이 때문에, **cross-entropy loss 를 통해 masked 토큰을 예측**하는데 사용할 수 있게됨 + +### 2.3. Base Model + +- base model + - projected T5 embedding + 이미지 토큰을 입력으로 한 [masked transformer](https://arxiv.org/abs/2202.04200) 로 구성 + - text embedding 은 unmasked, 이미지 토큰은 랜덤하게 masking 진행 → [MASK] 토큰으로 교체 +- 이미지 토큰을 embedding 으로 선형적으로 mapping 진행(transformer 의 input/hidden 사이즈에 맞게) + positional embedding 도 포함 +- transformer layer는 self-attention, cross-attention, MLP 블럭이 포함 + - MLP 는 masked image embedding 을 logit 값으로 변경하는데 사용되고 + - cross-entropy loss 는 ground truth 토큰과 함께 오차를 계산함 +- 학습 때, base model은 각 step 마다 모든 masked tokens를 예측하지만, + - inference 에서는 퀄리티를 증가하기 위한 iterative 방식으로 mask 예측 진행 + +### 2.4. Super-Resolution Model + +:::{figure-md} +fig_1 + +Figure 4 +::: + +- 바로 512x512 로 예측하도록 모델을 구성했을 때, **low level detail 에 더 포커싱**되어 학습이 진행됨. → 따라서 위의 그림과 같이 계층적으로 설계했음 + +- base model은 16x16 latent map 을 생성하고, super resolution 모델이 base latent map 을 **64x64 latent map 으로 upsampling** 함 + + - base 모델이 학습이 완료되면, 그 이후에 super resolution 모델 학습 진행 + +- Architecture + + :::{figure-md} + fig_1 + + Table 6 + ::: + +### 2.5. Decoder Finetuning + +- 디테일을 높이기 위해 residual layer를 더 추가하고 channel 늘림 + - residual layer: **2개 → 4개**, channel: **128 → 256** +- encoder weight, codebook, base, super-res transformer 모델은 freezing + +:::{figure-md} +fig_1 + +Figure 13 +::: + +- 해당 그림에서는 표지판이 더 finetuned decoder 가 복원이 잘 됐음 + +### 2.7. Classifier Free Guidance + +- 이미지 생성 퀄리티와 text-image alignment 향상을 위해 도입 +- 학습 때, 랜덤하게 10% 만 text conditioning 을 제거 + - inference + - $\ell_g=(1+t) \ell_c-t \ell_u$ + - $l_c$: conditional logit / $l_u$: unconditional logit / $t$: guidance scale +- **CFG 는 diversity ↔ fidelity 의 trade-off 관계** + - Muse 에서는 t 를 선형적으로 증가시키는 샘플링 과정을 거쳐 diversity 의 한계를 극복 + - 초반에는 guidance 가 없거나 낮게 해서 logit 값을 설정하고, 후반에는 conditional prompt 가 가능하게 많은 가중치를 주게 된다. + - unconditional logit → negative prompt 로도 사용 가능 + +### 2.8. Iterative Parallel Decoding at Inference + +- Muse 의 시간 효율성 + - parallel decoding 으로 인해 **한 번의 foward 연산으로 multiple token 을 예측**하는 방식으로 동작함 + - Markovian 속성: 많은 토큰이 주어진 다른 토큰에 대해 conditionally independent 함 + → parallel decoding 가능 +- [Maskgit](https://arxiv.org/abs/2202.04200) 논문 에서 Decoding 은 cosine schedule 에 의해 수행됨 + - 해당 step 에서 예측되는 가장 높은 신뢰도의 masked 토큰을 선택해 decoding 진행됨 + - 그 후 decoding 된 것은 masking 이 해제되는 방식 +- 이러한 절차를 따라서, Muse 에서는 base 모델의 256 토큰은 24 step 을 사용하고, super-res 모델의 4096 토큰은 8 step 만 사용 + - [Scaling Autoregressive Models for Content-Rich Text-to-Image Generation](https://arxiv.org/pdf/2206.10789.pdf) 에서는 256 or 4096 step 이 필요하고, + - diffusion 모델에서는 수백번의 step 이 필요한 것에 비해 Muse 가 빠른 inference 를 수행 가능 + +:::{figure-md} +fig_1 + +Figure 5 +::: + +## 3. Results + +- Imagen dataset + - 460M text-image pairs +- train step: 1M +- train time: 1 week +- batch size: 512 on 512-core TPU-v4 chips +- Adafactor optimizer + +:::{figure-md} +fig_1 + +Figure 6 +::: + +- cardinality: 동일한 객체를 여러 번 생성할 때, Muse 는 크기, 색상, 회전된 모습 + +:::{figure-md} +fig_1 + +Figure 7 +::: + +- 정량적 평가 + +        :::{figure-md} +fig_1        Table 6 +        ::: + +- FID(diversity) ↔ CLIP score(image-text alignment) + + :::{figure-md} + fig_1 + + Figure 8 + ::: + +- inpainting, outpainting + + :::{figure-md} + fig_1 + + Figure 10 + ::: + +# Contribution + +1. **FID, CLIP score** 기반으로 text-to-image 모델에 대한 SOTA 를 달성 + - 이미지 생성 퀄리티, 다양성, text prompt와의 alignment 측정했음 +2. quantized 이미지 토큰과 **parallel decoding** 으로 인해 **빠른 inference** 가 가능 +3. inpainting, outpainting, mask-free editing 을 포함한 **zero-shot editing** 가능 + +# Q&A + +1. Muse 와 같은 transformer 기반의 generation 모델에서는 어떻게 **diversity** 한 결과를 가져올 수 있나요? + 1. 아무래도 Muse 는 random latent 에서 생성하는 것이 아니라 text-to-image 모델이라, text 에 따라서 다양한 이미지 생성 결과가 나타날 수 있을 것 같습니다. +2. Muse 는 결국 GAN 모델인가요? + 1. 기준점이 어떻냐에 따라 GAN 이다, 아니다, 라고 정하기 어려울 것 같습니다. VQGAN을 사용해서 GAN이라고 생각할 수 도 있고, GAN 처럼 random latent 결과에 따라 이미지 생성이 달라질 수 있는 관점에서 생각하면 아니다라고 말할 수 있을 것 같습니다. +3. Token 은 어떤 의미를 갖나요? + 1. VQGAN에서 input 이미지를 인코딩하고, vector-quantization 과정을 거쳐 압축 후, codebook의 값을 가져와 feature를 구성하는데요, 이때 feature에 포함되어 있는 하나의 포인트에 해당하는 것이 token이라고 생각하시면 될 것 같습니다. +4. 텍스트 프롬프트를 넣었을때 실제 이미지 생성은 어떻게 이뤄지나요? Inference에서는 입력 이미지가 없는데 base transformer에 입력 이미지에 대한 masked token대신 뭐가 들어가게 되나요? + 1. 실제 inference 과정에서는 input 이미지가 없기 때문에 모두 마스크된 형태로 입력되게 됩니다. text prompt 의 condition 에 따라 각 step을 거쳐 decoding 이 수행됩니다. +5. text embedding이 어떻게 objective function 수식에 들어가나요? + 1. base transformer 에 대해 text embedding 값이 key, value로 입력되어 cross-attention 이 수행되게 됩니다. 그렇게 예측된 feature와 GT의 feature 끼리 cross entropy loss를 통해 마스크 예측할 수 있는 base transformer 가 학습이 됩니다. diff --git a/_sources/docs/review/NeRF.md b/_sources/docs/review/NeRF.md new file mode 100755 index 00000000..a952b65a --- /dev/null +++ b/_sources/docs/review/NeRF.md @@ -0,0 +1,449 @@ +```{admonition} Information +- **Title:** NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis + +- **Reference** + - Paper: [https://arxiv.org/abs/2003.08934](https://arxiv.org/abs/2003.08934) + - Project: [https://github.com/bmild/nerf](https://github.com/bmild/nerf) + +- **Author:** Jeongin Lee + +- **Last updated on May. 22, 2024** +``` + +# NeRF : Representing Scenes as Neural Radiance Fields for View Synthesis + +[https://youtu.be/JuH79E8rdKc?feature=shared](https://youtu.be/JuH79E8rdKc?feature=shared) + +- 기존의 3D object 자체를 구성하여 렌더링하는 explicit method → 저장 용량이 많이 소요 +- NeRF 는 3D object 자체를 구성하지 않는, **synthesizing novel views** +좌표를 mlp에 넣어 픽셀 별 색상 및 밀도 값을 얻는 implicit method +- **synthesizing novel views** + 특정한 장면(Scene)에서 여러 각도로 찍은 일부의 사진들을 가지고 완전 새로운 각도의 모습을 유추하는 task + +## 0. Abstract + +- **NeRF** + - 한정된 수의 입력 뷰 이미지들을 사용 + - continous volumetric scene 함수 최적화를 통해 **synthesizing novel views** 에서 SOTA 달성 +- **Algorithm** + - **FC layer 사용 (non-convolutional)** + - **input** : 5 차원 좌표 (공간적 위치$(x, y, z)$ & 바라보는 방향$(\theta, \phi))$ + - **output** : volume density와 해당 방향에 대한 색상 값 + - 5 차원 좌표 입력 → 카메라 광선을 따라 RGB 값, Volume density 예측 + → 고전적 Volume rendering 기술을 사용하여 image 로 합성 +- 복잡한 구조 및 외형을 갖는 scene 에 대한 **Novel views rendering** 을 위해 **NeRF** 를 최적화하는 방법을 제시 (+ Positional Encoding, Hierarchical volume sampling) +- 실험을 통해 기존 작업을 능가하는 결과를 입증 +- **Keywords :** scene representation, view synthesis, image-based rendering, + volume rendering, 3D deep learning + + :::{figure-md} + NeRF> + + {method that optimizes a continuous 5D neural radiance +field representation} \ (source: {https://arxiv.org/pdf/2003.08934v2}) + ::: + +## 1. Introduction + +캡처된 이미지들의 렌더링 오차를 최소화하기 위해 연속적인 $5 \mathrm{D}$ scene 함수의 파라미터를 직접 최적화하여 View synthesis 분야의 오랜 문제를 새로운 방식으로 해결함 + +--- + +- **정적 장면 → 연속적인 $5 \mathrm{D}$ 함수로 표현** + + - FC layer = Regression Function : + a single $5 \mathrm{D}$ coord $(x, y, z, \theta, \phi)$ → density, view-dependent RGB color + +- **Output** + + - 공간 상의 각 지점 $(x, y, z)$에서 각 방향 $(\theta, \phi)$ 으로 방출된 색상 + - 각 지점 $(x, y, z)$ 의 밀도(density) = $\sigma$ + - 밀도의 누적값을 통해 얼마나 많은 빛이 $(𝑥,𝑦,𝑧)$ 를 통과하는 광선에 의해 누적되는지를 표현 + +--- + +- **특정 시점으로부터의 NeRF 렌더링** + + 1. 광선을 따라 이동하여 샘플링된 $3 \mathrm{D}$ 포인트 집합을 생성 + 2. 해당 포인트들과 이에 해당하는 $2 \mathrm{D}$ 시점 방향을 신경망에 대한 입력으로 사용하여 색상과 밀도의 집합을 생성 + 3. 고전적 Volume rendering 기술을 사용하여 $2 \mathrm{D}$ image 로 합성 + +--- + +- **Optimization** + - 미분 가능, gradient descent 를 통한 최적화 + - 각 관찰된 이미지와 렌더링된 해당 **views**사이의 오차를 최소화 + - 다양한 views 에서 오차 최소화를 통해 실제 장면의 cotents 가 포함된 위치에 **높은 밀도**와 **정확한 색상**을 할당하여 장면의 일관된 모델을 예측 + +--- + +- **NeRF 최적화의 Basic implementation의 한계 및 대안** + + 1. **복잡한 장면에 대해서 충분히 고해상도 표현으로 수렴되지 않음** + - positional encoding 으로 입력 5D 좌표를 변환 + - MLP가 더 높은 주파수의 함수를 나타낼 수 있음. + 2. **카메라 광선당 요구되는 샘플링 수가 비효율적** + - 계층적 샘플링 절차를 제안 + - 고주파수의 장면 표현을 적절하게 샘플링하기 위해 필요한 쿼리 수를 감소시킴 + +--- + +- **본 논문의 접근 방식은 volumetric 표현의 이점을 상속** + - 복잡한 실세계의 기하학적 형태와 외형을 표현 가능 + - 투영된 이미지를 사용한 Gradient-based 최적화에 적합 + - 고해상도에서 복잡한 장면을 모델링할 때 이산화된 복셀 그리드의 엄청난 저장 비용을 극복 + + + +--- + +- **Technical contributions** + - 복잡한 기하학과 소재를 가진 연속적인 장면을 5차원 NeRF 로 나타내는 접근 방법, 기본 MLP 네트워크로 매개변수화 + - 고전적인 볼륨 렌더링 기법을 기반으로 한 미분 가능한 렌더링 절차를 사용하여 이러한 표현을 표준 RGB 이미지로부터 최적화하는 방법을 제안 + - hierarchical sampling strategy : MLP’s capacity 를 시각적인 장면 내용이 있는 공간으로 할당 (물체가 있을 확률이 높은 부분을 모델이 집중적으로 학습) + - Positional encoding : 입력 5차원 좌표를 고차원 공간으로 매핑하기 위해 NeRF를 성공적으로 최적화하여 고주파의 장면 콘텐츠를 표현가능 +- 최초의 **continuous neural scene representation** 제안 + +:::{figure-md} + NeRF overview + +{An overview of our neural radiance field scene representation and differentiable rendering procedure} \ (source: {https://arxiv.org/pdf/2003.08934v2}) +::: + +## 2. Related Work + +- **Neural 3D shape representations** +- **View synthesis and image-based rendering** + +## 3. Neural Radiance Field Scene Representation + +- 5차원 벡터 함수 (MLP) $F_{\Theta}:(\mathbf{x}, \mathbf{d}) \rightarrow(\mathbf{c}, \sigma)$ + + - **input** : $3 \mathrm{D}$ location $\mathbf{x}=(x, y, z)$ , $2 \mathrm{D}$ viewing direction $\mathbf{d}=(\theta, \phi)$ + - **(practically) direction** as a $3 \mathrm{D}$ Cartesian unit vector $\mathbf{d}$ + - 벡터 $\mathbf{d} =(𝑑_𝑥,𝑑_𝑦,𝑑_𝑧)$ 는 방향을 나타내며, 이는 단위 벡터(길이가 1)로 정규화 + - **output** : emitted color $\mathbf{c}=(r, g, b)$, volume density $\sigma$ + +- $\mathbf{x}$ → $\sigma$ , $(\mathbf{x, d})$ → RGB 색상 $\mathbf{c}$ 를 예측하도록 권장 (색상은 view dependent 이므로) + + 1. MLP $F_{\Theta}$ 는 먼저 8개의 fully-connected layer (ReLU, 256개 채널 사용) 로 + 입력 3D 좌표 $\mathbf{x}$ →  $\sigma$ , 256차원 feature 벡터를 출력 + 2. **a** 의 feature 벡터는 카메라 광선의 시점 방향과 concat + 3. 뷰에 따른 RGB 색상을 출력하는 하나의 추가 fully-connected layer (ReLU,128개 채널 사용)로 전달됨 + + + ![Untitled](%5Bpaper%5D%20NeRF%20418c2318659542b58f338b6b20bafb40/Untitled%203.png) + :::{figure-md} + NeRF architecture> + + {fully-connected network architecture} \ (source: {https://arxiv.org/pdf/2003.08934v2}) + ::: + +- **View 를 고려하여 색상을 예측해야 하는 이유 : non-Lambertian effects** + - **Lambertian 효과** + - 물체의 표면에서 나오는 광선이 균일하게 반사되는 현상 + - 표면의 방향과 상관없이 광선이 표면에서 나오는 각도에 따라 반사되는 광량이 일정하다는 원리를 기반 + - Fig. 3 : 입력 시선 방향을 사용하여 non-Lambertian effects 를 표현한 예시 + :::{figure-md} + NeRF fig3 + + (source: {https://arxiv.org/pdf/2003.08934v2}) + ::: + + - Fig. 4 : view dependence 를 고려하지 않고 (only $\mathbf{x}$ input) 학습된 모델은 반사성(specularity)을 표현하는데 어려움이 있음 + :::{figure-md} + NeRF fig4 + (source: {https://arxiv.org/pdf/2003.08934v2}) + ::: + + +## 4. Volume Rendering with Radiance Fields + +- **5D NeRF 는 장면을 volume density 와 특정 포인트에서 방출된 빛(색상)으로 표현** +- **볼륨 렌더링 : scene 을 통과하는 모든 광선의 색상을 렌더링** + - NeRF 로부터 View 를 렌더링하려면 원하는 가상 카메라의 각 픽셀을 거쳐 추적된 카메라 광선에 대해 적분값 $C(\mathbf{r})$ 을 추정을 요구 + - $\mathbf{r}(t)=\mathbf{o}+t \mathbf{d}$ : 카메라 광선 + - $C(\mathbf{r})$ : near bound $t_n$ , far bound $t_f$ 에서 카메라 광선 $\mathbf{r}(t)$ 의 예측된 색상 + - $T(t)$ : ray 를 따라 $t_n$ 부터 $t$ 까지 누적된 투과율(transmittance) + +$$ +C(\mathbf{r})=\int_{t_n}^{t_f} T(t) \sigma(\mathbf{r}(t)) \mathbf{c}(\mathbf{r}(t), \mathbf{d}) d t, \text { where } T(t)=\exp \left(-\int_{t_n}^t \sigma(\mathbf{r}(s)) d s\right) +$$ + +- **Quadrature (구적법) 을 통해 연속적 적분값을 수치적으로 추정** + - 이산화된 ****voxel grids 렌더링에 사용되는 **결정론적 구적법**의 한계 + - 일반적으로 이산화된 복셀 그리드를 렌더링하는 데 사용되는 결정론적 구적법은 MLP가 **고정된 이산 위치 집합**에서만 쿼리되기 때문에 표현의 해상도를 제한 + + + +- 위의 샘플링 방법을 통해 뽑은 샘플들로 [[26]에서 리뷰](https://courses.cs.duke.edu/spring03/cps296.8/papers/max95opticalModelsForDirectVolumeRendering.pdf)된 볼륨 렌더링에서 논의된 구적법으로 $C(\mathbf{r})$ 을 추정 (적분을 sample sum 으로) + + $$ + \hat{C}(\mathbf{r})=\sum_{i=1}^N T_i\left(1-\exp \left(-\sigma_i \delta_i\right)\right) \mathbf{c}_i, \\ \text { where } T_i=\exp \left(-\sum_{j=1}^{i-1} \sigma_j \delta_j\right), + $$ + + - $\delta_i=t_{i+1}-t_i$ is the distance between adjacent samples ($dt$ 를 대체) + - $\left(\mathbf{c}_i, \sigma_i\right)$ 의 집합으로부터 $\hat{C}(\mathbf{r})$ 을 계산하는 함수는 쉽게 미분 가능하며 + $\alpha_i=1-\exp \left(-\sigma_i \delta_i\right)$ 를 사용한 전통적인 **alpha compositing** + - **alpha compositing (**알파 합성) + - 여러 이미지 또는 픽셀을 결합하여 하나의 이미지로 만드는 기술 + - ex) 투명한 이미지(유리, 그림자)를 배경 이미지 위에 겹칠 때 알파 컴포지팅을 사용하여 자연스러운 합성 수행 + +## 5. Optimizing a Neural Radiance Field + +**[REMIND]** + +- 지금까지 **NeRF 로 scene 을 모델링하는 것, 이 표현으로 새로운 views 를 렌더링 하는 것** 에 필요한 핵심적인 구성요소를 다룸 + - 하지만 해당 요소들로 SOTA 성능을 달성하기에는 한계 존재 + - 고해상도 + 복잡한 scene 을 표현 가능하게 하는 두개의 개선점을 도입 + +1. Positional encoding of the input coordinates +that assists the MLP in representing high-frequency functions +2. hierarchical sampling procedure +that allows us to efficiently sample this high-frequency representation. + +### 5.1 Positional encoding + +- Neural network $F_{\Theta}$ 가 직접 **$(x, y, z, \theta, \phi)$ input coordinates** 에서 직접 연산하는 경우, 색상과 형태에서 고주파 변동을 표현하는데 성능이 좋지 않았음 +- [[35] On the spectral bias of neural networks](https://arxiv.org/abs/1806.08734) 논문 결과와 동일, + - 깊은 신경망이 저주파 함수를 학습하는 쪽으로 편향되었음을 보여줌 + - 신경망을 통과하기 전 고주파 함수를 사용하여 **입력을 고차원 공간으로 맵핑**하는 것은 고주파 변동이 포함된 데이터를 더 잘 적합 가능하게 함을 제시 + - 저자들은 Neural scene representations 에서 위의 결과를 이용 +- **→ $F_{\Theta}$ 를 두개의 함수로 구성 $F_{\Theta}=F_{\Theta}^{\prime} \circ \gamma$ 성능을 상당히 개선 ($\gamma$ : 학습 X)** + + $$ + \gamma(p)=\left(\sin \left(2^0 \pi p\right), \cos \left(2^0 \pi p\right), \cdots, \sin \left(2^{L-1} \pi p\right), \cos \left(2^{L-1} \pi p\right)\right) . + $$ + + - $\gamma$ : mapping $\mathbb{R}$ → $\mathbb{R}^{2 L}$, $F_{\Theta}^{\prime}$ : Regular MLP + - $\gamma(\cdot)$ : $\mathbf{x}$ 의 각 세개의 좌표값과 Cartesian 시점 방향 벡터 $\mathbf{d}$ 의 세 성분에 $[-1,1]$사이로 정규화 후 개별적으로 적용에 분리되어 적용됨 + - Experiments : $L=10$ for $\gamma(\mathbf{x})$ and $L=4$ for $\gamma(\mathbf{d})$ + + +### 5.2 Hierarchical volume sampling + +- **Stratified Sampling** + - 비효율적 + - 렌더링된 이미지에 기여하지 않는 여유 공간(비어있는 부분) 막혀있는(가려진) 영역이 여전히 반복적으로 샘플링됨. +- **Hierarchical volume sampling** + - 최종 렌더링에 대한 예상 효과에 비례하여 샘플을 할당 + - 렌더링 효율성을 증가시킴 + + **➡️ Content가 더 있을 것 같은 곳을 더 뽑자 !** + +- scene 표현을 위해 단순히 단일 네트워크를 사용하는 것 대신에 우리는 동시에 2개의 네트워크를 최적화 + + **Step 1. Coarse** + + **Step 2. Fine** + +--- + +1. **Coarse** + + **Stratified sampling** → $N_c$ 개의 위치 집합을 샘플링, 이 위치에서 $\hat{C(r)}$ 을 예측하여 **Coarse network** 를 평가 + +2. **Fine** + 1. 1에서 주어진 Coarse 네트워크의 출력을 바탕으로 더 많은 정보에 기반한 포인트 샘플링을 생성 (더 많은 정보에 기반한 포인트 샘플링을 생성) + 2. Coarse 네트워크에서의 알파 합성 색상 $\hat{C}_c(\mathbf{r})$을 광선을 따라 샘플링된 모든 컬러 $c_i$들의 가중합 형태로 다시 씀 + + $$ + \hat{C}_c(\mathbf{r})=\sum_{i=1}^{N_c} w_i c_i, \quad w_i=T_i\left(1-\exp \left(-\sigma_i \delta_i\right)\right) . + $$ + +3. **piecewise-constant PDF** + + Normalizing weight 를 통해 생성 + + +$$ +\hat{w}i= \dfrac{w_i}{\sum_{j=1}^{N_c} w_j} +$$ + +- 역변환 샘플링을 통해 확률 밀도함수 값에 기반한 2번째 샘플집합의 샘플 $N_f$ 개를 샘플링 +- 첫 번째와 두 번째 샘플 집합의 합집합에서 fine 네트워크를 평가 +- 모든 $N_c+N_f$ 샘플을 사용하여 광선의 최종 렌더링된 색상 $\hat{C}_f(\mathbf{r})$ 를 계산 +- 이 절차에서는 관측 가능한 content가 포함될 것으로 예상되는 영역에 더 많은 샘플을 할당 + +### 5.3 Implementation details + +- **각 Scene 에 대해 네트워크 를 별도로 최적화** + + scene이 캡처된 RGB 이미지, extrinsic parameter(해당 카메라 포즈), intrinsic parameter, 장면 경계로 구성된 데이터셋이 필요 + + - **extrinsic parameter, intrinsic parameter** + + **Extrinsic Paramete**r + + 3D 공간 내에서 카메라가 어디에 위치(3D Translation)하고 있고, 어디를 바라보고 있는지(3D Rotation)에 대한 Parameter + + **Intrinsic Parameter** + + 카메라 렌즈와 센서 위치에 의해서 결정되어지는 항목으로, + + 이미지 패널이 얼마나 이동(2D Translation)하고, 얼마나 확대하고(2D Scaling),  + 얼마나 기울어졌는지(2D Shear) 대한 intrinsic parameter + + :::{figure-md} + NeRF intrinsic_extrinsic + {intrinsic prameter and extrinsic parameter} + ::: + + - 카메라 영상 : 3차원 공간상의 점들을 2차원 이미지 평면에 투사(perspective projection) + :::{figure-md} + NeRF perspective projection + {perspective projection} + ::: + +- **Training** + + 1. 각 최적화 iteration에서 데이터셋의 모든 픽셀 집합에서 카메라 광선 batch를 무작위로 샘플링 + 2. 계층적 샘플링을 따라 coarse 네트워크의 $N_c$ 개의 샘플과 fine 네트워크의$N_c + N_f$개의 샘플을 쿼리 + 3. volume rendering 절차를 사용하여 두샘플 집합 모두에서 광선의 색상을 렌더링 + +- **Loss** + coarse 렌더링과 fine 렌더링의 색상 vs 실제 픽셀 색상 간의 총 제곱 오차 + + $$ + \mathcal{L}=\sum_{\mathbf{r} \in \mathcal{R}}\left[\left\|\hat{C}_c(\mathbf{r})-C(\mathbf{r})\right\|_2^2+\left\|\hat{C}_f(\mathbf{r})-C(\mathbf{r})\right\|_2^2\right] + $$ + + - $\mathcal{R}$ : 각 batch 의 광선의 집합 + - $C(\mathbf{r})$ : Ray $\mathbf{r}$ 에 대한 Ground Truth RGB colors + - $\hat{C}_c(\mathbf{r})$ : Ray $\mathbf{r}$ 에 대한 Coarse volume predicted RGB colors + - $\hat{C}_f(\mathbf{r})$ : Ray $\mathbf{r}$ 에 대한 Fine volume predicted RGB colors + - 최종 렌더링은 $\hat{C}_f(\mathbf{r})$ 이지만, $\hat{C}_c(\mathbf{r})$ 의 Loss 역시 최소화 + - Coarse 네트워크의 weight 분포가 fine network 의 샘플링의 기반이 되기 때문 + +## 5.4 Experiments detail + +- a batch size of 4096 rays +- sampling coordinates : + - $N_c=64$ in the coarse volume + - $N_f=128$ in the fine volume +- Optimizer : Adam, lr : $5 \times 10^{-4}$ → $5 \times 10^{-5}$ (exponentially decay learning rate) + - Default : $\beta_1=0.9, \beta_2=0.999$, +- iteration: 한 장면 당 10~30만 iter (NVIDIA V100 GPU 1개로 1~2일 소요) + +## 6. Results + +### 6.1 Datasets + +- **Synthetic renderings of object** + :::{figure-md} + Diffuse Synthetic + {Diffuse Synthetic : Lambertian, Realistic Synthetic : non-Lambertian} + ::: + +1. **Diffuse / Synthetic** $360\degree$ + + 1. 총 4개의 Lambertian 물체가 간단한 geometry로 구성 + 2. object : **512×512** + 3. 상반구에 대한 viewpoint 를 렌더링 + 4. Train : 479, Test : 1000 + +2. **Real / Synthetic $360\degree$, Forward-Facing** + + 1. 총 8개의 non-Lambertian 물체 8개, + 2. 각각의 pathtraced image 를 포함한 형태의 데이터 셋을 구성 + 3. object : **800×800** + 4. 6 Scenes : 상반구에 대한 viewpoint 를 렌더링, 2 Scenes : 구 전체에 대한 viewpoint 를 렌더링 + 5. Train : 100, Test : 200 + +3. **Real / Forward-Facing** + + 1. 복잡한 형태의 현실 scene을 앞쪽에서 본 모습을 사용 + 2. 총 8개의 scene, (5 scenes : LLFF paper 3 scenes : 직접 캡처) + 3. object : **$1008\times 756$** + 4. Train : Test = 7 : 1 + +### 6.2 Comparisons + +- **Models** + - **Neural Volumes (NV)** + - **Scene Representation Networks (SRN)** + - **Local Light Field Fusion (LLFF)** + +### 6.3 Discussion + +1. comparison : Diffuse Synthetic : Lambertian, Realistic Synthetic : non-Lambertian +- $\text{Nerf}$ : 미세 디테일, 기하학적 구조, 외양, nonLambertian 반사 반영 +- $\text{LLFF}$ : ghosting artifact (ship, lego) +- $\text{SRN}$ : blurry and distorted rendering +- $\text{NV}$ : detail 및 기하적 구조 반영 실패 + + :::{figure-md} + Diffuse Synthetic + + {Diffuse Synthetic : Lambertian, Realistic Synthetic : non-Lambertian} + ::: + +- **Ghosting :** 렌더링에서의 객체 겹침 혹은 번짐 +- **Lambertian :** 모든 각도에서 동일한 밝기 +- **Non-Lambertian :** 각도에 따라 밝기와 색상 변화 / 광택, 반사, 투명도 등을 가짐 + +2. comparison : reconstruction partially occluded regions + :::{figure-md} + Diffuse Synthetic + + {NeRF also correctly reconstructs partially occluded regions} + ::: + +### 6.4 Ablation studies + +- Realistic Synthetic 360도 scene +- 위치 인코딩(PE), 시점 의존성(VD), 계층적 샘플링(H) +- 최대 주파수 $L$ 의 선택 + - 5→10 (성능 향상), 10→15 (성능 감소) + - $2^L$ 이 샘플링 된 입력 이미지에서 존재하는 최대 주파수(본 데이터는 1024)를 초과할 때 추가적인 성능 향상에 제한 + + :::{figure-md} + ablation study + + {ablation study} + ::: + +--- + +## (Appendix) A. Additional Implementation Details + +1. **Volume Bounds** +For experiments with synthetic images, we scale the scene so that it lies within a **cube of +side length 2 centered at the origin**, and only query the representation within this bounding volume. we use normalized device coordinates **to map the depth range of these points into [−1, 1]**. + +2. **Training Details** +adding random Gaussian noise with zero mean and unit variance to the **output σ values** during optimization + +3. **Rendering Details** + :::{figure-md} + NeRF architecture> + + {fully-connected network architecture} \ (source: {https://arxiv.org/pdf/2003.08934v2}) + ::: + +- Coarse network 64 + fine network 128 = 192 +- fully-connected network 구조 +- positional encoding이 더해진 형태의 위치 정보**$(\gamma(x))$** 를 input으로 투입 +- 256 채널과 ReLU로 엮인 총 8개의 네트워크를 통과하게 된다. 해당 논문에서는 DeepSDF 구조를 따르고, skip connection을 5번째 layer의 activation에 투입 +- 추가 레이어는 volume density 를 output으로 산출 diff --git a/_sources/docs/review/SDEdit.md b/_sources/docs/review/SDEdit.md old mode 100644 new mode 100755 index d0d8a282..bf7c57b3 --- a/_sources/docs/review/SDEdit.md +++ b/_sources/docs/review/SDEdit.md @@ -1,145 +1,145 @@ -```{admonition} Information -- **Title:** SDEdit: Guided Image Synthesis and Editing with Stochastic Differential Equations - -- **Reference** - - Paper: [https://arxiv.org/pdf/2108.01073.pdf](https://arxiv.org/pdf/2108.01073.pdf) - -- **Author:** Seunghwan Ji - -- **Last updated on Oct. 03, 2023** -``` - -# SDEdit - -## Abstract - -- 최근 이미지 생성 분야에서의 놀라운 진화 속도가 계속 되어오고있다. (GAN, Diffusion etc..) -- 이 중 이미지에 random noise를 추가해 denoising 과정을 학습하는 Diffusion을 통해 high quality의 이미지를 생성할 수 있다. -- 또, 생성되는 이미지를 사용자가 원하는 방향으로 이끌어내려는 연구 분야도 활발히 진행되고있다 (a.k.a Editing) -- 하지만, GAN 또는 Diffusion을 포함한 방식으로의 Editing에는 몇가지 단점이 있고, SDEdit은 그런 문제점을 해결해나아갔다는 점을 논문의 핵심 Contribution으로 제시하였다. - -## 1. Introduction - -- Abstract에서 말한 Editing이란, 유저가 생성하고자 하는 Guide를 제시하면 모델은 해당 Guide를 기반으로 이미지를 생성해내는 Vision Task를 의미한다. -- 이때 두가지의 평가요소가 있는데 - 1. faithful : 유저의 Guide를 얼마나 잘 따르는지 - 2. realistic : 생성된 이미지가 얼마나 real한지 -- 기존의 연구방식은 크게 두가지로 나뉜다. - 1. GAN(Generative Adversarial Network) 기반 - 2. Diffusion 기반 -- 이 중 기존에 SOTA를 이룬 GAN 방식을 살펴보면 다시 크게 두가지로 나뉜다. - 1. conditional GAN - - 특징 : 원본 이미지에서 Edit된 Pair 이미지를 직접 학습 - - 단점 : Pair Dataset이 반드시 필요하고, Condition마다 재학습을 요구 - 2. GAN Inversion - - 특징 : 이미지를 Latent space로 Inversion한 후, Latent vactor를 조작해(manipulate) Edited image를 생성 - - 단점 : 새로운 loss function이 정의되어야하고, condition마다 재학습을 요구 -- 그에 반해 SDEdit은 - 1. Pair Dataset이 필요하지 않다. - 2. 추가적인 loss function과 재학습이 모두 필요하지 않다. - 3. 단 한개의 pretrained weight로 모든 condition의 이미지를 생성할 수 있다. - - -## 2. Related Works - -### 2.1. Score Based Generated Model -:::{figure-md} -SDEdit_00 - -Image 1 -::: - -- Key Idea - - *“Real 이미지들은 실제 데이터 확률 분포에서 높은 값을 유지할 것이다. 따라서, 이미지를 분포가 높은곳으로 update 해나가면 좋은 퀄리티의 이미지를 생성하는 모델을 얻어낼 수 있다.”* -- 이 때, score는 확률 밀도 함수의 순간 기울기(미분값)로 정의한다. - -### 2.2. Score Based Generated Diffusion Model (SDE, SMLD) -:::{figure-md} -SDEdit_01 - -Image 2 -::: - - -- 위에서 제시한 Score Based Generated Model에 Diffusion 방식을 적용한 모델 -- Forward Process 과정에서 이미지에 noise를 주입하는데, 이 때 Stochastic Differential Equation 수식을 이용해 noise를 주입한다. -- 또다른 Diffusion 모델인 (Probability based) DDPM과의 차이는 Forward, Reverse process에서 정의하는 equation의 차이 정도이다. -- paper : [https://arxiv.org/abs/1907.05600](https://arxiv.org/abs/1907.05600) - -## 3. Methods - -1. Pre-Setup - - Guide image의 Level을 정의한다. - :::{figure-md} - SDEdit_02 - - Image 3 - ::: - - 1. low-level guide : real 이미지위에 image patch를 추가 - 2. mid-level guide : real 이미지위에 stroke를 추가 - 3. high-level guide : 단순히 coarse한 stroke의 이미지 -2. Procedure - - DDPM과 달리 SDE의 경우, 완전히 noise화된 이미지 즉, random noise로부터 denoising을 진행할 필요가 없다. - - 즉, 적절한 $t_{0} \in [0,1]$를 지정한 후 denoising process가 가능하다. - - :::{figure-md} - SDEdit_03 - - Image 4 - ::: - - 이 때, 적절한 $t_{0}$를 정의해야하는데, - 1. $t_{0}$ = 1 (i.e. random noise)이면, realistic하지만, faithful 하지않은 이미지 - 2. $t_{0}$ = 0 이면, faithful하지만, artistic한 이미지 - - 를 얻게된다. - - :::{figure-md} - SDEdit_04 - - Image 5 - ::: - - 아래는 SDEdit의 적용 과정이다. - - :::{figure-md} - SDEdit_05 - - Image 6 - ::: - -## 4. Experiments - -- Score - - Metric - - realistic : Kid score (lower is better) - - faithful : $L_{2}$ score (lower is better) - - 그 외 종합적인 평가 지표로 survey를 통한 수치를 제시하였다. - - :::{figure-md} - SDEdit_06 - - Image 7 - ::: - - 기존의 GAN 방식들과 비교했을 때 Kid, $L_{2}$ score 모두 더 좋은 수치를 보이는 것을 확인할 수 있다. -- Comparison with GAN (styleGAN-ADA + Inversion) - - :::{figure-md} - SDEdit_07 - - Image 8 - ::: - - SDEdit이 GAN Based model보다 더 자연스럽고(realistic), 유저의 guide를 잘 따르는(faithful)것을 확인할 수 있다. -- Comparison with original blending technique - - :::{figure-md} - SDEdit_08 - - Image 9 - ::: - - :::{figure-md} - SDEdit_09 - - Image 10 - ::: - - 기존의 전통적인 방식의 몇가지 blending 기법과 비교해도 더 좋은 성능과 수치를 보이는 것을 확인할 수 있다. +```{admonition} Information +- **Title:** SDEdit: Guided Image Synthesis and Editing with Stochastic Differential Equations + +- **Reference** + - Paper: [https://arxiv.org/pdf/2108.01073.pdf](https://arxiv.org/pdf/2108.01073.pdf) + +- **Author:** Seunghwan Ji + +- **Last updated on Oct. 03, 2023** +``` + +# SDEdit + +## Abstract + +- 최근 이미지 생성 분야에서의 놀라운 진화 속도가 계속 되어오고있다. (GAN, Diffusion etc..) +- 이 중 이미지에 random noise를 추가해 denoising 과정을 학습하는 Diffusion을 통해 high quality의 이미지를 생성할 수 있다. +- 또, 생성되는 이미지를 사용자가 원하는 방향으로 이끌어내려는 연구 분야도 활발히 진행되고있다 (a.k.a Editing) +- 하지만, GAN 또는 Diffusion을 포함한 방식으로의 Editing에는 몇가지 단점이 있고, SDEdit은 그런 문제점을 해결해나아갔다는 점을 논문의 핵심 Contribution으로 제시하였다. + +## 1. Introduction + +- Abstract에서 말한 Editing이란, 유저가 생성하고자 하는 Guide를 제시하면 모델은 해당 Guide를 기반으로 이미지를 생성해내는 Vision Task를 의미한다. +- 이때 두가지의 평가요소가 있는데 + 1. faithful : 유저의 Guide를 얼마나 잘 따르는지 + 2. realistic : 생성된 이미지가 얼마나 real한지 +- 기존의 연구방식은 크게 두가지로 나뉜다. + 1. GAN(Generative Adversarial Network) 기반 + 2. Diffusion 기반 +- 이 중 기존에 SOTA를 이룬 GAN 방식을 살펴보면 다시 크게 두가지로 나뉜다. + 1. conditional GAN + - 특징 : 원본 이미지에서 Edit된 Pair 이미지를 직접 학습 + - 단점 : Pair Dataset이 반드시 필요하고, Condition마다 재학습을 요구 + 2. GAN Inversion + - 특징 : 이미지를 Latent space로 Inversion한 후, Latent vactor를 조작해(manipulate) Edited image를 생성 + - 단점 : 새로운 loss function이 정의되어야하고, condition마다 재학습을 요구 +- 그에 반해 SDEdit은 + 1. Pair Dataset이 필요하지 않다. + 2. 추가적인 loss function과 재학습이 모두 필요하지 않다. + 3. 단 한개의 pretrained weight로 모든 condition의 이미지를 생성할 수 있다. + + +## 2. Related Works + +### 2.1. Score Based Generated Model +:::{figure-md} +SDEdit_00 + +Image 1 +::: + +- Key Idea + - *“Real 이미지들은 실제 데이터 확률 분포에서 높은 값을 유지할 것이다. 따라서, 이미지를 분포가 높은곳으로 update 해나가면 좋은 퀄리티의 이미지를 생성하는 모델을 얻어낼 수 있다.”* +- 이 때, score는 확률 밀도 함수의 순간 기울기(미분값)로 정의한다. + +### 2.2. Score Based Generated Diffusion Model (SDE, SMLD) +:::{figure-md} +SDEdit_01 + +Image 2 +::: + + +- 위에서 제시한 Score Based Generated Model에 Diffusion 방식을 적용한 모델 +- Forward Process 과정에서 이미지에 noise를 주입하는데, 이 때 Stochastic Differential Equation 수식을 이용해 noise를 주입한다. +- 또다른 Diffusion 모델인 (Probability based) DDPM과의 차이는 Forward, Reverse process에서 정의하는 equation의 차이 정도이다. +- paper : [https://arxiv.org/abs/1907.05600](https://arxiv.org/abs/1907.05600) + +## 3. Methods + +1. Pre-Setup + - Guide image의 Level을 정의한다. + :::{figure-md} + SDEdit_02 + + Image 3 + ::: + + 1. low-level guide : real 이미지위에 image patch를 추가 + 2. mid-level guide : real 이미지위에 stroke를 추가 + 3. high-level guide : 단순히 coarse한 stroke의 이미지 +2. Procedure + - DDPM과 달리 SDE의 경우, 완전히 noise화된 이미지 즉, random noise로부터 denoising을 진행할 필요가 없다. + - 즉, 적절한 $t_{0} \in [0,1]$를 지정한 후 denoising process가 가능하다. + + :::{figure-md} + SDEdit_03 + + Image 4 + ::: + - 이 때, 적절한 $t_{0}$를 정의해야하는데, + 1. $t_{0}$ = 1 (i.e. random noise)이면, realistic하지만, faithful 하지않은 이미지 + 2. $t_{0}$ = 0 이면, faithful하지만, artistic한 이미지 + + 를 얻게된다. + + :::{figure-md} + SDEdit_04 + + Image 5 + ::: + - 아래는 SDEdit의 적용 과정이다. + + :::{figure-md} + SDEdit_05 + + Image 6 + ::: + +## 4. Experiments + +- Score + - Metric + - realistic : Kid score (lower is better) + - faithful : $L_{2}$ score (lower is better) + - 그 외 종합적인 평가 지표로 survey를 통한 수치를 제시하였다. + + :::{figure-md} + SDEdit_06 + + Image 7 + ::: + - 기존의 GAN 방식들과 비교했을 때 Kid, $L_{2}$ score 모두 더 좋은 수치를 보이는 것을 확인할 수 있다. +- Comparison with GAN (styleGAN-ADA + Inversion) + + :::{figure-md} + SDEdit_07 + + Image 8 + ::: + - SDEdit이 GAN Based model보다 더 자연스럽고(realistic), 유저의 guide를 잘 따르는(faithful)것을 확인할 수 있다. +- Comparison with original blending technique + + :::{figure-md} + SDEdit_08 + + Image 9 + ::: + + :::{figure-md} + SDEdit_09 + + Image 10 + ::: + - 기존의 전통적인 방식의 몇가지 blending 기법과 비교해도 더 좋은 성능과 수치를 보이는 것을 확인할 수 있다. diff --git a/_sources/docs/review/SDXL.md b/_sources/docs/review/SDXL.md old mode 100644 new mode 100755 index 53748067..60786d68 --- a/_sources/docs/review/SDXL.md +++ b/_sources/docs/review/SDXL.md @@ -1,141 +1,141 @@ -```{admonition} Information -- **Title:** SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis - -- **Reference** - - Paper: [https://arxiv.org/abs/2307.01952](https://arxiv.org/abs/2307.01952) - - Code: [https://github.com/Stability-AI/generative-models](https://github.com/Stability-AI/generative-models) - -- **Author:** Jun-Hyoung Lee - -- **Last updated on May. 31. 2023** -``` - -# SDXL - -## Abstract - -SDXL은 T2I latent diffusion 모델이다. Stable Diffusion과 비교하면, SDXL은 세 배 더 큰 규모의 UNet을 포함한다. 더 많은 attention 블록과 더 큰 cross attention context 가 SDXL에서 두 번째 text encoder로 사용되면서 모델 파라미터가 증가했다. 다수의 새로운 conditioning 방법과 다양한 비율에 맞도록 SDXL을 학습할 수 있도록 설계했다. 또한 후처리 방식의 image to image 기술을 사용해 SDXL의 생성 샘플의 시각적인 fidelity를 향상시킨 refinement model을 소개한다. SDXL은 대폭 향상된 성능을 보여준다. - -:::{figure-md} SDXL result -sdxl_result - -SDXL result -::: - -## Introduction - -세 가지 주요 기능이라 볼 수 있는데, - -1. 3배 더 큰 UNet backbone, -2. 어떤 형태의 추가 감독(supervision)없는 간단하면서도 효과적인 추가의 conditioning 기술 -3. noising-denoising 과정을 적용해 시각적 품질을 향상하는 latent를 생성할 수 있는 별개의 diffusion 기반 img-to-img refinement 모델을 포함한다. - -:::{figure-md} Figure 1 -fig_1 - -Figure 1 -::: - -그림 1에서 왼쪽 그림을 보면 추가의 refinement 단계를 추가해 성능을 높인 SDXL이 기존 SD보다 성능이 우수한 것을 확인할 수 있다. 오른쪽 그림은 아키텍처를 시각화했는데, 128x128 크기의 latent를 생성한다. 그 후 고해상도 refinement 모델을 활용하고 동일한 프롬프트를 활용해 첫 번째 단계에서 생성된 latent를 SDEdit을 적용한다. SDXL과 refinement 모델은 동일한 autoencoder를 사용한다. - -:::{figure-md} Table 1 -table_1 - -Table 1 -::: - -SD와 다르게 UNet 내의 transformer 블록의 heterogeneous 분포를 사용했다는 점이다. 테이블 1을 참고하면 highest feature level에서 transformer 블럭을 사용했고, lower level에서는 2, 10 개의 블럭을 사용했고, UNet에서 lowest level(8x downsampling)을 제거했다. text conditioning을 위한 pretrained 된 text encoder를 사용했다. 특히, CLIP Vit-L과 함께 OpenCLIP ViT-bigG를 사용했고, 채널 축에 두 번째 text encoder의 output을 concat 했다. 게다가 text input으로 모델에 condition을 주기 위해 cross attention 레이어를 사용했으며, 또 OpenCLIP로부터 pooled text embedding을 모델에 condition으로 추가했다. 이러한 변화는 UNet의 파라미터 사이즈가 2.6B로 증가했다. text encoder는 817M 파라미터를 가지고 있다. - -## 2.2 Micro-Conditioning - -:::{figure-md} Figure 2 -fig_2 - -Figure 2 -::: - -SD 1.4/1.5 같은 경우 512 픽셀 이하 크기의 이미지는 제외하고 학습을 시키거나, 너무 작은 이미지는 upscale하여 학습을 시켰다. 이는 학습할 때의 최소 크기가 정해지는 문제점이 발생한다. 따라서 성능을 저하시키거나, 일반화를 잘 못할 수 있다. - -그림 2를 보면 SDXL의 데이터 셋의 분포를 시각화해주는 그림이다. 제안된 size-conditiong 없이, 256x256 픽셀 크기 미만의 데이터가 39%나 달한다. upscale 하게 된다면 최종 결과물이 blur 한 결과를 가져와 좋지 않은 아티팩트가 생긴다. - -대신, 저자들은 원래의 이미지 해상도에서 UNet 모델에 condition을 주었다. 특히 어떠한 rescaling 전의 원래의 크기인 $c_\text{size}=(h_\text{original}, w_\text{original})$를 제공해 추가의 condition을 줄 수 있게 했다. UNet의 denoising 할 때의 condition으로 추가된다. - -Inference 때, 사용자가 size-conditioning을 통해 해상도를 정할 수 있다. 모델은 conditioning 크기를 해상도에 의존적인 이미지 feature과 연관시키도록 하는 방법을 학습했다. - -:::{figure-md} Figure 3 -fig_3 - -Figure 3 -::: - -또 ImageNet으로 평가를 진행해 size-conditiong에 대한 우수성을 입증했다. - -:::{figure-md} Table 2 -table_2 - -Table 2 -::: - -_CIN-512-only_ 는 512 미만의 이미지를 제외하고 학습을 시켰고(70k 장), _CIN-nocond_ 는 모든 ImageNet 이미지를 사용했으며, _CIN-size-cond_ 는 추가 size-condition을 사용했다. 표 2에서 보다시피 _CIN-size-cond_ 모델이 FID, IS 모두 높은 성능을 보였다. - -### Conditioning the Model on Cropping Parameters - -:::{figure-md} Figure 4 -fig_4 - -Figure 4 -::: - -그림 4에서 SD 같은 경우 고양이 머리가 잘려진 결과를 얻었다. 이러한 이유는 학습할 때, random cropping으로 인해 생성되었기 때문이다. - -이러한 문제를 해결하기 위해, 간단한 효과적인 방법을 제안한다. 데이터를 loading 할 때, 균등하게 $c_\text{top}$과 $c_\text{left}$ (높이 및 너비 축을 따라 왼쪽 상단 모서리에서 잘린 픽셀의 양을 지정하는 정수)를 샘플링한다. 그 후 Fourier feature 임베딩을 통해 conditioning 파라미터로써 모델에 입력한다. 위에서 언급한 size conditioning과 비슷하다. concat 된 임베딩 $c_\text{crop}$은 추가의 conditioning 파라미터로 사용된다. - -저자들은 LDM 뿐만 아니라 어떠한 DM에서도 사용될 수 있다고 강조한다. crop 및 size-conditioning은 쉽게 결합될 수 있다. 이러한 경우, crop 및 size-conditioning을 feature 임베딩을 채널 축에 concat 하고 UNet의 타임스텝 임베딩에 추가한다. - -## 2.3 Multi-Aspect Training - -일반적인 T2I 모델에서 결과물의 크기는 512x512, 1024x1024 로 얻을 수 있는데, 이는 현실 세계에서 부자연스럽다. 이유는 현실 세계에서는 다양한 크기, 비율을 가진 이미지가 많고, 풍경 같은 경우 16:9 비율의 크기를 지니고 있다. - -따라서, 다양한 비율을 동시에 다룰수 있도록 모델을 파인튜닝했다. 픽셀수를 1024x1024 만큼 수를 최대한 유지하면서 다양한 비율의 데이터를 사용했고, 64의 배수를 지니도록 했다. - -:::{figure-md} /Multi aspect ratio -multi_aspect_ratio - -Multi aspect ratio -::: - -최적화 동안, 학습 배치는 동일한 버킷(같은 비율의 이미지들?)의 이미지로 구성되며, 각 훈련 스텝마다 버킷 크기를 번갈아 가며 사용했다. 추가적으로, 모델은 버킷 크기(혹은 타겟 크기)를 conditioning으로 주었으며, 위에서 언급한 size, crop conditioning과 유사하게 Fourier 공간에 임베딩되는 $c_\text{ar}=(h_\text{tgt}, w_\text{tgt})$ 형태로 표현된다. - -실제로, 모델이 고정된 비율및 해상도의 데이터로 pretraining이 마친 후 파인튜닝 단계에서는 다양한 비율의 데이터로 학습했고, 채널 축으로 concat 하는 2.2절에서 소개한 conditioning 기술과 함께 결합했다. 이를 아래의 그림 16에서 코드로 확인할 수 있다. - -## 2.4 Improved Autoencoder - -SD는 LDM 중 하나이고, autoencoder의 latent space를 학습한다. semantic composition은 LDM으로부터 표현되지만 저자들은 local, high frequency 디테일한 부분을 향상하고자 autoencoder를 향상했다. 끝으로, 원래의 SD를 사용한 autoencoder 아키텍처에서 더 큰 배치사이즈(256 vs 9)로 학습했고 추가로 exponential moving average를 사용한 가중치를 사용했다. 결과 autoencoder의 성능이 reconstruction 메트릭에 좋은 결과를 가져왔다. - -:::{figure-md} Table 3 -table_3 - -Table 3 -::: - -## 2.5 Putting Everything Together - -학습 파라미터를 정리해주는 절입니다. diffusion time step은 1000 step을 사용했다. 우선, base model를 내부 데이터 셋으로 그림 2에 나와있는 높이-너비 분포에 맞게 학습을 시켰다. 600,000 step을 사용했으며, 256x256 사이즈로, 배치는 2048로, size & crop conditioning을 사용했다. 그 후 512x512 이미지를 추가로 200,000 최적화 step으로 학습시켰고, 마침내 offset 노이즈 [11, 25] 0.05 수준과 함께 다중 비율 학습을 활용하여 ~ 1024x1024 영역의 다양한 비율로 모델을 학습했다. - -### Refinement Stage - -:::{figure-md} Figure 6 -fig_6 - -Figure 6 -::: - -경험적으로, 그림 6처럼 특정 부분 퀄리티가 낮은 샘플의 결과를 찾았다. 왼쪽 그림이 refinement stage 적용 전, 오른쪽 그림이 refinement stage를 적용한 그림이다. - -이를 해결하기 위해, 고품질, 고해상도 데이터에 특화된 latent space 내에서 별도의 LDM을 학습했다. 기본 모델의 샘플에 대해 SDEdit에서 도입한 노이즈 제거 과정을 사용했다. eDiff-I 방법을 따랐으며, 이를 첫 200 노이즈 스케일에 refinement 모델을 사용했다. inference에서, base SDXL에서 latent를 추출하고 바로 diffuse와 denoise를 refinement 모델에 넣었다. 이 스텝은 선택이지만 배경 및 사람 얼굴과 같은 디테일에서 향상된 결과(그림 6, 13)를 얻을 수 있었다. - -:::{figure-md} Figure 13 -fig_13 - -Figure 13 -::: +```{admonition} Information +- **Title:** SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis + +- **Reference** + - Paper: [https://arxiv.org/abs/2307.01952](https://arxiv.org/abs/2307.01952) + - Code: [https://github.com/Stability-AI/generative-models](https://github.com/Stability-AI/generative-models) + +- **Author:** Jun-Hyoung Lee + +- **Last updated on May. 31. 2023** +``` + +# SDXL + +## Abstract + +SDXL은 T2I latent diffusion 모델이다. Stable Diffusion과 비교하면, SDXL은 세 배 더 큰 규모의 UNet을 포함한다. 더 많은 attention 블록과 더 큰 cross attention context 가 SDXL에서 두 번째 text encoder로 사용되면서 모델 파라미터가 증가했다. 다수의 새로운 conditioning 방법과 다양한 비율에 맞도록 SDXL을 학습할 수 있도록 설계했다. 또한 후처리 방식의 image to image 기술을 사용해 SDXL의 생성 샘플의 시각적인 fidelity를 향상시킨 refinement model을 소개한다. SDXL은 대폭 향상된 성능을 보여준다. + +:::{figure-md} SDXL result +sdxl_result + +SDXL result +::: + +## Introduction + +세 가지 주요 기능이라 볼 수 있는데, + +1. 3배 더 큰 UNet backbone, +2. 어떤 형태의 추가 감독(supervision)없는 간단하면서도 효과적인 추가의 conditioning 기술 +3. noising-denoising 과정을 적용해 시각적 품질을 향상하는 latent를 생성할 수 있는 별개의 diffusion 기반 img-to-img refinement 모델을 포함한다. + +:::{figure-md} Figure 1 +fig_1 + +Figure 1 +::: + +그림 1에서 왼쪽 그림을 보면 추가의 refinement 단계를 추가해 성능을 높인 SDXL이 기존 SD보다 성능이 우수한 것을 확인할 수 있다. 오른쪽 그림은 아키텍처를 시각화했는데, 128x128 크기의 latent를 생성한다. 그 후 고해상도 refinement 모델을 활용하고 동일한 프롬프트를 활용해 첫 번째 단계에서 생성된 latent를 SDEdit을 적용한다. SDXL과 refinement 모델은 동일한 autoencoder를 사용한다. + +:::{figure-md} Table 1 +table_1 + +Table 1 +::: + +SD와 다르게 UNet 내의 transformer 블록의 heterogeneous 분포를 사용했다는 점이다. 테이블 1을 참고하면 highest feature level에서 transformer 블럭을 사용했고, lower level에서는 2, 10 개의 블럭을 사용했고, UNet에서 lowest level(8x downsampling)을 제거했다. text conditioning을 위한 pretrained 된 text encoder를 사용했다. 특히, CLIP Vit-L과 함께 OpenCLIP ViT-bigG를 사용했고, 채널 축에 두 번째 text encoder의 output을 concat 했다. 게다가 text input으로 모델에 condition을 주기 위해 cross attention 레이어를 사용했으며, 또 OpenCLIP로부터 pooled text embedding을 모델에 condition으로 추가했다. 이러한 변화는 UNet의 파라미터 사이즈가 2.6B로 증가했다. text encoder는 817M 파라미터를 가지고 있다. + +## 2.2 Micro-Conditioning + +:::{figure-md} Figure 2 +fig_2 + +Figure 2 +::: + +SD 1.4/1.5 같은 경우 512 픽셀 이하 크기의 이미지는 제외하고 학습을 시키거나, 너무 작은 이미지는 upscale하여 학습을 시켰다. 이는 학습할 때의 최소 크기가 정해지는 문제점이 발생한다. 따라서 성능을 저하시키거나, 일반화를 잘 못할 수 있다. + +그림 2를 보면 SDXL의 데이터 셋의 분포를 시각화해주는 그림이다. 제안된 size-conditiong 없이, 256x256 픽셀 크기 미만의 데이터가 39%나 달한다. upscale 하게 된다면 최종 결과물이 blur 한 결과를 가져와 좋지 않은 아티팩트가 생긴다. + +대신, 저자들은 원래의 이미지 해상도에서 UNet 모델에 condition을 주었다. 특히 어떠한 rescaling 전의 원래의 크기인 $c_\text{size}=(h_\text{original}, w_\text{original})$를 제공해 추가의 condition을 줄 수 있게 했다. UNet의 denoising 할 때의 condition으로 추가된다. + +Inference 때, 사용자가 size-conditioning을 통해 해상도를 정할 수 있다. 모델은 conditioning 크기를 해상도에 의존적인 이미지 feature과 연관시키도록 하는 방법을 학습했다. + +:::{figure-md} Figure 3 +fig_3 + +Figure 3 +::: + +또 ImageNet으로 평가를 진행해 size-conditiong에 대한 우수성을 입증했다. + +:::{figure-md} Table 2 +table_2 + +Table 2 +::: + +_CIN-512-only_ 는 512 미만의 이미지를 제외하고 학습을 시켰고(70k 장), _CIN-nocond_ 는 모든 ImageNet 이미지를 사용했으며, _CIN-size-cond_ 는 추가 size-condition을 사용했다. 표 2에서 보다시피 _CIN-size-cond_ 모델이 FID, IS 모두 높은 성능을 보였다. + +### Conditioning the Model on Cropping Parameters + +:::{figure-md} Figure 4 +fig_4 + +Figure 4 +::: + +그림 4에서 SD 같은 경우 고양이 머리가 잘려진 결과를 얻었다. 이러한 이유는 학습할 때, random cropping으로 인해 생성되었기 때문이다. + +이러한 문제를 해결하기 위해, 간단한 효과적인 방법을 제안한다. 데이터를 loading 할 때, 균등하게 $c_\text{top}$과 $c_\text{left}$ (높이 및 너비 축을 따라 왼쪽 상단 모서리에서 잘린 픽셀의 양을 지정하는 정수)를 샘플링한다. 그 후 Fourier feature 임베딩을 통해 conditioning 파라미터로써 모델에 입력한다. 위에서 언급한 size conditioning과 비슷하다. concat 된 임베딩 $c_\text{crop}$은 추가의 conditioning 파라미터로 사용된다. + +저자들은 LDM 뿐만 아니라 어떠한 DM에서도 사용될 수 있다고 강조한다. crop 및 size-conditioning은 쉽게 결합될 수 있다. 이러한 경우, crop 및 size-conditioning을 feature 임베딩을 채널 축에 concat 하고 UNet의 타임스텝 임베딩에 추가한다. + +## 2.3 Multi-Aspect Training + +일반적인 T2I 모델에서 결과물의 크기는 512x512, 1024x1024 로 얻을 수 있는데, 이는 현실 세계에서 부자연스럽다. 이유는 현실 세계에서는 다양한 크기, 비율을 가진 이미지가 많고, 풍경 같은 경우 16:9 비율의 크기를 지니고 있다. + +따라서, 다양한 비율을 동시에 다룰수 있도록 모델을 파인튜닝했다. 픽셀수를 1024x1024 만큼 수를 최대한 유지하면서 다양한 비율의 데이터를 사용했고, 64의 배수를 지니도록 했다. + +:::{figure-md} /Multi aspect ratio +multi_aspect_ratio + +Multi aspect ratio +::: + +최적화 동안, 학습 배치는 동일한 버킷(같은 비율의 이미지들?)의 이미지로 구성되며, 각 훈련 스텝마다 버킷 크기를 번갈아 가며 사용했다. 추가적으로, 모델은 버킷 크기(혹은 타겟 크기)를 conditioning으로 주었으며, 위에서 언급한 size, crop conditioning과 유사하게 Fourier 공간에 임베딩되는 $c_\text{ar}=(h_\text{tgt}, w_\text{tgt})$ 형태로 표현된다. + +실제로, 모델이 고정된 비율및 해상도의 데이터로 pretraining이 마친 후 파인튜닝 단계에서는 다양한 비율의 데이터로 학습했고, 채널 축으로 concat 하는 2.2절에서 소개한 conditioning 기술과 함께 결합했다. 이를 아래의 그림 16에서 코드로 확인할 수 있다. + +## 2.4 Improved Autoencoder + +SD는 LDM 중 하나이고, autoencoder의 latent space를 학습한다. semantic composition은 LDM으로부터 표현되지만 저자들은 local, high frequency 디테일한 부분을 향상하고자 autoencoder를 향상했다. 끝으로, 원래의 SD를 사용한 autoencoder 아키텍처에서 더 큰 배치사이즈(256 vs 9)로 학습했고 추가로 exponential moving average를 사용한 가중치를 사용했다. 결과 autoencoder의 성능이 reconstruction 메트릭에 좋은 결과를 가져왔다. + +:::{figure-md} Table 3 +table_3 + +Table 3 +::: + +## 2.5 Putting Everything Together + +학습 파라미터를 정리해주는 절입니다. diffusion time step은 1000 step을 사용했다. 우선, base model를 내부 데이터 셋으로 그림 2에 나와있는 높이-너비 분포에 맞게 학습을 시켰다. 600,000 step을 사용했으며, 256x256 사이즈로, 배치는 2048로, size & crop conditioning을 사용했다. 그 후 512x512 이미지를 추가로 200,000 최적화 step으로 학습시켰고, 마침내 offset 노이즈 [11, 25] 0.05 수준과 함께 다중 비율 학습을 활용하여 ~ 1024x1024 영역의 다양한 비율로 모델을 학습했다. + +### Refinement Stage + +:::{figure-md} Figure 6 +fig_6 + +Figure 6 +::: + +경험적으로, 그림 6처럼 특정 부분 퀄리티가 낮은 샘플의 결과를 찾았다. 왼쪽 그림이 refinement stage 적용 전, 오른쪽 그림이 refinement stage를 적용한 그림이다. + +이를 해결하기 위해, 고품질, 고해상도 데이터에 특화된 latent space 내에서 별도의 LDM을 학습했다. 기본 모델의 샘플에 대해 SDEdit에서 도입한 노이즈 제거 과정을 사용했다. eDiff-I 방법을 따랐으며, 이를 첫 200 노이즈 스케일에 refinement 모델을 사용했다. inference에서, base SDXL에서 latent를 추출하고 바로 diffuse와 denoise를 refinement 모델에 넣었다. 이 스텝은 선택이지만 배경 및 사람 얼굴과 같은 디테일에서 향상된 결과(그림 6, 13)를 얻을 수 있었다. + +:::{figure-md} Figure 13 +fig_13 + +Figure 13 +::: diff --git a/_sources/docs/review/StyO.md b/_sources/docs/review/StyO.md old mode 100644 new mode 100755 index 94e82323..63881073 --- a/_sources/docs/review/StyO.md +++ b/_sources/docs/review/StyO.md @@ -1,169 +1,169 @@ -```{admonition} Information -- **Title:** StyO: Stylize Your Face in Only One-Shot - -- **Reference** - - Paper: [https://arxiv.org/abs/2303.03231](https://arxiv.org/abs/2303.03231) - -- **Author:** Seunghwan Ji - -- **Last updated on Aug. 6, 2023** -``` -# StyO - -## Abstract - -- “**Sty**lize the face in only **O**ne-shot.” -- 한장의 이미지만으로 다른 이미지로 스타일을 Transfer! - -## 1. Introduction - -- 현재 다양한 분야에서 이미지에 특정 스타일을 입히고자하는 연구들이 활발히 진행중이다. -- 이전까지의 연구들은 대부분 각각의 source 이미지, target 이미지 한장씩을 사용해 GAN based model을 활용하려는 식이 주를 이루었다. -- 단 이러한 방식에는 한계가 있는데, - 1. Real Face를 학습한 pre-trained GAN 모델의 의존도가 너무 커서 Style을 입히기 힘들다. - 2. latent space안에서 Content 정보와 Style 정보가 Entangle 되어있다. -- **StyO는?** - - GAN 대신 Data의 Distribution을 더 잘 포용하는 Latent Diffusion Model을 Base모델로 채용한다. - - 총 2 Stage로 구성되는데 - 1. Identifier Disentanglement Learner(IDL) - - 이미지의 content 정보와 Style 정보를 분리 - 2. Fine-grained Content Controller(FCC) - - IDL로부터 분리된 Content와 Style을 원하는대로 재조합 - - 추가로 src 이미지의 detail한 정보(head-pose, hair color 등)를 유지하기위해 Generate 과정에서 src 이미지의 attention map을 재사용하는 trick을 제안했다. -- 이러한 StyO는 GAN based 모델에 비해 더 좋은 퀄리티의 이미지를 생성해내고, one-shot face stylization 분야에서 SOTA를 기록했다. - -## 2. Related Work - -### 2.1. Diffusion Model - -- GAN이 생성 분야를 장악하던 중 최근 DDPM의 등장으로 Diffusion 모델이 주목을 받기 시작했다. -- text prompt를 기반으로 manipulated image 생성이 가능해졌지만, detail한 부분까지 control하기에는 한계가 있었다. -- 이 때, StyO는 이미지의 fine한 style 정보까지 transfer 가능한 diffusion model이다. - -### 2.2. Face Stylization - -- 최근 GAN Based 생성 모델이 좋은 성능을 보이면서 styleGAN을 베이스로 하는 face image style transfer 모델이 좋은 성능을 보여주었다. -- 하지만 real face dataset을 학습한 pretrained checkpoint를 사용하고 이에 대한 의존성이 너무 커 artistic style 정보를 입히는데 한계를 보여준다. -- StyO는 이러한 한계를 개선한 결과를 보여준다. - -## 3. Method - -### 3.2. Framework of StyO -:::{figure-md} -StyO_00 - -Figure 1 -::: - -- image 간의 style transfer를 위해 **identifier disentaglement learner**과 **fine-grained content controller**를 제안한다. - -**IDL** - -- image의 content 정보와 style 정보를 분리하는 방향으로 학습이 진행 -- src 이미지는 `"a drawing with $S_{src}$ not $S_{tgt}$ style of $C_{src}$ not $C_{tgt}$ portrait"` prompt로 학습 (tgt 이미지는 반대) - -⇒ 이미지 간의 Style 정보와 Content 정보가 Disentangle 되고, $S_{src}$안에 이미지 A의 Style 정보가, $C_{tgt}$ 안에 src 이미지의 content 정보가 embedding 되도록 학습 - -- 이 때 $S_{src}$, $C_{src}$에 target 이미지의 conext 정보를 배제함과 동시에$S_{tgt}$, $C_{tgt}$에 포함하기위해 앞에 negator(=부정의 의미를 가진 단어)를 사용 - - *e.g*. *not, without, except …* -- src, tgt 이미지에 추가로 auxiliary 이미지 셋을 구성해 `“a drawing with $S_{src}$ not $S_{tgt}$ style of portrait”` prompt로 학습 - - $X_{aux}$ : FFHQ dataset에서 임의로 200장의 데이터를 sampling -- 효과 - 1. auxiliary 이미지를 학습함으로써 key prompt간 disentanglement를 향상 - 2. auxiliary 이미지에는 없는 src 이미지만의 정보를 $C_{src}$ 에 주입 - 3. src 이미지의 style과 tgt 이미지의 style을 구별하는데 도움을 줌 -- Full Loss - :::{figure-md} - StyO_01 - - Equation 1 - ::: - -- 이러한 IDL의 학습만으로 src 이미지와 tgt 이미지의 style transfer가 가능하다. - - `“a drawing with $S_{tgt}$ not $S_{src}$ style of $C_{src}$ not $C_{tgt}$ portrait”` - :::{figure-md} - StyO_02 - - Figure 2 - ::: - -- 하지만 위 이미지처럼 src 이미지의 content 정보(head-pose, facial feature)를 잃어버리는 경향이 있다. -- 이러한 문제점을 개선하기위해 **FCC**를 추가로 도입하였다. - -**FCC** - -- IDL로 분리된 content 정보와 style 정보를 원하는 방식으로 조합(Recombination)할 때 A의 Content 정보를 유지하도록 하는 Trick -1. Cross Attention Control - - LDM은 기본적으로 Text 정보를 생성 이미지에 주입하기위해 cross attention mechanism을 사용 - - $Attn(z, r) = M(z, r)V$, *z : image latent, r : text embedding* - - 이 때 “prompt-to-promt” paper에서 **attention map M의 값이 생성 이미지의 Layout에 강한 영향을 미친다**는 점을 확인 - - 따라서 src 이미지의 attention mask를 generate 과정에 주입합으로써 content 정보를 좀 더 잘 유지하도록 유도 - - 단, attention map의 모든 값을 replace하지않고, content에 관한 Index만 선택적으로 replace - - content index : '$C_{src}$`, `not`, `$C_{tgt}$`, `portrait` - :::{figure-md} - StyO_03 - - Equation 3 - ::: - -2. Augmented Text Prompt - - training time에서 key prompt를 n번 사용함으로서 생성되는 이미지에 context 정보를 강하게 주입 - - src 이미지는 `“a drawing with ($S_{src}$ not $S_{tgt}$) * $n_{s}$ style of ($C_{src}$ not $C_{tgt}$) * $n_{c}$ portrait”` (tgt 이미지는 반대) - - 실험상 hyperparameter $n_{s}$와 $n_{c}$는 3 이하의 값을 추천 - -## 4. Experiments - -**Implementation Details** - -- base model : Pretrained LDM model checkpoint (trained by LAION-5B) -- hyper parameter - - key prompt : “ak47”, “aug”, “sks”, m4a1” - - Learning rate : 1e-6 - - Optimizer : Adam - - train step : 400 - - $n_{s}$ : 3, $n_{c}$ : 1 - - 나머지는 LDM과 동일 - -**Comparison with SOTA methods** -:::{figure-md} -StyO_04 - -Figure 3 -::: - -- StyO가 src 이미지의 face identity와 local detail 모두 잘 유지함과 동시에, style 정보를 자연스럽게 입힌 결과물을 생성해낸다. -- User Study도 다른 모델들에 비해 좋은 결과를 보였다. - - :::{figure-md} - StyO_05 - - Table 1 - ::: - - -**Ablation Study** - -1. *Effect of Contrastive Disentangled Prompt Template* - - negative prompt 없이 positive prompt만 넣고 학습할경우 학습 이미지의 overfitting이 심하고, style과 content 정보의 분리에 어려움을 보인다. - :::{figure-md} - StyO_06 - - Figure 4 - ::: - - - 또, source 이미지의 local detail을 유지하기위해 auxiliary set의 trick도 적용하는것이 Best Quality의 결과물을 생성해냈다. -2. *Effect of Fine-grained Content Controller* - - FCC 없이 Inference할 경우 generated 이미지의 높은 diversity를 보이지만, FCC를 포함할 경우 src 이미지의 fidelity가 높아져 좀더 significant한 이미지가 생성되는것을 보여주었다. - :::{figure-md} - StyO_07 - - Figure 5 - ::: - -1. *Hyper-parameters in Augmented Text Prompt* - - $n_{s}$ 값이 커질수록 이미지가 photorealistic에서 artistic하게 바뀌고, $n_{c}$도 마찬가지로 값이 커질수록 src 이미지에 overfitting된 이미지가 나오는 경향을 보여주었다. - -## 5. Conclusion - -- StyO는 IDL과 FCC를 사용해 기존 GAN을 이용한 SOTA 모델들보다 더 자연스럽고 Quality 좋은 style transfered 이미지를 생성해낼 수 있었다. -- **단, style 하나의 transfer를 위해 single GPU로 10분이 걸리므로 time-efficiency가 좋지 못하다는 단점이 있다.** +```{admonition} Information +- **Title:** StyO: Stylize Your Face in Only One-Shot + +- **Reference** + - Paper: [https://arxiv.org/abs/2303.03231](https://arxiv.org/abs/2303.03231) + +- **Author:** Seunghwan Ji + +- **Last updated on Aug. 6, 2023** +``` +# StyO + +## Abstract + +- “**Sty**lize the face in only **O**ne-shot.” +- 한장의 이미지만으로 다른 이미지로 스타일을 Transfer! + +## 1. Introduction + +- 현재 다양한 분야에서 이미지에 특정 스타일을 입히고자하는 연구들이 활발히 진행중이다. +- 이전까지의 연구들은 대부분 각각의 source 이미지, target 이미지 한장씩을 사용해 GAN based model을 활용하려는 식이 주를 이루었다. +- 단 이러한 방식에는 한계가 있는데, + 1. Real Face를 학습한 pre-trained GAN 모델의 의존도가 너무 커서 Style을 입히기 힘들다. + 2. latent space안에서 Content 정보와 Style 정보가 Entangle 되어있다. +- **StyO는?** + - GAN 대신 Data의 Distribution을 더 잘 포용하는 Latent Diffusion Model을 Base모델로 채용한다. + - 총 2 Stage로 구성되는데 + 1. Identifier Disentanglement Learner(IDL) + - 이미지의 content 정보와 Style 정보를 분리 + 2. Fine-grained Content Controller(FCC) + - IDL로부터 분리된 Content와 Style을 원하는대로 재조합 + - 추가로 src 이미지의 detail한 정보(head-pose, hair color 등)를 유지하기위해 Generate 과정에서 src 이미지의 attention map을 재사용하는 trick을 제안했다. +- 이러한 StyO는 GAN based 모델에 비해 더 좋은 퀄리티의 이미지를 생성해내고, one-shot face stylization 분야에서 SOTA를 기록했다. + +## 2. Related Work + +### 2.1. Diffusion Model + +- GAN이 생성 분야를 장악하던 중 최근 DDPM의 등장으로 Diffusion 모델이 주목을 받기 시작했다. +- text prompt를 기반으로 manipulated image 생성이 가능해졌지만, detail한 부분까지 control하기에는 한계가 있었다. +- 이 때, StyO는 이미지의 fine한 style 정보까지 transfer 가능한 diffusion model이다. + +### 2.2. Face Stylization + +- 최근 GAN Based 생성 모델이 좋은 성능을 보이면서 styleGAN을 베이스로 하는 face image style transfer 모델이 좋은 성능을 보여주었다. +- 하지만 real face dataset을 학습한 pretrained checkpoint를 사용하고 이에 대한 의존성이 너무 커 artistic style 정보를 입히는데 한계를 보여준다. +- StyO는 이러한 한계를 개선한 결과를 보여준다. + +## 3. Method + +### 3.2. Framework of StyO +:::{figure-md} +StyO_00 + +Figure 1 +::: + +- image 간의 style transfer를 위해 **identifier disentaglement learner**과 **fine-grained content controller**를 제안한다. + +**IDL** + +- image의 content 정보와 style 정보를 분리하는 방향으로 학습이 진행 +- src 이미지는 `"a drawing with $S_{src}$ not $S_{tgt}$ style of $C_{src}$ not $C_{tgt}$ portrait"` prompt로 학습 (tgt 이미지는 반대) + +⇒ 이미지 간의 Style 정보와 Content 정보가 Disentangle 되고, $S_{src}$안에 이미지 A의 Style 정보가, $C_{tgt}$ 안에 src 이미지의 content 정보가 embedding 되도록 학습 + +- 이 때 $S_{src}$, $C_{src}$에 target 이미지의 conext 정보를 배제함과 동시에$S_{tgt}$, $C_{tgt}$에 포함하기위해 앞에 negator(=부정의 의미를 가진 단어)를 사용 + - *e.g*. *not, without, except …* +- src, tgt 이미지에 추가로 auxiliary 이미지 셋을 구성해 `“a drawing with $S_{src}$ not $S_{tgt}$ style of portrait”` prompt로 학습 + - $X_{aux}$ : FFHQ dataset에서 임의로 200장의 데이터를 sampling +- 효과 + 1. auxiliary 이미지를 학습함으로써 key prompt간 disentanglement를 향상 + 2. auxiliary 이미지에는 없는 src 이미지만의 정보를 $C_{src}$ 에 주입 + 3. src 이미지의 style과 tgt 이미지의 style을 구별하는데 도움을 줌 +- Full Loss + :::{figure-md} + StyO_01 + + Equation 1 + ::: + +- 이러한 IDL의 학습만으로 src 이미지와 tgt 이미지의 style transfer가 가능하다. + - `“a drawing with $S_{tgt}$ not $S_{src}$ style of $C_{src}$ not $C_{tgt}$ portrait”` + :::{figure-md} + StyO_02 + + Figure 2 + ::: + +- 하지만 위 이미지처럼 src 이미지의 content 정보(head-pose, facial feature)를 잃어버리는 경향이 있다. +- 이러한 문제점을 개선하기위해 **FCC**를 추가로 도입하였다. + +**FCC** + +- IDL로 분리된 content 정보와 style 정보를 원하는 방식으로 조합(Recombination)할 때 A의 Content 정보를 유지하도록 하는 Trick +1. Cross Attention Control + - LDM은 기본적으로 Text 정보를 생성 이미지에 주입하기위해 cross attention mechanism을 사용 + - $Attn(z, r) = M(z, r)V$, *z : image latent, r : text embedding* + - 이 때 “prompt-to-promt” paper에서 **attention map M의 값이 생성 이미지의 Layout에 강한 영향을 미친다**는 점을 확인 + - 따라서 src 이미지의 attention mask를 generate 과정에 주입합으로써 content 정보를 좀 더 잘 유지하도록 유도 + - 단, attention map의 모든 값을 replace하지않고, content에 관한 Index만 선택적으로 replace + - content index : '$C_{src}$`, `not`, `$C_{tgt}$`, `portrait` + :::{figure-md} + StyO_03 + + Equation 3 + ::: + +2. Augmented Text Prompt + - training time에서 key prompt를 n번 사용함으로서 생성되는 이미지에 context 정보를 강하게 주입 + - src 이미지는 `“a drawing with ($S_{src}$ not $S_{tgt}$) * $n_{s}$ style of ($C_{src}$ not $C_{tgt}$) * $n_{c}$ portrait”` (tgt 이미지는 반대) + - 실험상 hyperparameter $n_{s}$와 $n_{c}$는 3 이하의 값을 추천 + +## 4. Experiments + +**Implementation Details** + +- base model : Pretrained LDM model checkpoint (trained by LAION-5B) +- hyper parameter + - key prompt : “ak47”, “aug”, “sks”, m4a1” + - Learning rate : 1e-6 + - Optimizer : Adam + - train step : 400 + - $n_{s}$ : 3, $n_{c}$ : 1 + - 나머지는 LDM과 동일 + +**Comparison with SOTA methods** +:::{figure-md} +StyO_04 + +Figure 3 +::: + +- StyO가 src 이미지의 face identity와 local detail 모두 잘 유지함과 동시에, style 정보를 자연스럽게 입힌 결과물을 생성해낸다. +- User Study도 다른 모델들에 비해 좋은 결과를 보였다. + + :::{figure-md} + StyO_05 + + Table 1 + ::: + + +**Ablation Study** + +1. *Effect of Contrastive Disentangled Prompt Template* + - negative prompt 없이 positive prompt만 넣고 학습할경우 학습 이미지의 overfitting이 심하고, style과 content 정보의 분리에 어려움을 보인다. + :::{figure-md} + StyO_06 + + Figure 4 + ::: + + - 또, source 이미지의 local detail을 유지하기위해 auxiliary set의 trick도 적용하는것이 Best Quality의 결과물을 생성해냈다. +2. *Effect of Fine-grained Content Controller* + - FCC 없이 Inference할 경우 generated 이미지의 높은 diversity를 보이지만, FCC를 포함할 경우 src 이미지의 fidelity가 높아져 좀더 significant한 이미지가 생성되는것을 보여주었다. + :::{figure-md} + StyO_07 + + Figure 5 + ::: + +1. *Hyper-parameters in Augmented Text Prompt* + - $n_{s}$ 값이 커질수록 이미지가 photorealistic에서 artistic하게 바뀌고, $n_{c}$도 마찬가지로 값이 커질수록 src 이미지에 overfitting된 이미지가 나오는 경향을 보여주었다. + +## 5. Conclusion + +- StyO는 IDL과 FCC를 사용해 기존 GAN을 이용한 SOTA 모델들보다 더 자연스럽고 Quality 좋은 style transfered 이미지를 생성해낼 수 있었다. +- **단, style 하나의 transfer를 위해 single GPU로 10분이 걸리므로 time-efficiency가 좋지 못하다는 단점이 있다.** diff --git a/_sources/docs/review/StyleGAN.md b/_sources/docs/review/StyleGAN.md old mode 100644 new mode 100755 index 9f86ec6d..432e8c58 --- a/_sources/docs/review/StyleGAN.md +++ b/_sources/docs/review/StyleGAN.md @@ -1,171 +1,171 @@ -```{admonition} Information -- **Title:** A Style-Based Generator Architecture for Generative Adversarial Networks (CVPR 2019) - -- **Reference** - - Paper: [https://arxiv.org/abs/1812.04948](https://arxiv.org/abs/1812.04948) - - Code: [https://github.com/huangzh13/StyleGAN.pytorch](https://github.com/huangzh13/StyleGAN.pytorch) - -- **Author:** Jisu Kim - -- **Last updated on Apr. 12, 2023** -``` - -# StyleGAN - -오늘 알아볼 모델은 StyleGAN입니다. 기존에 다뤘던 GAN과 같이 이미지를 생성하는 모델입니다. generator 구조를 변경함으로써 성능을 올리고 feature의 control이 가능하게 했습니다. loss나 discriminator 구조 개선에 관한 논문은 아닙니다. 먼저 결과를 보도록 하죠. - -:::{figure-md} -stylegan_01 - -Images generated by StyleGAN -::: - -이 논문의 contribution은 다음과 같습니다. - -1. 새로운 구조를 제안하여 성능을 높이면서 feature의 control이 가능해졌습니다. -2. 새로운 데이터셋을 제안했습니다. (FFHQ) - -이 중에서 첫 번째 contribution을 자세히 보도록 하겠습니다. 논문의 abstract에는 다음과 같은 문장이 있습니다. - -> The new architecture leads to an automatically learned, **unsupervised separation of high-level attributes** (e.g., pose and identity when trained on human faces) and stochastic variation in the generated images (e.g., freckles, hair), and it enables intuitive, scale-specific control of the synthesis. -> - -논문에서 제안한 새로운 generator 구조가 할 수 있는 일을 설명하는 부분입니다. 여기서 보시면 high level attribute의 separation이 가능하다고 얘기하고 있습니다. 저는 개인적으로 이 부분이 StyleGAN의 가장 중요한 특징이라고 생각합니다. - -생성 모델로 이미지를 생성하고자 할 때, 사용자는 어떠한 목적을 가지고 자신이 원하는 이미지를 만들고자 할 것입니다. 이미지의 품질이 좋더라도 모델이 사용자의 의도와 상관없는 랜덤한 이미지를 내뱉어준다면 그 모델의 실용성이 좋다고 할 수 없을 것입니다. 근래에 Text-to-Image 모델들이 인기를 얻었던 이유도 누구나 쉽게 텍스트를 통해서 생성되는 이미지를 조절할 수 있다는 점도 한몫했다고 생각합니다. StyleGAN은 그런 controllability를 어느 정도 가능하게 한 모델이라는 측면에서 의미있다고 생각합니다. - -StyleGAN의 구조는 아래 그림과 같습니다. synthesis network는 해상도를 4x4에서 시작해서 1024x1024까지 높여줍니다. 최종적으로 1024x1024 해상도를 가지는 이미지를 갖게됩니다. 아래 구조를 보면 기존 GAN하고 비교해서 특이한 점이 세 가지 있습니다. - -1. z를 input으로 받는 mapping network - -2. style과 AdaIN - -3. noise와 B (stochastic variation) - -이 각각에 대해서 알아보도록 합시다. - -:::{figure-md} -stylegan_02 - -Structure of StyleGAN -::: - -## Mapping Network - -:::{figure-md} -stylegan_03 - -Mappings with $w$ and without $w$ -::: - -기존 GAN을 생각해보면 z를 input으로 받아서 generator를 거쳐서 이미지를 생성하는 구조입니다. 이 z는 보통 Gaussian distribution에서 샘플링으로 얻습니다. GAN은 학습을 통해 Gaussian distribution을 data distribution으로 보내는 방법을 배우게 될 것이고, 이 분포는 (b)처럼 생기게 될 것입니다. 그런데 데이터가 (a)처럼 주어져서 특정한 데이터가 없거나 적을 수도 있을 것입니다. 예를 들어, 데이터에 피부가 희면서 머리가 긴 샘플들이 없다고 해봅시다. 그러면 피부색과 머리 길이라는 두 feature는 서로 얽히게(entangled)되어, 하나를 바꿀 때 다른 하나도 같이 바뀌는 현상이 일어나게 됩니다. 이런 현상을 완화하기 위해 논문에서는 Gaussian에서 뽑은 z를 바로 사용하는 것이 아니라 mapping network를 통해 learnable distribution에서 뽑은 w를 사용합니다. - -## Style and AdaIN - -instance normalization은 샘플 하나의 각 채널마다 정규화를 취해주는 방법입니다. - -:::{figure-md} -stylegan_04 - -Normalization methods -::: - -adaptive instance normalization (AdaIN) 은 instance normalization에 scale을 곱해주고 bias를 더해주는 형태입니다. 그런데 이 scale과 bias가 style vector의 linear transformation으로 주어지는 형태입니다. linear layer를 통해서 w는 $\mathbf{y}=(\mathbf{y}_{s},\mathbf{y}_{b})$로 보내지게 됩니다. AdaIN의 수식은 아래와 같습니다. - -$$ -AdaIN(\mathbf{x}_{i},\mathbf{y})=\mathbf{y}_{s,i}\frac{\mathbf{x}_{i}-\mu(\mathbf{x}_{i})}{\sigma(\mathbf{x}_{i})}+\mathbf{y}_{b,i} -$$ - -AdaIN은 각 블록마다 두 개씩 들어가서 style은 총 열여덟 번 AdaIN을 통해 generator에 들어가게 됩니다. AdaIN은 localization이라는 특징과도 연관이 있습니다. 여기서 말하는 localization이란 열여덟 개의 style 중에서 일부를 바꿈으로써 이미지의 일부 특징들을 바꿀 수 있다는 의미입니다. AdaIN은 각 convolution layer 다음에 적용이 됩니다. 이 때 feature map들은 normalization되고 style에 의해 새로운 statistics를 가지게 됩니다. style은 하나의 convolution에 적용되고, 다음 convolution에서 다시 normalization이 수행되기 때문에 이전 layer에 적용된 style과 다음 layer에 적용된 style이 분리되게 학습될 수 있습니다. - -관련 코드 - -```python -class StyleMod(nn.Module): - def __init__(self, latent_size, channels, use_wscale): - super(StyleMod, self).__init__() - self.lin = EqualizedLinear(latent_size, - channels * 2, - gain=1.0, use_wscale=use_wscale) - - def forward(self, x, latent): - style = self.lin(latent) # style => [batch_size, n_channels*2] - - shape = [-1, 2, x.size(1)] + (x.dim() - 2) * [1] - style = style.view(shape) # [batch_size, 2, n_channels, ...] - x = x * (style[:, 0] + 1.) + style[:, 1] - return x - -class LayerEpilogue(nn.Module): - """Things to do at the end of each layer.""" - - def __init__(self, channels, dlatent_size, use_wscale, - use_noise, use_pixel_norm, use_instance_norm, use_styles, activation_layer): - super().__init__() - - layers = [] - if use_noise: - layers.append(('noise', NoiseLayer(channels))) - layers.append(('activation', activation_layer)) - if use_pixel_norm: - layers.append(('pixel_norm', PixelNormLayer())) - if use_instance_norm: - layers.append(('instance_norm', nn.InstanceNorm2d(channels))) - - self.top_epi = nn.Sequential(OrderedDict(layers)) - - if use_styles: - self.style_mod = StyleMod(dlatent_size, channels, use_wscale=use_wscale) - else: - self.style_mod = None - - def forward(self, x, dlatents_in_slice=None): - x = self.top_epi(x) - if self.style_mod is not None: - x = self.style_mod(x, dlatents_in_slice) - else: - assert dlatents_in_slice is None - return x -``` - -code from [https://github.com/huangzh13/StyleGAN.pytorch](https://github.com/huangzh13/StyleGAN.pytorch) - -아래 그림은 source A의 style 중 일부를 source B의 style로 변경해서 만든 이미지들입니다. style은 총 18곳에서 사용되는데 처음 4곳 ($4^2 - 8^2$)을 coarse, 그다음 4곳 ($16^2-32^2$)을 middle, 마지막 10곳 ($64^2-1024^2$)을 fine style로 정의하였습니다. 그림을 보시면 윗 부분에서는 포즈나 전체적인 머리 스타일같이 coarse style은 source B의 것을 유지하고, 아래로 갈수록 source A의 큰 틀을 유지하면서 세부적인 부분들을 B에서 가져왔음을 볼 수 있습니다. - -:::{figure-md} -stylegan_05 - -Mixing two styles -::: - -## Stochastic Variation - -한 사람의 이미지 안에는 확률적으로 바뀔 수 있는 부분이 있습니다. (주근깨, 머릿결, 피부) 이를 모델링하기 위해서 noise를 추가적인 input으로 사용하여 각 convolution layer 다음에 더해집니다. 아래 그림에서 (a)의 생성된 한 사람의 이미지 안에서도 디테일들은 (b)와 같이 달라질 수 있습니다. (c)와 같이 standard deviation을 구해봤을 때 얼굴형과 같은 attribute는 변하지않지만 noise에 의해서 머리카락과 같은 부분은 variation이 생김을 볼 수 있습니다. - -:::{figure-md} -stylegan_06 - -Examples of stochastic variation -::: - -아래 그림에서 (a)는 모든 layer에 noise를 준 경우, (b)는 noise를 주지 않은 경우, (c)는 fine layers ($64^2 - 1024^2$)에만 noise를 준 경우, (d)는 coarse layers ($4^2 - 32^2$)에만 noise를 준 경우입니다. (b)를 보면 noise가 없을 경우 머리카락같은 디테일이 제대로 살아있지 않은 것을 볼 수 있습니다. (c)와 (d)를 보면 fine layers에 들어간 noise가 머리카락의 더 세밀한 부분에 영향을 끼친다는 것을 볼 수 있습니다. - -:::{figure-md} -stylegan_07 - -Effect of noise inputs at different layers -::: - -## Mixing Regularization - -논문에서는 localization이 더 잘 되게하기 위해 style mixing이라는 방법을 훈련에 사용합니다. 두 개의 style vector $\mathbf{w}_{1},\mathbf{w}_{2}$를 사용하여 앞 쪽 layer에는 $\mathbf{w}_{1}$을, 뒤 쪽 layer에는 $\mathbf{w}_{2}$를 사용하는 방법입니다. 이는 generator가 인접한 style끼리 correlated되어있다고 학습하는 것을 막아서 localization을 더 잘 되게 하는 목적입니다. - -## 실험 결과 - -마지막으로 저자들이 제안한 방법들이 실제로 효과가 있었는지 확인해봅시다. 아래 표와 같이 실험적으로 보았을 때 저자들이 제안한 방법들을 모두 사용한 경우 FID가 가장 우수하게 나왔습니다. - -:::{figure-md} -stylegan_08 - -FID for various generator designs -::: +```{admonition} Information +- **Title:** A Style-Based Generator Architecture for Generative Adversarial Networks (CVPR 2019) + +- **Reference** + - Paper: [https://arxiv.org/abs/1812.04948](https://arxiv.org/abs/1812.04948) + - Code: [https://github.com/huangzh13/StyleGAN.pytorch](https://github.com/huangzh13/StyleGAN.pytorch) + +- **Author:** Jisu Kim + +- **Last updated on Apr. 12, 2023** +``` + +# StyleGAN + +오늘 알아볼 모델은 StyleGAN입니다. 기존에 다뤘던 GAN과 같이 이미지를 생성하는 모델입니다. generator 구조를 변경함으로써 성능을 올리고 feature의 control이 가능하게 했습니다. loss나 discriminator 구조 개선에 관한 논문은 아닙니다. 먼저 결과를 보도록 하죠. + +:::{figure-md} +stylegan_01 + +Images generated by StyleGAN +::: + +이 논문의 contribution은 다음과 같습니다. + +1. 새로운 구조를 제안하여 성능을 높이면서 feature의 control이 가능해졌습니다. +2. 새로운 데이터셋을 제안했습니다. (FFHQ) + +이 중에서 첫 번째 contribution을 자세히 보도록 하겠습니다. 논문의 abstract에는 다음과 같은 문장이 있습니다. + +> The new architecture leads to an automatically learned, **unsupervised separation of high-level attributes** (e.g., pose and identity when trained on human faces) and stochastic variation in the generated images (e.g., freckles, hair), and it enables intuitive, scale-specific control of the synthesis. +> + +논문에서 제안한 새로운 generator 구조가 할 수 있는 일을 설명하는 부분입니다. 여기서 보시면 high level attribute의 separation이 가능하다고 얘기하고 있습니다. 저는 개인적으로 이 부분이 StyleGAN의 가장 중요한 특징이라고 생각합니다. + +생성 모델로 이미지를 생성하고자 할 때, 사용자는 어떠한 목적을 가지고 자신이 원하는 이미지를 만들고자 할 것입니다. 이미지의 품질이 좋더라도 모델이 사용자의 의도와 상관없는 랜덤한 이미지를 내뱉어준다면 그 모델의 실용성이 좋다고 할 수 없을 것입니다. 근래에 Text-to-Image 모델들이 인기를 얻었던 이유도 누구나 쉽게 텍스트를 통해서 생성되는 이미지를 조절할 수 있다는 점도 한몫했다고 생각합니다. StyleGAN은 그런 controllability를 어느 정도 가능하게 한 모델이라는 측면에서 의미있다고 생각합니다. + +StyleGAN의 구조는 아래 그림과 같습니다. synthesis network는 해상도를 4x4에서 시작해서 1024x1024까지 높여줍니다. 최종적으로 1024x1024 해상도를 가지는 이미지를 갖게됩니다. 아래 구조를 보면 기존 GAN하고 비교해서 특이한 점이 세 가지 있습니다. + +1. z를 input으로 받는 mapping network + +2. style과 AdaIN + +3. noise와 B (stochastic variation) + +이 각각에 대해서 알아보도록 합시다. + +:::{figure-md} +stylegan_02 + +Structure of StyleGAN +::: + +## Mapping Network + +:::{figure-md} +stylegan_03 + +Mappings with $w$ and without $w$ +::: + +기존 GAN을 생각해보면 z를 input으로 받아서 generator를 거쳐서 이미지를 생성하는 구조입니다. 이 z는 보통 Gaussian distribution에서 샘플링으로 얻습니다. GAN은 학습을 통해 Gaussian distribution을 data distribution으로 보내는 방법을 배우게 될 것이고, 이 분포는 (b)처럼 생기게 될 것입니다. 그런데 데이터가 (a)처럼 주어져서 특정한 데이터가 없거나 적을 수도 있을 것입니다. 예를 들어, 데이터에 피부가 희면서 머리가 긴 샘플들이 없다고 해봅시다. 그러면 피부색과 머리 길이라는 두 feature는 서로 얽히게(entangled)되어, 하나를 바꿀 때 다른 하나도 같이 바뀌는 현상이 일어나게 됩니다. 이런 현상을 완화하기 위해 논문에서는 Gaussian에서 뽑은 z를 바로 사용하는 것이 아니라 mapping network를 통해 learnable distribution에서 뽑은 w를 사용합니다. + +## Style and AdaIN + +instance normalization은 샘플 하나의 각 채널마다 정규화를 취해주는 방법입니다. + +:::{figure-md} +stylegan_04 + +Normalization methods +::: + +adaptive instance normalization (AdaIN) 은 instance normalization에 scale을 곱해주고 bias를 더해주는 형태입니다. 그런데 이 scale과 bias가 style vector의 linear transformation으로 주어지는 형태입니다. linear layer를 통해서 w는 $\mathbf{y}=(\mathbf{y}_{s},\mathbf{y}_{b})$로 보내지게 됩니다. AdaIN의 수식은 아래와 같습니다. + +$$ +AdaIN(\mathbf{x}_{i},\mathbf{y})=\mathbf{y}_{s,i}\frac{\mathbf{x}_{i}-\mu(\mathbf{x}_{i})}{\sigma(\mathbf{x}_{i})}+\mathbf{y}_{b,i} +$$ + +AdaIN은 각 블록마다 두 개씩 들어가서 style은 총 열여덟 번 AdaIN을 통해 generator에 들어가게 됩니다. AdaIN은 localization이라는 특징과도 연관이 있습니다. 여기서 말하는 localization이란 열여덟 개의 style 중에서 일부를 바꿈으로써 이미지의 일부 특징들을 바꿀 수 있다는 의미입니다. AdaIN은 각 convolution layer 다음에 적용이 됩니다. 이 때 feature map들은 normalization되고 style에 의해 새로운 statistics를 가지게 됩니다. style은 하나의 convolution에 적용되고, 다음 convolution에서 다시 normalization이 수행되기 때문에 이전 layer에 적용된 style과 다음 layer에 적용된 style이 분리되게 학습될 수 있습니다. + +관련 코드 + +```python +class StyleMod(nn.Module): + def __init__(self, latent_size, channels, use_wscale): + super(StyleMod, self).__init__() + self.lin = EqualizedLinear(latent_size, + channels * 2, + gain=1.0, use_wscale=use_wscale) + + def forward(self, x, latent): + style = self.lin(latent) # style => [batch_size, n_channels*2] + + shape = [-1, 2, x.size(1)] + (x.dim() - 2) * [1] + style = style.view(shape) # [batch_size, 2, n_channels, ...] + x = x * (style[:, 0] + 1.) + style[:, 1] + return x + +class LayerEpilogue(nn.Module): + """Things to do at the end of each layer.""" + + def __init__(self, channels, dlatent_size, use_wscale, + use_noise, use_pixel_norm, use_instance_norm, use_styles, activation_layer): + super().__init__() + + layers = [] + if use_noise: + layers.append(('noise', NoiseLayer(channels))) + layers.append(('activation', activation_layer)) + if use_pixel_norm: + layers.append(('pixel_norm', PixelNormLayer())) + if use_instance_norm: + layers.append(('instance_norm', nn.InstanceNorm2d(channels))) + + self.top_epi = nn.Sequential(OrderedDict(layers)) + + if use_styles: + self.style_mod = StyleMod(dlatent_size, channels, use_wscale=use_wscale) + else: + self.style_mod = None + + def forward(self, x, dlatents_in_slice=None): + x = self.top_epi(x) + if self.style_mod is not None: + x = self.style_mod(x, dlatents_in_slice) + else: + assert dlatents_in_slice is None + return x +``` + +code from [https://github.com/huangzh13/StyleGAN.pytorch](https://github.com/huangzh13/StyleGAN.pytorch) + +아래 그림은 source A의 style 중 일부를 source B의 style로 변경해서 만든 이미지들입니다. style은 총 18곳에서 사용되는데 처음 4곳 ($4^2 - 8^2$)을 coarse, 그다음 4곳 ($16^2-32^2$)을 middle, 마지막 10곳 ($64^2-1024^2$)을 fine style로 정의하였습니다. 그림을 보시면 윗 부분에서는 포즈나 전체적인 머리 스타일같이 coarse style은 source B의 것을 유지하고, 아래로 갈수록 source A의 큰 틀을 유지하면서 세부적인 부분들을 B에서 가져왔음을 볼 수 있습니다. + +:::{figure-md} +stylegan_05 + +Mixing two styles +::: + +## Stochastic Variation + +한 사람의 이미지 안에는 확률적으로 바뀔 수 있는 부분이 있습니다. (주근깨, 머릿결, 피부) 이를 모델링하기 위해서 noise를 추가적인 input으로 사용하여 각 convolution layer 다음에 더해집니다. 아래 그림에서 (a)의 생성된 한 사람의 이미지 안에서도 디테일들은 (b)와 같이 달라질 수 있습니다. (c)와 같이 standard deviation을 구해봤을 때 얼굴형과 같은 attribute는 변하지않지만 noise에 의해서 머리카락과 같은 부분은 variation이 생김을 볼 수 있습니다. + +:::{figure-md} +stylegan_06 + +Examples of stochastic variation +::: + +아래 그림에서 (a)는 모든 layer에 noise를 준 경우, (b)는 noise를 주지 않은 경우, (c)는 fine layers ($64^2 - 1024^2$)에만 noise를 준 경우, (d)는 coarse layers ($4^2 - 32^2$)에만 noise를 준 경우입니다. (b)를 보면 noise가 없을 경우 머리카락같은 디테일이 제대로 살아있지 않은 것을 볼 수 있습니다. (c)와 (d)를 보면 fine layers에 들어간 noise가 머리카락의 더 세밀한 부분에 영향을 끼친다는 것을 볼 수 있습니다. + +:::{figure-md} +stylegan_07 + +Effect of noise inputs at different layers +::: + +## Mixing Regularization + +논문에서는 localization이 더 잘 되게하기 위해 style mixing이라는 방법을 훈련에 사용합니다. 두 개의 style vector $\mathbf{w}_{1},\mathbf{w}_{2}$를 사용하여 앞 쪽 layer에는 $\mathbf{w}_{1}$을, 뒤 쪽 layer에는 $\mathbf{w}_{2}$를 사용하는 방법입니다. 이는 generator가 인접한 style끼리 correlated되어있다고 학습하는 것을 막아서 localization을 더 잘 되게 하는 목적입니다. + +## 실험 결과 + +마지막으로 저자들이 제안한 방법들이 실제로 효과가 있었는지 확인해봅시다. 아래 표와 같이 실험적으로 보았을 때 저자들이 제안한 방법들을 모두 사용한 경우 FID가 가장 우수하게 나왔습니다. + +:::{figure-md} +stylegan_08 + +FID for various generator designs +::: diff --git a/_sources/docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification.md b/_sources/docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification.md old mode 100644 new mode 100755 index 671f43ae..231cd96b --- a/_sources/docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification.md +++ b/_sources/docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification.md @@ -1,256 +1,256 @@ -```{admonition} Information -- **Title:** Synthetic Data from Diffusion Models Improves ImageNet Classification - -- **Reference** - - Paper: [https://arxiv.org/abs/2304.08466](https://arxiv.org/abs/2303.03231) - -- **Author:** [Jeonghwa Yoo](https://www.linkedin.com/in/jeonghwa-yoo-8403a716b) - -- **Last updated on Oct. 25, 2023** -``` - -# Synthetic Data from Diffusion Models Improves ImageNet Classification - -이번에 리뷰할 논문은 구글 리서치 그룹에서 TMLR(Transactions on Machine Learning Research) 2023에 제출한 논문인 [Synthetic Data from Diffusion Models Improves ImageNet Classification](https://arxiv.org/abs/2304.08466)입니다. - -생성 모델이 놀라운 속도로 발전하고 있는데요! 해당 논문에서는 생성 모델의 수준이 얼만큼 왔는지, 복잡한 이미지 데이터인 ImageNet 데이터에 대해서도 충분한 퀄리티의 데이터를 생성할 수 있는 정도가 되었는지, 그래서 이 생성된 데이터를 augment된 데이터로 사용할 수 있는 정도까지 왔는지에 대한 실험과 답을 제시합니다. 이 글의 목차는 논문 내용과 동일하게 구성하였습니다. - - - - -본 논문에서는 기술적으로 엄청 새로운 내용은 없는데요! 다만 보통 사전학습된 text-to-image diffusion 모델을 사용하던 기존 방법들과는 달리 Imagen을 ImageNet에 대해 파인튜닝 했다는 것이 새롭습니다. - - -# 1. Introduction -Diffusion 모델의 등장으로 생성 기술이 크게 발전되었습니다. 현재 생성 기술 수준이 data augmentation으로 사용될 수 있을 만큼의 자연스러운 이미지를 생성하는 것도 가능할까?에 대한 질문이 나오는 것은 당연하고, 본 논문에서는 이에 대한 답을 찾고자 했습니다. 먼저 이 질문에 대한 답을 이야기 하면 아래와 같습니다. -- 결과 요약 - - ImageNet에 대해 fine-tuning된 Imagen이 FID, Inception Score, CAS 성능에 대해 SOTA 성능을 달성 하였다. - - 합성 데이터와 실제 데이터를 결합하여 사용하고, 합성 데이터의 양이 많고, 훈련 시간이 길수록 생성 데이터로 훈련된 모델의 성능이 더욱 향상되었다. - - :::{figure-md} - improved_imagenet_classification_00 - - 위 그림: 합성 데이터로만 학습된 모델 분류 성능과 진짜 데이터로 학습된 모델의 분류 성능 비교 \\ - 아래 그림: 합성 및 진짜 데이터를 사용하였을 때의 분류 성능과 진짜 데이터로 학습된 모델의 분류 성능 비교 - ::: - - -위의 그림에서 볼 수 있듯이 합성 데이터로만 학습한 모델의 정확도와 실제 데이터로 학습한 모델의 정확도를 비교했을 때, 다른 모델들에 비해 본 논문에서 제안한 모델이 훨씬 성능 차이가 적다는 것을 알 수 있습니다. 또한, 아래 그림을 보면, 실제 데이터와 생성된 데이터를 더해서 학습했을 경우에는 ResNet 기반 모델과 Transformer 기반 모델들에서 모두 실제 데이터를 사용했을 때보다 성능 향상이 있었습니다. - - -# 2. Related Work -생성 모델을 이용해 data augmentation을 하려고 했던 기존 방법들에 대해 짧게 이야기 햐려고 합니다. 최근에는 large-scale text-to-image 모델들이 학습 데이터를 보강하는데 사용되기 시작했습니다. - -그 예로 "[Is synthetic data from generative models ready for image recognition?](https://arxiv.org/abs/2210.07574)" 논문이 있습니다. 해당 논문에서는 GLIDE로 생성된 합성 데이터가 zero-shot과 few-shot 이미지 분류 성능을 향상 시켰으며, CIFAR-100 이미지에서 GLIDE를 fine-tuning하여 생성된 합성 데이터 세트가 CIFAR-100의 분류 정확도를 크게 향상 시켰다고 이야기 합니다. - -하지만, 위의 논문을 포함해서 기존의 논문들은 이런 생성 모델을 이용해서 data augmentation을 하여도 ImageNet validation set에 대해서는 성능을 향상 시키지 못했습니다. 또한, 기존에 논문들은 pretrained Stable Diffusion 모델을 사용하고, fine-tuning은 하지 않았습니다. 본 논문에서는 기존 논문들과는 다르게 Imagen을 ImageNet에 잘 동작하고 fine-tuning을 하였고, 그 결과 ImageNet validation set에 대해서도 성능을 향상 시킬 수 있었습니다. - - -# 3. Background - -본 논문에서는 Classification Accuracy Scores(CAS)라는 성능 지표를 소개합니다. FID와 Inception Score는 생성 모델의 성능 지표로 워낙 많이 쓰여서 설명은 생략하고, CAS에 대해서는 논문에서 써져 있는 내용으로 소개하겠습니다. - -CAS는 FID와 Inception Score와 마찬가지로 생성 모델이 만들어낸 샘플의 품질을 평가하는 방법으로 제안 된 성능 지표입니다. 이것은 '합성 데이터'로만 훈련된 ResNet-50 모델에 대한 ImageNet validation set에 대한 분류 성능을 의미합니다. 먼저, 생성 모델을 통해 ImageNet 데이터에 대한 합성 데이터를 만들어냅니다. 그리고 이 합성 데이터만을 이용하여 ResNet-50을 훈련 시키고, 그 훈련된 모델의 실제 ImageNet validation set에 대해 분류 성능이 CAS가 됩니다. 만약 합성 데이터가 실제 ImageNet과 비슷하다면 그 합성 데이터로 학습된 모델은 실제 ImageNet validation set에 대해 좋은 분류 성능을 보일 것이라는 가정을 이용한 성능 지표라고 이해하면 될 것 같습니다. - -저자에 의하면 그동안 생성모델의 CAS 성능은 좋지 않았다고 합니다. 생성된 샘플로만 훈련된 모델은 실제 데이터로 훈련된 모델보다 성능이 떨어졌고 (이는 당연해보입니다), 실제 데이터에 합성 데이터를 추가하면 성능이 떨어졌다고 합니다. 이는 아마도 생성된 샘플의 품질, 다양성 등이 원인일 수 있을 것이라고 합니다. - - -# 4. Generative Model Training and Sampling - -여기서는 실제로 저자들이 어떻게 text-to-image diffusion 모델을 학습하고, 샘플링을 하였는지에 대한 설명을 합니다. - -먼저 저자들은 text-to-image diffusion 모델로는 Imagen을 사용하였습니다. Text-to-image 모델을 어떻게 ImageNet 클래스와 alignment 할 지에 대한 고민이 필요했다고 합니다. 처음에는 CLIP에서 사용한 방법과 유사하게 짧은 텍스트를 ImageNet 클래스의 텍스트 프롬프트로 사용했다고 하였는데 이 경우에 성능이 좋지 않았다고 합니다. 이는 Imagen에서 high guidance weight를 사용하여 샘플의 다양성이 저하 되면서 생기는 현상일 수 있다고 합니다. 따라서, 저자들은 프롬프트를 한 두단어 클래스 이름으로 수정하고, 모델의 weight와 sampling parameter를 fine-tuning 했다고 합니다. - -:::{figure-md} -improved_imagenet_classification_01 - -Figure 2 - -::: - -왼쪽 그림이 fine-tuning이 적용된 Imagen이 만들어낸 이미지고, 오른쪽이 fine-tuning이 적용되지 않은 Imagen입니다. 아래에서 두 번째 클래스인 Schipperke를 보면, 이것은 스키퍼키라는 개 품종을 의미하는데 fine-tuning이 적용되지 않은 Imagen의 경우는 꽃과 같은 전혀 엉뚱한 이미지를 만들고 있는 것을 볼 수 있습니다. - -## 4.1. Imagen Fine-tuning - -이 부분은 Imagen을 어떻게 fine-tuning 했는지를 설명하는 부분입니다. - -먼저 Imagen 구조는 아래와 같습니다. - -:::{figure-md} -improved_imagenet_classification_02 - -Imagen 구조 - -::: - - -본 논문에서는 위의 Imagen 구조에서 빨간 원으로 표시된 부분에 대해서만 fine-tuning 했습니다. Frozen Text Encoder의 경우는 원래 Imagen에서도 학습을 하지 않는 부분이라 마찬가지로 학습을 하지 않았고, 1024x1024 Image를 출력으로 하는 마지막 Super-Resolution Diffusion Model의 경우 ImageNet에 고해상도의 데이터가 적어서 fine-tuning을 하지 않았다고 합니다. - -64x64 모델의 경우는 210K step 정도 학습하였고, optimizer의 경우는 Imagen에서 사용하였던 Adafactor optimizer를 사용하였다고 합니다. 64x64 → 256x256 super-resolution 모델의 경우는 490K step 정도 하였고, Adam optimizer를 사용하였다고 합니다. - -최적의 모델 선택의 기준으로는 기본 Imagen sampler와 ImageNet-1K validation set에 대해 10K개의 샘플들에 대해 FID score를 계산했을 때 가장 좋은 성능의 모델을 선택했다고 합니다. - - -## 4.2. Sampling Parameters -이 부분은 본 논문에서 sampling parameter는 어떻게 정했는지를 설명하는 부분입니다. 먼저, Text-conditioned diffusion model 샘플링의 품질, 다양성, 속도는 디퓨전 스텝 수, noise condition augmentation, guidance weight for classifier-free guidance, log-variance mixing coefficient 등에 대해 큰 영향을 받는다고 합니다. - -각각에 대해 간단하게 설명하면 아래와 같습니다. - -- Noise condition augmentation: - - 이미지 생성 과정에서 확률적인 요소를 도입하여 생성된 이미지의 다양성을 증가시키는 기술. 일반적으로, 모델은 잠재 공간의 랜덤한 노이즈를 입력으로 받아 다양한 이미지를 생성하게 됨. 이것은 생성된 이미지가 조금씩 다른 것으로 보이게 만들며, 더 다양한 결과를 얻을 수 있게 함 (자세한 내용은 "[Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding](https://arxiv.org/abs/2205.11487)"를 참고해주세요) -
- -- Guidance weight for classifier-free guidance: - - "Classifier-free guidance"는 이미지를 생성하는 데 분류기나 특정 지표 없이 외부 정보를 사용한다는 것. "Guidance weights"는 외부 정보를 모델에 어떻게 반영할지를 조절하는 가중치를 의미할 수 있으며, 이러한 가중치를 조절하여 모델이 원하는 특성이나 스타일을 가진 이미지를 더 잘 생성하도록 함 (자세한 내용은 "[Classifier-free diffusion guidance](https://arxiv.org/abs/2207.12598)"를 참고해주세요) -
- -- Log-variance mixing coefficient: - - 이미지 생성 모델에서 사용되는 확률 분포의 변동성을 조절하는 데 사용되는 계수를 나타냄. 이미지 생성 모델은 일반적으로 확률 분포를 사용하여 이미지를 생성하며, 이 확률 분포의 평균과 분산을 조절함으로써 생성된 이미지의 다양성과 품질을 조절할 수 있음. 로그-분산 혼합 계수는 이러한 분산을 조절하는 데 사용되며, 높은 값은 더 큰 분산을 의미하고, 작은 값은 더 작은 분산을 의미함. 이를 통해 이미지 생성의 다양성을 조절할 수 있음 (자세한 내용은 "[Improved denoising diffusion probabilistic models](https://arxiv.org/abs/2102.09672)"를 참고해주세요) -
- -64x64 기반 모델의 샘플링 parameter 설정법에 대해 설명하겠습니다. 해당 모델의 샘플링 이미지 샘플링의 전반적인 특징과 다양성의 영향을 주게 됩니다. 1차 sweep으로 DDPM 샘플러를 이용하여 FID-50K에 대해 가장 최적의 하이퍼파라미터를 찾습니다. Sweep의 사용한 각 하이퍼파라미터의 범위는 아래와 같습니다. - - -- Guidance weight: [1.0, 1.25, 1.5, 1.75, 2.0, 5.0] -- Log-variance: [0.0, 0.2, 0.3, 0.4, 1.0] -- Denoise step: [128, 500, 1000] - -1차 sweep 결과 최적의 FID는 log-variance는 0이고 denoising step은 1000이었을 때라고 합니다. - -1차 sweep이 끝난 후에는 guidance weight에 대해서만 sweep을 합니다. 이 때에는 1.2M 이미지를 사용하고, 각 guidacne weight에 대해 FID, IS, CAS를 측정했다고 합니다. - -각 샘플링 하이퍼파라미터에 대한 실험 결과는 아래와 같습니다. - -:::{figure-md} -improved_imagenet_classification_03 - -Figure 3 - -::: - -왼쪽 그림이 1차 sweep에 대한 결과고, 가운데와 오른쪽 그림이 2차 sweep에 대한 결과로 guidance weight에 따른 FID, IS, CAS를 나타낸 결과입니다. - - -이제 다음으로는 64x64 → 256x256 super-resolution 모델에 대해 하이퍼파라미터를 선택하는 부분에 대해 설명하겠습니다. 하이퍼파라미터의 range는 아래와 같습니다. - - Guidance weight: [1.0, 2.0, 5.0, 10.0, 30.0] - - Noise conditioning augmentation: [0.0, 0.1, 0.2, 0.3, 0.4] - - Log-variance mixing coefficients: [0,1, 0.3] - - Denose steps: [129, 500, 1000] - -:::{figure-md} -improved_imagenet_classification_04 - -Figure 4 - -::: - -위 그래프는 guidance weight를 1.0으로 설정하고 noise condition 파라미터를 변경했을 때 FID와 CAS의 그래프를 나타낸 그래프입니다. CAS 같은 경우는 logvar coeff가 0.3일 때 전반적으로 좋은 성능을 보였으며, FID 같은 경우도 logvar coeff가 0.3일 때 전반적으로 좋은 성능을 보인 것을 알 수 있습니다. - -
- -샘플링 하이퍼파라미터의 결과를 분석해보자면, 전반적으로 FID와 CAS는 높은 상관관계가 있으며 (Figure 4 참고), guidance weight가 작을수록 CAS는 높아지지만, Inception Score에는 부정적인 영향을 주며 (Figure 3 참고), noise augmentation이 0일 때 FID가 가장 작은 것을 볼 수 있습니다. (Figure 4 참고) - -
- -이런 하이퍼파라미터 설정 방법을 기준으로 본 논문에서 최종적으로 설정한 값은 아래와 같다고 합니다. -- Guidance weight - - 베이스 모델: 1.25 - - 나머지 resolution: 1.0 -- Log-variance mixing coefficients (sampler, steps) - - 64x64 샘플: 0.0 (DDPM, 1000 denoising steps) - - 256x256 샘플: 0.1 (DDPM, 1000 denoising steps) - - 1024x1024 샘플: 0.0 (DDIM, 32 denoising steps) - -## 4.3. Generation Protocol -이 부분은 실제로 데이터 합성은 어떤 프로토콜을 따랐는지에 대해 설명하는 부분입니다. 본 논문에서는 원본 데이터셋의 class balance를 유지하며 데이터를 합성했으며, 합성된 결과 총 훈련 데이터셋의 규모는 1배인 1.2M 에서 10배인 12M 규모의 데이터셋의 범위를 가지도록 데이터를 합성했다고 합니다. - -# 5. Result - - -## 5-1. Sample Quality: FID and IS -먼저, 합성된 데이터의 품질을 합성 태스크에서 많이 사용되는 지표인 FID와 IS의 관점으로 봅니다. - -:::{figure-md} -improved_imagenet_classification_05 - -Table 1 - -::: - -위 표에서 볼 수 있듯이, 본 논문의 파인 튜닝된 Imagen이 ImageNet에 대한 데이터 생성에 대해 다른 베이스모델들 보다 FID와 IS가 뛰어난 것을 알 수 있습니다. 이는 64x64 resolution과 256x256 resolution에서 모두 해당되었습니다. - -## 5.2. Classification Accuracy Score -이 부분은 CAS 성능 지표를 통해 본 논문에서 제안한 모델의 데이터 합성 능력을 확인하는 부분입니다. - -:::{figure-md} -improved_imagenet_classification_06 - -CAS score - -::: - -Figure 5에서 파란색 부분은 실제 학습 데이터로 학습된 모델의 분류 성능이고, 빨간색 부분은 합성된 데이터로 학습된 모델의 분류 성능입니다. 왼쪽 그림은 베이스라인 중 하나인 CDM 모델의 성능을 나타낸 그림이며, 가운데는 본 논문에서 256x256 resolution 모델의 성능, 오른쪽은 본 논문에서 제안한 1024x1024 resolution 모델의 성능을 나타낸 것입니다. 빨간색 부분이 파란색 부분보다 전반적으로 위쪽에 위치하면 모델의 성능이 좋다고 해석할 수 있습니다. 이 그림을 통해 본 논문에서 제안한 모델들이 베이스라인보다 좋은 성능을 보인다는 것을 알 수 있습니다. - -Table 2에서도 마찬가지로 본 논문 모델이 다른 베이스 모델보다 성능이 뛰어난 것을 알 수 있습니다. 여기서 주목할 만한 점은 CAS를 평가하기 위한 ResNet50이 256x256으로 입력 데이터를 다운샘플링 함에도 1024x1024 샘플에 대한 결과가 훨씬 좋다는 것을 볼 수 있습니다. (Ours 256x256 resolution보다 Ours 1024x1024 resolution의 CAS 성능이 월등히 높음) - -## 5.3. Classification Accuracy with Different Models -이 부분은 합성된 데이터를 여러 종류의 모델로 학습 시켰을 때, 각 모델의 분류 성능을 확인하는 부분입니다. CAS와 비슷하지만 CAS에서는 ResNet50 모델로 분류 성능을 확인했지만 여기서는 ResNet50 이외에 모델로도 분류 성능을 본다는 차이점이 있습니다. - -:::{figure-md} -improved_imagenet_classification_06 - -Table 3 - -::: - -위 표에서 확인할 수 있듯이, 다양한 모델에 대해서 분류 정확도를 살펴본 결과 생성된 데이터로만 학습될 경우에는 실제 데이터로 학습할 때 보다 성능이 낮았지만, 실제 데이터와 생성된 데이터를 합쳐서 학습할 경우 실제 데이터만 사용했을 때보다 성능이 증가한 것을 볼 수 있습니다. 이것은 onvNet기반 모델과 transformer 기반 모델에 대해서 동일한 양상을 보였습니다. - -## 5.4. Merging Real and Synthetic Data at Scale -이 부분은 합성 데이터 규모에 따른 ResNet-50의 성능을 분석한 부분입니다. - -:::{figure-md} -improved_imagenet_classification_06 - -Figure 6 - -::: - -64x64 이미지의 경우 생성되는 데이터의 양이 증가함에 따라 성능이 지속적으로 향상되는 것을 볼 수 있습니다. - -:::{figure-md} -improved_imagenet_classification_06 - -Table 4 - -::: - -하지만 다른 resolution에 대해서는 다른 양상을 보였습니다. 학습 데이터가 4.8M 규모가 될 때까지는 합성 데이터를 추가하는 것이 분류 성능에 좋았으나, 합성 데이터를 더 늘려 그 이상의 규모가 되었을 때는 오히려 성능이 떨어지는 것을 볼 수 있었습니다. - -# 6. Conclusion - -본 논문에 결론 부분을 보자면, 이 논문에서는 Large-sclae text-to-image diffusion 모델을 파인튜닝하여 FID, Inception Score, CAS 성능 지표에 대해서 SOTA를 달성했습니다. -- FID: 1.76 at 256x256 -- Inception Score: 239 at 256x256 -- CAS: 64.96 for 256x256, 69.24 for 1024x1024 - -또한 그렇게 생성 데이터를 이용하여 ResNet과 Transformer 기반 모델들에 대한 ImageNet classification accuracy를 향상 시켰습니다. - -실험 결과에 대해서 생각해볼만한 거리들이 있었는데 그 중 하나는 CAS 성능 측정할 때 ResNet50이 입력을 256x256으로 다운샘플링 함에도 불구하고 256x256보다 1024x1024의 모델의 CAS가 좋은 것이 있었습니다. 이는 다운샘플링을 하더라도 다운샘플링 전 원본 데이터 resolution이 클 때 더 많은 정보를 담는다는 것을 의미하는 것일 수 있습니다. 또한, 64x64 데이터에서 합성 데이터의 양이 증가함에 따라 분류 정확도가 지속적으로 증가했지만 고해상도 데이터에서는 그렇지 않았던 것을 통해 고해상도에 이미지에 대해서는 보다 정교한 훈련 방법이 필요할 수 있음을 시사하고 있습니다. - ---- - -이렇게 Synthetic Data from Diffusion Models Improves ImageNet Classification 논문의 리뷰를 마치겠습니다. 개인적으로 느낀 점은 실제 산업에서는 data shortage나 class imbalance 문제가 대부분 발생하는데 본 논문이 그 해결법 중 하나가 될 수 있을 것 같다는 생각이 들었습니다. 다만 Frozen Text Encoder는 추가적으로 파인튜닝이 되지 않기 때문에 특정 산업에서만 쓰이는 특정 텍스트가 들어왔을 때는 잘 동작할 수 있을까 하는 의문이 들었습니다. 또한 합성하고자 하는 데이터셋에 맞게 파인튜닝을 해야하는 점이 꽤나 불편할 것 같아서 파인튜닝이 모델 성능에 얼마나 큰 의미를 갖는지, 파인튜닝을 하지 않았을 때의 CAS 성능도 논문에 있었으면 좋았을 것 같다는 개인적인 생각이 들었습니다. (물론 Figure 2를 보고 어느 정도 결과를 유추해볼 순 있지만요!) +```{admonition} Information +- **Title:** Synthetic Data from Diffusion Models Improves ImageNet Classification + +- **Reference** + - Paper: [https://arxiv.org/abs/2304.08466](https://arxiv.org/abs/2303.03231) + +- **Author:** [Jeonghwa Yoo](https://www.linkedin.com/in/jeonghwa-yoo-8403a716b) + +- **Last updated on Oct. 25, 2023** +``` + +# Synthetic Data from Diffusion Models Improves ImageNet Classification + +이번에 리뷰할 논문은 구글 리서치 그룹에서 TMLR(Transactions on Machine Learning Research) 2023에 제출한 논문인 [Synthetic Data from Diffusion Models Improves ImageNet Classification](https://arxiv.org/abs/2304.08466)입니다. + +생성 모델이 놀라운 속도로 발전하고 있는데요! 해당 논문에서는 생성 모델의 수준이 얼만큼 왔는지, 복잡한 이미지 데이터인 ImageNet 데이터에 대해서도 충분한 퀄리티의 데이터를 생성할 수 있는 정도가 되었는지, 그래서 이 생성된 데이터를 augment된 데이터로 사용할 수 있는 정도까지 왔는지에 대한 실험과 답을 제시합니다. 이 글의 목차는 논문 내용과 동일하게 구성하였습니다. + + + + +본 논문에서는 기술적으로 엄청 새로운 내용은 없는데요! 다만 보통 사전학습된 text-to-image diffusion 모델을 사용하던 기존 방법들과는 달리 Imagen을 ImageNet에 대해 파인튜닝 했다는 것이 새롭습니다. + + +# 1. Introduction +Diffusion 모델의 등장으로 생성 기술이 크게 발전되었습니다. 현재 생성 기술 수준이 data augmentation으로 사용될 수 있을 만큼의 자연스러운 이미지를 생성하는 것도 가능할까?에 대한 질문이 나오는 것은 당연하고, 본 논문에서는 이에 대한 답을 찾고자 했습니다. 먼저 이 질문에 대한 답을 이야기 하면 아래와 같습니다. +- 결과 요약 + - ImageNet에 대해 fine-tuning된 Imagen이 FID, Inception Score, CAS 성능에 대해 SOTA 성능을 달성 하였다. + - 합성 데이터와 실제 데이터를 결합하여 사용하고, 합성 데이터의 양이 많고, 훈련 시간이 길수록 생성 데이터로 훈련된 모델의 성능이 더욱 향상되었다. + + :::{figure-md} + improved_imagenet_classification_00 + + 위 그림: 합성 데이터로만 학습된 모델 분류 성능과 진짜 데이터로 학습된 모델의 분류 성능 비교 \\ + 아래 그림: 합성 및 진짜 데이터를 사용하였을 때의 분류 성능과 진짜 데이터로 학습된 모델의 분류 성능 비교 + ::: + + +위의 그림에서 볼 수 있듯이 합성 데이터로만 학습한 모델의 정확도와 실제 데이터로 학습한 모델의 정확도를 비교했을 때, 다른 모델들에 비해 본 논문에서 제안한 모델이 훨씬 성능 차이가 적다는 것을 알 수 있습니다. 또한, 아래 그림을 보면, 실제 데이터와 생성된 데이터를 더해서 학습했을 경우에는 ResNet 기반 모델과 Transformer 기반 모델들에서 모두 실제 데이터를 사용했을 때보다 성능 향상이 있었습니다. + + +# 2. Related Work +생성 모델을 이용해 data augmentation을 하려고 했던 기존 방법들에 대해 짧게 이야기 햐려고 합니다. 최근에는 large-scale text-to-image 모델들이 학습 데이터를 보강하는데 사용되기 시작했습니다. + +그 예로 "[Is synthetic data from generative models ready for image recognition?](https://arxiv.org/abs/2210.07574)" 논문이 있습니다. 해당 논문에서는 GLIDE로 생성된 합성 데이터가 zero-shot과 few-shot 이미지 분류 성능을 향상 시켰으며, CIFAR-100 이미지에서 GLIDE를 fine-tuning하여 생성된 합성 데이터 세트가 CIFAR-100의 분류 정확도를 크게 향상 시켰다고 이야기 합니다. + +하지만, 위의 논문을 포함해서 기존의 논문들은 이런 생성 모델을 이용해서 data augmentation을 하여도 ImageNet validation set에 대해서는 성능을 향상 시키지 못했습니다. 또한, 기존에 논문들은 pretrained Stable Diffusion 모델을 사용하고, fine-tuning은 하지 않았습니다. 본 논문에서는 기존 논문들과는 다르게 Imagen을 ImageNet에 잘 동작하고 fine-tuning을 하였고, 그 결과 ImageNet validation set에 대해서도 성능을 향상 시킬 수 있었습니다. + + +# 3. Background + +본 논문에서는 Classification Accuracy Scores(CAS)라는 성능 지표를 소개합니다. FID와 Inception Score는 생성 모델의 성능 지표로 워낙 많이 쓰여서 설명은 생략하고, CAS에 대해서는 논문에서 써져 있는 내용으로 소개하겠습니다. + +CAS는 FID와 Inception Score와 마찬가지로 생성 모델이 만들어낸 샘플의 품질을 평가하는 방법으로 제안 된 성능 지표입니다. 이것은 '합성 데이터'로만 훈련된 ResNet-50 모델에 대한 ImageNet validation set에 대한 분류 성능을 의미합니다. 먼저, 생성 모델을 통해 ImageNet 데이터에 대한 합성 데이터를 만들어냅니다. 그리고 이 합성 데이터만을 이용하여 ResNet-50을 훈련 시키고, 그 훈련된 모델의 실제 ImageNet validation set에 대해 분류 성능이 CAS가 됩니다. 만약 합성 데이터가 실제 ImageNet과 비슷하다면 그 합성 데이터로 학습된 모델은 실제 ImageNet validation set에 대해 좋은 분류 성능을 보일 것이라는 가정을 이용한 성능 지표라고 이해하면 될 것 같습니다. + +저자에 의하면 그동안 생성모델의 CAS 성능은 좋지 않았다고 합니다. 생성된 샘플로만 훈련된 모델은 실제 데이터로 훈련된 모델보다 성능이 떨어졌고 (이는 당연해보입니다), 실제 데이터에 합성 데이터를 추가하면 성능이 떨어졌다고 합니다. 이는 아마도 생성된 샘플의 품질, 다양성 등이 원인일 수 있을 것이라고 합니다. + + +# 4. Generative Model Training and Sampling + +여기서는 실제로 저자들이 어떻게 text-to-image diffusion 모델을 학습하고, 샘플링을 하였는지에 대한 설명을 합니다. + +먼저 저자들은 text-to-image diffusion 모델로는 Imagen을 사용하였습니다. Text-to-image 모델을 어떻게 ImageNet 클래스와 alignment 할 지에 대한 고민이 필요했다고 합니다. 처음에는 CLIP에서 사용한 방법과 유사하게 짧은 텍스트를 ImageNet 클래스의 텍스트 프롬프트로 사용했다고 하였는데 이 경우에 성능이 좋지 않았다고 합니다. 이는 Imagen에서 high guidance weight를 사용하여 샘플의 다양성이 저하 되면서 생기는 현상일 수 있다고 합니다. 따라서, 저자들은 프롬프트를 한 두단어 클래스 이름으로 수정하고, 모델의 weight와 sampling parameter를 fine-tuning 했다고 합니다. + +:::{figure-md} +improved_imagenet_classification_01 + +Figure 2 + +::: + +왼쪽 그림이 fine-tuning이 적용된 Imagen이 만들어낸 이미지고, 오른쪽이 fine-tuning이 적용되지 않은 Imagen입니다. 아래에서 두 번째 클래스인 Schipperke를 보면, 이것은 스키퍼키라는 개 품종을 의미하는데 fine-tuning이 적용되지 않은 Imagen의 경우는 꽃과 같은 전혀 엉뚱한 이미지를 만들고 있는 것을 볼 수 있습니다. + +## 4.1. Imagen Fine-tuning + +이 부분은 Imagen을 어떻게 fine-tuning 했는지를 설명하는 부분입니다. + +먼저 Imagen 구조는 아래와 같습니다. + +:::{figure-md} +improved_imagenet_classification_02 + +Imagen 구조 + +::: + + +본 논문에서는 위의 Imagen 구조에서 빨간 원으로 표시된 부분에 대해서만 fine-tuning 했습니다. Frozen Text Encoder의 경우는 원래 Imagen에서도 학습을 하지 않는 부분이라 마찬가지로 학습을 하지 않았고, 1024x1024 Image를 출력으로 하는 마지막 Super-Resolution Diffusion Model의 경우 ImageNet에 고해상도의 데이터가 적어서 fine-tuning을 하지 않았다고 합니다. + +64x64 모델의 경우는 210K step 정도 학습하였고, optimizer의 경우는 Imagen에서 사용하였던 Adafactor optimizer를 사용하였다고 합니다. 64x64 → 256x256 super-resolution 모델의 경우는 490K step 정도 하였고, Adam optimizer를 사용하였다고 합니다. + +최적의 모델 선택의 기준으로는 기본 Imagen sampler와 ImageNet-1K validation set에 대해 10K개의 샘플들에 대해 FID score를 계산했을 때 가장 좋은 성능의 모델을 선택했다고 합니다. + + +## 4.2. Sampling Parameters +이 부분은 본 논문에서 sampling parameter는 어떻게 정했는지를 설명하는 부분입니다. 먼저, Text-conditioned diffusion model 샘플링의 품질, 다양성, 속도는 디퓨전 스텝 수, noise condition augmentation, guidance weight for classifier-free guidance, log-variance mixing coefficient 등에 대해 큰 영향을 받는다고 합니다. + +각각에 대해 간단하게 설명하면 아래와 같습니다. + +- Noise condition augmentation: + + 이미지 생성 과정에서 확률적인 요소를 도입하여 생성된 이미지의 다양성을 증가시키는 기술. 일반적으로, 모델은 잠재 공간의 랜덤한 노이즈를 입력으로 받아 다양한 이미지를 생성하게 됨. 이것은 생성된 이미지가 조금씩 다른 것으로 보이게 만들며, 더 다양한 결과를 얻을 수 있게 함 (자세한 내용은 "[Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding](https://arxiv.org/abs/2205.11487)"를 참고해주세요) +
+ +- Guidance weight for classifier-free guidance: + + "Classifier-free guidance"는 이미지를 생성하는 데 분류기나 특정 지표 없이 외부 정보를 사용한다는 것. "Guidance weights"는 외부 정보를 모델에 어떻게 반영할지를 조절하는 가중치를 의미할 수 있으며, 이러한 가중치를 조절하여 모델이 원하는 특성이나 스타일을 가진 이미지를 더 잘 생성하도록 함 (자세한 내용은 "[Classifier-free diffusion guidance](https://arxiv.org/abs/2207.12598)"를 참고해주세요) +
+ +- Log-variance mixing coefficient: + + 이미지 생성 모델에서 사용되는 확률 분포의 변동성을 조절하는 데 사용되는 계수를 나타냄. 이미지 생성 모델은 일반적으로 확률 분포를 사용하여 이미지를 생성하며, 이 확률 분포의 평균과 분산을 조절함으로써 생성된 이미지의 다양성과 품질을 조절할 수 있음. 로그-분산 혼합 계수는 이러한 분산을 조절하는 데 사용되며, 높은 값은 더 큰 분산을 의미하고, 작은 값은 더 작은 분산을 의미함. 이를 통해 이미지 생성의 다양성을 조절할 수 있음 (자세한 내용은 "[Improved denoising diffusion probabilistic models](https://arxiv.org/abs/2102.09672)"를 참고해주세요) +
+ +64x64 기반 모델의 샘플링 parameter 설정법에 대해 설명하겠습니다. 해당 모델의 샘플링 이미지 샘플링의 전반적인 특징과 다양성의 영향을 주게 됩니다. 1차 sweep으로 DDPM 샘플러를 이용하여 FID-50K에 대해 가장 최적의 하이퍼파라미터를 찾습니다. Sweep의 사용한 각 하이퍼파라미터의 범위는 아래와 같습니다. + + +- Guidance weight: [1.0, 1.25, 1.5, 1.75, 2.0, 5.0] +- Log-variance: [0.0, 0.2, 0.3, 0.4, 1.0] +- Denoise step: [128, 500, 1000] + +1차 sweep 결과 최적의 FID는 log-variance는 0이고 denoising step은 1000이었을 때라고 합니다. + +1차 sweep이 끝난 후에는 guidance weight에 대해서만 sweep을 합니다. 이 때에는 1.2M 이미지를 사용하고, 각 guidacne weight에 대해 FID, IS, CAS를 측정했다고 합니다. + +각 샘플링 하이퍼파라미터에 대한 실험 결과는 아래와 같습니다. + +:::{figure-md} +improved_imagenet_classification_03 + +Figure 3 + +::: + +왼쪽 그림이 1차 sweep에 대한 결과고, 가운데와 오른쪽 그림이 2차 sweep에 대한 결과로 guidance weight에 따른 FID, IS, CAS를 나타낸 결과입니다. + + +이제 다음으로는 64x64 → 256x256 super-resolution 모델에 대해 하이퍼파라미터를 선택하는 부분에 대해 설명하겠습니다. 하이퍼파라미터의 range는 아래와 같습니다. + - Guidance weight: [1.0, 2.0, 5.0, 10.0, 30.0] + - Noise conditioning augmentation: [0.0, 0.1, 0.2, 0.3, 0.4] + - Log-variance mixing coefficients: [0,1, 0.3] + - Denose steps: [129, 500, 1000] + +:::{figure-md} +improved_imagenet_classification_04 + +Figure 4 + +::: + +위 그래프는 guidance weight를 1.0으로 설정하고 noise condition 파라미터를 변경했을 때 FID와 CAS의 그래프를 나타낸 그래프입니다. CAS 같은 경우는 logvar coeff가 0.3일 때 전반적으로 좋은 성능을 보였으며, FID 같은 경우도 logvar coeff가 0.3일 때 전반적으로 좋은 성능을 보인 것을 알 수 있습니다. + +
+ +샘플링 하이퍼파라미터의 결과를 분석해보자면, 전반적으로 FID와 CAS는 높은 상관관계가 있으며 (Figure 4 참고), guidance weight가 작을수록 CAS는 높아지지만, Inception Score에는 부정적인 영향을 주며 (Figure 3 참고), noise augmentation이 0일 때 FID가 가장 작은 것을 볼 수 있습니다. (Figure 4 참고) + +
+ +이런 하이퍼파라미터 설정 방법을 기준으로 본 논문에서 최종적으로 설정한 값은 아래와 같다고 합니다. +- Guidance weight + - 베이스 모델: 1.25 + - 나머지 resolution: 1.0 +- Log-variance mixing coefficients (sampler, steps) + - 64x64 샘플: 0.0 (DDPM, 1000 denoising steps) + - 256x256 샘플: 0.1 (DDPM, 1000 denoising steps) + - 1024x1024 샘플: 0.0 (DDIM, 32 denoising steps) + +## 4.3. Generation Protocol +이 부분은 실제로 데이터 합성은 어떤 프로토콜을 따랐는지에 대해 설명하는 부분입니다. 본 논문에서는 원본 데이터셋의 class balance를 유지하며 데이터를 합성했으며, 합성된 결과 총 훈련 데이터셋의 규모는 1배인 1.2M 에서 10배인 12M 규모의 데이터셋의 범위를 가지도록 데이터를 합성했다고 합니다. + +# 5. Result + + +## 5-1. Sample Quality: FID and IS +먼저, 합성된 데이터의 품질을 합성 태스크에서 많이 사용되는 지표인 FID와 IS의 관점으로 봅니다. + +:::{figure-md} +improved_imagenet_classification_05 + +Table 1 + +::: + +위 표에서 볼 수 있듯이, 본 논문의 파인 튜닝된 Imagen이 ImageNet에 대한 데이터 생성에 대해 다른 베이스모델들 보다 FID와 IS가 뛰어난 것을 알 수 있습니다. 이는 64x64 resolution과 256x256 resolution에서 모두 해당되었습니다. + +## 5.2. Classification Accuracy Score +이 부분은 CAS 성능 지표를 통해 본 논문에서 제안한 모델의 데이터 합성 능력을 확인하는 부분입니다. + +:::{figure-md} +improved_imagenet_classification_06 + +CAS score + +::: + +Figure 5에서 파란색 부분은 실제 학습 데이터로 학습된 모델의 분류 성능이고, 빨간색 부분은 합성된 데이터로 학습된 모델의 분류 성능입니다. 왼쪽 그림은 베이스라인 중 하나인 CDM 모델의 성능을 나타낸 그림이며, 가운데는 본 논문에서 256x256 resolution 모델의 성능, 오른쪽은 본 논문에서 제안한 1024x1024 resolution 모델의 성능을 나타낸 것입니다. 빨간색 부분이 파란색 부분보다 전반적으로 위쪽에 위치하면 모델의 성능이 좋다고 해석할 수 있습니다. 이 그림을 통해 본 논문에서 제안한 모델들이 베이스라인보다 좋은 성능을 보인다는 것을 알 수 있습니다. + +Table 2에서도 마찬가지로 본 논문 모델이 다른 베이스 모델보다 성능이 뛰어난 것을 알 수 있습니다. 여기서 주목할 만한 점은 CAS를 평가하기 위한 ResNet50이 256x256으로 입력 데이터를 다운샘플링 함에도 1024x1024 샘플에 대한 결과가 훨씬 좋다는 것을 볼 수 있습니다. (Ours 256x256 resolution보다 Ours 1024x1024 resolution의 CAS 성능이 월등히 높음) + +## 5.3. Classification Accuracy with Different Models +이 부분은 합성된 데이터를 여러 종류의 모델로 학습 시켰을 때, 각 모델의 분류 성능을 확인하는 부분입니다. CAS와 비슷하지만 CAS에서는 ResNet50 모델로 분류 성능을 확인했지만 여기서는 ResNet50 이외에 모델로도 분류 성능을 본다는 차이점이 있습니다. + +:::{figure-md} +improved_imagenet_classification_06 + +Table 3 + +::: + +위 표에서 확인할 수 있듯이, 다양한 모델에 대해서 분류 정확도를 살펴본 결과 생성된 데이터로만 학습될 경우에는 실제 데이터로 학습할 때 보다 성능이 낮았지만, 실제 데이터와 생성된 데이터를 합쳐서 학습할 경우 실제 데이터만 사용했을 때보다 성능이 증가한 것을 볼 수 있습니다. 이것은 onvNet기반 모델과 transformer 기반 모델에 대해서 동일한 양상을 보였습니다. + +## 5.4. Merging Real and Synthetic Data at Scale +이 부분은 합성 데이터 규모에 따른 ResNet-50의 성능을 분석한 부분입니다. + +:::{figure-md} +improved_imagenet_classification_06 + +Figure 6 + +::: + +64x64 이미지의 경우 생성되는 데이터의 양이 증가함에 따라 성능이 지속적으로 향상되는 것을 볼 수 있습니다. + +:::{figure-md} +improved_imagenet_classification_06 + +Table 4 + +::: + +하지만 다른 resolution에 대해서는 다른 양상을 보였습니다. 학습 데이터가 4.8M 규모가 될 때까지는 합성 데이터를 추가하는 것이 분류 성능에 좋았으나, 합성 데이터를 더 늘려 그 이상의 규모가 되었을 때는 오히려 성능이 떨어지는 것을 볼 수 있었습니다. + +# 6. Conclusion + +본 논문에 결론 부분을 보자면, 이 논문에서는 Large-sclae text-to-image diffusion 모델을 파인튜닝하여 FID, Inception Score, CAS 성능 지표에 대해서 SOTA를 달성했습니다. +- FID: 1.76 at 256x256 +- Inception Score: 239 at 256x256 +- CAS: 64.96 for 256x256, 69.24 for 1024x1024 + +또한 그렇게 생성 데이터를 이용하여 ResNet과 Transformer 기반 모델들에 대한 ImageNet classification accuracy를 향상 시켰습니다. + +실험 결과에 대해서 생각해볼만한 거리들이 있었는데 그 중 하나는 CAS 성능 측정할 때 ResNet50이 입력을 256x256으로 다운샘플링 함에도 불구하고 256x256보다 1024x1024의 모델의 CAS가 좋은 것이 있었습니다. 이는 다운샘플링을 하더라도 다운샘플링 전 원본 데이터 resolution이 클 때 더 많은 정보를 담는다는 것을 의미하는 것일 수 있습니다. 또한, 64x64 데이터에서 합성 데이터의 양이 증가함에 따라 분류 정확도가 지속적으로 증가했지만 고해상도 데이터에서는 그렇지 않았던 것을 통해 고해상도에 이미지에 대해서는 보다 정교한 훈련 방법이 필요할 수 있음을 시사하고 있습니다. + +--- + +이렇게 Synthetic Data from Diffusion Models Improves ImageNet Classification 논문의 리뷰를 마치겠습니다. 개인적으로 느낀 점은 실제 산업에서는 data shortage나 class imbalance 문제가 대부분 발생하는데 본 논문이 그 해결법 중 하나가 될 수 있을 것 같다는 생각이 들었습니다. 다만 Frozen Text Encoder는 추가적으로 파인튜닝이 되지 않기 때문에 특정 산업에서만 쓰이는 특정 텍스트가 들어왔을 때는 잘 동작할 수 있을까 하는 의문이 들었습니다. 또한 합성하고자 하는 데이터셋에 맞게 파인튜닝을 해야하는 점이 꽤나 불편할 것 같아서 파인튜닝이 모델 성능에 얼마나 큰 의미를 갖는지, 파인튜닝을 하지 않았을 때의 CAS 성능도 논문에 있었으면 좋았을 것 같다는 개인적인 생각이 들었습니다. (물론 Figure 2를 보고 어느 정도 결과를 유추해볼 순 있지만요!) diff --git a/_sources/docs/review/Textual_Inversion.md b/_sources/docs/review/Textual_Inversion.md old mode 100644 new mode 100755 index 5293d739..7fb72e34 --- a/_sources/docs/review/Textual_Inversion.md +++ b/_sources/docs/review/Textual_Inversion.md @@ -1,206 +1,206 @@ -```{admonition} Information -- **Title:** An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion - -- **Reference** - - Paper: [https://arxiv.org/pdf/2208.01618.pdf](https://arxiv.org/pdf/2208.01618.pdf) - - Code: [https://textual-inversion.github.io/](https://textual-inversion.github.io/) - - Review: [https://devocean.sk.com/blog/techBoardDetail.do?page=&query=&ID=164320&boardType=writer&searchData=sam56903&subIndex=&idList=&pnwriterID=sam56903](https://devocean.sk.com/blog/techBoardDetail.do?page=&query=&ID=164320&boardType=writer&searchData=sam56903&subIndex=&idList=&pnwriterID=sam56903) - -- **Author:** Kwang-Su Mun - -- **Last updated on May. 31. 2023** -``` - -# Textual Inversion - -# Abstract -``` -이미지 3-5장으로 새로운 개념(또는 콘셉트, concept)을 학습해 관련된 이미지를 뽑아내는 모델 -``` - - text-to-image model은 자연어를 통한 creation에 전례없는 자유도를 주었다. 하지만, 특정한 contept를 생성하고, 그것의 생김새를 바꾸거나, 새로운 역할이 주어지거나 참신한 장면이 그려지는건 아직 불분명하다. 즉, '이것을 그려줘'라고 말할 때, '이것'에 대한 설명을 prompt로 어떻게 할 것이냐는 물음에는 아직 한계가 있는 것 같다. 이를 해결하기 위해, 저자는 image를 3-5개만으로 사물이나 스타일과 같은 concept, 즉 새로운 '단어'를 고정된 text-to-image model의 embedding space에서 표현하는 방법을 제안한다. 이러한 '단어'는 자연어 문장에 녹아들어가, 직관적인 방법으로 '개인화된' 이미지 생성을 이끌어 낸다. 특히, 독자적이면서 다양한 콘셉트를 capture하기 위해서는 single word embedding이 충분하다는 것을 알게 되었다. - -:::{figure-md} textual inverison example -textual inverison example - -textual inversion example \ (source: https://arxiv.org/abs/2208.01618) -::: - -# Introduction -대규모 학습된 모델에 새로운 개념을 도입하는 일은 어려운 일이다. 각 새로운 개념에 대해 확장된 데이터 셋을 사용해 모델을 retraining하는 것은 엄청나게 비용이 많이 들고, 몇 가지 예제에 해서 fine-tuning은 보통 치명적인 망각을 초래한다. 따라서 저자들은 사전 훈련된 텍스트-이미지 모델의 텍스트 임베딩 공간에서 새로운 단어를 찾아 이러한 문제를 극복할 것을 제안. - - -:::{figure-md} architecture -architecture - -architecture \ (source: https://arxiv.org/abs/2208.01618) -::: -위 figure에서, "A photo of S*"은 tokenizer를 지나면서 각각 '508', '701', '73', '*'과 같은 형태의 token set으로 변환되고, 이후 각 토큰은 자체 임베딩 벡터로 변환되고 이러한 벡터는 다운스트림 모델을 통해 제공됨. - -input image의 concept를 나타내는, 새로운 pseudo-word인 S*를 이용해 새로운 embedding vector(v*)를 나타낸다. 이후 이 vector는 다른 단어와 같이 처리되며 생성 모델에 대한 새로운 text query를 구성하는데 사용될 수 있음. 따라서 이 query는 generator에 들어가서 사용자가 의도한바와 일치하도록 새로운 image를 생성하도록 하는 것이 전반적인 그림이라고 볼 수 있음. - -여기서 중요한 것은, 이 과정에서 생성모델(여기서는 LDM이 쓰임)은 untouched되어 있다는 것(즉, 따로 수정이 들어가지 않는듯함). 그렇게 함으로써 새로운 task에 대한 fine-tuning을 할 때 일반적으로 손실되는 text에 대한 이해도나 generalization을 유지할 수 있음. - -이러한 '유사단어'를 찾기 위해, 이 작업을 하나로 inversion시켜 프레임화 한다. 그리고 고정된, pre-trained text-to-image model을 사용하고, 3-5개의 concept를 나타내는 small image set이 주어진다. 저자들은 'a photo of S*'와 같은 형태의 문장을 설정해 주어진 작은 dataset에서 이미지를 재구성 하는 것으로 이어지는 single-word embedding을 찾는 것을 목표로 함. - -이 모델의 목표는 **새로운 concept인 입력 이미지를 나타내는 S*를 표현하는 방법을 찾는 것**이며, 이러한 task를 **'textual inversion'**이라고 한다고 함. - -``` -This embedding is found through an optimization process, which we refer to as “Textual Inversion”. -``` - -# Related work -- text-guided synthesis -- GAN inversion -- Diffusion-based inversion -- personalization - - PALAVRA: image를 S*으로 바꾸는데 사용되는 기술로 추정. - - pre-trained CLIP model을 이용해서 personalized object의 복구 및 segmentation을 수행. PALAVRA는 특정 개체를 참조하는 CLIP의 textual embedding space에서 pseudo-word를 식별함. 그 다음 검색을 위해 이미지를 설명하거나 어떤 장면에서 특정 개체를 분할하기 위해 사용됨. figure 5에서 보듯이, 그들의 접근 방식은 새로운 장면에서 그럴듯한 재구성 또는 합성에 필요한 세부 정보를 캡처하지 못함. - -# Method -``` -Our goal is to enable language-guided generation of new, user-specified concepts. -``` -- 의역) 목표: 유저가 의도한 것에 초첨을 맞춘, 새로운 concept를 embedding으로 잘 가이드해서 괜찮은 성과물을 내는 것. - -따라서 pre-trained text-to-image model의 중간 단계의 representation으로 이러한 새로운 'concepts'을 인코딩하는데 초점을 맞춤. 일반적인 text-to-image model에서는 image의 representation에 대한 후보군을 text encoder의 word-embedding 단계에서 찾는다. 그러나 이러한 접근 방식은 이미지에 대한 in-depth visual understanding을 필요로 하지 않는다(생성자가 이미지에 대해서 시각적인 이해? 없이 그린다.) 따라서 여기서는 GAN inversion에서 영감을 받은 visual reconstruction objective를 제시. - -## cf) GAN Inversion(이해 못함) -출처) - https://hyoseok-personality.tistory.com/entry/GAN-Inversion - -:::{figure-md} GAN inversion -GAN inversion - -GAN inversion \ (source: https://hyoseok-personality.tistory.com/entry/GAN-Inversion) -::: - -- 입력 이미지와 유사한 결과 이미지를 얻을 수 있도록 하는 latent vector를 찾는 과정. GAN이 학습되면 random latent vector로부터 이미지를 생성해낸다. GAN inversion은 이의 역과정으로써 GAN의 latent space로 input image를 inverting시켜 latent vector를 알아가는 과정. - -## LDM(Latent Diffusion Model) -논문에서는 생성모델로서 LDM(Latent Diffusion Model)을 사용함. 이전에 말했듯이, LDM은 하나도 건들지 않음. - -:::{figure-md} LDM objective function -LDM objective function - -LDM objective function \ (source: https://arxiv.org/pdf/2208.01618.pdf) -::: - -## Text Embeddings -:::{figure-md} Text-Embedding -Text-Embedding - -Text-Embedding \ (source: https://arxiv.org/pdf/2208.01618.pdf) -::: -- 입력된 문자열의 각 단어, 하위 단어는 tokenizer를 통과하며, 미리 정의된 dictionary에서 index token으로 변환함. 각 토큰을 통해 찾을 수 있는 고유한 임베딩 벡터에 연결됨. -- index에 의한 embedding vector는 일반적으로 text encoder인 C_Θ의 일부로 학습된다. 이러한 space를 inversion target으로 삼았음. 새로운 개념을 나타내기 위해 자리표시자 문자열인 S*를 새롭게 지정함. 이 과정에서 PALAVRA를 사용했을 것으로 추정함. 임베딩 process에 개입해서 tokenize된 문자열과 관련된 vector를 새로운 학습된 embedding V*로 대체하여 본질적으로 어휘(pseudo-word)에 개념을 주입함. 이렇게 함으로써 다른 단어와 마찬가지로 concept를 포함하는 새로운 문장을 만들 수 있었음. - -## Textual Inversion -새로운 embedding을 찾기 위해 작은 규모의 dataset(3-5장)을 사용해 다양한 배경 또는 포즈와 같은 여러 설정에 걸쳐 목표 concept을 묘사함. 이러한 작은 dataset에서 LDM loss를 최소화하는 과정을 통해 V를 최적화함. 생성 조건을 고정하기 위해 CLIP ImageNet 템플릿에서 파생된 중립 컨텍스트 텍스트를 무작위로 샘플링한다. 여기에는 "A photo of S*", "A rendition of S*" 등의 형식 프롬프트가 포함된다.(아마 원본 이미지와 최대한 비슷하게 만들어서 원본과 비교하기 위한 목적이 아닐까 싶음) 최적화 목표식은 다음과 같음. - -:::{figure-md} textual inversion objective function -textual inversion objective function - -textual inversion objective function \ (source: https://arxiv.org/pdf/2208.01618.pdf) -::: - -LDM loss함수와 매우 유사함. 여기서 CΘ와 eΘ는 고정. 해당 따라서 학습된 embedding이 개념에 미세한 시각적 detail을 포착할 수 있을것으로 기대함. - -# 성능평가 -## DALL:E-2와 비교 -:::{figure-md} compare with DALLE-2 -compare with DALLE-2 - -compare with DALLE-2 \ (source: https://arxiv.org/pdf/2208.01618.pdf) -::: -- input image에 대한 디테일을 더 잘 포착하는 모습을 볼 수 있다. - -## Text guided synthesis - -:::{figure-md} text guided synthesis -text guided synthesis - -text guided synthesis - 입력 이미지의 스타일과 유사하면서도 text guide에 맞춰서 잘 진행함. - \ (source: https://arxiv.org/pdf/2208.01618.pdf) -::: - -- Textual Inversion 모델은 새로운 주제에 대해 더 정확하게 개념을 보존하고, 새로운 임베딩과 나머지 캡션들에 대해서도 모두 추론이 가능했음. - -:::{figure-md} style transfer -style transfer - -style transfer \ (source: https://arxiv.org/pdf/2208.01618.pdf) -::: -- 적은 데이터셋으로도 style을 보존하면서 표현한 그림 - -## pseudo word 두 개 사용 - -:::{figure-md} two pseudo word -two pseudo word - -two pseudo word \ (source: https://arxiv.org/pdf/2208.01618.pdf) -::: - -## Bias Reduction -:::{figure-md} Bias reduction -Bias reduction - -Bias reduction \ (source: https://arxiv.org/pdf/2208.01618.pdf) -::: - -기존 모델의 결과를 보면, 위 사진에서와 같이 '의사'라는 단어를 사용하면, 보통 백인 남성 의사를 잘 그려냈음. 이는 기존 데이터셋에서 남성 의사 사진 데이터가 많았음을 보여준다. 보다 작은 imageset에서 새로운 embedding을 학습함으로써 이러한 bias를 줄일 수 있음을 보여준다(즉, 성별 및 인종적 다양성에 대한 인식을 높일 수 있음). - -# 정량평가 - -latent space embedding의 품질을 분석. - -1. reconstruction(y축?): target concept를 얼마나 잘 복제하는지. 특정 이미지가 아닌 개념에 대한 변형을 생성하므로 의미적 CLIP 공간 거리를 고려하여 유사성을 측정.(이미지에 자체가 아닌, 이미지가 가진 '개념'에 대해 latent space를 생성하므로) 각 컨셉에 대해 "A photo of S*"라는 prompt를 사용해 64개의 이미지를 생성. -2. editability(x축?): text prompt를 사용해 개념을 수정하는 능력을 평가. 다양한 난이도와 다양한 설정의 prompt를 사용해 일련의 이미지를 생성. - -각 prompt 별로, 50 DDIM step을 사용해 64개의 샘플을 만들고, CLIP-space embedding을 평가, textual prompt의 CLIP-space embedding에서 cosine similarity를 계산. 높은 스코어는 더 높은 editing capability와 prompt의 신뢰도를 보여줌. - -## 평가 setups -GAN inversion에서 영감을 받은 실험 환경 설정에 따름. 생략 - -## 결과 -:::{figure-md} quantative evaluation1 -quantative evaluation1 - -quantative evaluation1 \ (source: https://arxiv.org/pdf/2208.01618.pdf) -::: - -### 주목할 점 - -1. 많은 baseline과 우리 방법의 semantic reconstruction quality는 단순히 training set에서 임의의 이미지를 샘플링하는 것과 비슷함(== 원본 이미지와 생성된 이미지가 큰 차이가 없었다?) - -2. single-word method는 비슷한 reconstruction quality를 달성하고, 모든 multi-word baseline에서 상당히 향상된 editablity을 달성. 이러한 점은 text embedding space의 인상적인 유연성을 나타내고, 단일 pseudo word만 사용하면서 높은 정확도로 새로운 개념을 캡처하는데 도움이 될 수 있음을 보여줌. - -3. baseline이 distortion-editability tradeoff 곡선의 outline을 그리며 실제 단어 분포에 더 가까운 embedding이 더 쉽게 수정될 수 있음. 그러나 target의 세부 정보를 캡처하지는 못함. 반대로, 단어 분포에서 멀리 벗어나면 editability가 크게 감소하는 대신 향상된 reconstruction이 가능해짐. 특히 single embedding model은 단순히 learning rate를 변경해 이 곡선을 따라 이동할 수 있으므로 사용자에게 이 tradeoff에 대한 어느 정도의 제어를 제공함. - -4. concept에 대한 human description을 사용하면 유사성을 포착하지 못하면서도, editability가 감소함. - - -## 사용자평가 - -:::{figure-md} human test -human test - -human test \ (source: https://arxiv.org/pdf/2208.01618.pdf) -::: - -두 개의 설문지: -1) 사용자는 concept의 training set에서 4개의 이미지를 제공받았고, 이미지와의 유사성에 따라 5개의 모델에서 생성된 결과의 순위를 매김. - -2) 이미지 context를 설명하는 텍스트를 제공받았고, 텍스트와 생성된 이미지의 유사성에 따라 순위를 매김. - -각 질문별로 600개씩 총 1,200개의 응답을 수집. - -# Limitation -1. 이미지 생성에 더 많은 자유도를 제공하지만, concept의 의미론적인 본질을 파악하거나, 정확한 shape를 학습하는데 한계. -2. 최적화가 오래 걸린다. 하나의 concept를 학습하는데 약 2시간이 소요됨. - -# 마무리 -: 새로운 설정과 장면에서 특정 concept의 이미지를 생성하기 위해 text-to-image model를 활용하는 개인화되며, language-guided generation을 소개함. 여기서 사용한 'text inversion'은 pretrained text-to-image 모델의 text embedding space 내에서 concept를 새로운 pseudo word로 inverse하여 작동함. 이러한 pseudo-word는 간단한 자연어 설명을 사용해 새로운 장면에 삽입할 수 있으므로 간단하고 직관적인 수정이 가능함. - - 어떤 의미에서 이 방법은 사용자가 편집하기 쉽도록 텍스트 기반 interpace를 사용하지만 자연 언어의 한계에 접근할 때 시각적 단서를 제공하는 등 multi modal 정보를 활용할 수 있도록 함. - +```{admonition} Information +- **Title:** An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion + +- **Reference** + - Paper: [https://arxiv.org/pdf/2208.01618.pdf](https://arxiv.org/pdf/2208.01618.pdf) + - Code: [https://textual-inversion.github.io/](https://textual-inversion.github.io/) + - Review: [https://devocean.sk.com/blog/techBoardDetail.do?page=&query=&ID=164320&boardType=writer&searchData=sam56903&subIndex=&idList=&pnwriterID=sam56903](https://devocean.sk.com/blog/techBoardDetail.do?page=&query=&ID=164320&boardType=writer&searchData=sam56903&subIndex=&idList=&pnwriterID=sam56903) + +- **Author:** Kwang-Su Mun + +- **Last updated on May. 31. 2023** +``` + +# Textual Inversion + +# Abstract +``` +이미지 3-5장으로 새로운 개념(또는 콘셉트, concept)을 학습해 관련된 이미지를 뽑아내는 모델 +``` + + text-to-image model은 자연어를 통한 creation에 전례없는 자유도를 주었다. 하지만, 특정한 contept를 생성하고, 그것의 생김새를 바꾸거나, 새로운 역할이 주어지거나 참신한 장면이 그려지는건 아직 불분명하다. 즉, '이것을 그려줘'라고 말할 때, '이것'에 대한 설명을 prompt로 어떻게 할 것이냐는 물음에는 아직 한계가 있는 것 같다. 이를 해결하기 위해, 저자는 image를 3-5개만으로 사물이나 스타일과 같은 concept, 즉 새로운 '단어'를 고정된 text-to-image model의 embedding space에서 표현하는 방법을 제안한다. 이러한 '단어'는 자연어 문장에 녹아들어가, 직관적인 방법으로 '개인화된' 이미지 생성을 이끌어 낸다. 특히, 독자적이면서 다양한 콘셉트를 capture하기 위해서는 single word embedding이 충분하다는 것을 알게 되었다. + +:::{figure-md} textual inverison example +textual inverison example + +textual inversion example \ (source: https://arxiv.org/abs/2208.01618) +::: + +# Introduction +대규모 학습된 모델에 새로운 개념을 도입하는 일은 어려운 일이다. 각 새로운 개념에 대해 확장된 데이터 셋을 사용해 모델을 retraining하는 것은 엄청나게 비용이 많이 들고, 몇 가지 예제에 해서 fine-tuning은 보통 치명적인 망각을 초래한다. 따라서 저자들은 사전 훈련된 텍스트-이미지 모델의 텍스트 임베딩 공간에서 새로운 단어를 찾아 이러한 문제를 극복할 것을 제안. + + +:::{figure-md} architecture +architecture + +architecture \ (source: https://arxiv.org/abs/2208.01618) +::: +위 figure에서, "A photo of S*"은 tokenizer를 지나면서 각각 '508', '701', '73', '*'과 같은 형태의 token set으로 변환되고, 이후 각 토큰은 자체 임베딩 벡터로 변환되고 이러한 벡터는 다운스트림 모델을 통해 제공됨. + +input image의 concept를 나타내는, 새로운 pseudo-word인 S*를 이용해 새로운 embedding vector(v*)를 나타낸다. 이후 이 vector는 다른 단어와 같이 처리되며 생성 모델에 대한 새로운 text query를 구성하는데 사용될 수 있음. 따라서 이 query는 generator에 들어가서 사용자가 의도한바와 일치하도록 새로운 image를 생성하도록 하는 것이 전반적인 그림이라고 볼 수 있음. + +여기서 중요한 것은, 이 과정에서 생성모델(여기서는 LDM이 쓰임)은 untouched되어 있다는 것(즉, 따로 수정이 들어가지 않는듯함). 그렇게 함으로써 새로운 task에 대한 fine-tuning을 할 때 일반적으로 손실되는 text에 대한 이해도나 generalization을 유지할 수 있음. + +이러한 '유사단어'를 찾기 위해, 이 작업을 하나로 inversion시켜 프레임화 한다. 그리고 고정된, pre-trained text-to-image model을 사용하고, 3-5개의 concept를 나타내는 small image set이 주어진다. 저자들은 'a photo of S*'와 같은 형태의 문장을 설정해 주어진 작은 dataset에서 이미지를 재구성 하는 것으로 이어지는 single-word embedding을 찾는 것을 목표로 함. + +이 모델의 목표는 **새로운 concept인 입력 이미지를 나타내는 S*를 표현하는 방법을 찾는 것**이며, 이러한 task를 **'textual inversion'**이라고 한다고 함. + +``` +This embedding is found through an optimization process, which we refer to as “Textual Inversion”. +``` + +# Related work +- text-guided synthesis +- GAN inversion +- Diffusion-based inversion +- personalization + - PALAVRA: image를 S*으로 바꾸는데 사용되는 기술로 추정. + - pre-trained CLIP model을 이용해서 personalized object의 복구 및 segmentation을 수행. PALAVRA는 특정 개체를 참조하는 CLIP의 textual embedding space에서 pseudo-word를 식별함. 그 다음 검색을 위해 이미지를 설명하거나 어떤 장면에서 특정 개체를 분할하기 위해 사용됨. figure 5에서 보듯이, 그들의 접근 방식은 새로운 장면에서 그럴듯한 재구성 또는 합성에 필요한 세부 정보를 캡처하지 못함. + +# Method +``` +Our goal is to enable language-guided generation of new, user-specified concepts. +``` +- 의역) 목표: 유저가 의도한 것에 초첨을 맞춘, 새로운 concept를 embedding으로 잘 가이드해서 괜찮은 성과물을 내는 것. + +따라서 pre-trained text-to-image model의 중간 단계의 representation으로 이러한 새로운 'concepts'을 인코딩하는데 초점을 맞춤. 일반적인 text-to-image model에서는 image의 representation에 대한 후보군을 text encoder의 word-embedding 단계에서 찾는다. 그러나 이러한 접근 방식은 이미지에 대한 in-depth visual understanding을 필요로 하지 않는다(생성자가 이미지에 대해서 시각적인 이해? 없이 그린다.) 따라서 여기서는 GAN inversion에서 영감을 받은 visual reconstruction objective를 제시. + +## cf) GAN Inversion(이해 못함) +출처) - https://hyoseok-personality.tistory.com/entry/GAN-Inversion + +:::{figure-md} GAN inversion +GAN inversion + +GAN inversion \ (source: https://hyoseok-personality.tistory.com/entry/GAN-Inversion) +::: + +- 입력 이미지와 유사한 결과 이미지를 얻을 수 있도록 하는 latent vector를 찾는 과정. GAN이 학습되면 random latent vector로부터 이미지를 생성해낸다. GAN inversion은 이의 역과정으로써 GAN의 latent space로 input image를 inverting시켜 latent vector를 알아가는 과정. + +## LDM(Latent Diffusion Model) +논문에서는 생성모델로서 LDM(Latent Diffusion Model)을 사용함. 이전에 말했듯이, LDM은 하나도 건들지 않음. + +:::{figure-md} LDM objective function +LDM objective function + +LDM objective function \ (source: https://arxiv.org/pdf/2208.01618.pdf) +::: + +## Text Embeddings +:::{figure-md} Text-Embedding +Text-Embedding + +Text-Embedding \ (source: https://arxiv.org/pdf/2208.01618.pdf) +::: +- 입력된 문자열의 각 단어, 하위 단어는 tokenizer를 통과하며, 미리 정의된 dictionary에서 index token으로 변환함. 각 토큰을 통해 찾을 수 있는 고유한 임베딩 벡터에 연결됨. +- index에 의한 embedding vector는 일반적으로 text encoder인 C_Θ의 일부로 학습된다. 이러한 space를 inversion target으로 삼았음. 새로운 개념을 나타내기 위해 자리표시자 문자열인 S*를 새롭게 지정함. 이 과정에서 PALAVRA를 사용했을 것으로 추정함. 임베딩 process에 개입해서 tokenize된 문자열과 관련된 vector를 새로운 학습된 embedding V*로 대체하여 본질적으로 어휘(pseudo-word)에 개념을 주입함. 이렇게 함으로써 다른 단어와 마찬가지로 concept를 포함하는 새로운 문장을 만들 수 있었음. + +## Textual Inversion +새로운 embedding을 찾기 위해 작은 규모의 dataset(3-5장)을 사용해 다양한 배경 또는 포즈와 같은 여러 설정에 걸쳐 목표 concept을 묘사함. 이러한 작은 dataset에서 LDM loss를 최소화하는 과정을 통해 V를 최적화함. 생성 조건을 고정하기 위해 CLIP ImageNet 템플릿에서 파생된 중립 컨텍스트 텍스트를 무작위로 샘플링한다. 여기에는 "A photo of S*", "A rendition of S*" 등의 형식 프롬프트가 포함된다.(아마 원본 이미지와 최대한 비슷하게 만들어서 원본과 비교하기 위한 목적이 아닐까 싶음) 최적화 목표식은 다음과 같음. + +:::{figure-md} textual inversion objective function +textual inversion objective function + +textual inversion objective function \ (source: https://arxiv.org/pdf/2208.01618.pdf) +::: + +LDM loss함수와 매우 유사함. 여기서 CΘ와 eΘ는 고정. 해당 따라서 학습된 embedding이 개념에 미세한 시각적 detail을 포착할 수 있을것으로 기대함. + +# 성능평가 +## DALL:E-2와 비교 +:::{figure-md} compare with DALLE-2 +compare with DALLE-2 + +compare with DALLE-2 \ (source: https://arxiv.org/pdf/2208.01618.pdf) +::: +- input image에 대한 디테일을 더 잘 포착하는 모습을 볼 수 있다. + +## Text guided synthesis + +:::{figure-md} text guided synthesis +text guided synthesis + +text guided synthesis - 입력 이미지의 스타일과 유사하면서도 text guide에 맞춰서 잘 진행함. + \ (source: https://arxiv.org/pdf/2208.01618.pdf) +::: + +- Textual Inversion 모델은 새로운 주제에 대해 더 정확하게 개념을 보존하고, 새로운 임베딩과 나머지 캡션들에 대해서도 모두 추론이 가능했음. + +:::{figure-md} style transfer +style transfer + +style transfer \ (source: https://arxiv.org/pdf/2208.01618.pdf) +::: +- 적은 데이터셋으로도 style을 보존하면서 표현한 그림 + +## pseudo word 두 개 사용 + +:::{figure-md} two pseudo word +two pseudo word + +two pseudo word \ (source: https://arxiv.org/pdf/2208.01618.pdf) +::: + +## Bias Reduction +:::{figure-md} Bias reduction +Bias reduction + +Bias reduction \ (source: https://arxiv.org/pdf/2208.01618.pdf) +::: + +기존 모델의 결과를 보면, 위 사진에서와 같이 '의사'라는 단어를 사용하면, 보통 백인 남성 의사를 잘 그려냈음. 이는 기존 데이터셋에서 남성 의사 사진 데이터가 많았음을 보여준다. 보다 작은 imageset에서 새로운 embedding을 학습함으로써 이러한 bias를 줄일 수 있음을 보여준다(즉, 성별 및 인종적 다양성에 대한 인식을 높일 수 있음). + +# 정량평가 + +latent space embedding의 품질을 분석. + +1. reconstruction(y축?): target concept를 얼마나 잘 복제하는지. 특정 이미지가 아닌 개념에 대한 변형을 생성하므로 의미적 CLIP 공간 거리를 고려하여 유사성을 측정.(이미지에 자체가 아닌, 이미지가 가진 '개념'에 대해 latent space를 생성하므로) 각 컨셉에 대해 "A photo of S*"라는 prompt를 사용해 64개의 이미지를 생성. +2. editability(x축?): text prompt를 사용해 개념을 수정하는 능력을 평가. 다양한 난이도와 다양한 설정의 prompt를 사용해 일련의 이미지를 생성. + +각 prompt 별로, 50 DDIM step을 사용해 64개의 샘플을 만들고, CLIP-space embedding을 평가, textual prompt의 CLIP-space embedding에서 cosine similarity를 계산. 높은 스코어는 더 높은 editing capability와 prompt의 신뢰도를 보여줌. + +## 평가 setups +GAN inversion에서 영감을 받은 실험 환경 설정에 따름. 생략 + +## 결과 +:::{figure-md} quantative evaluation1 +quantative evaluation1 + +quantative evaluation1 \ (source: https://arxiv.org/pdf/2208.01618.pdf) +::: + +### 주목할 점 + +1. 많은 baseline과 우리 방법의 semantic reconstruction quality는 단순히 training set에서 임의의 이미지를 샘플링하는 것과 비슷함(== 원본 이미지와 생성된 이미지가 큰 차이가 없었다?) + +2. single-word method는 비슷한 reconstruction quality를 달성하고, 모든 multi-word baseline에서 상당히 향상된 editablity을 달성. 이러한 점은 text embedding space의 인상적인 유연성을 나타내고, 단일 pseudo word만 사용하면서 높은 정확도로 새로운 개념을 캡처하는데 도움이 될 수 있음을 보여줌. + +3. baseline이 distortion-editability tradeoff 곡선의 outline을 그리며 실제 단어 분포에 더 가까운 embedding이 더 쉽게 수정될 수 있음. 그러나 target의 세부 정보를 캡처하지는 못함. 반대로, 단어 분포에서 멀리 벗어나면 editability가 크게 감소하는 대신 향상된 reconstruction이 가능해짐. 특히 single embedding model은 단순히 learning rate를 변경해 이 곡선을 따라 이동할 수 있으므로 사용자에게 이 tradeoff에 대한 어느 정도의 제어를 제공함. + +4. concept에 대한 human description을 사용하면 유사성을 포착하지 못하면서도, editability가 감소함. + + +## 사용자평가 + +:::{figure-md} human test +human test + +human test \ (source: https://arxiv.org/pdf/2208.01618.pdf) +::: + +두 개의 설문지: +1) 사용자는 concept의 training set에서 4개의 이미지를 제공받았고, 이미지와의 유사성에 따라 5개의 모델에서 생성된 결과의 순위를 매김. + +2) 이미지 context를 설명하는 텍스트를 제공받았고, 텍스트와 생성된 이미지의 유사성에 따라 순위를 매김. + +각 질문별로 600개씩 총 1,200개의 응답을 수집. + +# Limitation +1. 이미지 생성에 더 많은 자유도를 제공하지만, concept의 의미론적인 본질을 파악하거나, 정확한 shape를 학습하는데 한계. +2. 최적화가 오래 걸린다. 하나의 concept를 학습하는데 약 2시간이 소요됨. + +# 마무리 +: 새로운 설정과 장면에서 특정 concept의 이미지를 생성하기 위해 text-to-image model를 활용하는 개인화되며, language-guided generation을 소개함. 여기서 사용한 'text inversion'은 pretrained text-to-image 모델의 text embedding space 내에서 concept를 새로운 pseudo word로 inverse하여 작동함. 이러한 pseudo-word는 간단한 자연어 설명을 사용해 새로운 장면에 삽입할 수 있으므로 간단하고 직관적인 수정이 가능함. + + 어떤 의미에서 이 방법은 사용자가 편집하기 쉽도록 텍스트 기반 interpace를 사용하지만 자연 언어의 한계에 접근할 때 시각적 단서를 제공하는 등 multi modal 정보를 활용할 수 있도록 함. + 이러한 접근 방식은 공개적으로 사용가능한 가장 큰 text-to-image model인 LDM을 통해 구현됨. 그러나 접근 방식에 아키텍처 세부 정보에 의존하지 않음. 따라서 textual inversion은 추가적인 대규모 text-to-image model에 쉽게 적용할 수 있다고 생각. 거기에서 text-to-image alignment, shape preseravation, image generation fidelity가 더 향상될 수 있음. \ No newline at end of file diff --git a/_sources/docs/review/VideoLDM.md b/_sources/docs/review/VideoLDM.md old mode 100644 new mode 100755 index f3d443b0..ebb1c7ec --- a/_sources/docs/review/VideoLDM.md +++ b/_sources/docs/review/VideoLDM.md @@ -1,193 +1,193 @@ -```{admonition} Information -- **Title:** Align your Latents: High-Resolution Video Synthesis with Latent Diffusion Models - -- **Reference** - - Paper: [https://arxiv.org/abs/2304.08818](https://arxiv.org/abs/2304.08818) - -- **Author:** Jun-Hyoung Lee - -- **Last updated on Nov. 30. 2023** -``` - -# VideoLDM - -:::{figure-md} -figure1 - -Video LDM samples -::: - -## Abstract - -- Latent Diffusion Models (LDMs)는 computing resource 를 줄이기 위해 낮은 차원의 latent space 로 압축하여 high quality 의 image synthesis 를 가능하게 했다. -- 비디오 생성 모델링의 퀄리티 부족하며, - - 이유가 학습에 필요한 computing cost 가 많이 발생, 데이터 셋 부족하다. -- 제안 - :::{figure-md} - figure2 - - Temproal Video finetuning - ::: - - - 기존에는 가우시안 노이즈의 랜덤한 샘플들 끼리의 denoising 결과 다른 이미지를 생성했다. - - Temporal Video finetuning 을 거치게 되면 비디오 시퀀스의 형태(시간축에 정렬된 이미지)로 생성할 수 있다. -- VideoLDM 은 기존 LDM 방법에 고해상도의 비디오 생성을 적용했다. - 1. 대규모 이미지 데이터 셋을 활용해 LDM 을 pre-train 했고, (only image) - - pre-trained image LDMs 를 활용 가능하다. - - temporal modeling 만 학습한다.(기존 이미지 LDM은 freeze) - - 1280x2048 해상도 까지 가능하다. - 2. 그 후, 이미지 generator 를 비디오 generator 로 전환한다. - - latent space diffusion model 에 temporal(시간적) 차원을 적용한다. - - 이미지 시퀀스(비디오)를 인코딩해 파인 튜닝 진행한다. - 3. diffusion model upsampler 를 시간적으로 정렬하여 일관적인 비디오 super resolution model 로 변환한다. -- Applied task - - 자율 주행의 시뮬레이션 엔진 (512x1024 해상도로 실제로 평가 진행해 sota 달성) - - creative content creation (using text-to-video) - -## 3. Latent Video Diffusion Models - -- 비디오 데이터 셋: $x ∈ R^{T×3×\tilde H×\tilde W}$ 로 표현 - - $T$: frame 수, $\tilde H, \tilde W$: 높이, 너비 - -### 3.1. Turning Latent Image into Video Generators - -- 잘 학습된 image LDM 을 활용하는 것이 주요한 key point. - - 문제점 - - image LDM 은 개별의 프레임에 대한 high quality 이미지를 생성할 수 있고, - → 시간적인 정보는 포함하고 있지 않다. - - 따라서 이를 연속적인 프레임으로 렌더링해 사용할 수 없다. -- $l_\phi ^i$ 로 표현하는 temporal neural network 를 추가했다. - - 이는 이미지 LDM 의 공간적인 정보에 연관되며, 시간적으로 일관된 방식으로 개별 프레임을 정렬할 수 있도록 한다. - - 비디오를 인식할 수 있는 backbone 을 정의한다. - - :::{figure-md} - figure4 - - Video-Aware Temporal Backbone - ::: - - :::{figure-md} - einops - - Einops notation - ::: - - - einops 로 구현했으며, spatial layer 에서는 비디오(배치x시간) 정보가 함께 인코딩이 되며, - - temporal layer 에서는 이를 rearrange 를 통해 배치, 시간 정보를 나눠 시간 차원에서 인코딩이 진행된다. - - (option) 이때 text prompt 가 conditioning 이 될 수 있다. - - (i) temporal attention (ii) 3D conv 로 구성된다. - - + Sinusoidal embedding 을 사용해 시간에 대한 위치 인코딩 활용했다. - - temporal layer 을 거친 후, spatial layer 의 output 과 가중합을 통해 정보가 결합된다. - - -#### 3.1.1 Temporal Autoencoder Finetuning - -- Image LDM 을 사용하면 시퀀스로 생성할 때 flickering이 발생하는 문제가 있다. - - 이를 해결하기 위해, autoencoder 의 decoder 에서 temporal 한 layer 를 추가한다. - - 이는 3D conv 로 구축된 patch-wise temporal discriminator 도 추가해 비디오 데이터를 fine tuning 한다. - - :::{figure-md} - figure3 - - Temporal Autoencoder Finetuning - ::: - -- 인코딩된 비디오 프레임의 latent space 내에서 image DM 을 사용할 수 있도록 인코더는 학습이 되지 않는다. - -### 3.2. Prediction Models for Long-Term Generation - -- 그럼에도 불구하고, 긴 동영상은 생성하지 못하는 한계가 있다. -- 따라서 전체 $T$ 프레임에서 마스킹된 $S$ 프레임으로 구성해 모델이 예측하게끔 학습을 한다. - - 이러한 프레임들은 LDM 의 인코더를 통해 채널 차원에 concat 되며, temporal layer 에 입력된다. -- inference 에서는 반복적인 샘플링 과정을 통해 긴 영상을 생성할 수 있게 했다. - - 최신 prediction 을 재 사용해 새로운 context 를 생성했다. - - classifier-free guidance 를 도입해 마스킹된 프레임 수를 0, 1, 2 개를 사용해 학습. - -### 3.3. Temporal Interpolation for High Frame Rates - -:::{figure-md} -interpolation - -Temporal Interpolation -::: - -- High resolution video 란 해상도 뿐만 아니라 높은 frame rate 를 가지고 있어야 한다. -- 이를 위해 두 가지 과정으로 진행한다. - 1. semantic 한 큰 변화가 있는 키 프레임을 생성한다. - - 메모리 제약으로 인해 low frame rate 로 생성할 수 있다. - 2. 키 프레임을 활용한 interpolate 진행한다. - - interpolate 할 프레임을 masking 을 씌운다. - - 두 개의 키 프레임에 대해 세 개의 프레임을 예측하는 것으로 T → 4T interpolation model 을 학습해 사용했다. - - 높은 frame rate 를 위해 16T 까지 interpolation 모델 구축. - - -### 3.4. Temporal Fine-tuning of SR Models - -- megapixel 의 해상도까지 생성하는 것이 목표이다. - - cascaded DMs 에 영감받아 4배 해상도를 키웠다. - - :::{figure-md} - cascaded_dms - - Cascaded DM - ::: - - - noise augmentation(with noise level conditioning) 으로 super resolution 모델 학습했다. -- 또한 consistency 한 SR 모델을 구축하기 위해 spatial / temporal layer를 추가했다. - - 저해상도 시퀀스 길이 $T$ 를 concat 하여 conditioning - - locally 하게 patch 단위로 연산하고, 후에 convolution 을 진행한다. -- computing resource - - VideoLDM 에서의 main LDM 을 효율적으로 연산을 하기 위해 latent space 에서 모든 비디오 모델링이 수행된다. - - 그로 인해, 높은 배치 사이즈 + 긴 영상 생성 가능하다. - - upsampler 는 패치 단위로 진행하기에 computing resource 를 줄일 수 있다. - -## 4. Experiments - -- Dataset - - RDS(real driving scene): 683,060 개, 8초(30 fps), 512×1024, day/night, “crowdedness” - - WebVid-10M: 10.7M video-caption pairs, 52K video hours, resized 320×512 -- Evaluation metric - - FVD + human evaluation - - CLIP similarity (CLIP- SIM) + IS - -### 4.1. High-Resolution Driving Video Synthesis - -:::{figure-md} -figure7 - -Real-World Driving Scenes with Video LDM -::: - -### 4.2. Text-to-Video with Stable Diffusion - -- WebVid-10M 데이터셋(resized 320×512)으로 Stable Diffusion 의 spatial layer 에 대해 학습했고, - - text-conditioning 을 적용한 temporal layer 를 추가해 학습 진행했다. - - 그 후 upscaler 를 학습해 4배 upscale 해 1280×2048 해상도로 비디오 생성 가능해졌다. - - 113 frames: 24fps 4.7초 or 30fps 3.8초 - - :::{figure-md} - figure6 - - Text-to-Video with Stable Diffusion - ::: - - - 다양성이 적은 Real video 로 제한적인 데이터로 학습했지만, 기존 Stable Diffusion 의 생성 능력을 가져와 artistic 한 생성이 가능하다. - - performance - - :::{figure-md} - table4_5 - - Performance Table - ::: - - - Make-A-Video 의 경우 VideoLDM 보다 더 많은 데이터 셋과 text-to-video를 entirely하게 학습했다. - -#### 4.2.1 Personalized Text-to-Video with Dreambooth - -:::{figure-md} -figure8 - -Text-to-Video with DreamBooth -::: - -- 위쪽의 VideoLDM 을 활용한 결과가 consistency 한 결과를 가져왔다. +```{admonition} Information +- **Title:** Align your Latents: High-Resolution Video Synthesis with Latent Diffusion Models + +- **Reference** + - Paper: [https://arxiv.org/abs/2304.08818](https://arxiv.org/abs/2304.08818) + +- **Author:** Jun-Hyoung Lee + +- **Last updated on Nov. 30. 2023** +``` + +# VideoLDM + +:::{figure-md} +figure1 + +Video LDM samples +::: + +## Abstract + +- Latent Diffusion Models (LDMs)는 computing resource 를 줄이기 위해 낮은 차원의 latent space 로 압축하여 high quality 의 image synthesis 를 가능하게 했다. +- 비디오 생성 모델링의 퀄리티 부족하며, + - 이유가 학습에 필요한 computing cost 가 많이 발생, 데이터 셋 부족하다. +- 제안 + :::{figure-md} + figure2 + + Temproal Video finetuning + ::: + + - 기존에는 가우시안 노이즈의 랜덤한 샘플들 끼리의 denoising 결과 다른 이미지를 생성했다. + - Temporal Video finetuning 을 거치게 되면 비디오 시퀀스의 형태(시간축에 정렬된 이미지)로 생성할 수 있다. +- VideoLDM 은 기존 LDM 방법에 고해상도의 비디오 생성을 적용했다. + 1. 대규모 이미지 데이터 셋을 활용해 LDM 을 pre-train 했고, (only image) + - pre-trained image LDMs 를 활용 가능하다. + - temporal modeling 만 학습한다.(기존 이미지 LDM은 freeze) + - 1280x2048 해상도 까지 가능하다. + 2. 그 후, 이미지 generator 를 비디오 generator 로 전환한다. + - latent space diffusion model 에 temporal(시간적) 차원을 적용한다. + - 이미지 시퀀스(비디오)를 인코딩해 파인 튜닝 진행한다. + 3. diffusion model upsampler 를 시간적으로 정렬하여 일관적인 비디오 super resolution model 로 변환한다. +- Applied task + - 자율 주행의 시뮬레이션 엔진 (512x1024 해상도로 실제로 평가 진행해 sota 달성) + - creative content creation (using text-to-video) + +## 3. Latent Video Diffusion Models + +- 비디오 데이터 셋: $x ∈ R^{T×3×\tilde H×\tilde W}$ 로 표현 + - $T$: frame 수, $\tilde H, \tilde W$: 높이, 너비 + +### 3.1. Turning Latent Image into Video Generators + +- 잘 학습된 image LDM 을 활용하는 것이 주요한 key point. + - 문제점 + - image LDM 은 개별의 프레임에 대한 high quality 이미지를 생성할 수 있고, + → 시간적인 정보는 포함하고 있지 않다. + - 따라서 이를 연속적인 프레임으로 렌더링해 사용할 수 없다. +- $l_\phi ^i$ 로 표현하는 temporal neural network 를 추가했다. + - 이는 이미지 LDM 의 공간적인 정보에 연관되며, 시간적으로 일관된 방식으로 개별 프레임을 정렬할 수 있도록 한다. + - 비디오를 인식할 수 있는 backbone 을 정의한다. + + :::{figure-md} + figure4 + + Video-Aware Temporal Backbone + ::: + + :::{figure-md} + einops + + Einops notation + ::: + + - einops 로 구현했으며, spatial layer 에서는 비디오(배치x시간) 정보가 함께 인코딩이 되며, + - temporal layer 에서는 이를 rearrange 를 통해 배치, 시간 정보를 나눠 시간 차원에서 인코딩이 진행된다. + - (option) 이때 text prompt 가 conditioning 이 될 수 있다. + - (i) temporal attention (ii) 3D conv 로 구성된다. + - + Sinusoidal embedding 을 사용해 시간에 대한 위치 인코딩 활용했다. + - temporal layer 을 거친 후, spatial layer 의 output 과 가중합을 통해 정보가 결합된다. + + +#### 3.1.1 Temporal Autoencoder Finetuning + +- Image LDM 을 사용하면 시퀀스로 생성할 때 flickering이 발생하는 문제가 있다. + - 이를 해결하기 위해, autoencoder 의 decoder 에서 temporal 한 layer 를 추가한다. + - 이는 3D conv 로 구축된 patch-wise temporal discriminator 도 추가해 비디오 데이터를 fine tuning 한다. + + :::{figure-md} + figure3 + + Temporal Autoencoder Finetuning + ::: + +- 인코딩된 비디오 프레임의 latent space 내에서 image DM 을 사용할 수 있도록 인코더는 학습이 되지 않는다. + +### 3.2. Prediction Models for Long-Term Generation + +- 그럼에도 불구하고, 긴 동영상은 생성하지 못하는 한계가 있다. +- 따라서 전체 $T$ 프레임에서 마스킹된 $S$ 프레임으로 구성해 모델이 예측하게끔 학습을 한다. + - 이러한 프레임들은 LDM 의 인코더를 통해 채널 차원에 concat 되며, temporal layer 에 입력된다. +- inference 에서는 반복적인 샘플링 과정을 통해 긴 영상을 생성할 수 있게 했다. + - 최신 prediction 을 재 사용해 새로운 context 를 생성했다. + - classifier-free guidance 를 도입해 마스킹된 프레임 수를 0, 1, 2 개를 사용해 학습. + +### 3.3. Temporal Interpolation for High Frame Rates + +:::{figure-md} +interpolation + +Temporal Interpolation +::: + +- High resolution video 란 해상도 뿐만 아니라 높은 frame rate 를 가지고 있어야 한다. +- 이를 위해 두 가지 과정으로 진행한다. + 1. semantic 한 큰 변화가 있는 키 프레임을 생성한다. + - 메모리 제약으로 인해 low frame rate 로 생성할 수 있다. + 2. 키 프레임을 활용한 interpolate 진행한다. + - interpolate 할 프레임을 masking 을 씌운다. + - 두 개의 키 프레임에 대해 세 개의 프레임을 예측하는 것으로 T → 4T interpolation model 을 학습해 사용했다. + - 높은 frame rate 를 위해 16T 까지 interpolation 모델 구축. + + +### 3.4. Temporal Fine-tuning of SR Models + +- megapixel 의 해상도까지 생성하는 것이 목표이다. + - cascaded DMs 에 영감받아 4배 해상도를 키웠다. + + :::{figure-md} + cascaded_dms + + Cascaded DM + ::: + + - noise augmentation(with noise level conditioning) 으로 super resolution 모델 학습했다. +- 또한 consistency 한 SR 모델을 구축하기 위해 spatial / temporal layer를 추가했다. + - 저해상도 시퀀스 길이 $T$ 를 concat 하여 conditioning + - locally 하게 patch 단위로 연산하고, 후에 convolution 을 진행한다. +- computing resource + - VideoLDM 에서의 main LDM 을 효율적으로 연산을 하기 위해 latent space 에서 모든 비디오 모델링이 수행된다. + - 그로 인해, 높은 배치 사이즈 + 긴 영상 생성 가능하다. + - upsampler 는 패치 단위로 진행하기에 computing resource 를 줄일 수 있다. + +## 4. Experiments + +- Dataset + - RDS(real driving scene): 683,060 개, 8초(30 fps), 512×1024, day/night, “crowdedness” + - WebVid-10M: 10.7M video-caption pairs, 52K video hours, resized 320×512 +- Evaluation metric + - FVD + human evaluation + - CLIP similarity (CLIP- SIM) + IS + +### 4.1. High-Resolution Driving Video Synthesis + +:::{figure-md} +figure7 + +Real-World Driving Scenes with Video LDM +::: + +### 4.2. Text-to-Video with Stable Diffusion + +- WebVid-10M 데이터셋(resized 320×512)으로 Stable Diffusion 의 spatial layer 에 대해 학습했고, + - text-conditioning 을 적용한 temporal layer 를 추가해 학습 진행했다. + - 그 후 upscaler 를 학습해 4배 upscale 해 1280×2048 해상도로 비디오 생성 가능해졌다. + - 113 frames: 24fps 4.7초 or 30fps 3.8초 + + :::{figure-md} + figure6 + + Text-to-Video with Stable Diffusion + ::: + + - 다양성이 적은 Real video 로 제한적인 데이터로 학습했지만, 기존 Stable Diffusion 의 생성 능력을 가져와 artistic 한 생성이 가능하다. + - performance + + :::{figure-md} + table4_5 + + Performance Table + ::: + + - Make-A-Video 의 경우 VideoLDM 보다 더 많은 데이터 셋과 text-to-video를 entirely하게 학습했다. + +#### 4.2.1 Personalized Text-to-Video with Dreambooth + +:::{figure-md} +figure8 + +Text-to-Video with DreamBooth +::: + +- 위쪽의 VideoLDM 을 활용한 결과가 consistency 한 결과를 가져왔다. diff --git a/_sources/docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier.md b/_sources/docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier.md old mode 100644 new mode 100755 index 1e2ed35f..c2b6446a --- a/_sources/docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier.md +++ b/_sources/docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier.md @@ -1,271 +1,271 @@ -``` {admonition} Information -- **Title:** {Your Diffusion Model is Secretly a Zero-Shot Classifier}, {ICCV 2023} - -- **Reference** - - Paper: [https://arxiv.org/pdf/2303.16203.pdf](https://arxiv.org/pdf/2303.16203.pdf) - - Github io: [https://diffusion-classifier.github.io/](https://diffusion-classifier.github.io/) - - Code: [https://github.com/diffusion-classifier/diffusion-classifier](https://github.com/diffusion-classifier/diffusion-classifier) - -- **Author:** SeonHoon Kim -- **Edited by:** SeonHoon Kim - -- **Last updated on Nov. 09, 2023** -``` - -# Your Diffusion Model is Secretly a Zero-Shot Classifier - -- **핵심** - - 학습된 **Diffusion Models 에서 Classifier 를 추가 학습 없이 획득**할 수 있다. - - **Stable Diffusion** 같은 거대 모델로부터 **Zero-shot classifier** 를 얻을 수 있다. - - **Class-conditional Diffusion Models** 에서는 **일반적인 (non Zero-shot) classifier** 를 얻을 수 있다. -- **결과 요약** - - **Classification 성능이 나쁘지 않았다.** - - **Zero-shot classifier 는 Multimodal Compositional reasoning ability 가 매우 훌륭**했다. - - 이렇게 Diffusion 모델에서 추출된 Classifiers 는 **Distribution shift 에 대해 Robust** 한 성능을 보여주었다. - -- **Classifier 구현 방법** - -:::{figure-md} -img_00 - -Diffusion Classifier 아키텍쳐 -::: - -- **예시로 먼저 살펴보기.** -- 예를 들어, 어떤 동물 이미지 X 를 Stable Diffusion 으로 Classification 하고 싶다면..
- 1. 일단 해당 동물의 클래스를 포함하고 있을 만한 데이터셋을 구한다.
- 37개의 동물 클래스가 존재하는 Pets 데이터셋을 사용한다고 치자.
- 2. text prompts 로 “호랑이” 가 주어진 Stable Diffusion 으로,
- X 의 Noised Image 에서 Reverse process 를 진행한다. 그럼 Loss 를 획득할 수 있을 것이다.
- 3. 37개의 모든 Pets Classes 에 대해서 이를 수행해서,
- 가장 Loss 가 작은 Class 를 판별한다.
- 이 Class 가 바로 이미지 X 의 클래스이다. - -:::{figure-md} -img_01 - -Algorithm 1 : Diffusion Classifier 학습 알고리즘 -::: - -1. `n_samples` 에 지정된 수 만큼 t 와 noise 를 각각 샘플링해 벡터를 만든다. -2. 클래스 판별이 필요한 이미지 X 의 t-step Noised image 인 X_t 를 구한다. -3. X_t 를 Diffusion Model 에 Input 으로 주어 Noise 를 출력한다. -4. **loss** 를 구한다.
-- 위 과정을, 여러 번 (`n_trials` 만큼) 시도해서 평균낼 수도 있다. -5. loss 가 가장 낮은 Class 를 찾을 때 까지, 가능한 모든 Class 에 대해 추론한다. -6. 최종 남은 Class 를 X 의 Class 라고 판정한다. -- Zero-shot classification 도 위와 동일한 과정으로 진행된다.
-다만 추론할 Class list 가 필요하다.
- - 예를 들어서, Stable Diffusion 의 Zero-shot classification 을 수행하기 위해서는,
- (Stable Diffusion 이 학습하지는 않았지만) 37개의 클래스가 정의되어 있는
- Pets 와 같은 데이터셋으로 Classification 을 수행할 수 있다. -- 하지만, Class 마다 n_samples 수 만큼 t 를 샘플링하고,
-또 X_t 를 구하고,
-Diffusion Model 로 노이즈를 추론하고,
-loss 를 구하는 것은 Inference times 가 많이 소모됨.
-따라서 다음의 방법을 활용해 inference times 을 줄인다. - -:::{figure-md} -img_02 - -Algorithm 2. Efficient Diffusion Classifier Algorithm -::: - -1. **일단 작은 수의 n_samples 로 error 가 높은 class 들을 걸러낸다.** -2. **소수의 class 만 남았다면,
-이제는 정확한 추론을 위해서 더 큰 n_samples 를 설정해 추론한다.
-(large n_samples 로 t 와 $\epsilon$ 을 sampling 한다.)** -- c.f. - -```markdown -### Oxford-IIIT Pets -```bash -python eval_prob_adaptive.py --dataset pets --split test --n_trials 1 \ - --to_keep 5 1 --n_samples 25 250 --loss l1 \ - --prompt_path prompts/pets_prompts.csv -``` - -- 왜 이렇게까지 inference time 을 줄이려고 하지??
- - 위의 스크립트 그대로 RTX 3090 에서 돌리면,
- Pets 이미지 1장 Classification 하는데 18초 걸린다.
- - ImageNet 은 Class 1,000 개 있는데,
- 512x512 이미지 1장 Classification 하려면 1,000 초 걸린다. -- **c.f. Loss 계산 코드 (eval_prob_adaptive.py)** - -```python -all_noise = torch.randn((max_n_samples * args.n_trials, 4, latent_size, latent_size), device=latent.device) - -def eval_error(unet, scheduler, latent, all_noise, ts, noise_idxs, - text_embeds, text_embed_idxs, batch_size=32, dtype='float32', loss='l2'): - assert len(ts) == len(noise_idxs) == len(text_embed_idxs) - pred_errors = torch.zeros(len(ts), device='cpu') - idx = 0 - with torch.inference_mode(): - for _ in tqdm.trange(len(ts) // batch_size + int(len(ts) % batch_size != 0), leave=False): - batch_ts = torch.tensor(ts[idx: idx + batch_size]) - noise = all_noise[noise_idxs[idx: idx + batch_size]] - noised_latent = latent * (scheduler.alphas_cumprod[batch_ts] 0.5).view(-1, 1, 1, 1).to(device) + \ - noise * ((1 - scheduler.alphas_cumprod[batch_ts]) 0.5).view(-1, 1, 1, 1).to(device) - t_input = batch_ts.to(device).half() if dtype == 'float16' else batch_ts.to(device) - text_input = text_embeds[text_embed_idxs[idx: idx + batch_size]] - noise_pred = unet(noised_latent, t_input, encoder_hidden_states=text_input).sample - if loss == 'l2': - error = F.mse_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3)) - elif loss == 'l1': - error = F.l1_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3)) - elif loss == 'huber': - error = F.huber_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3)) - else: - raise NotImplementedError - pred_errors[idx: idx + len(batch_ts)] = error.detach().cpu() - idx += len(batch_ts) - return pred_errors -``` - - -- **실험 결과** - - **Figure 2** - - :::{figure-md} - img_03 - - Figure 2 - ::: - - - 특정한 이미지 x 의 모든 클래스에 대해서 loss 를 추론하게 될텐데,
- **모든 클래스에 대해서
- 동일한 $\epsilon$** (즉 sampled noise) **과 동일한 t** (즉 sampled time steps) **를 사용해야** 한다.
- **이 두 변수에 따라 loss 가 크게 달라지기 때문.** - -- **Figure 3 & Figure 4** - - **Figure 3** - - t 에 따라서, Classification 성능이 달라졌다. - - **Figure 4** - - Figure 3 의 결과에 따라서,
- intermediate timesteps 를 더 많이 sampling 하면 성능이 올라가는지 실험해보았다. - - 그렇지 않았다.
- timesteps 를 Uniform 하게 sampling 했을 때 성능이 가장 좋았다. - -:::{figure-md} -img_04 - -Figure 3 -::: - -:::{figure-md} -img_05 - -Figure 4 -::: - -- **Table 1** (+ F. Additional Implementation Details 참고) - -:::{figure-md} -img_06 - -Table 1 -::: - -- 본 논문에서 제시한 Diffusion Classifier 가 Classification 능력이 나쁘지 않았다. -1. Diffusion 모델에서 knowledge 를 추출해내는 다른 방법들보다 성능이 뛰어났다.
- - Diffusion Classifier 는 **Zero-shot 성능**이,
- **“Stable Diffusion 으로 생성된 영상을“ 학습한** **ResNet-50** **classifier** 보다 뛰어났다.
- - **Synthetic SD data :**
- Class 마다 10,000 장의 이미지를 Stable Diffusion 2.0 으로 생성해
- 데이터셋을 구축하고 (90% train / 10% validation),
- 해당 데이터셋으로 ResNet-50 classifier 를 학습시켜서 classification 수행한 결과
- - Diffusion Classifier 는 **Classification 성능**이,
- **Stable Diffusion 의 intermediate U-Net layer 를 추출해 학습시킨
- ResNet-based 모델**보다 뛰어났다.
- - **SD features :**
- Input 이미지에 따른 Stable Diffusion 의 Intermediate U-Net features 를
- ResNet 기반의 classifier 에 전달해서 추론.
- 이 때 classifier 는 모든 데이터셋을 직접 학습한다. 따라서 zero-shot 은 아니다.
-2. **CLIP ResNet-50 모델보다도 성능이 뛰어났다.** -3. **OpenCLIP ViT-H/14 모델에 competitive** 했다. - -- **Table 2** - -:::{figure-md} -img_07 - -Table 2 -::: - -- **Stable Diffusion 은**
-Resolution 이 높은지, Aesthetic 한지, Safe-for-work 한지에 따라서 **filtered 된
-LAION-5B 데이터셋을 학습**했다. -- 이와 같은 기준으로 filtering 하면,
-**CIFAR10, Pets, Flowers, STL10, ImageNet 데이터셋의 test set 은 97~100% 가 filtered out** 된다. -- 따라서, **이들 데이터셋은 Stable Diffusion 에게 완전한 out-of-distribution 데이터**이다. -- 따라서, **필터링이 안된 데이터로 Stable Diffusion 을 추가 학습시키면
-classification 성능도 올라갈 것**이다. - -- **Figure 5 & Table 3** - -:::{figure-md} -img_08 - -Figure 5 -::: - -:::{figure-md} -img_09 - -Table 3 -::: - -- 본 논문에서는 Winoground 데이터셋을 활용해
-visio-linguistic compositional reasoning abilities 를 측정했다.
- - 주어진 captions 를 적절한 이미지에 매치시키는 능력을 측정하는 것이다.
- - Winoground 데이터셋
- - Object 는 명사절끼리 뒤바뀐 경우
- - Relation 은 동사끼리 or 형용사끼리 or 부사끼리 뒤바뀐 경우
- - Both 는 다른 품사끼리 서로 뒤바뀐 경우
-- Stable Diffusion 의 Diffusion Classifier 가 최고의 성능을 보여주었다. -- 본 논문에서 제시한 method 를 통해서 **추가 학습 없이,**
-여느 diffusion 모델처럼 sample generation 만을 학습했음에도,
-**Stable Diffusion 모델을 훌륭한 classifier 이자 reasoner 로 변모**시킬 수 있었다. - -- **Table 4** - -:::{figure-md} -img_10 - -Table 4 -::: - -- ImageNet 에 존재하는 **1,000 개의 클래스를 활용해**
-Pretrained **DiT** (Diffusion Transformer) 를 활용한 **Diffusion Classifier 의 성능**을,
-**Discriminative Classifiers** (ResNet-101 and ViT-B/16) **와 비교**했다. -- **ImageNet** 에 대해서, **79.1% 의 top-1 accuracy 를 기록하며 ViT-L/32 을 능가**했다. -- **더 적은 augmentation 기법**을 사용하였고,
-**regularization 은 사용하지 않았음에도** Discriminative Classifiers 의 성능을 능가했다. - -- **Figure 6** - -:::{figure-md} -img_11 - -Figure 6 -::: - -- ImageNet 데이터셋에서,
-ImageNet-A 와 겹치는 클래스에 대해서만 Classification 을 수행한다. -- 일반적인 **discriminative classifiers 는 신뢰구간 과 함께 파란 점**으로 찍혀 있다. -- **Diffusion Classifiers 는 신뢰구간 과 함께 별 모양의 점**으로 찍혀 있다. -- Diffusion Classifiers 는 In-distribution (ImageNet) 에서 획득한 Accuracy 에 따라
-기대되는 것보다,
-훨씬 Out-of-distribution (ImageNet-A) 에서의 성능이 뛰어났다.
- - 즉, OOD 에 훨씬 Robust 하다. - -- 결론 - - Diffusion Models 에서 **Diffusion Classifier 를 추출하는 방법을 제시**함 - - Stable Diffusion 에서 추출한 **Diffusion Classifier 가 Zero-shot 능력이 우수함을 확인** - - DiT 에서 추출한 **Diffusion Classifier 가 Standard Classification 능력이 우수함을 확인** - - Diffusion Classifiers 의 **Compositional Reasoning 능력이 우수함을 확인** - - Diffusion Classifiers 가 **OOD 에 매우 Robust 함** - - **Filtering 되지 않은 데이터도 학습시킬 수 있다면,
- Stable Diffusion 의 Diffusion Classifier 성능은 더 개선될 것**임. - - Imagen 의 경우 OpenCLIP 보다 훨씬 큰 거대 언어 모델인, T5-XXL 을 활용했음.
+``` {admonition} Information +- **Title:** {Your Diffusion Model is Secretly a Zero-Shot Classifier}, {ICCV 2023} + +- **Reference** + - Paper: [https://arxiv.org/pdf/2303.16203.pdf](https://arxiv.org/pdf/2303.16203.pdf) + - Github io: [https://diffusion-classifier.github.io/](https://diffusion-classifier.github.io/) + - Code: [https://github.com/diffusion-classifier/diffusion-classifier](https://github.com/diffusion-classifier/diffusion-classifier) + +- **Author:** SeonHoon Kim +- **Edited by:** SeonHoon Kim + +- **Last updated on Nov. 09, 2023** +``` + +# Your Diffusion Model is Secretly a Zero-Shot Classifier + +- **핵심** + - 학습된 **Diffusion Models 에서 Classifier 를 추가 학습 없이 획득**할 수 있다. + - **Stable Diffusion** 같은 거대 모델로부터 **Zero-shot classifier** 를 얻을 수 있다. + - **Class-conditional Diffusion Models** 에서는 **일반적인 (non Zero-shot) classifier** 를 얻을 수 있다. +- **결과 요약** + - **Classification 성능이 나쁘지 않았다.** + - **Zero-shot classifier 는 Multimodal Compositional reasoning ability 가 매우 훌륭**했다. + - 이렇게 Diffusion 모델에서 추출된 Classifiers 는 **Distribution shift 에 대해 Robust** 한 성능을 보여주었다. + +- **Classifier 구현 방법** + +:::{figure-md} +img_00 + +Diffusion Classifier 아키텍쳐 +::: + +- **예시로 먼저 살펴보기.** +- 예를 들어, 어떤 동물 이미지 X 를 Stable Diffusion 으로 Classification 하고 싶다면..
+ 1. 일단 해당 동물의 클래스를 포함하고 있을 만한 데이터셋을 구한다.
+ 37개의 동물 클래스가 존재하는 Pets 데이터셋을 사용한다고 치자.
+ 2. text prompts 로 “호랑이” 가 주어진 Stable Diffusion 으로,
+ X 의 Noised Image 에서 Reverse process 를 진행한다. 그럼 Loss 를 획득할 수 있을 것이다.
+ 3. 37개의 모든 Pets Classes 에 대해서 이를 수행해서,
+ 가장 Loss 가 작은 Class 를 판별한다.
+ 이 Class 가 바로 이미지 X 의 클래스이다. + +:::{figure-md} +img_01 + +Algorithm 1 : Diffusion Classifier 학습 알고리즘 +::: + +1. `n_samples` 에 지정된 수 만큼 t 와 noise 를 각각 샘플링해 벡터를 만든다. +2. 클래스 판별이 필요한 이미지 X 의 t-step Noised image 인 X_t 를 구한다. +3. X_t 를 Diffusion Model 에 Input 으로 주어 Noise 를 출력한다. +4. **loss** 를 구한다.
+- 위 과정을, 여러 번 (`n_trials` 만큼) 시도해서 평균낼 수도 있다. +5. loss 가 가장 낮은 Class 를 찾을 때 까지, 가능한 모든 Class 에 대해 추론한다. +6. 최종 남은 Class 를 X 의 Class 라고 판정한다. +- Zero-shot classification 도 위와 동일한 과정으로 진행된다.
+다만 추론할 Class list 가 필요하다.
+ - 예를 들어서, Stable Diffusion 의 Zero-shot classification 을 수행하기 위해서는,
+ (Stable Diffusion 이 학습하지는 않았지만) 37개의 클래스가 정의되어 있는
+ Pets 와 같은 데이터셋으로 Classification 을 수행할 수 있다. +- 하지만, Class 마다 n_samples 수 만큼 t 를 샘플링하고,
+또 X_t 를 구하고,
+Diffusion Model 로 노이즈를 추론하고,
+loss 를 구하는 것은 Inference times 가 많이 소모됨.
+따라서 다음의 방법을 활용해 inference times 을 줄인다. + +:::{figure-md} +img_02 + +Algorithm 2. Efficient Diffusion Classifier Algorithm +::: + +1. **일단 작은 수의 n_samples 로 error 가 높은 class 들을 걸러낸다.** +2. **소수의 class 만 남았다면,
+이제는 정확한 추론을 위해서 더 큰 n_samples 를 설정해 추론한다.
+(large n_samples 로 t 와 $\epsilon$ 을 sampling 한다.)** +- c.f. + +```markdown +### Oxford-IIIT Pets +```bash +python eval_prob_adaptive.py --dataset pets --split test --n_trials 1 \ + --to_keep 5 1 --n_samples 25 250 --loss l1 \ + --prompt_path prompts/pets_prompts.csv +``` + +- 왜 이렇게까지 inference time 을 줄이려고 하지??
+ - 위의 스크립트 그대로 RTX 3090 에서 돌리면,
+ Pets 이미지 1장 Classification 하는데 18초 걸린다.
+ - ImageNet 은 Class 1,000 개 있는데,
+ 512x512 이미지 1장 Classification 하려면 1,000 초 걸린다. +- **c.f. Loss 계산 코드 (eval_prob_adaptive.py)** + +```python +all_noise = torch.randn((max_n_samples * args.n_trials, 4, latent_size, latent_size), device=latent.device) + +def eval_error(unet, scheduler, latent, all_noise, ts, noise_idxs, + text_embeds, text_embed_idxs, batch_size=32, dtype='float32', loss='l2'): + assert len(ts) == len(noise_idxs) == len(text_embed_idxs) + pred_errors = torch.zeros(len(ts), device='cpu') + idx = 0 + with torch.inference_mode(): + for _ in tqdm.trange(len(ts) // batch_size + int(len(ts) % batch_size != 0), leave=False): + batch_ts = torch.tensor(ts[idx: idx + batch_size]) + noise = all_noise[noise_idxs[idx: idx + batch_size]] + noised_latent = latent * (scheduler.alphas_cumprod[batch_ts] 0.5).view(-1, 1, 1, 1).to(device) + \ + noise * ((1 - scheduler.alphas_cumprod[batch_ts]) 0.5).view(-1, 1, 1, 1).to(device) + t_input = batch_ts.to(device).half() if dtype == 'float16' else batch_ts.to(device) + text_input = text_embeds[text_embed_idxs[idx: idx + batch_size]] + noise_pred = unet(noised_latent, t_input, encoder_hidden_states=text_input).sample + if loss == 'l2': + error = F.mse_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3)) + elif loss == 'l1': + error = F.l1_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3)) + elif loss == 'huber': + error = F.huber_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3)) + else: + raise NotImplementedError + pred_errors[idx: idx + len(batch_ts)] = error.detach().cpu() + idx += len(batch_ts) + return pred_errors +``` + + +- **실험 결과** + - **Figure 2** + + :::{figure-md} + img_03 + + Figure 2 + ::: + + - 특정한 이미지 x 의 모든 클래스에 대해서 loss 를 추론하게 될텐데,
+ **모든 클래스에 대해서
+ 동일한 $\epsilon$** (즉 sampled noise) **과 동일한 t** (즉 sampled time steps) **를 사용해야** 한다.
+ **이 두 변수에 따라 loss 가 크게 달라지기 때문.** + +- **Figure 3 & Figure 4** + - **Figure 3** + - t 에 따라서, Classification 성능이 달라졌다. + - **Figure 4** + - Figure 3 의 결과에 따라서,
+ intermediate timesteps 를 더 많이 sampling 하면 성능이 올라가는지 실험해보았다. + - 그렇지 않았다.
+ timesteps 를 Uniform 하게 sampling 했을 때 성능이 가장 좋았다. + +:::{figure-md} +img_04 + +Figure 3 +::: + +:::{figure-md} +img_05 + +Figure 4 +::: + +- **Table 1** (+ F. Additional Implementation Details 참고) + +:::{figure-md} +img_06 + +Table 1 +::: + +- 본 논문에서 제시한 Diffusion Classifier 가 Classification 능력이 나쁘지 않았다. +1. Diffusion 모델에서 knowledge 를 추출해내는 다른 방법들보다 성능이 뛰어났다.
+ - Diffusion Classifier 는 **Zero-shot 성능**이,
+ **“Stable Diffusion 으로 생성된 영상을“ 학습한** **ResNet-50** **classifier** 보다 뛰어났다.
+ - **Synthetic SD data :**
+ Class 마다 10,000 장의 이미지를 Stable Diffusion 2.0 으로 생성해
+ 데이터셋을 구축하고 (90% train / 10% validation),
+ 해당 데이터셋으로 ResNet-50 classifier 를 학습시켜서 classification 수행한 결과
+ - Diffusion Classifier 는 **Classification 성능**이,
+ **Stable Diffusion 의 intermediate U-Net layer 를 추출해 학습시킨
+ ResNet-based 모델**보다 뛰어났다.
+ - **SD features :**
+ Input 이미지에 따른 Stable Diffusion 의 Intermediate U-Net features 를
+ ResNet 기반의 classifier 에 전달해서 추론.
+ 이 때 classifier 는 모든 데이터셋을 직접 학습한다. 따라서 zero-shot 은 아니다.
+2. **CLIP ResNet-50 모델보다도 성능이 뛰어났다.** +3. **OpenCLIP ViT-H/14 모델에 competitive** 했다. + +- **Table 2** + +:::{figure-md} +img_07 + +Table 2 +::: + +- **Stable Diffusion 은**
+Resolution 이 높은지, Aesthetic 한지, Safe-for-work 한지에 따라서 **filtered 된
+LAION-5B 데이터셋을 학습**했다. +- 이와 같은 기준으로 filtering 하면,
+**CIFAR10, Pets, Flowers, STL10, ImageNet 데이터셋의 test set 은 97~100% 가 filtered out** 된다. +- 따라서, **이들 데이터셋은 Stable Diffusion 에게 완전한 out-of-distribution 데이터**이다. +- 따라서, **필터링이 안된 데이터로 Stable Diffusion 을 추가 학습시키면
+classification 성능도 올라갈 것**이다. + +- **Figure 5 & Table 3** + +:::{figure-md} +img_08 + +Figure 5 +::: + +:::{figure-md} +img_09 + +Table 3 +::: + +- 본 논문에서는 Winoground 데이터셋을 활용해
+visio-linguistic compositional reasoning abilities 를 측정했다.
+ - 주어진 captions 를 적절한 이미지에 매치시키는 능력을 측정하는 것이다.
+ - Winoground 데이터셋
+ - Object 는 명사절끼리 뒤바뀐 경우
+ - Relation 은 동사끼리 or 형용사끼리 or 부사끼리 뒤바뀐 경우
+ - Both 는 다른 품사끼리 서로 뒤바뀐 경우
+- Stable Diffusion 의 Diffusion Classifier 가 최고의 성능을 보여주었다. +- 본 논문에서 제시한 method 를 통해서 **추가 학습 없이,**
+여느 diffusion 모델처럼 sample generation 만을 학습했음에도,
+**Stable Diffusion 모델을 훌륭한 classifier 이자 reasoner 로 변모**시킬 수 있었다. + +- **Table 4** + +:::{figure-md} +img_10 + +Table 4 +::: + +- ImageNet 에 존재하는 **1,000 개의 클래스를 활용해**
+Pretrained **DiT** (Diffusion Transformer) 를 활용한 **Diffusion Classifier 의 성능**을,
+**Discriminative Classifiers** (ResNet-101 and ViT-B/16) **와 비교**했다. +- **ImageNet** 에 대해서, **79.1% 의 top-1 accuracy 를 기록하며 ViT-L/32 을 능가**했다. +- **더 적은 augmentation 기법**을 사용하였고,
+**regularization 은 사용하지 않았음에도** Discriminative Classifiers 의 성능을 능가했다. + +- **Figure 6** + +:::{figure-md} +img_11 + +Figure 6 +::: + +- ImageNet 데이터셋에서,
+ImageNet-A 와 겹치는 클래스에 대해서만 Classification 을 수행한다. +- 일반적인 **discriminative classifiers 는 신뢰구간 과 함께 파란 점**으로 찍혀 있다. +- **Diffusion Classifiers 는 신뢰구간 과 함께 별 모양의 점**으로 찍혀 있다. +- Diffusion Classifiers 는 In-distribution (ImageNet) 에서 획득한 Accuracy 에 따라
+기대되는 것보다,
+훨씬 Out-of-distribution (ImageNet-A) 에서의 성능이 뛰어났다.
+ - 즉, OOD 에 훨씬 Robust 하다. + +- 결론 + - Diffusion Models 에서 **Diffusion Classifier 를 추출하는 방법을 제시**함 + - Stable Diffusion 에서 추출한 **Diffusion Classifier 가 Zero-shot 능력이 우수함을 확인** + - DiT 에서 추출한 **Diffusion Classifier 가 Standard Classification 능력이 우수함을 확인** + - Diffusion Classifiers 의 **Compositional Reasoning 능력이 우수함을 확인** + - Diffusion Classifiers 가 **OOD 에 매우 Robust 함** + - **Filtering 되지 않은 데이터도 학습시킬 수 있다면,
+ Stable Diffusion 의 Diffusion Classifier 성능은 더 개선될 것**임. + - Imagen 의 경우 OpenCLIP 보다 훨씬 큰 거대 언어 모델인, T5-XXL 을 활용했음.
**Imagen 의 Classification 능력은 Stable Diffusion 보다 뛰어날 것으로 예상**됨. \ No newline at end of file diff --git a/_sources/docs/review/consistency_models.md b/_sources/docs/review/consistency_models.md old mode 100644 new mode 100755 index 2f05044a..edac379e --- a/_sources/docs/review/consistency_models.md +++ b/_sources/docs/review/consistency_models.md @@ -1,322 +1,322 @@ -```{admonition} Information -- **Title:** Consistency Models (ICML 2023) - -- **Reference** - - Paper: [https://arxiv.org/pdf/2303.01469](https://arxiv.org/pdf/2303.01469) - - Code: [https://github.com/openai/consistency_models](https://github.com/openai/consistency_models) - -- **Author:** Sangwoo Jo - -- **Last updated on Apr. 26, 2024** -``` - -# Consistency Models - -## 1. Introduction - -Diffusion Models 은 image generation, audio synthesis, video generation 등의 다양한 분야에 연구가 진행되어 왔습니다. 하지만 single-step generative model 인 VAE, GAN, 그리고 normalizing flows 에 비해 추론 속도가 10-2000배 더 많은 연산작업을 요하는 치명적인 단점이 존재합니다. - -이러한 문제를 해결하기 위해 논문에서 Consistency Model 을 소개합니다. - -:::{figure-md} -consistency_models_01 - -Overview of Consistency Models -::: - -위의 사진처럼 주어진 PF ODE (Probability Flow Ordinary Differential Equation) 에 대해서 동일한 trajectory 에 있는 point 들이 동일한 시작점으로 매핑되도록 모델을 학습하는 방식을 제안하고, 이러한 self-consistency 특성을 만족시킬 수 있도록 2가지 학습 방식을 소개합니다. - -1) 첫번째 방식으로는 우선적으로 numerical ODE solver 와 사전 학습된 diffusion model을 사용하여 PF ODE trajectory 에서 인접한 point 쌍을 생성합니다. 그리고 이러한 쌍에 대한 모델 출력 간의 차이를 최소화하도록 모델을 학습함으로써 diffusion model 을 consistency model 로 효과적으로 knowledge distillation 을 적용할 수 있고, 단 한번의 step 만으로도 high quality sample 을 생성할 수 있게 됩니다. - -2) 두번째 방식으로는 사전학습된 diffusion model 에 의존하지 않고 독립적으로 consistency model 을 학습하는 방식입니다. - -CIFAR-10, ImageNet 64x64, LSUN 256x256 데이터셋에 실험한 결과, 기존 distillation 기법을 적용한 모델 (i.e., progressive distillation) 보다 성능이 개선되고, 독립적인 모델로서도 사전학습된 diffusion model 없이 GAN 을 제외한 single-step generative model 보다 성능이 좋다고 합니다. 마지막으로 다양한 zero-shot data editing (image denoising, interpolation, inpainting, colorization, super-resolution, stroke-guided image editing) task 에도 consistency model 이 좋은 성능을 보여준다는 것을 확인하였습니다. - -## 2. Diffusion Models - -**Diffusion Models in Continuous Time** - -Continuous time 에서의 diffusion model 을 다음과 같이 SDE 수식으로 표현할 수 있습니다. ([Song et al., 2021](https://arxiv.org/abs/2011.13456)) - -:::{figure-md} -consistency_models_02 - -Diffusion Models in Continuous Time -::: - -- $t \in [0,T], T > 0$ -- $\mu(\cdot,\cdot), \sigma(\cdot)$ := drift, diffusion coefficients -- $\{w_t\}_{t \in [0,T]}$ := standard Brownian motion - -그리고 해당 SDE 는 아래 식과 같은 PF ODE 로 표현할 수 있다는 성질을 가지고 있습니다. 이때 $\nabla \log p_t(x_t)$ 를 *score function* 이라고 하고, 시점 t 에 대한 solution trajectory 가 $p_t(x)$ 에 따라 분포합니다. - -:::{figure-md} -consistency_models_03 - -Probability Flow (PF) ODE -::: - -일반적으로 위의 SDE 수식에서 $p_T(x)$ 가 Gaussian distribution $\pi(x)$ 를 따르도록 정의하고, 해당 논문에서 [Karras et al., 2022](https://arxiv.org/abs/2206.00364) 와 동일하게 $\mu(x,t) = 0, \sigma(t) = \sqrt{2}t$ 로 설정하였습니다. 그리고 sampling 시, score matching 을 통해 score model $s_{\phi}(x,t) \approx \nabla \log p_t(x)$ 우선적으로 학습한 후, 위의 식에 대입하면 다음과 같은 empirical PF ODE 로 표현할 수 있습니다 - -:::{figure-md} -consistency_models_04 - -Empirical PF ODE -::: - -다음 과정으로는 initial condition $x_T \sim N(0, T^2I)$ 을 기반으로 Euler 나 Heun 등의 numerical ode solver 를 통해 역방향으로 풀어 solution trajectory $\{x_t\}_{t \in [0,T]}$${x_t}$$\hat{x}_0$${x_t}$$p_{data}(x)$ 로부터 나온 샘플에 대한 근사값이라고 할 수 있습니다. - -추가적으로 논문에서 numerical instability 를 방지하기 위해 고정된 작은 양수 $\epsilon$ 에 대해 $t = \epsilon$ 에서 solver 를 멈추고 $\hat{x}_{\epsilon}$ 를 $p_{data}(x)$ 에 대한 근사값으로 간주합니다. 그리고 [Karras et al., 2022](https://arxiv.org/abs/2206.00364) 와 동일하게 이미지 픽셀 값을 $[-1,1]$ 로 rescale 하고 $T = 80, \epsilon = 0.002$ 로 설정합니다. - -앞서 소개드린 방식으로 diffusion model 을 통한 sampling 시, ode solver 를 사용하는데 score model $s_{\phi}(x_t,t)$ 의 수많은 iterative evaluation 작업이 필요합니다. 빠른 sampling 작업을 위해, 더 빠른 numerical ode solver 에 대한 연구들이 진행되었지만, 이를 활용해도 최소 10번 이상의 evaluation step 을 거쳐야만 competitive 한 성능을 보여준다고 합니다. 여러 distillation 기법들에 대한 연구들도 진행되었지만, [Salimans & Ho (2022)](https://arxiv.org/abs/2202.00512) 를 제외하고는 distillation 작업을 하기 위해서 사전에 diffusion model 로부터 대량의 데이터를 수집해야한다는 단점이 있습니다. - -## 3. Consistency Models - -논문에서 single-step generation 이 가능한 consistency model 을 제안하고, 학습하는 방식으로 1) 사전학습된 diffusion model 로부터 knowledge distillation 진행하는 방식과 2) 독립적으로 학습하는 방식 을 소개합니다. - -**Definition** - -주어진 PF ODE 에 대한 trajectory $\{x_t\}_{t \in [0,T]}$ 에 대해서 다음과 같은 *consistency function* $f : (x_t, t) \mapsto x_{\epsilon}$ 을 정의하고, 함수 $f$ 는 동일한 trajectory 에 있는 임의의 두 $t, t' \in [\epsilon, T]$ 에 대해 $f(x_t, t) = f(x_{t'}, t')$, 즉 *self-consistency* 성질을 만족합니다. 이러한 함수 $f$ 를 예측하기 위해 데이터로부터 $f_{\theta}$ 을 학습하는 것이 consistency model 의 objective 이며, 이는 [Bilos et al., 2021](https://arxiv.org/abs/2110.13040) 에서 정의하는 neural flow 와 유사하지만, consistency model 은 invertible property 를 부여하지는 않습니다. - -:::{figure-md} -consistency_models_05 - -Self-Consistency -::: - -**Parameterization** - -앞서 정의한 부분에 의해, 모든 consistency function $f$ 에 대해서 $f(x_{\epsilon}, t) = x_{\epsilon}$ 를 만족해야 하는 *boundary condition* 이 존재하고, 이를 만족하기 위해 다음과 같이 두 가지 방식으로 parameterization 방식을 정의하였습니다. - -:::{figure-md} -consistency_models_06 - -Parameterization Method 1 -::: - -여기서 $F_{\theta}(x,t)$ 는 output 차원이 $x$ 와 동일한 free-form deep neural network 입니다. 두번째 방식으로는, 다음과 같이 skip-connection 을 활용합니다. - -:::{figure-md} -consistency_models_07 - -Parameterization Method 2 -::: - -이때, $F_{\theta}(x,t), c_{skip}(t), c_{out}(t)$ 는 $c_{skip}(\epsilon) = 1, c_{out}(\epsilon) = 0$ 조건을 만족시키는 미분 가능한 함수로 정의합니다. - -:::{figure-md} -consistency_models_08 - -Parameterization Method 2 - $c_{skip}(t), c_{out}(t)$ -::: - -두번째 parameterization 기법이 diffusion model 형식과 매우 유사하여 이러한 diffusion model 아키텍쳐를 leverage 하기 위해 논문에서 두번째 방식으로 parameterization 을 하는 방식을 택합니다. - -**Sampling** - -학습된 consistency model $f_{\theta}(\cdot,\cdot)$ 와 initial distribution $\hat{x}_T \sim N(0, T^2I)$ 를 활용하여 단일 sampling step 만으로 $\hat{x}_{\epsilon} = f_{\theta}(\hat{x}_{T}, T)$ 를 생성할 수 있습니다. 더불어 하단 pseudo code 에 보이듯이, denoising 과 noise injection 작업을 여러 번 거치는 *multistep* consistency sampling 을 통해 computing cost 와 sample quality 를 trade-off 할 수 있는 유연성도 제공합니다. - -:::{figure-md} -consistency_models_09 - -Multistep Consistency Sampling -::: - -**Zero-Shot Data Editing** - -Diffusion model 과 유사하게 추가적인 학습 없이 zero-shot 형태로 image editing 그리고 manipulation task 이 가능합니다. 예를 들어, consistency model 은 Gaussian noise 로부터 one-to-one mapping 을 통해 $x_{\epsilon}$을 생성하기 때문에 GAN, VAE, normalizing flow 와 유사하게 latent space 을 통해 sample 들간의 interpolation 이 가능합니다. 또한, multistep consistency sampling 을 통해 zero-shot 의 한계점을 보완하면서 image editing, inpainting, colorization, super-resolution, stroke-guided image editing ([Meng et al., 2021](https://arxiv.org/abs/2108.01073)) 등의 다양한 task 를 수행할 수 있습니다. 대표적으로 몇 가지 zero-shot image editing 결과 예시들을 공유합니다. - -- Inpainting - - :::{figure-md} - consistency_models_10 - - Consistency Models - Inpainting - ::: - -- Interpolation - - :::{figure-md} - consistency_models_11 - - Consistency Models - Interpolation - ::: - -- Self-consistency - - :::{figure-md} - consistency_models_12 - - Consistency Models - Self-consistency - ::: - - -## 4. Training Consistency Models via Distillation - -앞서 소개한 두 가지 학습 방식 중, 첫번째로 사전학습된 score model $s_{\phi}(x,t)$ 를 consistency model 에 knowledge distillation 하는 학습하는 방식을 소개합니다. - -논문에서 특히 continuous time interval $[\epsilon, T]$ 을 boundary $t_1 = \epsilon < t_2 < \cdots < t_N=T$ 를 기준으로 $N-1$ 개의 interval 로 discretize 하는 상황을 가정하고, [Karras et al., 2022](https://arxiv.org/abs/2206.00364) 의 설정과 동일하게 boundary 를 다음과 같이 정의합니다. - -$$ -t_i = (\epsilon^{1/\rho} + \frac{i-1}{N-1}(T^{1/\rho}-\epsilon^{1/\rho}))^{\rho}, \quad \rho = 7 -$$ - -이때, $N$ 이 충분히 크다면 다음과 같이 numerical ode solver 의 discretization step 을 한번 진행시켜 $x_{t_{n+1}}$ 로부터 $x_{t_n}$ 에 대한 정확한 예측값을 얻을 수 있다고 합니다. - -:::{figure-md} -consistency_models_13 - -One Discretization Step of a Numerical ODE Solver -::: - -이때, $\Phi(\cdots; \phi)$ 은 empirical PF ODE 에 적용되는 one step ODE solver 의 update function 입니다. Euler solver 같은 경우, $\Phi(x,t;\phi) = -ts_{\phi}(x,t)$ 를 대입하면 다음과 같이 표현할 수 있게 됩니다. - -:::{figure-md} -consistency_models_14 - -One Discretization Step of a Euler ODE Solver -::: - -위 수식을 활용하여 주어진 $x \sim p_{data}$ 에 대해서 PF ODE trajectory 에 있는 인접한 두 지점 $(\hat{x}^{\phi}_{t_n}, x_{t_{n+1}})$ 을 샘플링할 수 있게 됩니다. 더 자세하게는, $x_{t_{n+1}} \sim N(x,t^2_{n+1}I)$ 를 우선적으로 샘플링한 후, 위 수식을 기반으로 numerical ode solver 의 discretization step 을 한번 거쳐 $\hat{x}^{\phi}_{t_n}$ 을 계산합니다. 최종적으로 $(\hat{x}^{\phi}_{t_n}, x_{t_{n+1}})$ 로부터의 모델 출력값 차이를 최소화하도록 consistency model 을 학습하게 되고, 학습 시 사용되는 *consistency distillation loss* 는 다음과 같이 정의합니다. - -:::{figure-md} -consistency_models_15 - -Consistency Distillation Loss -::: - -여기서 metric function $d(\cdot,\cdot)$ 로는 L1 distance, L2 distance, 그리고 LPIPS distance 를 사용하였고, 실험적으로 확인해본 결과 $\lambda(t_n) \equiv 1$ 를 적용했을 때 모델 성능이 가장 좋은 부분을 확인할 수 있었다고 합니다. 파라미터 $\theta$ 는 stochastic gradient descent 그리고 $\theta^-$ 는 exponential moving average (EMA) 로 학습하였다고 합니다. - -:::{figure-md} -consistency_models_16 - -Exponential Moving Average (EMA) -::: - -이처럼 EMA update 와 stopgrad operator 로 학습할 시, $\theta = \theta^{-}$ 로 설정할때보다 모델을 더 안정적으로 학습할 수 있고 성능에도 개선이 있었다고 합니다. 전체적인 학습 절차는 하단의 Algorithm 2 처럼 정리할 수 있습니다. - -:::{figure-md} -consistency_models_17 - -Overview of Consistency Distillation (CD) -::: - -$\theta^{-}$ 는 과거 $\theta$ 에 대한 running average 이므로 Algorithm 2 가 수렴할 시 이 둘은 일치하게 됩니다. 즉, target network $f_{\theta^-}$와 online network $f_{\theta}$ 가 일치하게 됩니다. - -## 5. Training Consistency Models in Isolation - -Consistency Distillation 방식에서는 ground truth score function $\nabla \log p_t(x_t)$ 을 근사하는 사전학습된 score model $s_{\phi}(x,t)$ 에 의존했다면, 이에 의존하지 않고 다음과 같은 $\nabla \log p_t(x_t)$ 에 대한 unbiased estimator 를 활용할 수도 있습니다. 다시 말해, $-(x_t - x)/t^2$ 로 $\nabla \log p_t(x_t)$ 를 근사할 수 있습니다. - -:::{figure-md} -consistency_models_18 - -Unbiased Estimator of Score Function -::: - -- $x \sim p_{data}, x_t \sim N(x; t^2I)$ - -Consistency Training (CT) Loss 는 다음과 같이 정의하고, 이는 사전학습된 diffusion model 파라미터 $\phi$ 와는 독립적인 사실을 확인할 수 있습다. - -$$ -L_{CT}^{N}(\theta,\theta^{-}) = \mathbb{E}[\lambda(t_n)d(f_{\theta}(x + t_{n+1}z, t_{n+1}), f_{\theta^-}(x+t_nz, t_n))] -$$ - -- $x \sim p_{data}, n \sim \mathbb{U}[[1,N-1]], x_{t_{n+1}} \sim N(x;t^2_{n+1}I), z \sim N(0,I)$ -- Consistency Training Loss 를 위와 같이 정의하게 된 배경은 다음과 같습니다. - - :::{figure-md} - consistency_models_19 - - Consistency Training Loss - ::: - - -:::{figure-md} -consistency_models_20 - -Schedule Functions for Consistency Training -::: - -논문에서 추가적인 성능 개선을 위해 $N$ 을 점진적으로 증가시키는 방식을 제안합니다. $N$ 이 작을수록 ($i.e., \Delta t$ 가 클수록) consistency training loss 가 consistency distillation loss 와 비교했을때 variance 는 감소하지만 bias 는 증가하게 되어, 초기에 더 빠른 convergence 에 이르는데 용이합니다. 반면에, $N$ 이 클수록 ($i.e., \Delta t$ 가 작을수록) variance 는 증가하고 bias 는 감소하게 되어, 학습의 마지막 단계에 적용하는 것이 바람직하다고 제안합니다. EMA decay rate schedule function $\mu(\cdot)$ 도 $N$ 에 따라 바뀌는 함수로 최종적으로 정의합니다. 전체적인 학습 절차는 하단의 Algorithm 3 처럼 정리할 수 있습니다. - -:::{figure-md} -consistency_models_21 - -Overview of Consistency Training (CT) -::: - - -## 6. Experiments - -논문에서 CIFAR-10, ImageNet 64x64, LSUN Bedroom 256x256, 그리고 LSUN Cat 256x256 데이터셋에 consistency distillation, consistency training 두 학습 방식을 모두 실험하였고, 모델 성능 지표는 FID, IS, Precision, 그리고 Recall 을 사용하였습니다. 모델 architecture 는 CIFAR-10 데이터셋에는 NCSN++, 그리고 그 외 데이터셋에는 ADM 모델을 사용하였습니다. - -### 6.1. Training Consistency Models - -CIFAR-10 데이터셋에 다음과 같은 hyperparameter tuning 작업을 진행하였습니다. (metric function $d(\cdot,\cdot)$, ODE solver, CD (Consistency Distillation) 에서의 number of discretization steps $N$, 그리고 CT (Consistency Training)) 에서의 schedule functions $N(\cdot), \mu(\cdot)$) - -**Parameter Initialization** - -모델 초기 파라미터 값은 다음과 같이 설정하였습니다. - -- Consistency Distillation - 사전학습된 diffusion model 파라미터 값 -- Consistency Training - Random Initialization - -**Results** - -모델 실험 결과를 다음과 같이 정리할 수 있습니다. - -:::{figure-md} -consistency_models_22 - -Experimental Results - Hyperparameters -::: - -- Consistency Distillation (CD) - - LPIPS 를 metric function 으로 사용했을때 모델 성능이 가장 좋았고, 이는 LPIPS metric 이 CIFAR-10 와 같은 natural image 들 간의 유사도를 측정하는데 특화되어 있기 때문이라고 합니다. - - Euler ODE solver 보다 Heun ODE solver 를 사용했을 때, 그리고 $N = 18$ 로 설정했을때 모델 성능이 가장 좋았습니다. 또한, 동일한 $N$ 에 대해서 Heun’s second ode solver 를 사용했을때 Euler’s first ode solver 를 사용했을 때보다 모델 성능이 우월한 부분을 확인할 수 있었다고 합니다. - - 이외에도 다른 데이터셋에 hyperparameter tuning 작업을 별도로 진행하였습니다. - -- Consistency Training (CT) - - CD 와 동일하게 LPIPS metric function 사용하였고, ODE solver 는 사용하지 않았습니다. - - $N$ 이 작을수록, 모델이 더 빨리 수렴하지만 생성된 이미지 퀄리티는 좋지 않은 부분을 재차 확인할 수 있습니다. (and vice versa) - - $N$ 을 점차적으로 증가시키면서 $\mu$ 도 변화시켰을때 성능이 가장 좋았습니다. - - -#### 6.2. Few-Step Image Generation - -**Distillation** - -논문에서는 Consistency Distillation 모델의 성능을 synthetic data generation 을 필요하지 않는 knowledge distillation 기법 (PD, [Salimans & Ho (2022)](https://arxiv.org/abs/2202.00512)) 과 다음과 같이 비교합니다. - -:::{figure-md} -consistency_models_23 - -Experimental Results - Distillation -::: - -**Direct Generation** - -CIFAR-10 데이터셋 기준으로 VAE, normalizing flow 를 비롯한 타 single-step generative model 보다 CT 가 성능이 가장 좋았습니다. 또한, distillation 기법 없이도 Progressive Distillation (PD, [Salimans & Ho (2022)](https://arxiv.org/abs/2202.00512)) 와 견줄만한 성능을 가진 부분을 확인할 수 있습니다. 마지막으로 동일한 noise 로부터 높은 structural similarity 를 가진 이미지들을 생성함으로써 self-consistency 성질도 확인할 수 있었다고 합니다. - -:::{figure-md} -consistency_models_24 - -Experimental Results - Direct Generation -::: - -### 6.3. Zero-Shot Image Editing - -Diffusion model 과 유사하게 consistency model 도 multistep sampling 알고리즘을 수정함으로써 zero shot image editing 이 가능합니다. 해당 사진은 LSUN Bedroom 데이터셋에 colorization, super-resolution, stroke-guided image editing task 를 적용한 결과입니다. - -:::{figure-md} -consistency_models_25 - -Pseudocode for Zero-Shot Image Editing -::: - -:::{figure-md} -consistency_models_26 - -Zero-Shot Image Editing Results -::: +```{admonition} Information +- **Title:** Consistency Models (ICML 2023) + +- **Reference** + - Paper: [https://arxiv.org/pdf/2303.01469](https://arxiv.org/pdf/2303.01469) + - Code: [https://github.com/openai/consistency_models](https://github.com/openai/consistency_models) + +- **Author:** Sangwoo Jo + +- **Last updated on Apr. 26, 2024** +``` + +# Consistency Models + +## 1. Introduction + +Diffusion Models 은 image generation, audio synthesis, video generation 등의 다양한 분야에 연구가 진행되어 왔습니다. 하지만 single-step generative model 인 VAE, GAN, 그리고 normalizing flows 에 비해 추론 속도가 10-2000배 더 많은 연산작업을 요하는 치명적인 단점이 존재합니다. + +이러한 문제를 해결하기 위해 논문에서 Consistency Model 을 소개합니다. + +:::{figure-md} +consistency_models_01 + +Overview of Consistency Models +::: + +위의 사진처럼 주어진 PF ODE (Probability Flow Ordinary Differential Equation) 에 대해서 동일한 trajectory 에 있는 point 들이 동일한 시작점으로 매핑되도록 모델을 학습하는 방식을 제안하고, 이러한 self-consistency 특성을 만족시킬 수 있도록 2가지 학습 방식을 소개합니다. + +1) 첫번째 방식으로는 우선적으로 numerical ODE solver 와 사전 학습된 diffusion model을 사용하여 PF ODE trajectory 에서 인접한 point 쌍을 생성합니다. 그리고 이러한 쌍에 대한 모델 출력 간의 차이를 최소화하도록 모델을 학습함으로써 diffusion model 을 consistency model 로 효과적으로 knowledge distillation 을 적용할 수 있고, 단 한번의 step 만으로도 high quality sample 을 생성할 수 있게 됩니다. + +2) 두번째 방식으로는 사전학습된 diffusion model 에 의존하지 않고 독립적으로 consistency model 을 학습하는 방식입니다. + +CIFAR-10, ImageNet 64x64, LSUN 256x256 데이터셋에 실험한 결과, 기존 distillation 기법을 적용한 모델 (i.e., progressive distillation) 보다 성능이 개선되고, 독립적인 모델로서도 사전학습된 diffusion model 없이 GAN 을 제외한 single-step generative model 보다 성능이 좋다고 합니다. 마지막으로 다양한 zero-shot data editing (image denoising, interpolation, inpainting, colorization, super-resolution, stroke-guided image editing) task 에도 consistency model 이 좋은 성능을 보여준다는 것을 확인하였습니다. + +## 2. Diffusion Models + +**Diffusion Models in Continuous Time** + +Continuous time 에서의 diffusion model 을 다음과 같이 SDE 수식으로 표현할 수 있습니다. ([Song et al., 2021](https://arxiv.org/abs/2011.13456)) + +:::{figure-md} +consistency_models_02 + +Diffusion Models in Continuous Time +::: + +- $t \in [0,T], T > 0$ +- $\mu(\cdot,\cdot), \sigma(\cdot)$ := drift, diffusion coefficients +- $\{w_t\}_{t \in [0,T]}$ := standard Brownian motion + +그리고 해당 SDE 는 아래 식과 같은 PF ODE 로 표현할 수 있다는 성질을 가지고 있습니다. 이때 $\nabla \log p_t(x_t)$ 를 *score function* 이라고 하고, 시점 t 에 대한 solution trajectory 가 $p_t(x)$ 에 따라 분포합니다. + +:::{figure-md} +consistency_models_03 + +Probability Flow (PF) ODE +::: + +일반적으로 위의 SDE 수식에서 $p_T(x)$ 가 Gaussian distribution $\pi(x)$ 를 따르도록 정의하고, 해당 논문에서 [Karras et al., 2022](https://arxiv.org/abs/2206.00364) 와 동일하게 $\mu(x,t) = 0, \sigma(t) = \sqrt{2}t$ 로 설정하였습니다. 그리고 sampling 시, score matching 을 통해 score model $s_{\phi}(x,t) \approx \nabla \log p_t(x)$ 우선적으로 학습한 후, 위의 식에 대입하면 다음과 같은 empirical PF ODE 로 표현할 수 있습니다 + +:::{figure-md} +consistency_models_04 + +Empirical PF ODE +::: + +다음 과정으로는 initial condition $x_T \sim N(0, T^2I)$ 을 기반으로 Euler 나 Heun 등의 numerical ode solver 를 통해 역방향으로 풀어 solution trajectory $\{x_t\}_{t \in [0,T]}$${x_t}$$\hat{x}_0$${x_t}$$p_{data}(x)$ 로부터 나온 샘플에 대한 근사값이라고 할 수 있습니다. + +추가적으로 논문에서 numerical instability 를 방지하기 위해 고정된 작은 양수 $\epsilon$ 에 대해 $t = \epsilon$ 에서 solver 를 멈추고 $\hat{x}_{\epsilon}$ 를 $p_{data}(x)$ 에 대한 근사값으로 간주합니다. 그리고 [Karras et al., 2022](https://arxiv.org/abs/2206.00364) 와 동일하게 이미지 픽셀 값을 $[-1,1]$ 로 rescale 하고 $T = 80, \epsilon = 0.002$ 로 설정합니다. + +앞서 소개드린 방식으로 diffusion model 을 통한 sampling 시, ode solver 를 사용하는데 score model $s_{\phi}(x_t,t)$ 의 수많은 iterative evaluation 작업이 필요합니다. 빠른 sampling 작업을 위해, 더 빠른 numerical ode solver 에 대한 연구들이 진행되었지만, 이를 활용해도 최소 10번 이상의 evaluation step 을 거쳐야만 competitive 한 성능을 보여준다고 합니다. 여러 distillation 기법들에 대한 연구들도 진행되었지만, [Salimans & Ho (2022)](https://arxiv.org/abs/2202.00512) 를 제외하고는 distillation 작업을 하기 위해서 사전에 diffusion model 로부터 대량의 데이터를 수집해야한다는 단점이 있습니다. + +## 3. Consistency Models + +논문에서 single-step generation 이 가능한 consistency model 을 제안하고, 학습하는 방식으로 1) 사전학습된 diffusion model 로부터 knowledge distillation 진행하는 방식과 2) 독립적으로 학습하는 방식 을 소개합니다. + +**Definition** + +주어진 PF ODE 에 대한 trajectory $\{x_t\}_{t \in [0,T]}$ 에 대해서 다음과 같은 *consistency function* $f : (x_t, t) \mapsto x_{\epsilon}$ 을 정의하고, 함수 $f$ 는 동일한 trajectory 에 있는 임의의 두 $t, t' \in [\epsilon, T]$ 에 대해 $f(x_t, t) = f(x_{t'}, t')$, 즉 *self-consistency* 성질을 만족합니다. 이러한 함수 $f$ 를 예측하기 위해 데이터로부터 $f_{\theta}$ 을 학습하는 것이 consistency model 의 objective 이며, 이는 [Bilos et al., 2021](https://arxiv.org/abs/2110.13040) 에서 정의하는 neural flow 와 유사하지만, consistency model 은 invertible property 를 부여하지는 않습니다. + +:::{figure-md} +consistency_models_05 + +Self-Consistency +::: + +**Parameterization** + +앞서 정의한 부분에 의해, 모든 consistency function $f$ 에 대해서 $f(x_{\epsilon}, t) = x_{\epsilon}$ 를 만족해야 하는 *boundary condition* 이 존재하고, 이를 만족하기 위해 다음과 같이 두 가지 방식으로 parameterization 방식을 정의하였습니다. + +:::{figure-md} +consistency_models_06 + +Parameterization Method 1 +::: + +여기서 $F_{\theta}(x,t)$ 는 output 차원이 $x$ 와 동일한 free-form deep neural network 입니다. 두번째 방식으로는, 다음과 같이 skip-connection 을 활용합니다. + +:::{figure-md} +consistency_models_07 + +Parameterization Method 2 +::: + +이때, $F_{\theta}(x,t), c_{skip}(t), c_{out}(t)$ 는 $c_{skip}(\epsilon) = 1, c_{out}(\epsilon) = 0$ 조건을 만족시키는 미분 가능한 함수로 정의합니다. + +:::{figure-md} +consistency_models_08 + +Parameterization Method 2 - $c_{skip}(t), c_{out}(t)$ +::: + +두번째 parameterization 기법이 diffusion model 형식과 매우 유사하여 이러한 diffusion model 아키텍쳐를 leverage 하기 위해 논문에서 두번째 방식으로 parameterization 을 하는 방식을 택합니다. + +**Sampling** + +학습된 consistency model $f_{\theta}(\cdot,\cdot)$ 와 initial distribution $\hat{x}_T \sim N(0, T^2I)$ 를 활용하여 단일 sampling step 만으로 $\hat{x}_{\epsilon} = f_{\theta}(\hat{x}_{T}, T)$ 를 생성할 수 있습니다. 더불어 하단 pseudo code 에 보이듯이, denoising 과 noise injection 작업을 여러 번 거치는 *multistep* consistency sampling 을 통해 computing cost 와 sample quality 를 trade-off 할 수 있는 유연성도 제공합니다. + +:::{figure-md} +consistency_models_09 + +Multistep Consistency Sampling +::: + +**Zero-Shot Data Editing** + +Diffusion model 과 유사하게 추가적인 학습 없이 zero-shot 형태로 image editing 그리고 manipulation task 이 가능합니다. 예를 들어, consistency model 은 Gaussian noise 로부터 one-to-one mapping 을 통해 $x_{\epsilon}$을 생성하기 때문에 GAN, VAE, normalizing flow 와 유사하게 latent space 을 통해 sample 들간의 interpolation 이 가능합니다. 또한, multistep consistency sampling 을 통해 zero-shot 의 한계점을 보완하면서 image editing, inpainting, colorization, super-resolution, stroke-guided image editing ([Meng et al., 2021](https://arxiv.org/abs/2108.01073)) 등의 다양한 task 를 수행할 수 있습니다. 대표적으로 몇 가지 zero-shot image editing 결과 예시들을 공유합니다. + +- Inpainting + + :::{figure-md} + consistency_models_10 + + Consistency Models - Inpainting + ::: + +- Interpolation + + :::{figure-md} + consistency_models_11 + + Consistency Models - Interpolation + ::: + +- Self-consistency + + :::{figure-md} + consistency_models_12 + + Consistency Models - Self-consistency + ::: + + +## 4. Training Consistency Models via Distillation + +앞서 소개한 두 가지 학습 방식 중, 첫번째로 사전학습된 score model $s_{\phi}(x,t)$ 를 consistency model 에 knowledge distillation 하는 학습하는 방식을 소개합니다. + +논문에서 특히 continuous time interval $[\epsilon, T]$ 을 boundary $t_1 = \epsilon < t_2 < \cdots < t_N=T$ 를 기준으로 $N-1$ 개의 interval 로 discretize 하는 상황을 가정하고, [Karras et al., 2022](https://arxiv.org/abs/2206.00364) 의 설정과 동일하게 boundary 를 다음과 같이 정의합니다. + +$$ +t_i = (\epsilon^{1/\rho} + \frac{i-1}{N-1}(T^{1/\rho}-\epsilon^{1/\rho}))^{\rho}, \quad \rho = 7 +$$ + +이때, $N$ 이 충분히 크다면 다음과 같이 numerical ode solver 의 discretization step 을 한번 진행시켜 $x_{t_{n+1}}$ 로부터 $x_{t_n}$ 에 대한 정확한 예측값을 얻을 수 있다고 합니다. + +:::{figure-md} +consistency_models_13 + +One Discretization Step of a Numerical ODE Solver +::: + +이때, $\Phi(\cdots; \phi)$ 은 empirical PF ODE 에 적용되는 one step ODE solver 의 update function 입니다. Euler solver 같은 경우, $\Phi(x,t;\phi) = -ts_{\phi}(x,t)$ 를 대입하면 다음과 같이 표현할 수 있게 됩니다. + +:::{figure-md} +consistency_models_14 + +One Discretization Step of a Euler ODE Solver +::: + +위 수식을 활용하여 주어진 $x \sim p_{data}$ 에 대해서 PF ODE trajectory 에 있는 인접한 두 지점 $(\hat{x}^{\phi}_{t_n}, x_{t_{n+1}})$ 을 샘플링할 수 있게 됩니다. 더 자세하게는, $x_{t_{n+1}} \sim N(x,t^2_{n+1}I)$ 를 우선적으로 샘플링한 후, 위 수식을 기반으로 numerical ode solver 의 discretization step 을 한번 거쳐 $\hat{x}^{\phi}_{t_n}$ 을 계산합니다. 최종적으로 $(\hat{x}^{\phi}_{t_n}, x_{t_{n+1}})$ 로부터의 모델 출력값 차이를 최소화하도록 consistency model 을 학습하게 되고, 학습 시 사용되는 *consistency distillation loss* 는 다음과 같이 정의합니다. + +:::{figure-md} +consistency_models_15 + +Consistency Distillation Loss +::: + +여기서 metric function $d(\cdot,\cdot)$ 로는 L1 distance, L2 distance, 그리고 LPIPS distance 를 사용하였고, 실험적으로 확인해본 결과 $\lambda(t_n) \equiv 1$ 를 적용했을 때 모델 성능이 가장 좋은 부분을 확인할 수 있었다고 합니다. 파라미터 $\theta$ 는 stochastic gradient descent 그리고 $\theta^-$ 는 exponential moving average (EMA) 로 학습하였다고 합니다. + +:::{figure-md} +consistency_models_16 + +Exponential Moving Average (EMA) +::: + +이처럼 EMA update 와 stopgrad operator 로 학습할 시, $\theta = \theta^{-}$ 로 설정할때보다 모델을 더 안정적으로 학습할 수 있고 성능에도 개선이 있었다고 합니다. 전체적인 학습 절차는 하단의 Algorithm 2 처럼 정리할 수 있습니다. + +:::{figure-md} +consistency_models_17 + +Overview of Consistency Distillation (CD) +::: + +$\theta^{-}$ 는 과거 $\theta$ 에 대한 running average 이므로 Algorithm 2 가 수렴할 시 이 둘은 일치하게 됩니다. 즉, target network $f_{\theta^-}$와 online network $f_{\theta}$ 가 일치하게 됩니다. + +## 5. Training Consistency Models in Isolation + +Consistency Distillation 방식에서는 ground truth score function $\nabla \log p_t(x_t)$ 을 근사하는 사전학습된 score model $s_{\phi}(x,t)$ 에 의존했다면, 이에 의존하지 않고 다음과 같은 $\nabla \log p_t(x_t)$ 에 대한 unbiased estimator 를 활용할 수도 있습니다. 다시 말해, $-(x_t - x)/t^2$ 로 $\nabla \log p_t(x_t)$ 를 근사할 수 있습니다. + +:::{figure-md} +consistency_models_18 + +Unbiased Estimator of Score Function +::: + +- $x \sim p_{data}, x_t \sim N(x; t^2I)$ + +Consistency Training (CT) Loss 는 다음과 같이 정의하고, 이는 사전학습된 diffusion model 파라미터 $\phi$ 와는 독립적인 사실을 확인할 수 있습다. + +$$ +L_{CT}^{N}(\theta,\theta^{-}) = \mathbb{E}[\lambda(t_n)d(f_{\theta}(x + t_{n+1}z, t_{n+1}), f_{\theta^-}(x+t_nz, t_n))] +$$ + +- $x \sim p_{data}, n \sim \mathbb{U}[[1,N-1]], x_{t_{n+1}} \sim N(x;t^2_{n+1}I), z \sim N(0,I)$ +- Consistency Training Loss 를 위와 같이 정의하게 된 배경은 다음과 같습니다. + + :::{figure-md} + consistency_models_19 + + Consistency Training Loss + ::: + + +:::{figure-md} +consistency_models_20 + +Schedule Functions for Consistency Training +::: + +논문에서 추가적인 성능 개선을 위해 $N$ 을 점진적으로 증가시키는 방식을 제안합니다. $N$ 이 작을수록 ($i.e., \Delta t$ 가 클수록) consistency training loss 가 consistency distillation loss 와 비교했을때 variance 는 감소하지만 bias 는 증가하게 되어, 초기에 더 빠른 convergence 에 이르는데 용이합니다. 반면에, $N$ 이 클수록 ($i.e., \Delta t$ 가 작을수록) variance 는 증가하고 bias 는 감소하게 되어, 학습의 마지막 단계에 적용하는 것이 바람직하다고 제안합니다. EMA decay rate schedule function $\mu(\cdot)$ 도 $N$ 에 따라 바뀌는 함수로 최종적으로 정의합니다. 전체적인 학습 절차는 하단의 Algorithm 3 처럼 정리할 수 있습니다. + +:::{figure-md} +consistency_models_21 + +Overview of Consistency Training (CT) +::: + + +## 6. Experiments + +논문에서 CIFAR-10, ImageNet 64x64, LSUN Bedroom 256x256, 그리고 LSUN Cat 256x256 데이터셋에 consistency distillation, consistency training 두 학습 방식을 모두 실험하였고, 모델 성능 지표는 FID, IS, Precision, 그리고 Recall 을 사용하였습니다. 모델 architecture 는 CIFAR-10 데이터셋에는 NCSN++, 그리고 그 외 데이터셋에는 ADM 모델을 사용하였습니다. + +### 6.1. Training Consistency Models + +CIFAR-10 데이터셋에 다음과 같은 hyperparameter tuning 작업을 진행하였습니다. (metric function $d(\cdot,\cdot)$, ODE solver, CD (Consistency Distillation) 에서의 number of discretization steps $N$, 그리고 CT (Consistency Training)) 에서의 schedule functions $N(\cdot), \mu(\cdot)$) + +**Parameter Initialization** + +모델 초기 파라미터 값은 다음과 같이 설정하였습니다. + +- Consistency Distillation - 사전학습된 diffusion model 파라미터 값 +- Consistency Training - Random Initialization + +**Results** + +모델 실험 결과를 다음과 같이 정리할 수 있습니다. + +:::{figure-md} +consistency_models_22 + +Experimental Results - Hyperparameters +::: + +- Consistency Distillation (CD) + - LPIPS 를 metric function 으로 사용했을때 모델 성능이 가장 좋았고, 이는 LPIPS metric 이 CIFAR-10 와 같은 natural image 들 간의 유사도를 측정하는데 특화되어 있기 때문이라고 합니다. + - Euler ODE solver 보다 Heun ODE solver 를 사용했을 때, 그리고 $N = 18$ 로 설정했을때 모델 성능이 가장 좋았습니다. 또한, 동일한 $N$ 에 대해서 Heun’s second ode solver 를 사용했을때 Euler’s first ode solver 를 사용했을 때보다 모델 성능이 우월한 부분을 확인할 수 있었다고 합니다. + + 이외에도 다른 데이터셋에 hyperparameter tuning 작업을 별도로 진행하였습니다. + +- Consistency Training (CT) + - CD 와 동일하게 LPIPS metric function 사용하였고, ODE solver 는 사용하지 않았습니다. + - $N$ 이 작을수록, 모델이 더 빨리 수렴하지만 생성된 이미지 퀄리티는 좋지 않은 부분을 재차 확인할 수 있습니다. (and vice versa) + - $N$ 을 점차적으로 증가시키면서 $\mu$ 도 변화시켰을때 성능이 가장 좋았습니다. + + +#### 6.2. Few-Step Image Generation + +**Distillation** + +논문에서는 Consistency Distillation 모델의 성능을 synthetic data generation 을 필요하지 않는 knowledge distillation 기법 (PD, [Salimans & Ho (2022)](https://arxiv.org/abs/2202.00512)) 과 다음과 같이 비교합니다. + +:::{figure-md} +consistency_models_23 + +Experimental Results - Distillation +::: + +**Direct Generation** + +CIFAR-10 데이터셋 기준으로 VAE, normalizing flow 를 비롯한 타 single-step generative model 보다 CT 가 성능이 가장 좋았습니다. 또한, distillation 기법 없이도 Progressive Distillation (PD, [Salimans & Ho (2022)](https://arxiv.org/abs/2202.00512)) 와 견줄만한 성능을 가진 부분을 확인할 수 있습니다. 마지막으로 동일한 noise 로부터 높은 structural similarity 를 가진 이미지들을 생성함으로써 self-consistency 성질도 확인할 수 있었다고 합니다. + +:::{figure-md} +consistency_models_24 + +Experimental Results - Direct Generation +::: + +### 6.3. Zero-Shot Image Editing + +Diffusion model 과 유사하게 consistency model 도 multistep sampling 알고리즘을 수정함으로써 zero shot image editing 이 가능합니다. 해당 사진은 LSUN Bedroom 데이터셋에 colorization, super-resolution, stroke-guided image editing task 를 적용한 결과입니다. + +:::{figure-md} +consistency_models_25 + +Pseudocode for Zero-Shot Image Editing +::: + +:::{figure-md} +consistency_models_26 + +Zero-Shot Image Editing Results +::: diff --git a/_sources/docs/review/cycleGAN.md b/_sources/docs/review/cycleGAN.md old mode 100644 new mode 100755 index 883f125f..147d2da5 --- a/_sources/docs/review/cycleGAN.md +++ b/_sources/docs/review/cycleGAN.md @@ -1,297 +1,297 @@ -```{admonition} Information -- **Title:** Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks (ICCV 2017) - -- **Reference** - - Paper: [https://arxiv.org/abs/1703.10593](https://arxiv.org/abs/1703.10593) - - Code: [TensorFlow CycleGAN tutorial](https://www.tensorflow.org/tutorials/generative/cyclegan?hl=ko) - - [[논문리뷰] Cycle GAN: Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks](https://velog.io/@sjinu/CycleGAN) - [CycleGAN을 만든 사람이 한국인이라고? CycleGAN 논문 뜯어보기](https://comlini8-8.tistory.com/9) - -- **Author:** KwangSu Mun - -- **Author:** ChangHwan Lee - -- **Last updated on May. 16, 2024** -``` - -# CycleGAN - -## Abstract - -- Image-to-image translation 은 한 이미지 도메인을 다른 이미지 도메인으로 변환시키는 computer vision 의 한 task 입니다. -- Image-to-image translation 은 보통 input과 output이 짝이 지어진 상태에서 학습하지만 짝이 지어진 학습 데이터를 얻는 것이 어렵습니다. 따라서 CycleGAN 논문에서는 짝지어진 예시 없이 $X$ 라는 domain 으로부터 얻은 이미지를 target domain $Y$ 로 바꾸는 방법을 제안합니다. 이 연구는 Adversarial loss 를 활용해, $G(x)$ 로부터 생성된 이미지 데이터의 분포와 $Y$ 로부터의 이미지 데이터의 분포가 구분이 불가능하도록 함수 $G: X -> Y$ 를 학습시키는 것을 목표로 합니다. 더불어, $X -> Y$ 로의 mapping 에 제약을 가해서 원하는 이미지를 강제하기 위해 $F: Y -> X$ 와 같은 역방향 매핑을 함께 진행합니다. 즉, $F(G(x))$ 가 $X$ 와 유사해지도록 강제하는 cycle consistency loss 를 도입했습니다. -- 결과적으로 collection style transfer, object transfiguration, season transfer, photo enhancement 등의 task 에서 이미지 pair 가 존재하지 않는 상태에서 우수한 결과를 보여줬다고 합니다. - - -## Related work - -- GAN : adversarial loss 를 사용하여 이미지를 생성하는 방법입니다. -- Image-to-Image Translation : 특정 image 를 input 로 넣으면 그에 맞는 image 가 output 로 나오는 방법입니다. pix2pix 같은 방법이 있으며 상세한 설명은 아래의 Background section 을 참조하면 됩니다. -- Unpaired Image-to-Image Translation : 위의 Image-to-Image Translation 에서 pair 가 아닌 데이터로 학습해서 Image-to-Image Translation 과 같은 input, output 결과가 나오도록 만드는 방법입니다. -- Cycle Consistency : 한 이미지를 다른 도메인으로 변환하고 다시 원래 도메인으로 변환할 때 처음의 원본으로 되도록 하여 일종의 순환(사이클)을 만드는 방법으로 학습 프로세스가 더 안정적이게 되고, 이미지 간의 일관성을 보다 잘 유지할 수 있도록 만듭니다. (ex) $X$ 를 모델 $A$ 에 거쳐 $Y$ 로 만든 뒤 다시 모델 $B$ 를 거쳐 $X$ 로 복구) -- Neural Style Transfer : pre-trained 된 deep features 의 Gram matrix statistics 일치를 기반으로 이미지 content 를 다른 image 의 스타일과 결합하여 새로운 이미지를 합성하는 방법입니다. - - -## Background - -### Image-to-Image Translation - -:::{figure-md} - - -image-to-image translation -::: - - -Image-to-image translation 은 input image 를 다른 스타일, 속성, 구조 등을 가진 output image 로 변환하는 task 입니다. 예를 들어 사진을 그림으로 변환한다거나, 낮에 찍은 사진을 밤에 찍은 것 처럼 변환하는 것을 말합니다. 흔히 translation 은 input 과 output 로 짝이 지어진 데이터를 바탕으로 학습이 이루어져 있었는데요. 짝이 지어진 사진 데이터를 얻는 것은 어렵고 값이 비싼 일이 됩니다. - -:::{figure-md} - - -paired and unpaired data -::: - - 이 논문에서는 input image와 output image가 일대일로 짝지어지지 않은 상태에서 하나의 image 모음의 특성을 캡쳐하고, 이러한 특성을 다른 image 모음으로 변환할 수 있는 방법을 제시합니다. -GAN은 domain $X$ 에 이미지 한 세트, domain $Y$ 에 이미지 한 세트가 제공되고, model 의 output 과 $Y$ 가 discriminator 에 의해 구별할 수 없도록 모델 $G: X -> Y$ 를 학습합니다. 하지만, 이것이 개별 입력 $x$ 와 출력 $y$ 가 무조건 유의미하게 쌍을 이룬다는 것을 뜻하지는 않습니다. $G$ 가 생성할 수 있는 image 에는 무한한 경우의 수가 있기 때문에 종종 mode collapse 현상이 일어나기도 합니다. - -### Mode Collapse - -:::{figure-md} - - -mode collapsing 출처: http://dl-ai.blogspot.com/2017/08/gan-problems.html -::: - -어떤 input image 든 모두 같은 output image 로 매핑하면서 최적화에 실패하는 현상입니다. 이 현상은 generator 입장에서, discriminator 가 이 사진이 진짜 $Y$인지 가짜인 $\hat{Y}$인지 구별하는 것을 '**속이기만**' 하면 되기 때문에 우리의 목적과 전혀 상관이 없는 데이터를 generator 가 만들더라도 문제가 생기지 않아서 발생합니다. -- 참고: [http://dl-ai.blogspot.com/2017/08/gan-problems.html](http://dl-ai.blogspot.com/2017/08/gan-problems.html) - -이러한 이슈로 인해 추가 objective function 이 필요해졌습니다. 따라서 translation task 는 영어 -> 프랑스어 -> 영어로 번역했을 때 원래 문장에 다시 도달하는 것처럼, $X --> Y --> X'$ 로 돌아가는 과정에서 $X$ 와 $X'$ 이 최대한 같아야 한다는 의미의 cycle consistency 이라는 속성을 이용합니다. 필요한 목적식을 간단하게 정리하면 다음과 같습니다. - -- 정방향, 역방향 adversarial loss: $X -> Y & Y -> X$ -- Cycle consistency loss: $X $\approx$ F(G(x))$ - -## Method - - - -### Overview - -:::{figure-md} - - -CycleGAN 도식화 자료 -::: - -- 목표: $X$, $Y$ 를 mapping 하는 function 을 학습하는 것 -- 용어 정리 - - data 분포를 $x ~ p_{data}(x)$, $y ~ p_{data}(y)$ 로 표기 - - $G : X -> Y$, $F: Y -> X$ 는 generator - - $D_X$, $D_Y$ 는 discriminator - - $D_X$ 는 $X$ 와 $F(y)$ 그리고 $D_Y$ 는 $y$ 와 $G(x)$ 를 구분하고, 다음과 같이 두 개의 목적식으로 학습합니다. - - adversarial loss: 생성된 이미지의 분포를 대상 domain 의 data distribution 과 일치시키기 위한 것. - - cycle consistency loss: 학습된 mapping $G$ 와 $F$ 가 서로 모순되는 것을 방지하기 위한 것. - -### Adversarial Loss - -$G: X -> Y$ 와 $D_Y$ 에 대한 목적식은 다음과 같습니다. - -:::{figure-md} $\mathcal{L}_{GAN}$ Loss function -L_GAN Loss function - -$\mathcal{L}_{GAN}$ Loss function (source: https://arxiv.org/abs/1703.10593) -::: - -이는 GAN 에서 쓰이는 loss function 를 사용하지만, 차이점이 있다면 $X -> Y$ 로 갈 때와 $Y -> X$ 로 갈 때 총 두 개의 수식이 나옵니다. 다시 말해, $F: Y -> X$ 와 $D_X$ 에 대해서도 $F$, $D_X$ 를 넣은 동일한 수식을 사용합니다. - -### Cycle Consistency Loss - -:::{figure-md} - - -cycle consistency loss function -::: - -- 앞서 말했듯이, mapping distribution 에 제한을 두어 최대한 우리가 원하는 이미지를 생성하기 위해 사용되는 loss function 입니다. -- 예비 실험에서 L1 norm 을 adversarial loss 로 대체해봤는데, 성능 향상을 관찰할 수 없었다고 합니다. -- cycle consistency loss 를 통해 유도된 결과는 아래 그림에서 볼 수 있습니다. - -:::{figure-md} - - -cycle consistency loss result -::: - -### Full Objective - -:::{figure-md} - - -full objective function -::: - -이때 consistency loss 앞에 붙은 가중치 $\lambda$ 는 GAN Loss 와의 상대적 중요도에 따라 결정됩니다. - - -## Implementation - -### Network Architecture - -Baseline architecture 로서 neural style transfer 와 super-resolution 에 인상적인 결과를 보여준 논문(https://arxiv.org/abs/1603.08155) 에서 사용된 구조를 채택합니다. - -- 3 개의 convolutions and several residual blocks, -- fractionally-strided convolution with stride 1/2, -- feature 를 RGB 로 매핑하는 one convolution layer. -- 6 blocks for 128 x 128 image // 9 blocks for 256 x 256 및 고해상도 학습 image. -- instance normalization - -### Training details - -모델 학습을 안정화시키기 위해 아래와 같은 테크닉을 추가로 적용합니다. - -- Loss function $\mathcal{L}_{GAN}$ 에서 nll loss 를 least-squared loss 로 변경 -- 생성된 이미지 중 가장 최근의 50개를 따로 저장해 discriminator 가 이를 한꺼번에 분류(모델 진동을 최소화하기 위함) - -### (참고) least-square loss 추가 설명 - -- [https://velog.io/@sjinu/CycleGAN](https://velog.io/@sjinu/CycleGAN) --[https://ysbsb.github.io/gan/2022/02/23/LSGAN.html](https://ysbsb.github.io/gan/2022/02/23/LSGAN.html) - -LSGAN 을 참고했으며, 논문에서는 generator 업데이트시 더 안정적인 학습과 quality 높은 결과를 생성한다고 합니다. - -:::{figure-md} - - -출처: https://velog.io/@sjinu/CycleGAN -::: - -(원래 Discriminator 는 이보다 더 고차원이지만) 간략히 2차원을 표방하면 결정경계를 위와 같이 나타낼 수 있습니다. 윗 쪽이 가짜 영역, 아래 쪽이 진짜 영역입니다 이 때, 아래에 보면 진짜 데이터 샘플과 거리가 먼 가짜 데이터 샘플이 존재합니다. 즉, NLL Loss 를 사용한다면, Generator 의 입장에서는 이미 Discriminator 를 잘 속이고 있기 때문에 학습할 필요가 없게 됩니다. 즉, Vanishing Gradient 현상이 일어나기 때문에, Discriminator 를 잘 속인다는 이유만으로, 안 좋은 샘플을 생성하는 것에 대해 패널티를 줄 수가 없게 됩니다. 이 때, LSGAN 을 사용한다면 실제 데이터 분포와 가짜 데이터 샘플이 거리가 먼 것에 대해서도 패널티를 주게 됩니다. - -:::{figure-md} - - -출처: https://velog.io/@sjinu/CycleGAN -::: - -그리고 모든 실험에 대해서 $\lambda$ 를 10 으로 설정하고, batch size = 1, 그리고 Adam solver 를 사용했습니다. 첫 100 epoch 동안에는 learning rate 를 0.0002 로 설정했고, 다음 100 epoch 마다 0 으로 조금식 수렴하게 scheduling 하였습니다. - - -## Evaluation - -모델 성능 평가를 위해 아래와 같은 세 개의 지표를 기반으로 기존의 CoGAN, SimGAN, pix2pix baseline 모델과 비교했습니다. 그 외 loss function 에 대한 ablation study 도 수행했습니다. - -1. AMT perceptual studies: 참가자들은 실제 사진이미지 vs 가짜 이미지, 또는 지도 이미지 vs 가짜이미지에 노출된 후 진짜라고 생각되는 이미지를 선택하게 합니다. -2. FCN Score: 1번 study 가 테스트에 있어 매우 좋은 기준임에도 불구하고, 이번에는 사람을 대상으로 한 실험이 아닌 양적인 기준을 사용합니다. 우선적으로 FCN 모델을 통해 생성된 사진에 대한 레이블 맵을 예측합니다. 이 레이블 맵은 아래에서 설명하는 standard semantic segmentation metric 을 사용하여 input ground truth label 과 비교할 수 있습니다. "도로 상의 자동차"라는 label 에서 사진 이미지를 생성하면, 생성된 이미지에 적용된 FCN 이 "도로 상의 자동차"를 감지하면 성공한 것입니다. -3. Semantic segmentation metric: pixel 당 정확도, class 당 정확도, 그리고 IoU(Intersection-Over-Union) 를 포함하는 cityscapes benchmark 의 표준 metric 를 사용합니다. - - -### Comparison against baselines - -:::{figure-md} - - -Comparison aginst baselines -::: - -타 baseline 모델보다 성능이 좋을 뿐만 아니라, fully supervised 모델인 pix2pix 와 비슷한 품질의 translation 성능을 보여줍니다. - -* AMT Score * - -:::{figure-md} - - -AMT score -::: - -Table 1 은 AMT perceptual realism task 에 대한 성능을 나타냅니다. CycleGAN 의 지도에서 항공 사진, 그리고 항공 사진에서 지도 translation 결과에서 약 1/4의 참가자를 속일 수 있었던 반면에 그 외 모든 baseline 모델은 참가자를 거의 속일 수 없었습니다. - -* FCN Score * - -:::{figure-md} - - -FCN scores -::: - -Table 2, Table 3 는 각각 도시 풍경에 대한 label -> photo, 그리고 photo -> label translation task 의 성능을 보여줍니다. 두 경우 모두 CycleGAN 이 baseline 들의 성능을 능가합니다. - -### Ablation Study - Analysis of the loss function - -:::{figure-md} - - -Analysis of loss function -::: - -GAN 과 cycle consistency loss 의 중요성을 보여주는 ablation study 입니다. GAN loss 그리고 cycle consistency loss 를 각각 제거하면 성능이 크게 저하되는 부분을 확인할 수 있습니다. 또한 한쪽 방향에 대해서만 GAN + forward cycle 만 돌렸을 때와 GAN + backward cycle 만 돌렸을 때 학습의 불안정성을 보이고, mode collapse 를 유발하는 것을 확인할 수 있었다고 합니다. - -### Image reconstruction quality - -:::{figure-md} - - -Results on Cycle Consistency -::: - -Reconctructed 된 이미지 예시들입니다. 지도 -> 항공 사진과 같이 하나의 도메인이 훨씬 더 다양한 정보를 나타내는 경우에도 재구성된 이미지가 훈련 및 테스트 시 모두 원래 입력 $x$ 에 가깝게 복원되는 경우가 많았습니다. - -### Additional results on paired datasets - -:::{figure-md} - - -Additional results on paired datasets -::: - -Figure 8 은 CMP Facade Database 의 건축 레이블 <-> 사진, 그리고 UT Zapoos50K dataset 의 edge <-> 신발 을 비롯하여 pix2pix 에 사용된 paired dataset 에 대한 몇 가지 예시 결과를 보여줍니다. CycleGAN 이 생성한 이미지 품질이 fully supervised 된 pix2pix 에 대응하는 성능을 보여주는 것을 확인할 수 있습니다. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - : shallow depth of field: 얕은 초점. 초점이 맞은 대상과 배경이 흐릿하게 보이는 효과. 인물 사진 / 작품 사진에 활용. 구목하고자 하는 대상을 강조하기 위해 활용. --> - 따라서 source domain은 스마트폰의 **작은 조리개로 깊은 초점** \--> target은 **조리개가 커서 얕은 초점**.--> - - - - -## Limitations and Discusssion - -:::{figure-md} - - -Limitations and Discussion -::: - -이 방법은 많은 경우에 흥미로운 결과를 얻을 수 있지만, 결과가 균일하게 좋은 것은 아니었습니다. - -1. 개 <-> 고양이 translation task 와 같은 경우는 input image 에서 최소한의 변화만 주어, 사람이 보았을 때 실제로 변화가 안되는 경우도 있었고, 형체가 애매해진 경우도 있었습니다. 이를 보았을 때, geometry 가 반영되는 눈, 코, 입 등의 세부적인 구조에 대한 정확히 구현하는데 한계가 있어 보입니다. -2. 말 <--> 얼룩말 translation 예제의 경우, 말은 사람이 타는 모습이 많았는데 얼룩말의 경우는 사람이 타는 사진이 없다보니, 사람 뿐만 아니라 배경도 얼룩 그림을 그리거나 단순히 얼룩말에서 노랗게 칠한 경우가 존재합니다. -3. 때때로 photo -> image translation task 에서 나무와 건물의 label 을 바꾸는 경우도 있었습니다. - 이러한 모호성을 해결하려면 weak semantic supervision 이 필요할 수도 있을 것 같습니다. - -그럼에도 불구하고 해당 논문은 완전히 paired 되지 않은 "unsupervised" setting 에서도 image translation task 의 한계를 늘리는데 기여합니다. +```{admonition} Information +- **Title:** Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks (ICCV 2017) + +- **Reference** + - Paper: [https://arxiv.org/abs/1703.10593](https://arxiv.org/abs/1703.10593) + - Code: [TensorFlow CycleGAN tutorial](https://www.tensorflow.org/tutorials/generative/cyclegan?hl=ko) + - [[논문리뷰] Cycle GAN: Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks](https://velog.io/@sjinu/CycleGAN) + [CycleGAN을 만든 사람이 한국인이라고? CycleGAN 논문 뜯어보기](https://comlini8-8.tistory.com/9) + +- **Author:** KwangSu Mun + +- **Author:** ChangHwan Lee + +- **Last updated on May. 16, 2024** +``` + +# CycleGAN + +## Abstract + +- Image-to-image translation 은 한 이미지 도메인을 다른 이미지 도메인으로 변환시키는 computer vision 의 한 task 입니다. +- Image-to-image translation 은 보통 input과 output이 짝이 지어진 상태에서 학습하지만 짝이 지어진 학습 데이터를 얻는 것이 어렵습니다. 따라서 CycleGAN 논문에서는 짝지어진 예시 없이 $X$ 라는 domain 으로부터 얻은 이미지를 target domain $Y$ 로 바꾸는 방법을 제안합니다. 이 연구는 Adversarial loss 를 활용해, $G(x)$ 로부터 생성된 이미지 데이터의 분포와 $Y$ 로부터의 이미지 데이터의 분포가 구분이 불가능하도록 함수 $G: X -> Y$ 를 학습시키는 것을 목표로 합니다. 더불어, $X -> Y$ 로의 mapping 에 제약을 가해서 원하는 이미지를 강제하기 위해 $F: Y -> X$ 와 같은 역방향 매핑을 함께 진행합니다. 즉, $F(G(x))$ 가 $X$ 와 유사해지도록 강제하는 cycle consistency loss 를 도입했습니다. +- 결과적으로 collection style transfer, object transfiguration, season transfer, photo enhancement 등의 task 에서 이미지 pair 가 존재하지 않는 상태에서 우수한 결과를 보여줬다고 합니다. + + +## Related work + +- GAN : adversarial loss 를 사용하여 이미지를 생성하는 방법입니다. +- Image-to-Image Translation : 특정 image 를 input 로 넣으면 그에 맞는 image 가 output 로 나오는 방법입니다. pix2pix 같은 방법이 있으며 상세한 설명은 아래의 Background section 을 참조하면 됩니다. +- Unpaired Image-to-Image Translation : 위의 Image-to-Image Translation 에서 pair 가 아닌 데이터로 학습해서 Image-to-Image Translation 과 같은 input, output 결과가 나오도록 만드는 방법입니다. +- Cycle Consistency : 한 이미지를 다른 도메인으로 변환하고 다시 원래 도메인으로 변환할 때 처음의 원본으로 되도록 하여 일종의 순환(사이클)을 만드는 방법으로 학습 프로세스가 더 안정적이게 되고, 이미지 간의 일관성을 보다 잘 유지할 수 있도록 만듭니다. (ex) $X$ 를 모델 $A$ 에 거쳐 $Y$ 로 만든 뒤 다시 모델 $B$ 를 거쳐 $X$ 로 복구) +- Neural Style Transfer : pre-trained 된 deep features 의 Gram matrix statistics 일치를 기반으로 이미지 content 를 다른 image 의 스타일과 결합하여 새로운 이미지를 합성하는 방법입니다. + + +## Background + +### Image-to-Image Translation + +:::{figure-md} + + +image-to-image translation +::: + + +Image-to-image translation 은 input image 를 다른 스타일, 속성, 구조 등을 가진 output image 로 변환하는 task 입니다. 예를 들어 사진을 그림으로 변환한다거나, 낮에 찍은 사진을 밤에 찍은 것 처럼 변환하는 것을 말합니다. 흔히 translation 은 input 과 output 로 짝이 지어진 데이터를 바탕으로 학습이 이루어져 있었는데요. 짝이 지어진 사진 데이터를 얻는 것은 어렵고 값이 비싼 일이 됩니다. + +:::{figure-md} + + +paired and unpaired data +::: + + 이 논문에서는 input image와 output image가 일대일로 짝지어지지 않은 상태에서 하나의 image 모음의 특성을 캡쳐하고, 이러한 특성을 다른 image 모음으로 변환할 수 있는 방법을 제시합니다. +GAN은 domain $X$ 에 이미지 한 세트, domain $Y$ 에 이미지 한 세트가 제공되고, model 의 output 과 $Y$ 가 discriminator 에 의해 구별할 수 없도록 모델 $G: X -> Y$ 를 학습합니다. 하지만, 이것이 개별 입력 $x$ 와 출력 $y$ 가 무조건 유의미하게 쌍을 이룬다는 것을 뜻하지는 않습니다. $G$ 가 생성할 수 있는 image 에는 무한한 경우의 수가 있기 때문에 종종 mode collapse 현상이 일어나기도 합니다. + +### Mode Collapse + +:::{figure-md} + + +mode collapsing 출처: http://dl-ai.blogspot.com/2017/08/gan-problems.html +::: + +어떤 input image 든 모두 같은 output image 로 매핑하면서 최적화에 실패하는 현상입니다. 이 현상은 generator 입장에서, discriminator 가 이 사진이 진짜 $Y$인지 가짜인 $\hat{Y}$인지 구별하는 것을 '**속이기만**' 하면 되기 때문에 우리의 목적과 전혀 상관이 없는 데이터를 generator 가 만들더라도 문제가 생기지 않아서 발생합니다. +- 참고: [http://dl-ai.blogspot.com/2017/08/gan-problems.html](http://dl-ai.blogspot.com/2017/08/gan-problems.html) + +이러한 이슈로 인해 추가 objective function 이 필요해졌습니다. 따라서 translation task 는 영어 -> 프랑스어 -> 영어로 번역했을 때 원래 문장에 다시 도달하는 것처럼, $X --> Y --> X'$ 로 돌아가는 과정에서 $X$ 와 $X'$ 이 최대한 같아야 한다는 의미의 cycle consistency 이라는 속성을 이용합니다. 필요한 목적식을 간단하게 정리하면 다음과 같습니다. + +- 정방향, 역방향 adversarial loss: $X -> Y & Y -> X$ +- Cycle consistency loss: $X $\approx$ F(G(x))$ + +## Method + + + +### Overview + +:::{figure-md} + + +CycleGAN 도식화 자료 +::: + +- 목표: $X$, $Y$ 를 mapping 하는 function 을 학습하는 것 +- 용어 정리 + - data 분포를 $x ~ p_{data}(x)$, $y ~ p_{data}(y)$ 로 표기 + - $G : X -> Y$, $F: Y -> X$ 는 generator + - $D_X$, $D_Y$ 는 discriminator + - $D_X$ 는 $X$ 와 $F(y)$ 그리고 $D_Y$ 는 $y$ 와 $G(x)$ 를 구분하고, 다음과 같이 두 개의 목적식으로 학습합니다. + - adversarial loss: 생성된 이미지의 분포를 대상 domain 의 data distribution 과 일치시키기 위한 것. + - cycle consistency loss: 학습된 mapping $G$ 와 $F$ 가 서로 모순되는 것을 방지하기 위한 것. + +### Adversarial Loss + +$G: X -> Y$ 와 $D_Y$ 에 대한 목적식은 다음과 같습니다. + +:::{figure-md} $\mathcal{L}_{GAN}$ Loss function +L_GAN Loss function + +$\mathcal{L}_{GAN}$ Loss function (source: https://arxiv.org/abs/1703.10593) +::: + +이는 GAN 에서 쓰이는 loss function 를 사용하지만, 차이점이 있다면 $X -> Y$ 로 갈 때와 $Y -> X$ 로 갈 때 총 두 개의 수식이 나옵니다. 다시 말해, $F: Y -> X$ 와 $D_X$ 에 대해서도 $F$, $D_X$ 를 넣은 동일한 수식을 사용합니다. + +### Cycle Consistency Loss + +:::{figure-md} + + +cycle consistency loss function +::: + +- 앞서 말했듯이, mapping distribution 에 제한을 두어 최대한 우리가 원하는 이미지를 생성하기 위해 사용되는 loss function 입니다. +- 예비 실험에서 L1 norm 을 adversarial loss 로 대체해봤는데, 성능 향상을 관찰할 수 없었다고 합니다. +- cycle consistency loss 를 통해 유도된 결과는 아래 그림에서 볼 수 있습니다. + +:::{figure-md} + + +cycle consistency loss result +::: + +### Full Objective + +:::{figure-md} + + +full objective function +::: + +이때 consistency loss 앞에 붙은 가중치 $\lambda$ 는 GAN Loss 와의 상대적 중요도에 따라 결정됩니다. + + +## Implementation + +### Network Architecture + +Baseline architecture 로서 neural style transfer 와 super-resolution 에 인상적인 결과를 보여준 논문(https://arxiv.org/abs/1603.08155) 에서 사용된 구조를 채택합니다. + +- 3 개의 convolutions and several residual blocks, +- fractionally-strided convolution with stride 1/2, +- feature 를 RGB 로 매핑하는 one convolution layer. +- 6 blocks for 128 x 128 image // 9 blocks for 256 x 256 및 고해상도 학습 image. +- instance normalization + +### Training details + +모델 학습을 안정화시키기 위해 아래와 같은 테크닉을 추가로 적용합니다. + +- Loss function $\mathcal{L}_{GAN}$ 에서 nll loss 를 least-squared loss 로 변경 +- 생성된 이미지 중 가장 최근의 50개를 따로 저장해 discriminator 가 이를 한꺼번에 분류(모델 진동을 최소화하기 위함) + +### (참고) least-square loss 추가 설명 + +- [https://velog.io/@sjinu/CycleGAN](https://velog.io/@sjinu/CycleGAN) +-[https://ysbsb.github.io/gan/2022/02/23/LSGAN.html](https://ysbsb.github.io/gan/2022/02/23/LSGAN.html) + +LSGAN 을 참고했으며, 논문에서는 generator 업데이트시 더 안정적인 학습과 quality 높은 결과를 생성한다고 합니다. + +:::{figure-md} + + +출처: https://velog.io/@sjinu/CycleGAN +::: + +(원래 Discriminator 는 이보다 더 고차원이지만) 간략히 2차원을 표방하면 결정경계를 위와 같이 나타낼 수 있습니다. 윗 쪽이 가짜 영역, 아래 쪽이 진짜 영역입니다 이 때, 아래에 보면 진짜 데이터 샘플과 거리가 먼 가짜 데이터 샘플이 존재합니다. 즉, NLL Loss 를 사용한다면, Generator 의 입장에서는 이미 Discriminator 를 잘 속이고 있기 때문에 학습할 필요가 없게 됩니다. 즉, Vanishing Gradient 현상이 일어나기 때문에, Discriminator 를 잘 속인다는 이유만으로, 안 좋은 샘플을 생성하는 것에 대해 패널티를 줄 수가 없게 됩니다. 이 때, LSGAN 을 사용한다면 실제 데이터 분포와 가짜 데이터 샘플이 거리가 먼 것에 대해서도 패널티를 주게 됩니다. + +:::{figure-md} + + +출처: https://velog.io/@sjinu/CycleGAN +::: + +그리고 모든 실험에 대해서 $\lambda$ 를 10 으로 설정하고, batch size = 1, 그리고 Adam solver 를 사용했습니다. 첫 100 epoch 동안에는 learning rate 를 0.0002 로 설정했고, 다음 100 epoch 마다 0 으로 조금식 수렴하게 scheduling 하였습니다. + + +## Evaluation + +모델 성능 평가를 위해 아래와 같은 세 개의 지표를 기반으로 기존의 CoGAN, SimGAN, pix2pix baseline 모델과 비교했습니다. 그 외 loss function 에 대한 ablation study 도 수행했습니다. + +1. AMT perceptual studies: 참가자들은 실제 사진이미지 vs 가짜 이미지, 또는 지도 이미지 vs 가짜이미지에 노출된 후 진짜라고 생각되는 이미지를 선택하게 합니다. +2. FCN Score: 1번 study 가 테스트에 있어 매우 좋은 기준임에도 불구하고, 이번에는 사람을 대상으로 한 실험이 아닌 양적인 기준을 사용합니다. 우선적으로 FCN 모델을 통해 생성된 사진에 대한 레이블 맵을 예측합니다. 이 레이블 맵은 아래에서 설명하는 standard semantic segmentation metric 을 사용하여 input ground truth label 과 비교할 수 있습니다. "도로 상의 자동차"라는 label 에서 사진 이미지를 생성하면, 생성된 이미지에 적용된 FCN 이 "도로 상의 자동차"를 감지하면 성공한 것입니다. +3. Semantic segmentation metric: pixel 당 정확도, class 당 정확도, 그리고 IoU(Intersection-Over-Union) 를 포함하는 cityscapes benchmark 의 표준 metric 를 사용합니다. + + +### Comparison against baselines + +:::{figure-md} + + +Comparison aginst baselines +::: + +타 baseline 모델보다 성능이 좋을 뿐만 아니라, fully supervised 모델인 pix2pix 와 비슷한 품질의 translation 성능을 보여줍니다. + +* AMT Score * + +:::{figure-md} + + +AMT score +::: + +Table 1 은 AMT perceptual realism task 에 대한 성능을 나타냅니다. CycleGAN 의 지도에서 항공 사진, 그리고 항공 사진에서 지도 translation 결과에서 약 1/4의 참가자를 속일 수 있었던 반면에 그 외 모든 baseline 모델은 참가자를 거의 속일 수 없었습니다. + +* FCN Score * + +:::{figure-md} + + +FCN scores +::: + +Table 2, Table 3 는 각각 도시 풍경에 대한 label -> photo, 그리고 photo -> label translation task 의 성능을 보여줍니다. 두 경우 모두 CycleGAN 이 baseline 들의 성능을 능가합니다. + +### Ablation Study - Analysis of the loss function + +:::{figure-md} + + +Analysis of loss function +::: + +GAN 과 cycle consistency loss 의 중요성을 보여주는 ablation study 입니다. GAN loss 그리고 cycle consistency loss 를 각각 제거하면 성능이 크게 저하되는 부분을 확인할 수 있습니다. 또한 한쪽 방향에 대해서만 GAN + forward cycle 만 돌렸을 때와 GAN + backward cycle 만 돌렸을 때 학습의 불안정성을 보이고, mode collapse 를 유발하는 것을 확인할 수 있었다고 합니다. + +### Image reconstruction quality + +:::{figure-md} + + +Results on Cycle Consistency +::: + +Reconctructed 된 이미지 예시들입니다. 지도 -> 항공 사진과 같이 하나의 도메인이 훨씬 더 다양한 정보를 나타내는 경우에도 재구성된 이미지가 훈련 및 테스트 시 모두 원래 입력 $x$ 에 가깝게 복원되는 경우가 많았습니다. + +### Additional results on paired datasets + +:::{figure-md} + + +Additional results on paired datasets +::: + +Figure 8 은 CMP Facade Database 의 건축 레이블 <-> 사진, 그리고 UT Zapoos50K dataset 의 edge <-> 신발 을 비롯하여 pix2pix 에 사용된 paired dataset 에 대한 몇 가지 예시 결과를 보여줍니다. CycleGAN 이 생성한 이미지 품질이 fully supervised 된 pix2pix 에 대응하는 성능을 보여주는 것을 확인할 수 있습니다. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + : shallow depth of field: 얕은 초점. 초점이 맞은 대상과 배경이 흐릿하게 보이는 효과. 인물 사진 / 작품 사진에 활용. 구목하고자 하는 대상을 강조하기 위해 활용. --> + 따라서 source domain은 스마트폰의 **작은 조리개로 깊은 초점** \--> target은 **조리개가 커서 얕은 초점**.--> + + + + +## Limitations and Discusssion + +:::{figure-md} + + +Limitations and Discussion +::: + +이 방법은 많은 경우에 흥미로운 결과를 얻을 수 있지만, 결과가 균일하게 좋은 것은 아니었습니다. + +1. 개 <-> 고양이 translation task 와 같은 경우는 input image 에서 최소한의 변화만 주어, 사람이 보았을 때 실제로 변화가 안되는 경우도 있었고, 형체가 애매해진 경우도 있었습니다. 이를 보았을 때, geometry 가 반영되는 눈, 코, 입 등의 세부적인 구조에 대한 정확히 구현하는데 한계가 있어 보입니다. +2. 말 <--> 얼룩말 translation 예제의 경우, 말은 사람이 타는 모습이 많았는데 얼룩말의 경우는 사람이 타는 사진이 없다보니, 사람 뿐만 아니라 배경도 얼룩 그림을 그리거나 단순히 얼룩말에서 노랗게 칠한 경우가 존재합니다. +3. 때때로 photo -> image translation task 에서 나무와 건물의 label 을 바꾸는 경우도 있었습니다. + 이러한 모호성을 해결하려면 weak semantic supervision 이 필요할 수도 있을 것 같습니다. + +그럼에도 불구하고 해당 논문은 완전히 paired 되지 않은 "unsupervised" setting 에서도 image translation task 의 한계를 늘리는데 기여합니다. diff --git a/_sources/docs/review/dalle.md b/_sources/docs/review/dalle.md old mode 100644 new mode 100755 index 05066e68..8cf8662f --- a/_sources/docs/review/dalle.md +++ b/_sources/docs/review/dalle.md @@ -1,243 +1,243 @@ -```{admonition} Information -- **Title:** Zero-shot text-to-image generation (ICML 2021) - -- **Reference** - - Paper: [https://arxiv.org/abs/2102.12092](https://arxiv.org/abs/2102.12092) - - Code: [Unofficial-PyTorch](https://github.com/lucidrains/DALLE-pytorch) - - Code: [Official](https://github.com/openai/DALL-E) - -- **Author:** Donggeun "Sean" Ko - -- **Last updated on June 22 2023** -``` - -# DALL-E - -## 1. Introduction - -- GPT-3 기반 모델이며 120억개 parameter 수와 2.5억 데이터 (text,image) set으로 학습 -- Autoregressive 한 모델링을 통하여 image와 text를 이용하여 text-to-image generation task를 수행 -- 2021년 기준 zero-shot SOTA performance 달성 -- 아래 그림과 같이 text input에 따라 diverse한 이미지 생성 - - -:::{figure-md} -fig1 - -Images generated using DALL-E -::: - -:::{figure-md} -fig2 - -Images generated using DALL-E -::: - - -## 2. Background -- GPT-3와 VQ-VAE를 활용하여 나온 논문. -- VQ-VAE를 먼저 학습하고, Autoregressive Transformer을 순차적으로 학습하여 zero-shot architecture을 구축. - -### GPT-3 -- Autoregressive Language Model며 few-shot learning을 통해 fine-tuning 없이 높은 성능을 냄 *(fine-tuning 을 할 수는 있지만 본 논문에서는 task-agnostic performance 에 중점을 맞춰 Few shot을 함) -- GPT-3 는 transformer에서 decoder 부분만 사용 (GPT-2 와 유사한 구조를 가지고 있음 ) -- 약 1750억 parameter 개수의 모델 - - -:::{figure-md} -fig3 - -Transformer 아키텍쳐 \ (source: https://arxiv.org/pdf/2005.14165.pdf) - -::: - -:::{figure-md} -![GPT-3 GIF](../../pics/dalle/fig4.gif) - -GPT 3 Animation \ (source: https://jalammar.github.io/how-gpt3-works-visualizations-animations/) -::: - - -### VQ-VAE -- Encoder에서 나온 output은 discrete 하며 posterior 과 prior 이 categorical distribution을 갖는다고 가정함. -- CNN (encoder) 을 거친 각 D차원의 위치에 $H \times W$ 그리드로 이미지를 나누고 embedding space (Codebook) 에서 $𝑒_1$부터 $𝑒_𝑘$ 중에서 가까운 1개 embedding code로 변환. -- Quantization: Encoding output $z_{e}(x)$ representation 과 유사한 codebook embedding $e_j$ 를 찾아서 $k$ 값을 부여함. - -:::{figure-md} -fig5 - -VQ-VAE 아키텍쳐, Loss 함수 \ (source: https://velog.io/@p2yeong/Understanding-VQ-VAE-DALL-E-Explained-Pt.-1) - -::: - - - -:::{figure-md} -fig6 - -Quantization of VQ-VAE -::: - - - -## 3. Methodology - -## Limitation of Previous Works - -1. Memory/Bottleneck Issue -- 각 Image에서 나오는 pixel을 직접적으로 image token을 사용하면 고화질 이미지일수록 너무 많은 메모리량이 필요해서 “비효율적” - - -2. Short-range dependence modeling between pixels -- Model들 중 Likelihood function을 objective function으로 사용하면 short-range dependency를 우선적으로 볼 것이며 low-frequency 보다 high-frequency detail에 더욱 집중하게 됨. -- Low frequency 는 visually recognizable해서 시각적으로 더 도움이 되는 부분 - -이 2가지 문제점을 극복하고자 Two-stage training process 제안 - - -## DALL-E Overview -### Stage 1: Training VQ-VAE -- **Discrete VAE**를 이용하여 $256 \times 256$ RGB image \rightarrow $32 \times 32$ 이미지 토큰으로 압축 -- 각 이미지 토큰은 8,192개의 code 값 중에 하나 배정 -- 이미지의 **quality 손실 없이** $8 \times 8 \times 3$ 배 만큼 context size를 적게 만들 수 있음. - - -### Stage 2: Training an Autoregressive Transformer -- **최대 256 BPE-Encoded text tokens**들과 1024 image tokens ($32 \times 32$) 를 연속적으로 입력함 (concatenate) -- Text token과 Image Tokens 들의 joint distribution (결합 분포)를 모델링하여 autoregressive transformer을 학습 - - -## DALL-E Pipeline 예시 - - -:::{figure-md} -fig7 - -DALL-E 시각화 \ (source:https://jiho-ml.com/weekly-nlp-40/) -::: - -:::{figure-md} -fig8 - -DALL-E 파이프라인 \ (source:https://www.youtube.com/watch?v=CQoM0r2kMvI&t=1729s) -::: - - -## Methodology Details - -### DALL-E Equations - -:::{figure-md} -fig9 - -equation 1 -::: - -:::{figure-md} -fig10 - -equation 2: Maximizing ELBO -::: - -x: images, y: captions , z: encoded RGB image tokens - -**𝑞Φ (red)** : input image에서 dVAE encoder에서 생성한 32 x 32 image token를 예측 - -**𝑝𝜃 (blue)**: image token에서 dVAE decoder에서 생성한 RGB image를 예측 - -**𝑝ψ (purple)**: transformer 모델로 모델링한 text와 image token들의 결합 분포 (joint distribution) - -### DALL-E 학습과정 Stage 1: Learning the VIsual Codebook -- Transformer을 고정하고 dVAE encoder & decoder (𝑞_Φ , 𝑝_𝜃) 을 학습함 - - 즉, ELB (Evidence Lower Bound를 maximize 함) - - K = 8,192 codebook (embedding space)로 설정 - - -- **ELB를 optimize** 하기 위해서는 discrete distribution을 continuous를 바꿔야 함 - - 학습시에는 결국, argmax를 사용해서 codebook vector 인덱스를 선택하여 계산하면 Reparameterization gradient를 연산 X - - argmax 대신 **gumbel softmax**를 사용하여 해결 - - - 평가를 진행할 때에는 $z = codebook[\underset{i}{argmax}[g_i+log(q(e_i|x))]]$ - -- Gumbel Softmax Relaxation를 사용하여 해결! $q_\phi \rightarrow q_{\phi}^{\tau}$, temperature $\tau \rightarrow 0$, relaxation을 tight하게 잡아줌. - - -### DALL-E 학습과정 Stage 2: Learning the Prior -- Transformer을 고정하고 dVAE encoder & decoder ($q_{phi}$ , $p_{\theta}$) transformer의 prior distribution $p_{\psi}$를 학습함. -- 이때, $p_{\psi}$의 ELB를 maximize 하며 120억개의 parameter를 가진 sparse transformer 구조를 사용함 - -- Image token은 dVAE Encoder logit에서 Argmax sampling을 통해 생성 -- Text token은 소문자화 후 16,384 개의 vocabulary를 BPE-encoding 통해 한번에 최대 256 token을 활용 - -:::{figure-md} -fig11 - -Text-to-text attention: causal attention mask -Image-to-image attention: row/column/convolutional attention mask 적용 -::: - - -## Results -- 추론 시에는 text에 대하여 N개의 이미지를 생성. -- Best of N개는 **N개 생성 후 best**를 골라서 선택 함. - -- 우수한 이미지를 고르기 위해 CLIP (Contrastive Language-Image Pretraining, 2021) 논문에서 제시한 text 와 k 번째로 similarity 점수가 높은 이미지를 선택함 (k=1) - -:::{figure-md} -fig12 - -DALL-E 결과물. Best를 고를때 N 수가 증가할수록 주어진 text prompt랑 더 유사한 결과물이 나옴. -::: - -- 생성한 512개 이미지 중 CLIP 알고리즘을 통해 similarity score이 제일 높은 이미지를 뽑음. -- Ours (DALL-E) vs 다른 baseline method 와 비교 시 text에 더욱 알맞은 이미지를 생성한 것을 확인 할 수 있음. - - -:::{figure-md} -fig13 - -선택하는 이미지 개수에 따른 성능 향상 -::: - - -- DF-GAN 이랑 비교해서 MS-COCO dataset에 대하여 정성적 평가를 진행. -- Best-of-Five votes 중에 DF-GAN보다 매번 압도적인 차이로 투표 수를 받았음. - - -:::{figure-md} -fig14 - -DF-GAN 이랑 Qualitative Results 비교 -::: - - - - -- FID (Frechet Inception Distance)는 값이 낮을수록 좋으며 / IS (Inception Score)는 높을수록 좋음 -- MS-COCO 랑 CUB (새 특화 데이터셋) 기준, DALL-E는 MS-COCO에서는 뛰어난 성능을 보여줬음. -- CUB에서는 SOTA를 찍지 못하였고 Inception score에서는 낮은 점수를 기록함. -- 저자들은 Fine-tuning 으로 CUB에 성능 계선을 할 수 있다고 생각함. - -:::{figure-md} -fig15 - -MS-COCO 와 CUB dataset에서 FID/IS 결과값 비교 -::: - -## Conclusion -- GPT-3의 확장 모델로 120억개의 parameter과 autoregressive Transformer (Decoder only) 기반 모델링을 통해 text-to-image generation task를 뛰어나게 해결함. -- Zero-shot learning에서 다른 모델보다 훌륭한 일반화 성능을 보임 -- 정량적 / 정성적 평가에서 준수한 성능을 보이고 있으며 다양한 이미지 생성이 가능함. - -** Limitations: ** -- 생성하고 싶은 이미지에 다양한 객체가 포함되면 어려움을 겪음 -- (b)에 보면 고슴도치가 2마리거나 강아지와 고슴도치 둘다 크리스마스 스웨터를 입고 있음. - -- CUB dataset 처럼 다소 아쉬운 성능을 보인 데이터셋이 있지만 fine-tuning으로 해결 - - -:::{figure-md} -fig16 - -Limitation을 보여주는 결과물. -::: +```{admonition} Information +- **Title:** Zero-shot text-to-image generation (ICML 2021) + +- **Reference** + - Paper: [https://arxiv.org/abs/2102.12092](https://arxiv.org/abs/2102.12092) + - Code: [Unofficial-PyTorch](https://github.com/lucidrains/DALLE-pytorch) + - Code: [Official](https://github.com/openai/DALL-E) + +- **Author:** Donggeun "Sean" Ko + +- **Last updated on June 22 2023** +``` + +# DALL-E + +## 1. Introduction + +- GPT-3 기반 모델이며 120억개 parameter 수와 2.5억 데이터 (text,image) set으로 학습 +- Autoregressive 한 모델링을 통하여 image와 text를 이용하여 text-to-image generation task를 수행 +- 2021년 기준 zero-shot SOTA performance 달성 +- 아래 그림과 같이 text input에 따라 diverse한 이미지 생성 + + +:::{figure-md} +fig1 + +Images generated using DALL-E +::: + +:::{figure-md} +fig2 + +Images generated using DALL-E +::: + + +## 2. Background +- GPT-3와 VQ-VAE를 활용하여 나온 논문. +- VQ-VAE를 먼저 학습하고, Autoregressive Transformer을 순차적으로 학습하여 zero-shot architecture을 구축. + +### GPT-3 +- Autoregressive Language Model며 few-shot learning을 통해 fine-tuning 없이 높은 성능을 냄 *(fine-tuning 을 할 수는 있지만 본 논문에서는 task-agnostic performance 에 중점을 맞춰 Few shot을 함) +- GPT-3 는 transformer에서 decoder 부분만 사용 (GPT-2 와 유사한 구조를 가지고 있음 ) +- 약 1750억 parameter 개수의 모델 + + +:::{figure-md} +fig3 + +Transformer 아키텍쳐 \ (source: https://arxiv.org/pdf/2005.14165.pdf) + +::: + +:::{figure-md} +![GPT-3 GIF](../../pics/dalle/fig4.gif) + +GPT 3 Animation \ (source: https://jalammar.github.io/how-gpt3-works-visualizations-animations/) +::: + + +### VQ-VAE +- Encoder에서 나온 output은 discrete 하며 posterior 과 prior 이 categorical distribution을 갖는다고 가정함. +- CNN (encoder) 을 거친 각 D차원의 위치에 $H \times W$ 그리드로 이미지를 나누고 embedding space (Codebook) 에서 $𝑒_1$부터 $𝑒_𝑘$ 중에서 가까운 1개 embedding code로 변환. +- Quantization: Encoding output $z_{e}(x)$ representation 과 유사한 codebook embedding $e_j$ 를 찾아서 $k$ 값을 부여함. + +:::{figure-md} +fig5 + +VQ-VAE 아키텍쳐, Loss 함수 \ (source: https://velog.io/@p2yeong/Understanding-VQ-VAE-DALL-E-Explained-Pt.-1) + +::: + + + +:::{figure-md} +fig6 + +Quantization of VQ-VAE +::: + + + +## 3. Methodology + +## Limitation of Previous Works + +1. Memory/Bottleneck Issue +- 각 Image에서 나오는 pixel을 직접적으로 image token을 사용하면 고화질 이미지일수록 너무 많은 메모리량이 필요해서 “비효율적” + + +2. Short-range dependence modeling between pixels +- Model들 중 Likelihood function을 objective function으로 사용하면 short-range dependency를 우선적으로 볼 것이며 low-frequency 보다 high-frequency detail에 더욱 집중하게 됨. +- Low frequency 는 visually recognizable해서 시각적으로 더 도움이 되는 부분 + +이 2가지 문제점을 극복하고자 Two-stage training process 제안 + + +## DALL-E Overview +### Stage 1: Training VQ-VAE +- **Discrete VAE**를 이용하여 $256 \times 256$ RGB image \rightarrow $32 \times 32$ 이미지 토큰으로 압축 +- 각 이미지 토큰은 8,192개의 code 값 중에 하나 배정 +- 이미지의 **quality 손실 없이** $8 \times 8 \times 3$ 배 만큼 context size를 적게 만들 수 있음. + + +### Stage 2: Training an Autoregressive Transformer +- **최대 256 BPE-Encoded text tokens**들과 1024 image tokens ($32 \times 32$) 를 연속적으로 입력함 (concatenate) +- Text token과 Image Tokens 들의 joint distribution (결합 분포)를 모델링하여 autoregressive transformer을 학습 + + +## DALL-E Pipeline 예시 + + +:::{figure-md} +fig7 + +DALL-E 시각화 \ (source:https://jiho-ml.com/weekly-nlp-40/) +::: + +:::{figure-md} +fig8 + +DALL-E 파이프라인 \ (source:https://www.youtube.com/watch?v=CQoM0r2kMvI&t=1729s) +::: + + +## Methodology Details + +### DALL-E Equations + +:::{figure-md} +fig9 + +equation 1 +::: + +:::{figure-md} +fig10 + +equation 2: Maximizing ELBO +::: + +x: images, y: captions , z: encoded RGB image tokens + +**𝑞Φ (red)** : input image에서 dVAE encoder에서 생성한 32 x 32 image token를 예측 + +**𝑝𝜃 (blue)**: image token에서 dVAE decoder에서 생성한 RGB image를 예측 + +**𝑝ψ (purple)**: transformer 모델로 모델링한 text와 image token들의 결합 분포 (joint distribution) + +### DALL-E 학습과정 Stage 1: Learning the VIsual Codebook +- Transformer을 고정하고 dVAE encoder & decoder (𝑞_Φ , 𝑝_𝜃) 을 학습함 + - 즉, ELB (Evidence Lower Bound를 maximize 함) + - K = 8,192 codebook (embedding space)로 설정 + + +- **ELB를 optimize** 하기 위해서는 discrete distribution을 continuous를 바꿔야 함 + - 학습시에는 결국, argmax를 사용해서 codebook vector 인덱스를 선택하여 계산하면 Reparameterization gradient를 연산 X + - argmax 대신 **gumbel softmax**를 사용하여 해결 + + - 평가를 진행할 때에는 $z = codebook[\underset{i}{argmax}[g_i+log(q(e_i|x))]]$ + +- Gumbel Softmax Relaxation를 사용하여 해결! $q_\phi \rightarrow q_{\phi}^{\tau}$, temperature $\tau \rightarrow 0$, relaxation을 tight하게 잡아줌. + + +### DALL-E 학습과정 Stage 2: Learning the Prior +- Transformer을 고정하고 dVAE encoder & decoder ($q_{phi}$ , $p_{\theta}$) transformer의 prior distribution $p_{\psi}$를 학습함. +- 이때, $p_{\psi}$의 ELB를 maximize 하며 120억개의 parameter를 가진 sparse transformer 구조를 사용함 + +- Image token은 dVAE Encoder logit에서 Argmax sampling을 통해 생성 +- Text token은 소문자화 후 16,384 개의 vocabulary를 BPE-encoding 통해 한번에 최대 256 token을 활용 + +:::{figure-md} +fig11 + +Text-to-text attention: causal attention mask +Image-to-image attention: row/column/convolutional attention mask 적용 +::: + + +## Results +- 추론 시에는 text에 대하여 N개의 이미지를 생성. +- Best of N개는 **N개 생성 후 best**를 골라서 선택 함. + +- 우수한 이미지를 고르기 위해 CLIP (Contrastive Language-Image Pretraining, 2021) 논문에서 제시한 text 와 k 번째로 similarity 점수가 높은 이미지를 선택함 (k=1) + +:::{figure-md} +fig12 + +DALL-E 결과물. Best를 고를때 N 수가 증가할수록 주어진 text prompt랑 더 유사한 결과물이 나옴. +::: + +- 생성한 512개 이미지 중 CLIP 알고리즘을 통해 similarity score이 제일 높은 이미지를 뽑음. +- Ours (DALL-E) vs 다른 baseline method 와 비교 시 text에 더욱 알맞은 이미지를 생성한 것을 확인 할 수 있음. + + +:::{figure-md} +fig13 + +선택하는 이미지 개수에 따른 성능 향상 +::: + + +- DF-GAN 이랑 비교해서 MS-COCO dataset에 대하여 정성적 평가를 진행. +- Best-of-Five votes 중에 DF-GAN보다 매번 압도적인 차이로 투표 수를 받았음. + + +:::{figure-md} +fig14 + +DF-GAN 이랑 Qualitative Results 비교 +::: + + + + +- FID (Frechet Inception Distance)는 값이 낮을수록 좋으며 / IS (Inception Score)는 높을수록 좋음 +- MS-COCO 랑 CUB (새 특화 데이터셋) 기준, DALL-E는 MS-COCO에서는 뛰어난 성능을 보여줬음. +- CUB에서는 SOTA를 찍지 못하였고 Inception score에서는 낮은 점수를 기록함. +- 저자들은 Fine-tuning 으로 CUB에 성능 계선을 할 수 있다고 생각함. + +:::{figure-md} +fig15 + +MS-COCO 와 CUB dataset에서 FID/IS 결과값 비교 +::: + +## Conclusion +- GPT-3의 확장 모델로 120억개의 parameter과 autoregressive Transformer (Decoder only) 기반 모델링을 통해 text-to-image generation task를 뛰어나게 해결함. +- Zero-shot learning에서 다른 모델보다 훌륭한 일반화 성능을 보임 +- 정량적 / 정성적 평가에서 준수한 성능을 보이고 있으며 다양한 이미지 생성이 가능함. + +** Limitations: ** +- 생성하고 싶은 이미지에 다양한 객체가 포함되면 어려움을 겪음 +- (b)에 보면 고슴도치가 2마리거나 강아지와 고슴도치 둘다 크리스마스 스웨터를 입고 있음. + +- CUB dataset 처럼 다소 아쉬운 성능을 보인 데이터셋이 있지만 fine-tuning으로 해결 + + +:::{figure-md} +fig16 + +Limitation을 보여주는 결과물. +::: diff --git a/_sources/docs/review/diffusion_beats_GANs.md b/_sources/docs/review/diffusion_beats_GANs.md old mode 100644 new mode 100755 index 675d2240..9ab7da8d --- a/_sources/docs/review/diffusion_beats_GANs.md +++ b/_sources/docs/review/diffusion_beats_GANs.md @@ -1,247 +1,247 @@ -```{admonition} Information -- **Title:** Diffusion Models Beat GANs on Image Synthesis (NeurIPS 2021) - -- **Reference** - - Paper: [https://arxiv.org/abs/2105.05233](https://arxiv.org/abs/2105.05233) - - Code: [Official](https://github.com/openai/guided-diffusion) - -- **Author:** Donggeun Sean Ko - -- **Last updated on May. 17, 2023** -``` - -# Diffusion Models Beat GANs on Image Synthesis -## Abstract - -- Diffusion 모델들은 기존 unconditional 이미지 생성 모델들의 SOTA를 뛰어넘음. -- Conditional image synthesis 부분에서도 classifier guidance를 활용해 diffusion model을 활용하여 좋은 성능을 보여준다고 주장함. -- Classifier guidance를 활용해 diversity와 fidelity의 trade-off에 대해서도 분석 - -## 1. Introduction - -- Diffusion 모델들은 likelihood-based model들이며 고화질 이미지를 생성해내는데에 성공 했음. -- 하지만, FID 수치는 BigGAN-deep에 비해 낮으며, 개선사항이 필요함. -- 두가지 contribution을 통해 Diffusion Model들의 성능을 끌어올리며 FID 결과 수치를 낮추겠다고 주장. - - 모델 아키텍쳐 개선 - - Classifier Guidance - -## 2. Background -- DDPM, DDIM, Improved DDPM은 이전에 설명되있으므로, 각 background 논문들의 핵심 부분만 설명하겠습니다. -- -### DDPM - - - - $p_\theta(x_{t-1}|x_t)$은 $q(x_{t-1}|x_t)$의 근사값이라고 가정하며 계산한다. - - $p_\theta(x_{t-1}|x_t)$를 학습하여 $p_\theta(x_{t-1}|x_t) \approx$ $q(x_{t-1}|x_t)$를 만든다. - - $\epsilon_\theta(x_t,t)$ 을 모델링하여 **noise**를 예측한다. -- 공분산 $\Sigma_\theta(X_t,t)$은 학습 불가능한 매개변수로 설정되며 constant 값을 가진다. -- 아래와 같이 $L_{simple}$ 을 새로운 Loss function으로 제안한다. - - -:::{figure-md} -ddpm_pipeline - -DDPM Pipeline -::: - -:::{figure-md} -ddpm_eq - -DDPM Equation -::: - -### Improved DDPM - -:::{figure-md} - -improved_ddpm_pic - -Improved DDPM scheduling comparison with DDPM (Linear vs Cosine) -::: - -- 더 적은 diffusion step으로 샘플링 함. -- Competitive log-likelihood 지표 성능 개선 (전 DDPM에선 log-likelihood 지표가 상대적으로 GAN 모델의 비해 낮았다) -- 전 DDPM 논문에서는 linear scheduling을 사용했지만, 본 논문에서는 cosine scheduling을 사용해서 성능 향상을 했다고 주장했다. -- 분산 $\Sigma_\theta(X_t,t)$을 학습에도 활용 -- $L_{hybrid}$라는 새로운 loss 함수 제시 - -:::{figure-md} -improved_ddpm_eq - -Improved DDPM Equation -::: - - -### DDIM - -:::{figure-md} -ddim_pipe - -DDIM Pipeline -::: - -- Markovian Chain Process를 끊고 Non-Markovian 형태로 Deterministic 하게 수식을 바꿈 -- DDPM 보다 더 적은 iteration으로 image synthesis 가능 - -:::{figure-md} -ddim_pic - -DDIM Sampling Equation -::: - -## 3. Architectural Improvements - -- DDPM에서 사용한 architecture을 그대로 채택했지만, 다양한 ablation 및 parameter을 변경하여 제일 높은 성능이 나오는 architecture을 설명 및 채택함 - -- 모델 크기를 일정하게 가져가면서 Depth vs Width 증가 보기 -- Attention head 수 증가 시켜보기 -- 각 Attention head에 resolution 을 8x8, 16x16, 32x32 로 실험 해보기 -- 일반 ResNet Residual Block이 아닌 BigGAN의 residual block을 채택하여 upsampling / downsampling 사용 해보기 -- Residual Connection을 1/√2 로 rescaling 해보기 - -:::{figure-md} -architect_1 - -Table 1: Ablation of various architecture changes -::: - -:::{figure-md} -architect_2 - -Table 2: Ablation of various attention configurations. Attention head 가 32일때 FID 값이 제일 낮다 (좋다) -::: - -** 3-1. Best Architecture ** - -- Channel 수 160 -- Depth 2 -- number of Attention Head = 4 -- Attention Resolution을 32, 16, 8 로 block마다 줄이기 -- BigGAN residual block 채택 -- Rescaling X -- 위와 같은 parameter를 통해 제일 좋은 FID 결과가 나옴 - -:::{figure-md} -architect_3 - -Table 3: 다양한 parameter 튜닝을 통한 제일 좋은 FID 성능 테이블 -::: - -## 4. Adaptive Group Normalization -- 본 저자들은 AdaIN이랑 비슷한 방식으로 연산하는 AdaGN 이라는 것을 소개했다. (원래 있는 방법론인지는 모르겠다...) -- Group Normalization을 adpative하게 하는 방법으로 Group Normalization 후에 residual block에 time step embedding과 class embedding을 AdaIN 방식으로 곱하고 더함 - -Equation - -$$AdaIN(x,y) = \sigma(y)(\frac{x-\mu(x)}{\sigma(x)})+\mu(y)$$ -$$AdaGN(h,y) = y_s + GroupNorm(h) + y_b$$ -where $h =$ residual block and $y = [y_s,y_b]$ time-step embedding and class embedding's linear projection respectively - -**4-1 AdaGN의 성능** - -:::{figure-md} -adagn_table - -AdaGN과 Additon+GroupNorm 비교 테이블. DDPM에서 사용한 normalization보다 더 좋은 성능을 보여주고 있음. -::: - -- 기존 DDPM은 Addition + GroupNorm layer을 사용했는데, AdaGN 을 사용하는 것이 FID가 더 낮게 (즉 더 좋은 성능) 나온 것을 볼 수 있다 - -## 5. Classifier Guidance -- 본 논문의 주 contribution 중 하나가 classifier guidance를 사용했다는 점이다. -- unconditional de-noising process에서 label y를 condition으로 줌으로써 conditional de-noising process로 진행 - -Equation - $$p_{\theta, \phi }(x_t|x_{t+1},y) = Zp_\theta(x_t|x_{t+1})p_\phi(y|x_t)$$ - -- Z 는 normalizing을 위한 상수 이다 - -**5-1 Classifier Guidance 유도** - -$log_\phi p(y|x_t)$가 $\Sigma^-1$ 에 비해 곡률이 낮으며, 이 가정을 따라, diffusion step이 무한으로 갈 시, $||\Sigma^ || \rightarrow0$ 이므로,$log_\phi p(y|x_t)$가 테일러 급수를 활용하여 식을 $x_t = \mu$ 로 재전개 할 수 있다. - -- classifier의 gradient를 활용해서 학습을 같이 해준다. -- 식 유도는 아래와 같다. 본문의 (3) ~ (10) 번식이므로 본 논문을 참고하면 좋다. - -:::{figure-md} -class_eq1 - -Classifier Guidance 유도 식 1,2 -::: - -:::{figure-md} -classifier_2 - -Classifier Guidance 유도 식 3~7 -::: - -## 6. Algorithm - -:::{figure-md} -algorithm - -Algorithm 1 & 2 sampling method. Algorithm 1은 일반적인 DDPM 기준, Algorithm 2는 DDIM 기준 guidance 한 sampling 방법 -::: - -- Algorithm 1 은 일반 DDPM에서 샘플링 하는 방법이다. 똑같이 Gaussian distribution에서 샘플링 할 시, classifier의 gradient를 활용하여 $x_{t-1}$를 sample한다. -- Algorithm 2 는 DDIM에서 샘플링 하는 방법이다. $\epsilon$ 모델에서 나오는 output과 classifier의 gradient의 joint distribution 값을 빼 score을 구한다. - - - -- DDIM은 Deterministic하기때문에 모든 시점의 값을 모두 계산할 필요 없이 subset의 시점만으로 sampling이 가능하다. -- 이 Accelerating method는 약간의 quality 저하가 있지만 Computational efficiency를 충분히 증가시킬 수 있다. -- **DDIM 방식의 재학습 없이 DDPM의 training에 DDIM의 sampling이 가능하다.** - - -## 7. Impact of parameter s in classifier guidance - -:::{figure-md} -class_guidance_vis - -Classifier Guidance scaling의 영향 시각화 -::: -- classifier guidance 앞에 hyperparameter \bf{s} 의 값에 따라 classifier가 줄 수 있는 scaling이 다르다. -- scale을 1.0으로 주면 웰시코기라는 class의 scale 영향을 덜 받아 "웰시코기스러운" 강아지가 생성이 많이 되지는 않는다. -- scale을 10.0으로 주면 웰시코기 class라는 scaling의 영향을 많이 받아 웰시코기 분위기의 강아지의 이미지가 더 많이 생성 되는 것을 볼 수 있다. -- epsilon이라는 모델이 결국 scale에 따라 gradient의 영향을 얼마나 많이 받는지 sampling할 때 볼 수 있다. -## 8. Results - -:::{figure-md} -plot result - -Fidelity vs Diversity Trade-off 결과 -::: - -- gradient scale이 높을수록 recall은 낮지만, precision은 높다. 즉 trade-off 가 생기는데, recall이 낮을수록 diveristy가 낮다는 의미이고, precision이 높을수록 fidelity가 높다는 뜻이다. -- scale을 높일수록 다양한 이미지가 생성되는 것이 아닌, classifier가 준 label쪽으로 guide가 생기므로 일정한 class의 사진이 나온다. -- FID와 sFID는 diversity와 fidelity의 trade-off로 도출되는 값이므로, 최고의 값은 중간 지점에서 나왔다. - - -**8-1. Result Table** -- ADM은 Ablated Diffusion Model의 약자이며, ADM-G는 Ablated Diffusion Model with Guidance의 약자이다. -- Guidance를 주었을 시 제일 좋은 FID값이 나왔으며, Precision이 높을수록, Recall이 낮게 나왔다 (and vice versa). - - -## 8-2. Image Synthesis Results - -:::{figure-md} -img_results - -Generated Images (Left: BigGAN, Center: DMs, Right: Train Dataset) -::: - -- 두번쨰 플라밍고 생성된 사진을 볼때, BigGAN은 이미지간들의 diversity가 없다. 학습된 플라밍고가 다수 플라밍고 시 비슷한 느낌의 이미지만 뽑아낸다. -- 반면, Diffusion model with guidance를 사용했을 시, 다채로운 플라밍고 사진을 볼 수 있다. 한마리만 있는 플라밍고 사진도 뽑아 낼 수 있다. - -## 9. Limitation and Future Work -**Limitation 1** -- Diffusion 모델들은 GAN보다 샘플링 시간이 아직 느리다. - -**Future Work 1** -- DDIM의 sampling process를 distillation 해서 빠르게 하는 법을 고려 - -**Limitation 2** -- Classifier guidance는 classification function의 gradient를 사용함으로써, label이 없는 data에는 확장이 불가능하다. - -**Future Work 2** -- Unlabeled sample을 clustering 하는 방법을 통해 방법론을 expand 하려 한다. +```{admonition} Information +- **Title:** Diffusion Models Beat GANs on Image Synthesis (NeurIPS 2021) + +- **Reference** + - Paper: [https://arxiv.org/abs/2105.05233](https://arxiv.org/abs/2105.05233) + - Code: [Official](https://github.com/openai/guided-diffusion) + +- **Author:** Donggeun Sean Ko + +- **Last updated on May. 17, 2023** +``` + +# Diffusion Models Beat GANs on Image Synthesis +## Abstract + +- Diffusion 모델들은 기존 unconditional 이미지 생성 모델들의 SOTA를 뛰어넘음. +- Conditional image synthesis 부분에서도 classifier guidance를 활용해 diffusion model을 활용하여 좋은 성능을 보여준다고 주장함. +- Classifier guidance를 활용해 diversity와 fidelity의 trade-off에 대해서도 분석 + +## 1. Introduction + +- Diffusion 모델들은 likelihood-based model들이며 고화질 이미지를 생성해내는데에 성공 했음. +- 하지만, FID 수치는 BigGAN-deep에 비해 낮으며, 개선사항이 필요함. +- 두가지 contribution을 통해 Diffusion Model들의 성능을 끌어올리며 FID 결과 수치를 낮추겠다고 주장. + - 모델 아키텍쳐 개선 + - Classifier Guidance + +## 2. Background +- DDPM, DDIM, Improved DDPM은 이전에 설명되있으므로, 각 background 논문들의 핵심 부분만 설명하겠습니다. +- +### DDPM + + + - $p_\theta(x_{t-1}|x_t)$은 $q(x_{t-1}|x_t)$의 근사값이라고 가정하며 계산한다. + - $p_\theta(x_{t-1}|x_t)$를 학습하여 $p_\theta(x_{t-1}|x_t) \approx$ $q(x_{t-1}|x_t)$를 만든다. + - $\epsilon_\theta(x_t,t)$ 을 모델링하여 **noise**를 예측한다. +- 공분산 $\Sigma_\theta(X_t,t)$은 학습 불가능한 매개변수로 설정되며 constant 값을 가진다. +- 아래와 같이 $L_{simple}$ 을 새로운 Loss function으로 제안한다. + + +:::{figure-md} +ddpm_pipeline + +DDPM Pipeline +::: + +:::{figure-md} +ddpm_eq + +DDPM Equation +::: + +### Improved DDPM + +:::{figure-md} + +improved_ddpm_pic + +Improved DDPM scheduling comparison with DDPM (Linear vs Cosine) +::: + +- 더 적은 diffusion step으로 샘플링 함. +- Competitive log-likelihood 지표 성능 개선 (전 DDPM에선 log-likelihood 지표가 상대적으로 GAN 모델의 비해 낮았다) +- 전 DDPM 논문에서는 linear scheduling을 사용했지만, 본 논문에서는 cosine scheduling을 사용해서 성능 향상을 했다고 주장했다. +- 분산 $\Sigma_\theta(X_t,t)$을 학습에도 활용 +- $L_{hybrid}$라는 새로운 loss 함수 제시 + +:::{figure-md} +improved_ddpm_eq + +Improved DDPM Equation +::: + + +### DDIM + +:::{figure-md} +ddim_pipe + +DDIM Pipeline +::: + +- Markovian Chain Process를 끊고 Non-Markovian 형태로 Deterministic 하게 수식을 바꿈 +- DDPM 보다 더 적은 iteration으로 image synthesis 가능 + +:::{figure-md} +ddim_pic + +DDIM Sampling Equation +::: + +## 3. Architectural Improvements + +- DDPM에서 사용한 architecture을 그대로 채택했지만, 다양한 ablation 및 parameter을 변경하여 제일 높은 성능이 나오는 architecture을 설명 및 채택함 + +- 모델 크기를 일정하게 가져가면서 Depth vs Width 증가 보기 +- Attention head 수 증가 시켜보기 +- 각 Attention head에 resolution 을 8x8, 16x16, 32x32 로 실험 해보기 +- 일반 ResNet Residual Block이 아닌 BigGAN의 residual block을 채택하여 upsampling / downsampling 사용 해보기 +- Residual Connection을 1/√2 로 rescaling 해보기 + +:::{figure-md} +architect_1 + +Table 1: Ablation of various architecture changes +::: + +:::{figure-md} +architect_2 + +Table 2: Ablation of various attention configurations. Attention head 가 32일때 FID 값이 제일 낮다 (좋다) +::: + +** 3-1. Best Architecture ** + +- Channel 수 160 +- Depth 2 +- number of Attention Head = 4 +- Attention Resolution을 32, 16, 8 로 block마다 줄이기 +- BigGAN residual block 채택 +- Rescaling X +- 위와 같은 parameter를 통해 제일 좋은 FID 결과가 나옴 + +:::{figure-md} +architect_3 + +Table 3: 다양한 parameter 튜닝을 통한 제일 좋은 FID 성능 테이블 +::: + +## 4. Adaptive Group Normalization +- 본 저자들은 AdaIN이랑 비슷한 방식으로 연산하는 AdaGN 이라는 것을 소개했다. (원래 있는 방법론인지는 모르겠다...) +- Group Normalization을 adpative하게 하는 방법으로 Group Normalization 후에 residual block에 time step embedding과 class embedding을 AdaIN 방식으로 곱하고 더함 + +Equation + +$$AdaIN(x,y) = \sigma(y)(\frac{x-\mu(x)}{\sigma(x)})+\mu(y)$$ +$$AdaGN(h,y) = y_s + GroupNorm(h) + y_b$$ +where $h =$ residual block and $y = [y_s,y_b]$ time-step embedding and class embedding's linear projection respectively + +**4-1 AdaGN의 성능** + +:::{figure-md} +adagn_table + +AdaGN과 Additon+GroupNorm 비교 테이블. DDPM에서 사용한 normalization보다 더 좋은 성능을 보여주고 있음. +::: + +- 기존 DDPM은 Addition + GroupNorm layer을 사용했는데, AdaGN 을 사용하는 것이 FID가 더 낮게 (즉 더 좋은 성능) 나온 것을 볼 수 있다 + +## 5. Classifier Guidance +- 본 논문의 주 contribution 중 하나가 classifier guidance를 사용했다는 점이다. +- unconditional de-noising process에서 label y를 condition으로 줌으로써 conditional de-noising process로 진행 + +Equation + $$p_{\theta, \phi }(x_t|x_{t+1},y) = Zp_\theta(x_t|x_{t+1})p_\phi(y|x_t)$$ + +- Z 는 normalizing을 위한 상수 이다 + +**5-1 Classifier Guidance 유도** + +$log_\phi p(y|x_t)$가 $\Sigma^-1$ 에 비해 곡률이 낮으며, 이 가정을 따라, diffusion step이 무한으로 갈 시, $||\Sigma^ || \rightarrow0$ 이므로,$log_\phi p(y|x_t)$가 테일러 급수를 활용하여 식을 $x_t = \mu$ 로 재전개 할 수 있다. + +- classifier의 gradient를 활용해서 학습을 같이 해준다. +- 식 유도는 아래와 같다. 본문의 (3) ~ (10) 번식이므로 본 논문을 참고하면 좋다. + +:::{figure-md} +class_eq1 + +Classifier Guidance 유도 식 1,2 +::: + +:::{figure-md} +classifier_2 + +Classifier Guidance 유도 식 3~7 +::: + +## 6. Algorithm + +:::{figure-md} +algorithm + +Algorithm 1 & 2 sampling method. Algorithm 1은 일반적인 DDPM 기준, Algorithm 2는 DDIM 기준 guidance 한 sampling 방법 +::: + +- Algorithm 1 은 일반 DDPM에서 샘플링 하는 방법이다. 똑같이 Gaussian distribution에서 샘플링 할 시, classifier의 gradient를 활용하여 $x_{t-1}$를 sample한다. +- Algorithm 2 는 DDIM에서 샘플링 하는 방법이다. $\epsilon$ 모델에서 나오는 output과 classifier의 gradient의 joint distribution 값을 빼 score을 구한다. + + + +- DDIM은 Deterministic하기때문에 모든 시점의 값을 모두 계산할 필요 없이 subset의 시점만으로 sampling이 가능하다. +- 이 Accelerating method는 약간의 quality 저하가 있지만 Computational efficiency를 충분히 증가시킬 수 있다. +- **DDIM 방식의 재학습 없이 DDPM의 training에 DDIM의 sampling이 가능하다.** + + +## 7. Impact of parameter s in classifier guidance + +:::{figure-md} +class_guidance_vis + +Classifier Guidance scaling의 영향 시각화 +::: +- classifier guidance 앞에 hyperparameter \bf{s} 의 값에 따라 classifier가 줄 수 있는 scaling이 다르다. +- scale을 1.0으로 주면 웰시코기라는 class의 scale 영향을 덜 받아 "웰시코기스러운" 강아지가 생성이 많이 되지는 않는다. +- scale을 10.0으로 주면 웰시코기 class라는 scaling의 영향을 많이 받아 웰시코기 분위기의 강아지의 이미지가 더 많이 생성 되는 것을 볼 수 있다. +- epsilon이라는 모델이 결국 scale에 따라 gradient의 영향을 얼마나 많이 받는지 sampling할 때 볼 수 있다. +## 8. Results + +:::{figure-md} +plot result + +Fidelity vs Diversity Trade-off 결과 +::: + +- gradient scale이 높을수록 recall은 낮지만, precision은 높다. 즉 trade-off 가 생기는데, recall이 낮을수록 diveristy가 낮다는 의미이고, precision이 높을수록 fidelity가 높다는 뜻이다. +- scale을 높일수록 다양한 이미지가 생성되는 것이 아닌, classifier가 준 label쪽으로 guide가 생기므로 일정한 class의 사진이 나온다. +- FID와 sFID는 diversity와 fidelity의 trade-off로 도출되는 값이므로, 최고의 값은 중간 지점에서 나왔다. + + +**8-1. Result Table** +- ADM은 Ablated Diffusion Model의 약자이며, ADM-G는 Ablated Diffusion Model with Guidance의 약자이다. +- Guidance를 주었을 시 제일 좋은 FID값이 나왔으며, Precision이 높을수록, Recall이 낮게 나왔다 (and vice versa). + + +## 8-2. Image Synthesis Results + +:::{figure-md} +img_results + +Generated Images (Left: BigGAN, Center: DMs, Right: Train Dataset) +::: + +- 두번쨰 플라밍고 생성된 사진을 볼때, BigGAN은 이미지간들의 diversity가 없다. 학습된 플라밍고가 다수 플라밍고 시 비슷한 느낌의 이미지만 뽑아낸다. +- 반면, Diffusion model with guidance를 사용했을 시, 다채로운 플라밍고 사진을 볼 수 있다. 한마리만 있는 플라밍고 사진도 뽑아 낼 수 있다. + +## 9. Limitation and Future Work +**Limitation 1** +- Diffusion 모델들은 GAN보다 샘플링 시간이 아직 느리다. + +**Future Work 1** +- DDIM의 sampling process를 distillation 해서 빠르게 하는 법을 고려 + +**Limitation 2** +- Classifier guidance는 classification function의 gradient를 사용함으로써, label이 없는 data에는 확장이 불가능하다. + +**Future Work 2** +- Unlabeled sample을 clustering 하는 방법을 통해 방법론을 expand 하려 한다. diff --git a/_sources/docs/review/dreambooth.md b/_sources/docs/review/dreambooth.md old mode 100644 new mode 100755 index 9d0c1b01..c8e3349d --- a/_sources/docs/review/dreambooth.md +++ b/_sources/docs/review/dreambooth.md @@ -1,247 +1,247 @@ -``` {admonition} Information -- **Title:** DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation (CVPR 2023) - -- **Reference** - - Paper: [https://arxiv.org/abs/2208.12242](https://arxiv.org/abs/2208.12242) - - Code: [https://github.com/huggingface/diffusers/tree/main/examples/dreambooth](https://github.com/huggingface/diffusers/tree/main/examples/dreambooth) - -- **Author:** Sangwoo Jo - -- **Last updated on May. 31, 2023** -``` - -# DreamBooth - -## Introduction - -최근에 DALL-E2, Imagen, Stable Diffusion 등 다양한 text-to-image generation 모델들이 등장하였지만, 어떠한 동일한 subject 에 대해서 다른 context 에 적용하는 부분에서 부족한 면들을 보여주고 있습니다. DreamBooth 논문은 이러한 문제점을 개선하기 위해 text-to-image 모델을 fine-tuning 하는 기법으로 소개되었고, 단 3-5장의 이미지를 학습하면 되며 이를 NVIDIA A100 으로 학습하는데 5분 정도밖에 소요되지 않는다고 합니다. - -:::{figure-md} -dreambooth_01 - -Subject-Driven Generation -::: - -DreamBooth 가 무엇인지 자세히 알아보기 전에 text-to-image diffusion model 에 대해 다시 한번 개념 정리를 해볼 필요가 있습니다. - -## Text-to-Image Diffusion Models - -사전학습된 text-to-image diffusion model $\hat{x}_{\theta}$ 는 input 으로 원본 이미지 $x$, 그리고 text prompt $P$ 와 text-encoder $\Gamma$ 로부터 나오는 conditioning vector $c = \Gamma(P)$ 를 입력받아서 이미지 $x_{gen} = \hat{x}_{\theta}(\epsilon, c)$ 를 생성하게 됩니다. 학습 시, mean squared loss 를 사용하고 이를 수식적으로 표현하면 다음과 같습니다. - -$$ -\mathbb{E}_{x,c,\epsilon,t}[w_t || \hat{x}_{\theta}(\alpha_tx + \sigma_{t}\epsilon, c) - x ||_{2}^{2}] -$$ - -이때, DreamBooth 에서는 text encoder 를 CLIP text embedding 과 사전학습된 T5-XXL 모델 중 T5-XXL 모델을 사용했다고 합니다. 그리고 DreamBooth 로 fine-tuning 할때, diffusion process 에서 사용되는 U-net (때로는 text encoder 도 포함) 은 learnable 한 parameter 로 설정하고 생성된 latent vector 로부터 새로운 이미지를 생성하는 Decoder 의 파라미터 값은 고정시킨다고 합니다. - -앞써 설명드렸던 내용들을 해당 implementation code 에서 확인할 수 있습니다. - -- **code** - - ```python - # https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py - text_encoder_cls = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision) - - # Load scheduler and models - noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler") - text_encoder = text_encoder_cls.from_pretrained( - args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision - ) - vae = AutoencoderKL.from_pretrained(args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision) - unet = UNet2DConditionModel.from_pretrained( - args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision - ) - ``` - -- **training code** - - ```python - # https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py - for epoch in range(first_epoch, args.num_train_epochs): - unet.train() - if args.train_text_encoder: - text_encoder.train() - for step, batch in enumerate(train_dataloader): - # Skip steps until we reach the resumed step - if args.resume_from_checkpoint and epoch == first_epoch and step < resume_step: - if step % args.gradient_accumulation_steps == 0: - progress_bar.update(1) - continue - - with accelerator.accumulate(unet): - # Convert images to latent space - latents = vae.encode(batch["pixel_values"].to(dtype=weight_dtype)).latent_dist.sample() - latents = latents * vae.config.scaling_factor - - # Sample noise that we'll add to the latents - if args.offset_noise: - noise = torch.randn_like(latents) + 0.1 * torch.randn( - latents.shape[0], latents.shape[1], 1, 1, device=latents.device - ) - else: - noise = torch.randn_like(latents) - bsz = latents.shape[0] - # Sample a random timestep for each image - timesteps = torch.randint(0, noise_scheduler.config.num_train_timesteps, (bsz,), device=latents.device) - timesteps = timesteps.long() - - # Add noise to the latents according to the noise magnitude at each timestep - # (this is the forward diffusion process) - noisy_latents = noise_scheduler.add_noise(latents, noise, timesteps) - - # Get the text embedding for conditioning - encoder_hidden_states = text_encoder(batch["input_ids"])[0] - - # Predict the noise residual - model_pred = unet(noisy_latents, timesteps, encoder_hidden_states).sample - - # Get the target for loss depending on the prediction type - if noise_scheduler.config.prediction_type == "epsilon": - target = noise - elif noise_scheduler.config.prediction_type == "v_prediction": - target = noise_scheduler.get_velocity(latents, noise, timesteps) - else: - raise ValueError(f"Unknown prediction type {noise_scheduler.config.prediction_type}") - - if args.with_prior_preservation: - # Chunk the noise and model_pred into two parts and compute the loss on each part separately. - model_pred, model_pred_prior = torch.chunk(model_pred, 2, dim=0) - target, target_prior = torch.chunk(target, 2, dim=0) - - # Compute instance loss - loss = F.mse_loss(model_pred.float(), target.float(), reduction="mean") - - # Compute prior loss - prior_loss = F.mse_loss(model_pred_prior.float(), target_prior.float(), reduction="mean") - - # Add the prior loss to the instance loss. - loss = loss + args.prior_loss_weight * prior_loss - else: - loss = F.mse_loss(model_pred.float(), target.float(), reduction="mean") - - accelerator.backward(loss) - if accelerator.sync_gradients: - params_to_clip = ( - itertools.chain(unet.parameters(), text_encoder.parameters()) - if args.train_text_encoder - else unet.parameters() - ) - accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm) - optimizer.step() - lr_scheduler.step() - optimizer.zero_grad(set_to_none=args.set_grads_to_none) - ``` - - -## Fine-tuning - -DreamBooth 에서 pre-trained 된 text-to-image generation 모델을 fine-tuning 할 때 *“a [unique identifier] [class noun]”* 그리고 *“a [class noun]”* 형태의 두 가지 text prompt 를 사용합니다. 이때, *unique identifier* 에 유지하고자 하는 대상에 대한 정보를 담는 것을 목표로 하기 때문에 사전 정보가 없는 rare token 을 사용하는 것이 중요하다고 합니다. 논문에서는 3개 이하의 Unicode character 혹은 T5-XXL tokenizer 를 랜덤하게 샘플링해서 token 을 생성하고 이를 기반으로 *unique identifier* 를 정의합니다. - -또한, 논문에서 *Language Drift* 그리고 *Reduced Output Diversity* 두 가지 문제점을 해결하기 위해 Class-specific Prior Preservation Loss 를 소개합니다. 이를 활용하여 모델을 fine-tuning 하는 방법은 다음과 같습니다. - -:::{figure-md} -dreambooth_02 - -Fine-tuning -::: - -우선, Gaussian 노이즈 이미지와 *“A V [class noun]”* 형태의 text prompt 를 사전학습된 text-to-image diffusion 모델에 입력하여 이미지를 생성한 후, 원본 이미지와의 *Reconstruction Loss* 를 계산합니다. 그리고 비슷한 과정으로 Gaussian 노이즈 이미지와 *“A [class noun]”* 형태의 text prompt 를 학습하고자 하는 모델, 그리고 freeze 시킨 또 다른 pre-trained diffusion 모델에 각각 입력하여 이미지를 생성한 후 *Class-Specific Prior Preservation Loss* 를 계산합니다. 이에 대한 training objective 를 수식적으로 표현하면 다음과 같습니다. - -$$ -\mathbb{E}_{x,c,\epsilon,\epsilon^{'},t}[w_t || \hat{x}_{\theta}(\alpha_tx + \sigma_t\epsilon, c) - x ||_{2}^{2} + \lambda w_{t^{'}} || \hat{x}_{\theta}(\alpha_{t^{'}} x_{pr} + \sigma_{t^{'}}\epsilon^{'}, c_{pr}) - x_{pr} ||_{2}^{2}] -$$ - -*Class-Specific Prior Preservation Loss* 를 추가함으로써 class prior 에 대한 정보를 유지하게 되고, 이로써 동일한 class 에 대해 더 다양한 이미지들을 생성할 수 있는 부분을 아래 그림에서 확인할 수 있습니다. - -:::{figure-md} -dreambooth_03 - -Encouraging diversity with prior-preservation loss -::: - -## Experiments - -DreamBooth 논문에서 세 가지의 모델 평가 metric 을 소개합니다. 첫번째로는 *subject fidelity* 를 측정하는 CLIP-I, DINO 그리고 *prompt fidelity* 를 측정하는 CLIP-T metric 을 사용합니다. 이때, DINO metric 이 동일한 class 를 가진 subject 에 대해서 다른 embedding 이 생성되기 때문에 CLIP-I 보다 더 선호된다고 합니다. 더 자세하게는 각 metric 은 다음과 같이 계산됩니다. - -- CLIP-I := 생성된 이미지와 실제 이미지의 CLIP embedding 의 평균 pairwise cosine similarity -- DINO := 생성된 이미지와 실제 이미지의 ViT-S/16 DINO embedding 의 평균 pairwise cosine similarity -- CLIP-T := 입력 prompt 와 생성된 이미지의 CLIP embedding 의 평균 pairwise cosine similarity - -Textual Inversion 과 비교했을때, 세 개의 metric 에서 모두 DreamBooth 가 더 좋은 성능을 보여주는 것을 확인할 수 있습니다. - -:::{figure-md} -dreambooth_04 - -Comparison of models -::: - -## Ablation Studies - -Prior Preservation Loss (PPL) 과 Class-Prior 에 대한 Ablation Studies 결과도 논문에서 공유합니다. PPL 가 적용됨으로써 앞써 소개드렸던 Language Drift 그리고 Reduced Output Diversity 문제점을 PRES 그리고 DIV metric 을 통해 해결되는 것을 보여줍니다. 또한, Class-Prior Ablation 에서 다음과 같은 세 가지 prompt 를 사용하여 fine-tuning 했을 때, 해당 subject 에 맞는 *class noun* 을 prompt 에 입력했을때가 가장 좋은 성능을 보여준다고 설명합니다. - -- “no class noun” -- “a randomly sampled incorrect class noun” (e.g., “can” for a backpack) -- “correct class noun” - -## Applications - -논문에서 DreamBooth 를 활용한 여러 application 도 소개합니다. - -:::{figure-md} -dreambooth_05 - -Applications of DreamBooth -::: - -1. Recontextualization -- Prompt: “a [V] [class noun] [context description]” -- 다음과 같은 prompt 입력 시, 사전에 보지 못했던 새로운 pose 나 articulation 을 잘 표현하는 부분을 확인할 수 있습니다. - -:::{figure-md} -dreambooth_06 - -Recontextualization -::: - -2. Art Renditions -- Prompt: “a painting of a [V] [class noun] in the style of [famous painter]” or “a statue of a [V] [class noun] in the style of [famous sculptor]” -- Style Transfer 와 다르게 동일한 구조를 유지한 채 style 만 바꾸는 것이 아니라 다양한 pose 형태도 생성 가능합니다. - -3. Novel View Synthesis -- 동일한 subject 에 대해 다양한 각도에서 보는 이미지 생성도 가능합니다. - -4. Property Modification -- Prompt: “a cross of a [V] dog and a [target species]” -- 사전 학습한 subject 의 고유 feature 들이 다른 target species 에서도 반영이 되는 부분을 확인할 수 있습니다. - -## Limitations - -하지만 DreamBooth 모델에 다음과 같은 한계점도 존재합니다. - -:::{figure-md} -dreambooth_07 - -Limitations of DreamBooth -::: - -- Incorrect context synthesis := 대표적으로 training set 에 자주 나타나지 않는 subject, prompt, context 에 대해서 낮은 성능을 보여줍니다. -- Context-appearance entanglement := 유지하고자 하는 대상의 appearance (e.g, color) 가 prompted context 에 의해 달라지는 현상 -- Overfitting := 사전학습된 데이터와 유사한 prompt 입력 시, overfitting 현상 발생 - -마지막으로 subject 대상에 따라 모델 성능(fidelity)이 차이를 보인다고 합니다. - -## Appendix - -마지막으로, 논문 본문에 소개되고 있지는 않지만 Appendix 부문에서도 흥미로운 결과들을 확인할 수 있습니다. Figure 20 은 fine tuning 하는 이미지 개수에 따른 DreamBooth 학습결과를 보여주는데, 단 한 장만으로도 identity 의 전반적인 특징을 잘 담는 것을 확인할 수 있습니다. Figure 18 은 만화 캐릭터의 identity 를 유지한 상태로 다양한 만화 사진들을 모델이 생성하는 사례들을 보여줍니다. - -:::{figure-md} -dreambooth_08 - -Appendix-1 -::: - -:::{figure-md} -dreambooth_09 - -Appendix-2 -::: +``` {admonition} Information +- **Title:** DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation (CVPR 2023) + +- **Reference** + - Paper: [https://arxiv.org/abs/2208.12242](https://arxiv.org/abs/2208.12242) + - Code: [https://github.com/huggingface/diffusers/tree/main/examples/dreambooth](https://github.com/huggingface/diffusers/tree/main/examples/dreambooth) + +- **Author:** Sangwoo Jo + +- **Last updated on May. 31, 2023** +``` + +# DreamBooth + +## Introduction + +최근에 DALL-E2, Imagen, Stable Diffusion 등 다양한 text-to-image generation 모델들이 등장하였지만, 어떠한 동일한 subject 에 대해서 다른 context 에 적용하는 부분에서 부족한 면들을 보여주고 있습니다. DreamBooth 논문은 이러한 문제점을 개선하기 위해 text-to-image 모델을 fine-tuning 하는 기법으로 소개되었고, 단 3-5장의 이미지를 학습하면 되며 이를 NVIDIA A100 으로 학습하는데 5분 정도밖에 소요되지 않는다고 합니다. + +:::{figure-md} +dreambooth_01 + +Subject-Driven Generation +::: + +DreamBooth 가 무엇인지 자세히 알아보기 전에 text-to-image diffusion model 에 대해 다시 한번 개념 정리를 해볼 필요가 있습니다. + +## Text-to-Image Diffusion Models + +사전학습된 text-to-image diffusion model $\hat{x}_{\theta}$ 는 input 으로 원본 이미지 $x$, 그리고 text prompt $P$ 와 text-encoder $\Gamma$ 로부터 나오는 conditioning vector $c = \Gamma(P)$ 를 입력받아서 이미지 $x_{gen} = \hat{x}_{\theta}(\epsilon, c)$ 를 생성하게 됩니다. 학습 시, mean squared loss 를 사용하고 이를 수식적으로 표현하면 다음과 같습니다. + +$$ +\mathbb{E}_{x,c,\epsilon,t}[w_t || \hat{x}_{\theta}(\alpha_tx + \sigma_{t}\epsilon, c) - x ||_{2}^{2}] +$$ + +이때, DreamBooth 에서는 text encoder 를 CLIP text embedding 과 사전학습된 T5-XXL 모델 중 T5-XXL 모델을 사용했다고 합니다. 그리고 DreamBooth 로 fine-tuning 할때, diffusion process 에서 사용되는 U-net (때로는 text encoder 도 포함) 은 learnable 한 parameter 로 설정하고 생성된 latent vector 로부터 새로운 이미지를 생성하는 Decoder 의 파라미터 값은 고정시킨다고 합니다. + +앞써 설명드렸던 내용들을 해당 implementation code 에서 확인할 수 있습니다. + +- **code** + + ```python + # https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py + text_encoder_cls = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision) + + # Load scheduler and models + noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler") + text_encoder = text_encoder_cls.from_pretrained( + args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision + ) + vae = AutoencoderKL.from_pretrained(args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision) + unet = UNet2DConditionModel.from_pretrained( + args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision + ) + ``` + +- **training code** + + ```python + # https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py + for epoch in range(first_epoch, args.num_train_epochs): + unet.train() + if args.train_text_encoder: + text_encoder.train() + for step, batch in enumerate(train_dataloader): + # Skip steps until we reach the resumed step + if args.resume_from_checkpoint and epoch == first_epoch and step < resume_step: + if step % args.gradient_accumulation_steps == 0: + progress_bar.update(1) + continue + + with accelerator.accumulate(unet): + # Convert images to latent space + latents = vae.encode(batch["pixel_values"].to(dtype=weight_dtype)).latent_dist.sample() + latents = latents * vae.config.scaling_factor + + # Sample noise that we'll add to the latents + if args.offset_noise: + noise = torch.randn_like(latents) + 0.1 * torch.randn( + latents.shape[0], latents.shape[1], 1, 1, device=latents.device + ) + else: + noise = torch.randn_like(latents) + bsz = latents.shape[0] + # Sample a random timestep for each image + timesteps = torch.randint(0, noise_scheduler.config.num_train_timesteps, (bsz,), device=latents.device) + timesteps = timesteps.long() + + # Add noise to the latents according to the noise magnitude at each timestep + # (this is the forward diffusion process) + noisy_latents = noise_scheduler.add_noise(latents, noise, timesteps) + + # Get the text embedding for conditioning + encoder_hidden_states = text_encoder(batch["input_ids"])[0] + + # Predict the noise residual + model_pred = unet(noisy_latents, timesteps, encoder_hidden_states).sample + + # Get the target for loss depending on the prediction type + if noise_scheduler.config.prediction_type == "epsilon": + target = noise + elif noise_scheduler.config.prediction_type == "v_prediction": + target = noise_scheduler.get_velocity(latents, noise, timesteps) + else: + raise ValueError(f"Unknown prediction type {noise_scheduler.config.prediction_type}") + + if args.with_prior_preservation: + # Chunk the noise and model_pred into two parts and compute the loss on each part separately. + model_pred, model_pred_prior = torch.chunk(model_pred, 2, dim=0) + target, target_prior = torch.chunk(target, 2, dim=0) + + # Compute instance loss + loss = F.mse_loss(model_pred.float(), target.float(), reduction="mean") + + # Compute prior loss + prior_loss = F.mse_loss(model_pred_prior.float(), target_prior.float(), reduction="mean") + + # Add the prior loss to the instance loss. + loss = loss + args.prior_loss_weight * prior_loss + else: + loss = F.mse_loss(model_pred.float(), target.float(), reduction="mean") + + accelerator.backward(loss) + if accelerator.sync_gradients: + params_to_clip = ( + itertools.chain(unet.parameters(), text_encoder.parameters()) + if args.train_text_encoder + else unet.parameters() + ) + accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm) + optimizer.step() + lr_scheduler.step() + optimizer.zero_grad(set_to_none=args.set_grads_to_none) + ``` + + +## Fine-tuning + +DreamBooth 에서 pre-trained 된 text-to-image generation 모델을 fine-tuning 할 때 *“a [unique identifier] [class noun]”* 그리고 *“a [class noun]”* 형태의 두 가지 text prompt 를 사용합니다. 이때, *unique identifier* 에 유지하고자 하는 대상에 대한 정보를 담는 것을 목표로 하기 때문에 사전 정보가 없는 rare token 을 사용하는 것이 중요하다고 합니다. 논문에서는 3개 이하의 Unicode character 혹은 T5-XXL tokenizer 를 랜덤하게 샘플링해서 token 을 생성하고 이를 기반으로 *unique identifier* 를 정의합니다. + +또한, 논문에서 *Language Drift* 그리고 *Reduced Output Diversity* 두 가지 문제점을 해결하기 위해 Class-specific Prior Preservation Loss 를 소개합니다. 이를 활용하여 모델을 fine-tuning 하는 방법은 다음과 같습니다. + +:::{figure-md} +dreambooth_02 + +Fine-tuning +::: + +우선, Gaussian 노이즈 이미지와 *“A V [class noun]”* 형태의 text prompt 를 사전학습된 text-to-image diffusion 모델에 입력하여 이미지를 생성한 후, 원본 이미지와의 *Reconstruction Loss* 를 계산합니다. 그리고 비슷한 과정으로 Gaussian 노이즈 이미지와 *“A [class noun]”* 형태의 text prompt 를 학습하고자 하는 모델, 그리고 freeze 시킨 또 다른 pre-trained diffusion 모델에 각각 입력하여 이미지를 생성한 후 *Class-Specific Prior Preservation Loss* 를 계산합니다. 이에 대한 training objective 를 수식적으로 표현하면 다음과 같습니다. + +$$ +\mathbb{E}_{x,c,\epsilon,\epsilon^{'},t}[w_t || \hat{x}_{\theta}(\alpha_tx + \sigma_t\epsilon, c) - x ||_{2}^{2} + \lambda w_{t^{'}} || \hat{x}_{\theta}(\alpha_{t^{'}} x_{pr} + \sigma_{t^{'}}\epsilon^{'}, c_{pr}) - x_{pr} ||_{2}^{2}] +$$ + +*Class-Specific Prior Preservation Loss* 를 추가함으로써 class prior 에 대한 정보를 유지하게 되고, 이로써 동일한 class 에 대해 더 다양한 이미지들을 생성할 수 있는 부분을 아래 그림에서 확인할 수 있습니다. + +:::{figure-md} +dreambooth_03 + +Encouraging diversity with prior-preservation loss +::: + +## Experiments + +DreamBooth 논문에서 세 가지의 모델 평가 metric 을 소개합니다. 첫번째로는 *subject fidelity* 를 측정하는 CLIP-I, DINO 그리고 *prompt fidelity* 를 측정하는 CLIP-T metric 을 사용합니다. 이때, DINO metric 이 동일한 class 를 가진 subject 에 대해서 다른 embedding 이 생성되기 때문에 CLIP-I 보다 더 선호된다고 합니다. 더 자세하게는 각 metric 은 다음과 같이 계산됩니다. + +- CLIP-I := 생성된 이미지와 실제 이미지의 CLIP embedding 의 평균 pairwise cosine similarity +- DINO := 생성된 이미지와 실제 이미지의 ViT-S/16 DINO embedding 의 평균 pairwise cosine similarity +- CLIP-T := 입력 prompt 와 생성된 이미지의 CLIP embedding 의 평균 pairwise cosine similarity + +Textual Inversion 과 비교했을때, 세 개의 metric 에서 모두 DreamBooth 가 더 좋은 성능을 보여주는 것을 확인할 수 있습니다. + +:::{figure-md} +dreambooth_04 + +Comparison of models +::: + +## Ablation Studies + +Prior Preservation Loss (PPL) 과 Class-Prior 에 대한 Ablation Studies 결과도 논문에서 공유합니다. PPL 가 적용됨으로써 앞써 소개드렸던 Language Drift 그리고 Reduced Output Diversity 문제점을 PRES 그리고 DIV metric 을 통해 해결되는 것을 보여줍니다. 또한, Class-Prior Ablation 에서 다음과 같은 세 가지 prompt 를 사용하여 fine-tuning 했을 때, 해당 subject 에 맞는 *class noun* 을 prompt 에 입력했을때가 가장 좋은 성능을 보여준다고 설명합니다. + +- “no class noun” +- “a randomly sampled incorrect class noun” (e.g., “can” for a backpack) +- “correct class noun” + +## Applications + +논문에서 DreamBooth 를 활용한 여러 application 도 소개합니다. + +:::{figure-md} +dreambooth_05 + +Applications of DreamBooth +::: + +1. Recontextualization +- Prompt: “a [V] [class noun] [context description]” +- 다음과 같은 prompt 입력 시, 사전에 보지 못했던 새로운 pose 나 articulation 을 잘 표현하는 부분을 확인할 수 있습니다. + +:::{figure-md} +dreambooth_06 + +Recontextualization +::: + +2. Art Renditions +- Prompt: “a painting of a [V] [class noun] in the style of [famous painter]” or “a statue of a [V] [class noun] in the style of [famous sculptor]” +- Style Transfer 와 다르게 동일한 구조를 유지한 채 style 만 바꾸는 것이 아니라 다양한 pose 형태도 생성 가능합니다. + +3. Novel View Synthesis +- 동일한 subject 에 대해 다양한 각도에서 보는 이미지 생성도 가능합니다. + +4. Property Modification +- Prompt: “a cross of a [V] dog and a [target species]” +- 사전 학습한 subject 의 고유 feature 들이 다른 target species 에서도 반영이 되는 부분을 확인할 수 있습니다. + +## Limitations + +하지만 DreamBooth 모델에 다음과 같은 한계점도 존재합니다. + +:::{figure-md} +dreambooth_07 + +Limitations of DreamBooth +::: + +- Incorrect context synthesis := 대표적으로 training set 에 자주 나타나지 않는 subject, prompt, context 에 대해서 낮은 성능을 보여줍니다. +- Context-appearance entanglement := 유지하고자 하는 대상의 appearance (e.g, color) 가 prompted context 에 의해 달라지는 현상 +- Overfitting := 사전학습된 데이터와 유사한 prompt 입력 시, overfitting 현상 발생 + +마지막으로 subject 대상에 따라 모델 성능(fidelity)이 차이를 보인다고 합니다. + +## Appendix + +마지막으로, 논문 본문에 소개되고 있지는 않지만 Appendix 부문에서도 흥미로운 결과들을 확인할 수 있습니다. Figure 20 은 fine tuning 하는 이미지 개수에 따른 DreamBooth 학습결과를 보여주는데, 단 한 장만으로도 identity 의 전반적인 특징을 잘 담는 것을 확인할 수 있습니다. Figure 18 은 만화 캐릭터의 identity 를 유지한 상태로 다양한 만화 사진들을 모델이 생성하는 사례들을 보여줍니다. + +:::{figure-md} +dreambooth_08 + +Appendix-1 +::: + +:::{figure-md} +dreambooth_09 + +Appendix-2 +::: diff --git a/_sources/docs/review/gan.md b/_sources/docs/review/gan.md old mode 100644 new mode 100755 index e5b4440a..96a44561 --- a/_sources/docs/review/gan.md +++ b/_sources/docs/review/gan.md @@ -1,231 +1,231 @@ -```{admonition} Information -- **Title:** Generative Adversarial Networks (NIPS 2014) - -- **Reference** - - Paper: [https://arxiv.org/abs/1406.2661](https://arxiv.org/abs/1406.2661) - - Code: [https://github.com/eriklindernoren/PyTorch-GAN](https://github.com/eriklindernoren/PyTorch-GAN) - - [Smart Design Lab @KAIST | 딥러닝 Chp 3.4 GAN](https://www.youtube.com/watch?v=cd-kj1ysqOc) - -- **Author:** Sangwoo Jo - -- **Editor:** Changhwan Lee - -- **Last updated on Apr. 09, 2024** -``` - -# GAN - - -## Introduction -생성형 모델은 크게 생성하고자 하는 데이터의 explicit density 와 implicit density 를 계산하는 방식으로 나뉩니다. Explicit density 를 계산한다는 것은 데이터 분포를 명확하게 사전에 정의하고 모델을 학습하는 것을 의미합니다. 이때, 데이터의 분포를 직접적인 계산이 가능한 tractable density 로 추정하는 방법과 근사화시켜 approximate density 로 추정하는 방법으로 나뉩니다. -- Tractable density: AutoRegressive 하게 구하는 방식이 있습니다. AutoRegressive 모델을 사용하여 이전 단계의 데이터를 활용하여 모델을 학습하고, 대표적인 모델로는 PixelCNN, PixelRNN 등이 있습니다. -- Approximate density: 대표적으로 score-based model, Boltzmann Machine 등이 있습니다. - - Score-based model - 모델 파라미터의 gradient 가 아닌 데이터의 gradient 활용하여 모델을 학습하는 방식으로, energy-based model 에서 MLE 에 사용하는 확률분포를 정규화하는 term 을 따로 계산하지 않아도 되는 장점이 있습니다. - - Boltzmann Machine : 완전그래프 구조로 학습하는 생성형 모델입니다. 모델을 학습하는 과정에서 확률 분포의 학습이 어려워(계산량이 많아서 어려움) Markov chain 을 활용하여 학습합니다. 또한, 완전그래프이기 때문에 노드가 늘어날수록 간선, 파라미터 등이 급증하는 문제가 있어 Restricted Boltzmann Machine(RBM) 이 제안되기도 했습니다. - -반면에 데이터의 분포를 명확히 정의하지 않고 implicit 하게 모델을 학습하는 방식도 존재합니다. 대표적으로는 Ian Goodfellow 가 2014년에 발표한 GAN 모델이 있습니다. GAN 은 최근에 Diffusion Model 이 소개되기 전까지 몇 년 동안 이미지 생성 분야에서 대표적인 모델로 자리잡았었습니다. GAN 은 VAE 와 달리 marginal likelihood $p_{\theta}(x)$ 를 직접 구하지 않고, Adversarial Process 를 통해 implicit 하게 샘플링을 해서 분포를 구하게 됩니다. - -:::{figure-md} -gan_01 - -Taxonomy of Generative Models -::: - -아래 그림과 같이 GAN 은 크게 잠재변수 $z$ 로부터 가짜 데이터를 생성하는 Generator 와 그로부터 생성된 데이터와 실제 training 데이터를 구분하는 Discriminator 로 구성이 되어 있습니다. 다시 말해서 Discriminator 는 실제 데이터가 들어오면 1, 그리고 가짜로 생성된 데이터가 들어오면 0 을 출력하는 binary classification task 를 진행합니다. - -:::{figure-md} -gan_03 - -Generative Adversarial Network(GAN) Architecture -::: - -Generator 와 Discriminator 구현 코드도 같이 살펴보겠습니다. - -- **Generator 구현 code** - - ```python - class Generator(nn.Module): - def __init__(self): - super(Generator, self).__init__() - - def block(in_feat, out_feat, normalize=True): - layers = [nn.Linear(in_feat, out_feat)] - if normalize: - layers.append(nn.BatchNorm1d(out_feat, 0.8)) - layers.append(nn.LeakyReLU(0.2, inplace=True)) - return layers - - self.model = nn.Sequential( - *block(opt.latent_dim, 128, normalize=False), - *block(128, 256), - *block(256, 512), - *block(512, 1024), - nn.Linear(1024, int(np.prod(img_shape))), - nn.Tanh() - ) - - def forward(self, z): - img = self.model(z) - img = img.view(img.size(0), *img_shape) - return img - ``` - -- **Discriminator 구현 code** - - ```python - class Discriminator(nn.Module): - def __init__(self): - super(Discriminator, self).__init__() - - self.model = nn.Sequential( - nn.Linear(int(np.prod(img_shape)), 512), - nn.LeakyReLU(0.2, inplace=True), - nn.Linear(512, 256), - nn.LeakyReLU(0.2, inplace=True), - nn.Linear(256, 1), - nn.Sigmoid(), - ) - - def forward(self, img): - img_flat = img.view(img.size(0), -1) - validity = self.model(img_flat) - - return validity - ``` - - -## Training Procedure - -GAN 을 학습할 시, **D를 먼저 최적화하는 k 단계**와 **G를 최적화하는 한 단계를 번갈아 수행**합니다. 그리고 이때 쓰이는 손실함수(loss function)은 다음과 같습니다. - -$$ -\min_G \max_D V(D,G) = \mathbb{E}\_{x \sim p_{data}(x)}[logD(x)] + \mathbb{E}\_{z \sim p_z(z)}[\log(1-D(G(z))] -$$ - -논문에서 제시한 학습 알고리즘과 실제 implementation code 를 비교해보겠습니다. - -:::{figure-md} -gan_02 - -Generative Adversarial Network(GAN) Training Procedure -::: - -- **GAN 학습 code** - - ```python - # ---------- - # Training - # ---------- - - for epoch in range(opt.n_epochs): - for i, (imgs, _) in enumerate(dataloader): - - # Adversarial ground truths - valid = Variable(Tensor(imgs.size(0), 1).fill_(1.0), requires_grad=False) - fake = Variable(Tensor(imgs.size(0), 1).fill_(0.0), requires_grad=False) - - # Configure input - real_imgs = Variable(imgs.type(Tensor)) - - # ----------------- - # Train Generator - # ----------------- - - optimizer_G.zero_grad() - - # Sample noise as generator input - z = Variable(Tensor(np.random.normal(0, 1, (imgs.shape[0], opt.latent_dim)))) - - # Generate a batch of images - gen_imgs = generator(z) - - # Loss measures generator's ability to fool the discriminator - g_loss = adversarial_loss(discriminator(gen_imgs), valid) - - g_loss.backward() - optimizer_G.step() - - # --------------------- - # Train Discriminator - # --------------------- - - optimizer_D.zero_grad() - - # Measure discriminator's ability to classify real from generated samples - real_loss = adversarial_loss(discriminator(real_imgs), valid) - fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake) - d_loss = (real_loss + fake_loss) / 2 - - d_loss.backward() - optimizer_D.step() - - print( - "[Epoch %d/%d] [Batch %d/%d] [D loss: %f] [G loss: %f]" - % (epoch, opt.n_epochs, i, len(dataloader), d_loss.item(), g_loss.item()) - ) - - batches_done = epoch * len(dataloader) + i - if batches_done % opt.sample_interval == 0: - save_image(gen_imgs.data[:25], "images/%d.png" % batches_done, nrow=5, normalize=True) - ``` - - -이렇게 Discriminator 와 Generator 는 각각 $V(D,G)$ 가 최대화하고 최소화하는 방향으로 stochastic gradient descent 를 진행하게 됩니다. 하지만 아래 그림처럼 실제로 Generator를 학습할 때, 초반에 $D(G(z)) \approx 0$ 일 경우 학습하지 못하는 상황이 발생합니다. 이 때, $\log(1-D(G(z))$ 를 최소화하지 않고 $\log(D(G(z))$ 를 최대화하는 방향으로 Generator 를 학습하는 기법도 있습니다. - -:::{figure-md} -gan_04 - -Alternative to Vanishing Gradient when Training the Generator -::: - -이렇게 학습함으로써 최적화된 solution 에서는 Generator 가 training 데이터 분포를 완벽히 복원하고 Discriminator 는 binary classification 확률을 언제나 1/2 로 내뱉게 됩니다. - -### Theoretical Results - -**Proposition 1. 고정된 Generator 에 대해서, 최적화된 Discriminator 는 다음과 같습니다.** - -$$ -D_{G}^*(x) = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)} -$$ - -이를 증명하자면, Discriminator 에 대한 손실함수를 다음과 같이 쓸 수 있고 $D = D_{G}^*(x)$ 가 이를 최대화하는 solution 입니다. - -$$ -V(D,G) = \int_x p_{data}(x) \log(D(x)) dx+ \int_z p_{z}(z) \log(1-D(g(z)) dz -$$ - -$$ -= \int_x p_{data}(x) \log(D(x)) + p_{g}(x) \log(1-D(x)) dx -$$ - -**Proposition 2. 최적화된 Discriminator 에 대해 $\max_D V(D,G)$ 를 최소화하는 Generator 는 $p_g = p_{data}$ 일때 성립하고 이때 $D = D_{G}^*(x) = 1/2$ 입니다.** - -이를 증명하자면, 최적화된 Discriminator 에 대한 손실함수는 다음과 같고 - -$$ -V(D^{\ast},G) = \mathbb{E}\_{x \sim p_{data}(x)} [ \log D^{\ast}(x) ] + \mathbb{E}\_{x \sim p_g(x)} [ \log(1-D^{\ast}(x) ] -$$ - -$$ -= \int_x p_{data}(x) \log(\frac{p_{data}(x)}{p_{data}(x) + p_g(x)}) + \int_x p_{g}(x) \log(\frac{p_{g}(x)}{p_{data}(x) + p_g(x)})\ dx -$$ - -$$ -= -\log(4)\ + KL(p_{data}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) + KL(p_{g}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) -$$ - -$KL(p_{data}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) + KL(p_{g}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) = 2\ \cdot\ JSD(p_{data}\ ||\ p_{g})$ 의 최솟값은 0 이고 이는 $p_g = p_{data}$ 일때 성립합니다. - -## Experiments - -논문에서 MNIST, the Toronto Face Database(TFD), 그리고 CIFAR-10 dataset 로 모델 실험 및 성능 평가했습니다. 평가시에는 $p_g$ 로부터 Parzen density estimation을 거쳐 계산한 log likelihood estimate 로 모델 성능 평가를 진행했습니다. 아래 표를 보면 실험 방법 중 GAN이 제일 결과가 좋은 것을 볼 수 있습니다. - -:::{figure-md} -gan_05 - -Experimental Results -::: - -## Summary - -VAE는 새로운 데이터를 잘 생성하지만 생성된 이미지가 흐릿하다는 단점을 지니고 있습니다. 반면에 GAN 은 high quality image 를 잘 생성하지만 unstable 한 convergence 를 가지고 있습니다. 그래서 실제로 VAE 는 Encoder 를 활용한 차원축소로 많이 활용되고 이미지 데이터를 생성하는데는 GAN 이 많이 활용되었다고 합니다. +```{admonition} Information +- **Title:** Generative Adversarial Networks (NIPS 2014) + +- **Reference** + - Paper: [https://arxiv.org/abs/1406.2661](https://arxiv.org/abs/1406.2661) + - Code: [https://github.com/eriklindernoren/PyTorch-GAN](https://github.com/eriklindernoren/PyTorch-GAN) + - [Smart Design Lab @KAIST | 딥러닝 Chp 3.4 GAN](https://www.youtube.com/watch?v=cd-kj1ysqOc) + +- **Author:** Sangwoo Jo + +- **Editor:** Changhwan Lee + +- **Last updated on Apr. 09, 2024** +``` + +# GAN + + +## Introduction +생성형 모델은 크게 생성하고자 하는 데이터의 explicit density 와 implicit density 를 계산하는 방식으로 나뉩니다. Explicit density 를 계산한다는 것은 데이터 분포를 명확하게 사전에 정의하고 모델을 학습하는 것을 의미합니다. 이때, 데이터의 분포를 직접적인 계산이 가능한 tractable density 로 추정하는 방법과 근사화시켜 approximate density 로 추정하는 방법으로 나뉩니다. +- Tractable density: AutoRegressive 하게 구하는 방식이 있습니다. AutoRegressive 모델을 사용하여 이전 단계의 데이터를 활용하여 모델을 학습하고, 대표적인 모델로는 PixelCNN, PixelRNN 등이 있습니다. +- Approximate density: 대표적으로 score-based model, Boltzmann Machine 등이 있습니다. + - Score-based model - 모델 파라미터의 gradient 가 아닌 데이터의 gradient 활용하여 모델을 학습하는 방식으로, energy-based model 에서 MLE 에 사용하는 확률분포를 정규화하는 term 을 따로 계산하지 않아도 되는 장점이 있습니다. + - Boltzmann Machine : 완전그래프 구조로 학습하는 생성형 모델입니다. 모델을 학습하는 과정에서 확률 분포의 학습이 어려워(계산량이 많아서 어려움) Markov chain 을 활용하여 학습합니다. 또한, 완전그래프이기 때문에 노드가 늘어날수록 간선, 파라미터 등이 급증하는 문제가 있어 Restricted Boltzmann Machine(RBM) 이 제안되기도 했습니다. + +반면에 데이터의 분포를 명확히 정의하지 않고 implicit 하게 모델을 학습하는 방식도 존재합니다. 대표적으로는 Ian Goodfellow 가 2014년에 발표한 GAN 모델이 있습니다. GAN 은 최근에 Diffusion Model 이 소개되기 전까지 몇 년 동안 이미지 생성 분야에서 대표적인 모델로 자리잡았었습니다. GAN 은 VAE 와 달리 marginal likelihood $p_{\theta}(x)$ 를 직접 구하지 않고, Adversarial Process 를 통해 implicit 하게 샘플링을 해서 분포를 구하게 됩니다. + +:::{figure-md} +gan_01 + +Taxonomy of Generative Models +::: + +아래 그림과 같이 GAN 은 크게 잠재변수 $z$ 로부터 가짜 데이터를 생성하는 Generator 와 그로부터 생성된 데이터와 실제 training 데이터를 구분하는 Discriminator 로 구성이 되어 있습니다. 다시 말해서 Discriminator 는 실제 데이터가 들어오면 1, 그리고 가짜로 생성된 데이터가 들어오면 0 을 출력하는 binary classification task 를 진행합니다. + +:::{figure-md} +gan_03 + +Generative Adversarial Network(GAN) Architecture +::: + +Generator 와 Discriminator 구현 코드도 같이 살펴보겠습니다. + +- **Generator 구현 code** + + ```python + class Generator(nn.Module): + def __init__(self): + super(Generator, self).__init__() + + def block(in_feat, out_feat, normalize=True): + layers = [nn.Linear(in_feat, out_feat)] + if normalize: + layers.append(nn.BatchNorm1d(out_feat, 0.8)) + layers.append(nn.LeakyReLU(0.2, inplace=True)) + return layers + + self.model = nn.Sequential( + *block(opt.latent_dim, 128, normalize=False), + *block(128, 256), + *block(256, 512), + *block(512, 1024), + nn.Linear(1024, int(np.prod(img_shape))), + nn.Tanh() + ) + + def forward(self, z): + img = self.model(z) + img = img.view(img.size(0), *img_shape) + return img + ``` + +- **Discriminator 구현 code** + + ```python + class Discriminator(nn.Module): + def __init__(self): + super(Discriminator, self).__init__() + + self.model = nn.Sequential( + nn.Linear(int(np.prod(img_shape)), 512), + nn.LeakyReLU(0.2, inplace=True), + nn.Linear(512, 256), + nn.LeakyReLU(0.2, inplace=True), + nn.Linear(256, 1), + nn.Sigmoid(), + ) + + def forward(self, img): + img_flat = img.view(img.size(0), -1) + validity = self.model(img_flat) + + return validity + ``` + + +## Training Procedure + +GAN 을 학습할 시, **D를 먼저 최적화하는 k 단계**와 **G를 최적화하는 한 단계를 번갈아 수행**합니다. 그리고 이때 쓰이는 손실함수(loss function)은 다음과 같습니다. + +$$ +\min_G \max_D V(D,G) = \mathbb{E}\_{x \sim p_{data}(x)}[logD(x)] + \mathbb{E}\_{z \sim p_z(z)}[\log(1-D(G(z))] +$$ + +논문에서 제시한 학습 알고리즘과 실제 implementation code 를 비교해보겠습니다. + +:::{figure-md} +gan_02 + +Generative Adversarial Network(GAN) Training Procedure +::: + +- **GAN 학습 code** + + ```python + # ---------- + # Training + # ---------- + + for epoch in range(opt.n_epochs): + for i, (imgs, _) in enumerate(dataloader): + + # Adversarial ground truths + valid = Variable(Tensor(imgs.size(0), 1).fill_(1.0), requires_grad=False) + fake = Variable(Tensor(imgs.size(0), 1).fill_(0.0), requires_grad=False) + + # Configure input + real_imgs = Variable(imgs.type(Tensor)) + + # ----------------- + # Train Generator + # ----------------- + + optimizer_G.zero_grad() + + # Sample noise as generator input + z = Variable(Tensor(np.random.normal(0, 1, (imgs.shape[0], opt.latent_dim)))) + + # Generate a batch of images + gen_imgs = generator(z) + + # Loss measures generator's ability to fool the discriminator + g_loss = adversarial_loss(discriminator(gen_imgs), valid) + + g_loss.backward() + optimizer_G.step() + + # --------------------- + # Train Discriminator + # --------------------- + + optimizer_D.zero_grad() + + # Measure discriminator's ability to classify real from generated samples + real_loss = adversarial_loss(discriminator(real_imgs), valid) + fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake) + d_loss = (real_loss + fake_loss) / 2 + + d_loss.backward() + optimizer_D.step() + + print( + "[Epoch %d/%d] [Batch %d/%d] [D loss: %f] [G loss: %f]" + % (epoch, opt.n_epochs, i, len(dataloader), d_loss.item(), g_loss.item()) + ) + + batches_done = epoch * len(dataloader) + i + if batches_done % opt.sample_interval == 0: + save_image(gen_imgs.data[:25], "images/%d.png" % batches_done, nrow=5, normalize=True) + ``` + + +이렇게 Discriminator 와 Generator 는 각각 $V(D,G)$ 가 최대화하고 최소화하는 방향으로 stochastic gradient descent 를 진행하게 됩니다. 하지만 아래 그림처럼 실제로 Generator를 학습할 때, 초반에 $D(G(z)) \approx 0$ 일 경우 학습하지 못하는 상황이 발생합니다. 이 때, $\log(1-D(G(z))$ 를 최소화하지 않고 $\log(D(G(z))$ 를 최대화하는 방향으로 Generator 를 학습하는 기법도 있습니다. + +:::{figure-md} +gan_04 + +Alternative to Vanishing Gradient when Training the Generator +::: + +이렇게 학습함으로써 최적화된 solution 에서는 Generator 가 training 데이터 분포를 완벽히 복원하고 Discriminator 는 binary classification 확률을 언제나 1/2 로 내뱉게 됩니다. + +### Theoretical Results + +**Proposition 1. 고정된 Generator 에 대해서, 최적화된 Discriminator 는 다음과 같습니다.** + +$$ +D_{G}^*(x) = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)} +$$ + +이를 증명하자면, Discriminator 에 대한 손실함수를 다음과 같이 쓸 수 있고 $D = D_{G}^*(x)$ 가 이를 최대화하는 solution 입니다. + +$$ +V(D,G) = \int_x p_{data}(x) \log(D(x)) dx+ \int_z p_{z}(z) \log(1-D(g(z)) dz +$$ + +$$ += \int_x p_{data}(x) \log(D(x)) + p_{g}(x) \log(1-D(x)) dx +$$ + +**Proposition 2. 최적화된 Discriminator 에 대해 $\max_D V(D,G)$ 를 최소화하는 Generator 는 $p_g = p_{data}$ 일때 성립하고 이때 $D = D_{G}^*(x) = 1/2$ 입니다.** + +이를 증명하자면, 최적화된 Discriminator 에 대한 손실함수는 다음과 같고 + +$$ +V(D^{\ast},G) = \mathbb{E}\_{x \sim p_{data}(x)} [ \log D^{\ast}(x) ] + \mathbb{E}\_{x \sim p_g(x)} [ \log(1-D^{\ast}(x) ] +$$ + +$$ += \int_x p_{data}(x) \log(\frac{p_{data}(x)}{p_{data}(x) + p_g(x)}) + \int_x p_{g}(x) \log(\frac{p_{g}(x)}{p_{data}(x) + p_g(x)})\ dx +$$ + +$$ += -\log(4)\ + KL(p_{data}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) + KL(p_{g}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) +$$ + +$KL(p_{data}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) + KL(p_{g}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) = 2\ \cdot\ JSD(p_{data}\ ||\ p_{g})$ 의 최솟값은 0 이고 이는 $p_g = p_{data}$ 일때 성립합니다. + +## Experiments + +논문에서 MNIST, the Toronto Face Database(TFD), 그리고 CIFAR-10 dataset 로 모델 실험 및 성능 평가했습니다. 평가시에는 $p_g$ 로부터 Parzen density estimation을 거쳐 계산한 log likelihood estimate 로 모델 성능 평가를 진행했습니다. 아래 표를 보면 실험 방법 중 GAN이 제일 결과가 좋은 것을 볼 수 있습니다. + +:::{figure-md} +gan_05 + +Experimental Results +::: + +## Summary + +VAE는 새로운 데이터를 잘 생성하지만 생성된 이미지가 흐릿하다는 단점을 지니고 있습니다. 반면에 GAN 은 high quality image 를 잘 생성하지만 unstable 한 convergence 를 가지고 있습니다. 그래서 실제로 VAE 는 Encoder 를 활용한 차원축소로 많이 활용되고 이미지 데이터를 생성하는데는 GAN 이 많이 활용되었다고 합니다. diff --git a/_sources/docs/review/imagen.md b/_sources/docs/review/imagen.md old mode 100644 new mode 100755 index 71a0f5b2..641d80f4 --- a/_sources/docs/review/imagen.md +++ b/_sources/docs/review/imagen.md @@ -1,194 +1,194 @@ -``` {admonition} Information -- **Title:** Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding (NeurIPS 2022) - -- **Reference** - - Paper: [https://arxiv.org/abs/2205.11487](https://arxiv.org/abs/2205.11487) - -- **Author:** Donggeun Sean Ko - -- **Last updated on Sep. 13, 2023** - -``` - -# Imagen - - -## Introduction -- Multi-modal learning, 특히 text-to-image generation 에서 contrastive learning이 최근에 많은 주목을 받고 있음. - -- Contrastive learning 과 더불어 large language model (LLM) 들과 diffusion model 들을 사용하여 독창적인 image 생성도 가능함 - -- 텍스트 전용 말뭉치 (text corpus)로 학습된 LLM들의 text embedding들은 text-to-image 합성에 매우 효과적이라고 함. - -- Classifier-free guidance 사용하여, 더 높은 충실도 (fidelity)의 이미지를 생성하는 새로운 샘플링 기술을 사용함. - -:::{figure-md} -imagen_1 - -Concept of Contrastive Learning -::: - -## Contributions - -1. **Pretrained Frozen** text encoder (T5-XXL) 이 text-to-image generation task 에 매우 좋은 성능을 보여줌. -2. Pretrained Text Encoder 사이즈를 **fine-tuning**하는 것이 diffusion model size fine tuning 하는 것보다 더 중요하다는 것을 실험적으로 증명함 -3. **Dynamic Thresholding** 이라는 새로운 diffusion sampling technique (thresholding diffusion sampler) 을 제시하여 high guidance weight을 leverage 할 수 있게 만들어 더욱 “현실적인” 이미지 생성을 할 수 있음 -4. **Efficient U-Net**이라는 기존 Palette 나 DDIM에서 사용하는 U-Net 구조보다 computational, memory efficient 한 U-Net 구조를 제시함 -5. COCO FID 점수 **7.27** SOTA 점수를 달성함 -6. **DrawBench**라는 새로운 text-to-image generation evaluation용 benchmark dataset을 제시함 - -## Methodology - -### Pretrained T5-XXL + Cascaded Diffusion Model - -- Pretrained Text Encoder 중 T5-XXL (구글 모델) 사용 -- 학습 시 pretrained text encoder을 Freeze 해놓음 -- Text-to-Image Diffusion Model (Improved DDPM 아키텍쳐) 사용해 64x64 image 생성 -- 2가지 SR model (Efficient U-Net)을 사용해서 64 → 256 → 1024 로 upsampling - -:::{figure-md} -imagen_2 - -Imagen overall pipeline -::: - -### Classifier-Free Guidance -- Classifier-free guidance 이란 auxiliary classifier의 효과 없이 classifier guidance 효과를 얻는 방법 -- 아래의 그림처럼 guidance가 없을 시 image generation이 일정하지 않음. 즉, label/class 의 영향을 못받아서, 생성이 일정하지 않음. -- guidance를 줄 시, 생성된 이미지의 class나 object이 일정하고 무엇을 생성하는것인지 좀 더 자세하게 알 수 있음. - -:::{figure-md} -imagen_3 - -Comparison between when guidance is not used (left) vs when guidance is used with parameter, w=3 (right) -::: - -### Large guidance weight sampler -- Guide의 가중치 w 를 높이면 train-test 불일치가 생긴다. -- 이로 인해, 높은 가중치의 이미지는 훈련 데이터 범위 안에 없어 [-1,1], classifier-free guidance가 평균과 분산을 이동시켜 이미지가 아예 “빗나가” 이상한 이미지를 생성하게 된다 - -### Static Thresholding -- x-prediction 을 [-1,1]로 clipping 한다. 여전히 saturation 이 되고 fidelity가 덜한 이미지가 생성 됌 -- 문제를 해결하고자 dynamic thresholding 을 제시함 - -:::{figure-md} -imagen_5 - -Graphical visualization of static thresholding -::: - -### Dynamic Thresholding -- 특정 백분위수 절대 픽셀 값을 s 라고 지정하고 s > 1 이면, 임계값을 [-s,s]로 지정한 다음 s로 나눈다. -- 예시: 90% 지점의 픽셀 값이 3 이면 [-3,3]으로 clipping 한 후 3으로 나눠서 [-1,1] 로 normalize 함. -- Thresholding 의 차이는 아래 결과 비교 이미지로 확인 할 수 있다. - -:::{figure-md} -imagen_6 - -Graphical visualization of dynamic thresholding -::: - - -:::{figure-md} -imagen_7 - -Comparison among no thresholding, static thresholding and dynamic thresholding, respectively -::: - -### Super Resolution Models -- Efficient U-Net이라는 새로운 모델을 만들어, 기존 U-Net에서 여러가지 modification을 하였다고 주장 (그렇지만 EffU-Net은 의료쪽으로 이름이 이미 있는걸로 아는데…) -- Removed self-attention layer -- Keep the text cross-attention layer -- Skip connection scaling을 1/(√2)로 하여 convergence 를 더 빠르게 함 -- Lower resolution block에서 residual blocks를 더 추가함 - -:::{figure-md} -imagen_8 - -Architecture of Super Resolution Diffusion Model used in Imagen -::: - -### DrawBench -- Imagen 저자들이 제시한 새로운 벤치마크 데이터셋. 본 데이터셋은 text prompt 와 category label 로 이루어졌다 -- 깃허브에서 다운 받을 수 있으며, 예시는 아래 그림과 갗다 -11 categories, 200 text prompts -Human evaluation 으로 진행 (25명의 평가자) -Model A에서 생성한 이미지 set vs Model B에서 생성한 이미지 set - -평가자는 2가지 질문을 주며 2가지 기준점으로 평가함 -**Q1. Which set of images is of higher quality?** -**Q2. Which set of images better represents the text caption: {text caption}?** - - -기준점 -- Image Fidelity -- Image-text alignment - -평가자는 3가지 답변 중 하나를 선택해야함 -1. I prefer set A -2. I am Indifferent -3. I prefer set B - - -:::{figure-md} -imagen_9 - -Screenshot of DrawBench dataset -::: - -## Results -- Figure 2 에서는 DrawBench에서 나온 결과를 체리피킹 없이 보여준다. -- 아마 저자들은 체리피킹 없이도 좋은 결과를 보여주고, 다양한 카테고리에서도 훌륭한 이미지를 생성 할 수 있다는 주장인 것 같다. - -:::{figure-md} -imagen_10 - -Result of Imagen in DrawBench dataset -::: - -- Zero-shot 으로 한 FID값이 MS-COCO로 학습한 모델들 FID 보다 높음. - -- Table 2 에서는 Imagen이 no people (사람이 없는 사진) 에는 photorealism 점수가 올라감 -→ Imagen 은 photorealistic people을 생성하기에 한계가 있음. - -:::{figure-md} -imagen_11 - -Result Table of Imagen -::: - -### Qualitative Result Table of Imagen from Human Evaluators - -- Human raters (사람 평가자) 들은 T5-XXL로 text encoding 한 text-to-image generation 모델을 CLIP-based 보다 더 선호함 - -- 기본적으로 Imagen 은 다른 text-to-image generation 모델에서 (SOTA 모델인 DALL-E 2) 보다도 human raters 에서 DrawBench 데이터셋에서 좋은 평가를 받음 - -:::{figure-md} -imagen_12 - -Qualitative Result Table of Imagen from Human evaulators -::: - -## Ablation Study - -- Scaling text encoder size 가 U-Net size scaling 보다 더 중요함 -- (a)의 text encoder 사이즈의 변화가 FID 및 CLIP score 점수에 더욱 많은 영향을 끼침 - -- Dynamic thresholding 이 performance boost에 더욱 영향을 끼침 -- Dynamic thresholding을 이용하면 성능을 더욱 끌어 올릴 수 있음 - -:::{figure-md} -imagen_13 - -Qualitative Result Table of Imagen from Human evaulators -::: - -## Conclusion - -- Frozen large pretrained language model shows better performance over text-image paired multimodal encoders such as CLIP in text-to-image generation task -- Efficient U-Net significantly improves performance time -- Dynamic thresholding allows usage of much higher guidance weights with better fidelity of generated images - - - - +``` {admonition} Information +- **Title:** Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding (NeurIPS 2022) + +- **Reference** + - Paper: [https://arxiv.org/abs/2205.11487](https://arxiv.org/abs/2205.11487) + +- **Author:** Donggeun Sean Ko + +- **Last updated on Sep. 13, 2023** + +``` + +# Imagen + + +## Introduction +- Multi-modal learning, 특히 text-to-image generation 에서 contrastive learning이 최근에 많은 주목을 받고 있음. + +- Contrastive learning 과 더불어 large language model (LLM) 들과 diffusion model 들을 사용하여 독창적인 image 생성도 가능함 + +- 텍스트 전용 말뭉치 (text corpus)로 학습된 LLM들의 text embedding들은 text-to-image 합성에 매우 효과적이라고 함. + +- Classifier-free guidance 사용하여, 더 높은 충실도 (fidelity)의 이미지를 생성하는 새로운 샘플링 기술을 사용함. + +:::{figure-md} +imagen_1 + +Concept of Contrastive Learning +::: + +## Contributions + +1. **Pretrained Frozen** text encoder (T5-XXL) 이 text-to-image generation task 에 매우 좋은 성능을 보여줌. +2. Pretrained Text Encoder 사이즈를 **fine-tuning**하는 것이 diffusion model size fine tuning 하는 것보다 더 중요하다는 것을 실험적으로 증명함 +3. **Dynamic Thresholding** 이라는 새로운 diffusion sampling technique (thresholding diffusion sampler) 을 제시하여 high guidance weight을 leverage 할 수 있게 만들어 더욱 “현실적인” 이미지 생성을 할 수 있음 +4. **Efficient U-Net**이라는 기존 Palette 나 DDIM에서 사용하는 U-Net 구조보다 computational, memory efficient 한 U-Net 구조를 제시함 +5. COCO FID 점수 **7.27** SOTA 점수를 달성함 +6. **DrawBench**라는 새로운 text-to-image generation evaluation용 benchmark dataset을 제시함 + +## Methodology + +### Pretrained T5-XXL + Cascaded Diffusion Model + +- Pretrained Text Encoder 중 T5-XXL (구글 모델) 사용 +- 학습 시 pretrained text encoder을 Freeze 해놓음 +- Text-to-Image Diffusion Model (Improved DDPM 아키텍쳐) 사용해 64x64 image 생성 +- 2가지 SR model (Efficient U-Net)을 사용해서 64 → 256 → 1024 로 upsampling + +:::{figure-md} +imagen_2 + +Imagen overall pipeline +::: + +### Classifier-Free Guidance +- Classifier-free guidance 이란 auxiliary classifier의 효과 없이 classifier guidance 효과를 얻는 방법 +- 아래의 그림처럼 guidance가 없을 시 image generation이 일정하지 않음. 즉, label/class 의 영향을 못받아서, 생성이 일정하지 않음. +- guidance를 줄 시, 생성된 이미지의 class나 object이 일정하고 무엇을 생성하는것인지 좀 더 자세하게 알 수 있음. + +:::{figure-md} +imagen_3 + +Comparison between when guidance is not used (left) vs when guidance is used with parameter, w=3 (right) +::: + +### Large guidance weight sampler +- Guide의 가중치 w 를 높이면 train-test 불일치가 생긴다. +- 이로 인해, 높은 가중치의 이미지는 훈련 데이터 범위 안에 없어 [-1,1], classifier-free guidance가 평균과 분산을 이동시켜 이미지가 아예 “빗나가” 이상한 이미지를 생성하게 된다 + +### Static Thresholding +- x-prediction 을 [-1,1]로 clipping 한다. 여전히 saturation 이 되고 fidelity가 덜한 이미지가 생성 됌 +- 문제를 해결하고자 dynamic thresholding 을 제시함 + +:::{figure-md} +imagen_5 + +Graphical visualization of static thresholding +::: + +### Dynamic Thresholding +- 특정 백분위수 절대 픽셀 값을 s 라고 지정하고 s > 1 이면, 임계값을 [-s,s]로 지정한 다음 s로 나눈다. +- 예시: 90% 지점의 픽셀 값이 3 이면 [-3,3]으로 clipping 한 후 3으로 나눠서 [-1,1] 로 normalize 함. +- Thresholding 의 차이는 아래 결과 비교 이미지로 확인 할 수 있다. + +:::{figure-md} +imagen_6 + +Graphical visualization of dynamic thresholding +::: + + +:::{figure-md} +imagen_7 + +Comparison among no thresholding, static thresholding and dynamic thresholding, respectively +::: + +### Super Resolution Models +- Efficient U-Net이라는 새로운 모델을 만들어, 기존 U-Net에서 여러가지 modification을 하였다고 주장 (그렇지만 EffU-Net은 의료쪽으로 이름이 이미 있는걸로 아는데…) +- Removed self-attention layer +- Keep the text cross-attention layer +- Skip connection scaling을 1/(√2)로 하여 convergence 를 더 빠르게 함 +- Lower resolution block에서 residual blocks를 더 추가함 + +:::{figure-md} +imagen_8 + +Architecture of Super Resolution Diffusion Model used in Imagen +::: + +### DrawBench +- Imagen 저자들이 제시한 새로운 벤치마크 데이터셋. 본 데이터셋은 text prompt 와 category label 로 이루어졌다 +- 깃허브에서 다운 받을 수 있으며, 예시는 아래 그림과 갗다 +11 categories, 200 text prompts +Human evaluation 으로 진행 (25명의 평가자) +Model A에서 생성한 이미지 set vs Model B에서 생성한 이미지 set + +평가자는 2가지 질문을 주며 2가지 기준점으로 평가함 +**Q1. Which set of images is of higher quality?** +**Q2. Which set of images better represents the text caption: {text caption}?** + + +기준점 +- Image Fidelity +- Image-text alignment + +평가자는 3가지 답변 중 하나를 선택해야함 +1. I prefer set A +2. I am Indifferent +3. I prefer set B + + +:::{figure-md} +imagen_9 + +Screenshot of DrawBench dataset +::: + +## Results +- Figure 2 에서는 DrawBench에서 나온 결과를 체리피킹 없이 보여준다. +- 아마 저자들은 체리피킹 없이도 좋은 결과를 보여주고, 다양한 카테고리에서도 훌륭한 이미지를 생성 할 수 있다는 주장인 것 같다. + +:::{figure-md} +imagen_10 + +Result of Imagen in DrawBench dataset +::: + +- Zero-shot 으로 한 FID값이 MS-COCO로 학습한 모델들 FID 보다 높음. + +- Table 2 에서는 Imagen이 no people (사람이 없는 사진) 에는 photorealism 점수가 올라감 +→ Imagen 은 photorealistic people을 생성하기에 한계가 있음. + +:::{figure-md} +imagen_11 + +Result Table of Imagen +::: + +### Qualitative Result Table of Imagen from Human Evaluators + +- Human raters (사람 평가자) 들은 T5-XXL로 text encoding 한 text-to-image generation 모델을 CLIP-based 보다 더 선호함 + +- 기본적으로 Imagen 은 다른 text-to-image generation 모델에서 (SOTA 모델인 DALL-E 2) 보다도 human raters 에서 DrawBench 데이터셋에서 좋은 평가를 받음 + +:::{figure-md} +imagen_12 + +Qualitative Result Table of Imagen from Human evaulators +::: + +## Ablation Study + +- Scaling text encoder size 가 U-Net size scaling 보다 더 중요함 +- (a)의 text encoder 사이즈의 변화가 FID 및 CLIP score 점수에 더욱 많은 영향을 끼침 + +- Dynamic thresholding 이 performance boost에 더욱 영향을 끼침 +- Dynamic thresholding을 이용하면 성능을 더욱 끌어 올릴 수 있음 + +:::{figure-md} +imagen_13 + +Qualitative Result Table of Imagen from Human evaulators +::: + +## Conclusion + +- Frozen large pretrained language model shows better performance over text-image paired multimodal encoders such as CLIP in text-to-image generation task +- Efficient U-Net significantly improves performance time +- Dynamic thresholding allows usage of much higher guidance weights with better fidelity of generated images + + + + diff --git a/_sources/docs/review/imagen_editor.md b/_sources/docs/review/imagen_editor.md old mode 100644 new mode 100755 index cfd93b82..dd46ad63 --- a/_sources/docs/review/imagen_editor.md +++ b/_sources/docs/review/imagen_editor.md @@ -1,72 +1,72 @@ -``` {admonition} Information -- **Title:** Imagen Editor and EditBench: Advancing and Evaluating Text-Guided Image Inpainting (CVPR 2023) - -- **Reference** - - Paper: [https://arxiv.org/pdf/2212.06909](https://arxiv.org/pdf/2212.06909) - -- **Author:** Sangwoo Jo - -- **Last updated on Sep. 06, 2023** -``` - -# Imagen Editor - -이번 시간에는 Google Research 에서 소개하는 Imagen 모델 기반의 text-guided image inpainting 모델 Imagen Editor 와 text-guided impainting 의 평가기법 EditBench 에 대해 알아볼 예정입니다. - -Text-guided image inpainting 에서 기존에는 mask 영역을 random 하게 지정하여 학습을 진행했습니다. 이는 입력된 text prompt 와 무관한 영역을 masking 하게 됨으로써 모델이 prompt 를 참조하지 않고 오로지 image content 만으로 학습하게 되는 현상이 발생합니다. Imagen Editor 는 이를 해결하기 위해 Object Masking 기법을 소개합니다. Prompt 에 해당하는 객체 전체를 masking 함으로써 모델이 text prompt 를 더 참조할 수 있도록 유도하는 것이 목표입니다. SSD MobileNet v2 모델을 Object Detector 로 사용함으로써 모델 성능이 크게 개선되는 부분을 확인할 수 있었다고 합니다. - -:::{figure-md} -imagen_editor_01 - -Effect of Object Masking -::: - -Imagen Editor 에서 또 다른 특징은 Imagen 모델 기반의 cascaded diffusion model architecture 를 지니고 있다는 점입니다. 이때, SR3, Palette, GLIDE 와 유사하게 이미지와 mask 가 Encoder 를 거친 후, diffusion latent 와 concatenate 하면서 conditioning input 으로 들어가게 되며, 모두 1024x1024 해상도를 가진다고 합니다. 따라서, base diffusion 64x64 모델 그리고 64x64 → 256x256 super resolution 모델에 입력 시, downsampling 작업 후 모델 input 으로 입력합니다. 또한, conditioning 이미지와 mask 없을 시 Imagen 모델을 사용하는 것과 동일한 효과를 내기 위해, 새로 추가되는 input channel weights 는 0으로 초기화해서 학습을 진행했다고 소개합니다. - -:::{figure-md} -imagen_editor_02 - -Imagen Editor Architecture -::: - -Imagen 에서 소개되었던 Classifier-Free Guidance 를 동일하게 사용하고, 이때 guidance weight 를 1부터 30 까지 범위 내에서 변화시키는 oscillating guidance 기법을 적용함으로써 생성된 이미지 퀄리티 및 text-image alignment 가 상승되는 효과를 볼 수 있었다고 합니다. - -논문에서는 Imagen Editor 와 같은 text-guided image inpainting 모델들을 평가할 수 있는 새로운 benchmark EditBench 를 제시합니다. 240개의 (image, mask) 쌍으로 데이터셋이 구축되어있고, 각 쌍마다 3가지의 prompt 로 생성된 이미지로 사람이 모델 성능을 측정하게 됩니다. Automatic Evaluation Metric 으로는 CLIPScore, 그리고 CLIP-R-Prec 를 사용했습니다. - -EditBench 이미지 데이터셋의 절반은 open source 로 공개된 computer vision 데이터셋으로부터 수집되었고, 나머지 절반은 text-to-image 모델로 생성해서 구축했습니다. 이때, *attribute-object-scene* 의 요소들을 모두 갖추도록 이미지들을 수집 및 생성했습니다. - -- Attributes (material, color, shape, size, count) -- Objects (common, rare, text rendering) -- Scenes (indoor, outdoor, realistic, paintings) - -예를 들어서, ‘a=metal|o=cat|s=outdoor’ 요소들을 포함하는 문구를 ‘a metal cat standing in the middle of a farm field’ 처럼 생성하는 것입니다. 앞써 언급한 3가지 prompt 는 해당사진처럼 *Mask-Simple*, *Mask-Rich*, 그리고 *Full* 로 정의합니다. - -:::{figure-md} -imagen_editor_03 - -EditBench example -::: - -데이터셋 구축시, mask 크기도 다양하게 설정하여 mask 크기에 따른 모델 성능도 확인할 수 있었습니다. 성능을 측정해본 결과, Object masking 으로 학습한 모델이 random masking 으로 학습한 모델보다 small/medium masks 에서 성능적으로 월등히 좋다는 것을 확인할 수 있습니다. - -:::{figure-md} -imagen_editor_04 - -Human Evaluations on EditBench -::: - -또한, object-rendering 에 비해 text-rendering 성능이 저하되는 부분을 확인할 수 있고, material/color/size 속성보다 count/size 속성에 더 취약한 부분도 확인할 수 있었습니다. - -:::{figure-md} -imagen_editor_05 - -Imagen Editor failure cases by attribute -::: - -마지막으로, 동일한 prompt 에 대해 Stable Diffusion, DALL-E2, Imagen Editor 모델로 inpainting 한 결과를 비교한 예시 사진입니다. - -:::{figure-md} -imagen_editor_06 - -Example model outputs for Mask-Simple vs MaskRich prompts -::: +``` {admonition} Information +- **Title:** Imagen Editor and EditBench: Advancing and Evaluating Text-Guided Image Inpainting (CVPR 2023) + +- **Reference** + - Paper: [https://arxiv.org/pdf/2212.06909](https://arxiv.org/pdf/2212.06909) + +- **Author:** Sangwoo Jo + +- **Last updated on Sep. 06, 2023** +``` + +# Imagen Editor + +이번 시간에는 Google Research 에서 소개하는 Imagen 모델 기반의 text-guided image inpainting 모델 Imagen Editor 와 text-guided impainting 의 평가기법 EditBench 에 대해 알아볼 예정입니다. + +Text-guided image inpainting 에서 기존에는 mask 영역을 random 하게 지정하여 학습을 진행했습니다. 이는 입력된 text prompt 와 무관한 영역을 masking 하게 됨으로써 모델이 prompt 를 참조하지 않고 오로지 image content 만으로 학습하게 되는 현상이 발생합니다. Imagen Editor 는 이를 해결하기 위해 Object Masking 기법을 소개합니다. Prompt 에 해당하는 객체 전체를 masking 함으로써 모델이 text prompt 를 더 참조할 수 있도록 유도하는 것이 목표입니다. SSD MobileNet v2 모델을 Object Detector 로 사용함으로써 모델 성능이 크게 개선되는 부분을 확인할 수 있었다고 합니다. + +:::{figure-md} +imagen_editor_01 + +Effect of Object Masking +::: + +Imagen Editor 에서 또 다른 특징은 Imagen 모델 기반의 cascaded diffusion model architecture 를 지니고 있다는 점입니다. 이때, SR3, Palette, GLIDE 와 유사하게 이미지와 mask 가 Encoder 를 거친 후, diffusion latent 와 concatenate 하면서 conditioning input 으로 들어가게 되며, 모두 1024x1024 해상도를 가진다고 합니다. 따라서, base diffusion 64x64 모델 그리고 64x64 → 256x256 super resolution 모델에 입력 시, downsampling 작업 후 모델 input 으로 입력합니다. 또한, conditioning 이미지와 mask 없을 시 Imagen 모델을 사용하는 것과 동일한 효과를 내기 위해, 새로 추가되는 input channel weights 는 0으로 초기화해서 학습을 진행했다고 소개합니다. + +:::{figure-md} +imagen_editor_02 + +Imagen Editor Architecture +::: + +Imagen 에서 소개되었던 Classifier-Free Guidance 를 동일하게 사용하고, 이때 guidance weight 를 1부터 30 까지 범위 내에서 변화시키는 oscillating guidance 기법을 적용함으로써 생성된 이미지 퀄리티 및 text-image alignment 가 상승되는 효과를 볼 수 있었다고 합니다. + +논문에서는 Imagen Editor 와 같은 text-guided image inpainting 모델들을 평가할 수 있는 새로운 benchmark EditBench 를 제시합니다. 240개의 (image, mask) 쌍으로 데이터셋이 구축되어있고, 각 쌍마다 3가지의 prompt 로 생성된 이미지로 사람이 모델 성능을 측정하게 됩니다. Automatic Evaluation Metric 으로는 CLIPScore, 그리고 CLIP-R-Prec 를 사용했습니다. + +EditBench 이미지 데이터셋의 절반은 open source 로 공개된 computer vision 데이터셋으로부터 수집되었고, 나머지 절반은 text-to-image 모델로 생성해서 구축했습니다. 이때, *attribute-object-scene* 의 요소들을 모두 갖추도록 이미지들을 수집 및 생성했습니다. + +- Attributes (material, color, shape, size, count) +- Objects (common, rare, text rendering) +- Scenes (indoor, outdoor, realistic, paintings) + +예를 들어서, ‘a=metal|o=cat|s=outdoor’ 요소들을 포함하는 문구를 ‘a metal cat standing in the middle of a farm field’ 처럼 생성하는 것입니다. 앞써 언급한 3가지 prompt 는 해당사진처럼 *Mask-Simple*, *Mask-Rich*, 그리고 *Full* 로 정의합니다. + +:::{figure-md} +imagen_editor_03 + +EditBench example +::: + +데이터셋 구축시, mask 크기도 다양하게 설정하여 mask 크기에 따른 모델 성능도 확인할 수 있었습니다. 성능을 측정해본 결과, Object masking 으로 학습한 모델이 random masking 으로 학습한 모델보다 small/medium masks 에서 성능적으로 월등히 좋다는 것을 확인할 수 있습니다. + +:::{figure-md} +imagen_editor_04 + +Human Evaluations on EditBench +::: + +또한, object-rendering 에 비해 text-rendering 성능이 저하되는 부분을 확인할 수 있고, material/color/size 속성보다 count/size 속성에 더 취약한 부분도 확인할 수 있었습니다. + +:::{figure-md} +imagen_editor_05 + +Imagen Editor failure cases by attribute +::: + +마지막으로, 동일한 prompt 에 대해 Stable Diffusion, DALL-E2, Imagen Editor 모델로 inpainting 한 결과를 비교한 예시 사진입니다. + +:::{figure-md} +imagen_editor_06 + +Example model outputs for Mask-Simple vs MaskRich prompts +::: diff --git a/_sources/docs/review/latent_consistency_models.md b/_sources/docs/review/latent_consistency_models.md old mode 100644 new mode 100755 index 90728edc..b0f98590 --- a/_sources/docs/review/latent_consistency_models.md +++ b/_sources/docs/review/latent_consistency_models.md @@ -1,325 +1,325 @@ -```{admonition} Information -- **Title:** Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference - -- **Reference** - - Paper: [https://arxiv.org/pdf/2310.04378](https://arxiv.org/pdf/2310.04378) - - Code: [https://github.com/luosiallen/latent-consistency-model](https://github.com/luosiallen/latent-consistency-model) - - Project Page: [https://latent-consistency-models.github.io/](https://latent-consistency-models.github.io/) - -- **Author:** Donghyun Han - -- **Last updated on May. 1, 2024** -``` - -# Latent Consistency Models - -## 1. Introduction - -Diffusion model은 다양한 분야에서 주목할만한 성과를 거두었지만 매우 느린 sampling 속도를 가지기 때문에 실시간 사용이 불가능하다. 이 같은 단점을 극복하기 위해 sampling 속도를 향상시키는 다양한 accelerating 방법이 제안되었다: - -  - -1. ODE solver의 성능개선을 통해 10~20 step만으로도 좋은 성능을 가지는 방법. - - - DPM-Solver ([lu et al.](https://arxiv.org/pdf/2206.00927)) - -2. 사전 학습된 Diffusion model을 몇 step만으로도 추론할수 있도록 **distillation**하는 방법. - - - PD (Progressive Distillation). → 2 stage ([Salimans et al.](https://arxiv.org/pdf/2202.00512)) - - On Distillation of Guided Diffusion Models. ([Meng et al.](https://arxiv.org/pdf/2210.03142)) - - Consistency Models ([Song et al.](https://arxiv.org/pdf/2303.01469)) - -이중 특히 Consistency Models은 ODE-trajectory에 대한 일관성을 갖도록 하는 모델로서, single step만으로도 이미지를 생성할 수 있기 때문에 반복적인 계산이 필요하지 않다. 그러나 이 모델 또한 2가지의 단점을 가지고 있다: - -  - -1. Pixel space의 Flow-based Model이기 때문에 **high-resolution 이미지 생성**에 적합하지 않음. -2. Conditional(Classifer-free Guidance)한 이미지 생성을 고려하지 않아 **text2img**에 적합하지 않음. - ---- - -본 논문의 제안점은 다음 3가지다: - -  - -- 빠르고 high-resolution 이미지를 생성하기 위한 Latent Consistency Models(LCMs)를 제안한다. LCMs은 영상의 latent space에 Consistency Models 개념을 적용해 매우 적은 step 만으로도 **고품질의 이미지**를 생성할 수 있다. - -- guided consistency distillation을 통해 Stable Diffusion을 매우 적은 step(1~4)으로 sampling 할 수 있는 방법을 제공한다. **Skipping-Step**이라는 테크닉을 통해 학습을 가속화 한다. 2, 4 step Model의 경우 학습에 A100 GPU 32시간 밖에 걸리지 않으며 LAION-5B-Aesthetics dataset에서 SOTA의 성능을 달성했다. - -- LCMs에 대한 새로운 fine-tuning 방식인 Latent Consistency Fine-tuning을 통해 **빠른 추론 속도를 유지하면서도 Custom Dataset에 효율적으로 적용**할 수 있다. - -  - -:::{figure-md} -ldm_01 - -768x768 Resolution image in 1~4 steps. -::: - -## 2. Preliminaries - -### Diffusion Models - -Diffusion Models 혹은 Score-based Models는 데이터에 점진적으로 Gaussian noise를 주입하고 reverse denoise process로 noise를 제거하여 데이터를 sampling하는 기법이다. 반면 forwad process는 원본 데이터 분포인 $p_{data}(x)$를 주변 확률분포인 $q_{t}(x_{t})$로 변환한다: - -$$ -q_{0t}(x_{t}|x_{0})=\mathcal{N}(x_t|\alpha(t)x_0,\sigma^2(t)I) -$$ - -여기서 $\alpha(t)$와 $\sigma(t)$는 noise scheduler를 의미한다. 연속적인 timestep의 관점에서 이를 확률미분방정식(Stochastic Differential Equation, SDE)으로 나타낼 수 있는데, 다음과 같다: - -$$ -f(t)=\frac{d\log{\alpha(t)}}{dt}, g^2(t)=\frac{d\sigma^2(t)}{dt}-2\frac{d\log{\alpha(t)}}{dt}\sigma^2(t). \tag{1} -$$ - -또한 주변 확률분포 $q_t(x)$는 **Ptobability Flow ODE(PF-ODE)**라는 상미분방정식(Ordinary Differential Equation, ODE)을 만족하는데 다음과 같다: - -$$ -\frac{dx_t}{dt}=f(x)x_t-\frac{1}{2}g^2(t)\nabla_x\log{q_t(x_t)}, \ x_T \sim q_T(x_T). \tag{2} -$$ - -이때 Diffusion model은 $-\nabla\log{q_t(x_t)}$(score function)를 예측하는 noise 예측 모델($\epsilon_\theta(x_t,t)$)을 학습시킨다. 학습된 모델은 score function의 근사치를 예측하고 sampling하는데 이를 empirical PF-ODE라 한다 (경험적 PF-ODE): - -$$ -\frac{dx_t}{dt}=f(t)x_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(x_t,t), \ x_T \sim \mathcal{N}(0, \tilde{\sigma}^2I). \tag{3} -$$ - -Classifier-Free Guidance (CFG)는 sampling의 퀄리티를 높이기 위해 GLIDE, Stable Diffusion, DALL$\cdot$E2, Imagen 등 다양한 conditional model에서 사용되었다. CFG의 scale $\omega$가 주어졌을 때 원본 noise prediction은 conditional, unconditional noise prediction을 선형적으로 혼합하여 대체된다: - -$$ -\tilde{\epsilon}_\theta(z_t,\omega, c,t)=(1+\omega)\epsilon_\theta(z_t, c,t)-\omega\epsilon_\theta(z, \emptyset, t). -$$ - -  - -### Consistency Models - -Consistenct Model(CM)은 몇 step 혹은 한번의 step 만으로 데이터를 생성할 수 있는 모델이다. CM의 핵심은 **PF-ODE의 궤적에 어떤 point와 PF-ODE의 solution에 대해 mapping되는 function ($f:(x_t, t) \mapsto x_\epsilon$)을 추정**하는 것이다. - -:::{figure-md} -ldm_02 - -Consistency Models (CM). -::: - -$\epsilon$은 고정된 매우 작은 양수값을 가지며 CM의 function은 자기 자신에 대한 **self-consistency**를 만족해야한다. 즉 어떠한 time step에 대해서도 $x_\epsilon$을 sampling 할 수 있어야 한다. - -$$ -f(x_t,t)=f(x_{t'},t'), \forall t,t' \in [\epsilon, T]. \tag{4} -$$ - -$f_\theta(x, \epsilon)=x$를 만족하는 모델 $f_\theta$는 다음과 같이 정리할 수 있다: - -$$ -f_\theta(x,t)=c_{skip}(t)x+c_{out}(t)F_\theta(x,t). \tag{5} -$$ - -$c_{skip}(t)$와 $c_{out}(t)$는 미분 가능한 함수이며 $c_{skip}=1, c_{out}=0$이기 때문에 $f_\theta(x, \epsilon)=x$를 만족한다. $\theta$는 학습 가능한 파라미터로 $F_\theta$는 심층 신경망을 의미한다. - -  - -CM은 pre-trained 모델에 대한 Distillation 방식과 scratch부터 학습하는 방식이 있는데 주로 **Distillation 방식**을 사용한다. Distillation 방식은 parameter $\theta^-$가 $\theta$를 통해 학습하며 모델에 대한 self-consistency를 위해 다음과 같이 손실함수를 구성한다: - -$$ -\mathcal{L}(\theta,\theta^-;\Phi)=\mathbb{E}_{x,t}\bigg[d\bigg(f_\theta(x_{t_{n+1}, t_{n+1}}), f_{\theta^-}(\hat{x}^\phi_{t_n}, t_n)\bigg)\bigg]. \tag{6} -$$ - -이 때 $\theta^-$는 $\theta$에 대한 지수평균이동(Exponential Moving Average, EMA)이며 $\theta^- \leftarrow \mu\theta^-+(1-\mu)\theta$이다. $d(\cdot, \cdot)$은 두 sample 사이의 거리를 측정하는 지표이다. $\hat{x}^{\phi}_{t_n}$은 $x_{t_{n+1}}$에 대한 $x_{t_n}$을 추정한 값으로 다음과 같다: - -$$ -\hat{x}^\phi_{t_n} \leftarrow x_{t_{n+1}}+(t_{n}-t_{n+1})\Phi(x_{t_{n+1}}, t_{n+1};\phi). \tag{7} -$$ - -$\Phi$는 PF-ODE에 사용되는 ODE Solver로 [Euler](https://en.wikipedia.org/wiki/Euler_method)나 [Heun](https://en.wikipedia.org/wiki/Heun%27s_method) Method등의 수치적인 ODE solver를 사용할 수 있다. 즉 Consistency Distillation은 ODE Solver로 예측한 $\hat{x}^{\phi}_{t_n}$과 $x_{t_{n+1}}$을 입력으로 $f_{\theta^-}$와 $f_\theta$로 **예측한 값의 Consistency를 비교하는 방식으로 Distillation을 수행**한다. - -## 3. Latent Consistency Models - -CM의 한계: - -- ImageNet 64x64, LSUN 256x256 영상에 대한 Generation만 수행 - - - **High Resolution**의 잠재성이 아직 탐구되지 않았음. - - **Classifier-free Guidance(CFG)** 등을 사용하지 않음. - -Latent Consistency Models(LCMs)는 CM의 잠재력을 충분히 발휘하여 좀더 도전적인 task를 수행한다. - -### 3.1 Consistency Distillation in the Latent Space - -본 논문에서는 pre-trained 된 Stable Diffusion에 Consistency Distillation을 적용한 Latent Consistency Distillation (LCD)을 제안한다. LCMs는 LDM(SD)을 기반으로 설계되었기 때문에 $z=\varepsilon(x)$를 통해 $x$를 latent vector로 임베딩하고 $\hat{x}=\mathcal{D}(z)$를 통해 원본 영상으로 복원한다. latent space 상에서 연산이 이뤄지기 때문에 **Computation Cost를 크게 줄일 수 있어** high-resolution 영상을 laptop GPU에서 생성할 수도 있다. - -condition을 추가한 PF-ODE의 reverse process는 다음과 같이 정의된다: - -$$ -\frac{dz_t}{dt}=f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,c,t), \ z_T\sim\mathcal{N}(0,\tilde{\sigma}^2I). \tag{8} -$$ - -$z_t$는 t step의 image latents, $\epsilon_\theta(z_t,c,t)$는 noise 예측 모델, c는 text와 같은 conditional prompt를 의미한다. PF-ODE상에서 모든 t step에 대해 consistency function $f_\theta :(z_t,c,t) \mapsto z_0$이기 때문에 이를 수식으로 정리하자면 다음과 같이 나타낼 수 있다 ($\hat{\epsilon}_\theta$는 noise prediction model.): - -$$ -f_\theta(z,c,t)=c_{skip}(t)z+c_{out}(t)\bigg( \frac{z-\sigma_t\hat{\epsilon}_\theta(z,c,t)}{\alpha_t} \bigg). \ (\epsilon-Prediction) \tag{9} -$$ - -수식을 살펴보면 ddpm 등의 reparameterization trick인 $x_t := \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon$을 변형하여 식에 대입한 것을 알 수 있음. ($x$→$z$로 치환) - -$$ -x_0 = \frac{x_t-\sqrt{1-\bar{\alpha}_t}\epsilon}{\sqrt{\bar{\alpha}_t}}, \ \hat{z}_0 = \frac{z_t-\sigma(t)\hat{\epsilon}_{\theta}(z,c,t)}{\alpha(t)}. -$$ - -CM과 마찬가지로 $c_{skip}(0)=1, c_{out}(0)=0$이고 $\hat{\epsilon}_{\theta}(z,c,t)$는 teacher diffusion model과 유사한 noise 예측 모델 parameter이다. $f_\theta$는 $\epsilon-Prediction$ 외에도 $x-Prediction$이나 $v-Prediction$을 사용할 수도 있다. ($x-Prediction$은 DDPM, $v-prediction$은 PD에서 나온 개념) - -$$ -\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,n}\bigg[ d(f_\theta(z_{t_{n+1}},c,t_{n+1}), f_{\theta^-}(\hat{z}^\psi_{t_n},c,t_n)) \bigg]. \tag{10} -$$ - -$\psi(z_t,t,x,c)$는 ODE solver이며 특정한 time step $t \sim s$ 사이에 대한 Eq. 8의 우항을 근사한 값이다. ODE Solver이기 때문에 **DDIM, DPM-Solver, DPM-Solver++ 등을 사용할 수 있다.** 또한 $\psi$는 학습 및 Distillation시에만 사용한다. 이때 $t_n$은 EDM을 토대로 CM에서 나오는 값이다. 기존 timestep $[t, T]$에 대한 하위 간격으로 $t_1=\epsilon - -2 Stage Distillation. -::: - -t이에 반해 LCMs는 augmented PF-ODE를 해결하는 방식으로 one-stage의 guided Distillation을 제안했다. 일단 CFG에 대한 reverse diffusion process는 다음과 같다: - -$$ -\tilde{\epsilon}_{\theta}(z_t,\omega,c,t):=(1+\omega)\epsilon_\theta(z_t,c,t)-\omega\epsilon_\theta(z_t,\varnothing,t). \tag{12} -$$ - -CFG는 conditional noise 예측값과 unconditional noise 예측값을 선형 결합하여 사용한다. 즉 noise 값이 $\omega$에 따라 변형되므로 **augmented PF-ODE**라고 한다. augmented PF-ODE는 다음과 같이 나타낼 수 있다: - -$$ -\frac{dz_t}{dt}=f(t)z_t+\frac{g^2(t)}{2\sigma_t}\tilde{\epsilon}_\theta(z_t,\omega,c,t), \ z_T\sim\mathcal{N}(0,\tilde{\sigma}^2I). \tag{13} -$$ - -consistency function도 $\omega$를 변수로 받아오기 때문에 $f_\theta:(z_t,\omega,c,t)\mapsto z_0$로 다시 정의된다. Consistency Distillation Loss 또한 다음과 같이 나타낼 수 있다: - -$$ -\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,\omega,n}\bigg[ d\bigg( f_\theta(z_{t_{n+1}},\omega,c,t_{n+1}), f_{\theta^-}(\hat{z}_{t_n}^{\psi,\omega},\omega,c,t_n) \bigg) \bigg] \tag{14} -$$ - -$\omega$와 $n$는 각각 $[\omega_{min}, \omega_{max}]$, $\{1,…,N-1\}$에서 sampling된다. $\hat{z}^{\psi, \omega}_{t_n}$는 이전과 마찬가지로 CFG가 추가된 ODE-Solver를 사용하여 근사한 값을 의미한다. 이때 사용되는 새로운 noise 예측모델 $\tilde{\epsilon}_\theta(z_t,\omega,c,t)$는 Eq. 11처럼 $t_{n+1} \sim t_n$까지 t에 대해 적분 했을 때 다음과 같이 나타낼 수 있다: - -$$ -\hat{z}^{\psi, \omega}_{t_n}-z_{t_n+1}=\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\tilde{\epsilon}_\theta(z_t,\omega,c,t)\bigg)dt -$$ -$$ -=(1+\omega)\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,c,t)\bigg)dt -$$ -$$ --\omega\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,\varnothing,t)\bigg)dt -$$ -$$ -\approx(1+\omega)\psi(z_{t_{n+1}}, t_{n+1},t_n,c)-\omega\psi(z_{t_{n+1}}, t_{n+1},t_n,\varnothing). \tag{15} -$$ - -마찬가지로 PF-ODE Solver $\psi(\cdot,\cdot,\cdot,\cdot)$에는 DDIM, DPM-Solver, DPM-Solver++ 등을 사용할 수 있다. - -### 3.3 Accelerating Distillation with Skipping Time Steps - -Stable Diffusion 등 보통의 Diffusion Model들은 매우 큰 step을 전체 time step으로 잡고 학습한다. 그러나 이같이 촘촘한 time step은 각 $t_n$과 $t_{n+1}$의 변화량을 감소시키기 때문에 자연스럽게 Consistency Distillation Loss도 작아지게 된다. **Loss가 작아지면 학습의 수렴속도도 느려지게 된다.** 따라서 LCMs는 학습 수렴의 속도를 높이기 위해 time step을 수천에서 수십으로 크기 단축시키는 SKIPPING-STEP 방법을 제안하였다. - -기존 CMs 모델의 경우 time scheduler로 EDM을 사용하고 ODE-Solver로 Euler 방법이나 Heun 방법을 사용한다. 그러나 LCMs는 Eq. 8을 통해 DDIM, DPM-Solver, DPM-Solver++와 같은 효율적인 solver도 효과적으로 데이터를 생성할 수 있다는 것을 증명했다. 따라서 **SKIPPING-STEP 방법은 $t_{n+1} → t_n$ 사이의 Consistency를 비교하는것이 아니라 특정 k-step만큼 거리가 있는 time step에 대한 Consistency를 비교한다.** ($t_{n+k}→t_n$) - -이때 $k$값의 크기는 trade-off 관계를 가진다. 너무작으면 ($k=1$) 기존과 같이 느린 수렴속도를 갖게되며, 너무 큰 값일 때는 ODE solver 를 통해 근사할 때 오차가 매우 커질수 있다. 논문의 저자는 $k=20$을 사용해 **time step을 수천에서 수십으로 대폭 줄여** 학습을 Accelerating 할 수 있었다. Eq. 14에 k값을 추가해 SKIPPING-STEP을 표현할 수 있다. - -$$ -\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,\omega,n}\bigg[ d\bigg( f_\theta(z_{t_{n+k}},\omega,c,t_{n+k}), f_{\theta^-}(\hat{z}_{t_n}^{\psi,\omega},\omega,c,t_n) \bigg) \bigg]. \tag{16} -$$ - -$\hat{z}^{\psi, \omega}_{t_n}$에 대한 수식도 다음과 같이 변경할 수 있다. - -$$ -\hat{z}^{\psi, \omega}_{t_n} \leftarrow z_{t_{n+k}}+(1+\omega)\psi(z_{t_{n+k}}, t_{n+k},t_n,c)-\omega\psi(z_{t_{n+k}}, t_{n+k},t_n,\varnothing). \tag{17} -$$ - -## 3.4 Latent Consistency Fine-tuning for customized dataset - -Stable Diffusion과 같은 Foundation 생성 모델은 거의 대부분의 text-to-image Generation task에서 잘 되지만 가끔 downstream task를 위해 Cunstom dataset에 대한 fine-tuning이 필요할 때가 있다. Latent Consistency Fine-tuning(LCF)는 Custom Dataset도 teacher model에 대한 종속없이 few-step inference를 성공적으로 할수 있도록 한다. 따라서 LCM은 **기존의 Diffusion model에 대한 추가적인 fine tuning 방법론 없이도 Custom Dataset을 바로바로 학습하여 사용**할수 있다. - -따로 추가적인 fine-tuning 방법이 있는것은 아니고 Consisteny Distillation 시 pre-trained 된 LDM을 사용하여 EMA를 통해 Distillation을 하기 때문에 Dataset을 Custom Dataset으로 사용하기만하면 된다. 즉 pre-trained Diffuson model → Custom Dataset fine-tuning → few step inference를 위한 Consistency Distillation을 할 필요 없이 바로학습이 가능하다는 의미이다. - -## 4. Experiments - -### 4.1 Text-To-Image Generation - -3가지 데이터셋에 대한 평가를 진행했다. (LAION-5B, LAION-Aesthetics-6+(12M), LAION-Aesthetics-6.5+(650k)) 앞서말한것처럼 하나의 Resolution이 아닌 512x512, 768x768의 high resolution을 생성했다. 512 size는 $\epsilon$-prediction, 768 size는 $v$-prediction을 사용했고 ODE-Solver로는 DDIM을 사용했다. 앞서말한것처럼 SKIPPING-STEP은 20의 값을 가진다. - -:::{figure-md} -ldm_04 - -Quantitative results at 512 x 512 & 768 x 768 resolution. -::: - -:::{figure-md} -ldm_05 - -Qualitative results on LAION-Aesthetic-6.5+ Dataset. (2,4 steps) -::: - -DDIM, DPM-Solver, DPM-Solver++, Guided-Distill 4가지 모델에 대해 LCM과 성능비교를 했는데 이때 Guided-Distill은 오픈소스 코드가 없기 때문에 논문의 내용과 동일하게 Implementation 해서 성능을 비교하였다. LCM은 같은 메모리 Cost 대비 더 빠르게 수렴하고 더 좋은 품질의 영상을 생성하였다. 특히 Guided-Distill은 2 stage Distillation이지만 LCM은 **1 Stage**만 사용해도 이같은 성능을 보여줬다. - -### 4.2 Abulation Study - -#### ODE Solvers & Skipping-Step Schedule - -augmented PF-ODE를 푸는 solver들(DDIM, DPM, DPM++)을 LCM에 사용할 때 성능 비교와 SKIPPING-STEP schedule의 $k$값에 따른 성능 변화를 비교하였다. 모든 모델은 2,000 iteration에서의 4-step inference로 고정해서 비교했다. - -:::{figure-md} -ldm_06 - -Different ODE solvers and skipping step k. -::: - -Skipping step의 경우 $k$ 값을 올렸을 때 훨씬더 빠르게 수렴하며 때때로 더 좋은 FID 값을 보여주었다. 또한 DPM과 DPM++은 $k$가 50일 때 DDIM보다 더 좋은 성능을 보였다. 이는 **$k$ 값이 클수록 더 큰 ODE approximation error를 가지는 DDIM에 비해 오차가 적기 때문**이다. - -$k=20$일 때, 3가지 모델 모두 좋은 성능이 보였다. - -#### The Effect of Guidance Scale $\omega$ - -일반적으로 $\omega$값이 클수록 CLIP score 같은 품질의 지표는 좋아지지만 작을수록 다양성이 떨어져 FID Score가 떨어진다. 즉 $\omega$의 크기는 **Quality와 Diversity에 대한 trade-off가 있다.** - -:::{figure-md} -ldm_07 - -Different classifier-free guidance scales $\omega$. -::: - -그래프를 보면 2~8 step inference는 성능에 큰 차이를 가지지는 않는것으로 확인된다. 그러나 **1 step inference는 아직 개선의 여지가 있는것**을 확인할 수 있다. - -:::{figure-md} -ldm_08 - -Different classifier-free guidance scales $\omega$. -::: - -$\omega$에 따른 실제 생성 이미지를 비교해 봤을 때 생성 영상의 Quality 차이가 확연하게 들어난다. 즉 Distillation 시에도 CFG를 적용하는 것이 성능을 크게 개선할 수 있다는 것을 증명한다. - -### 4.3 Downstream Consistency Fine-tuning Results - -포켓몬 데이터셋과 심슨 데이터셋에 LCF를 적용했을 때를 비교하였다. 90%는 학습 데이터로, 10%는 검증 데이터로 사용했다. 완벽하진 않지만 Custom Dataset의 style을 잘 catch한 모습을 보여준다. - -:::{figure-md} -ldm_09 - -Latent Consistency Fine-tuning(LCF) on two customized dataset.. $\omega$. -::: - -# Conclusion - +```{admonition} Information +- **Title:** Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference + +- **Reference** + - Paper: [https://arxiv.org/pdf/2310.04378](https://arxiv.org/pdf/2310.04378) + - Code: [https://github.com/luosiallen/latent-consistency-model](https://github.com/luosiallen/latent-consistency-model) + - Project Page: [https://latent-consistency-models.github.io/](https://latent-consistency-models.github.io/) + +- **Author:** Donghyun Han + +- **Last updated on May. 1, 2024** +``` + +# Latent Consistency Models + +## 1. Introduction + +Diffusion model은 다양한 분야에서 주목할만한 성과를 거두었지만 매우 느린 sampling 속도를 가지기 때문에 실시간 사용이 불가능하다. 이 같은 단점을 극복하기 위해 sampling 속도를 향상시키는 다양한 accelerating 방법이 제안되었다: + +  + +1. ODE solver의 성능개선을 통해 10~20 step만으로도 좋은 성능을 가지는 방법. + + - DPM-Solver ([lu et al.](https://arxiv.org/pdf/2206.00927)) + +2. 사전 학습된 Diffusion model을 몇 step만으로도 추론할수 있도록 **distillation**하는 방법. + + - PD (Progressive Distillation). → 2 stage ([Salimans et al.](https://arxiv.org/pdf/2202.00512)) + - On Distillation of Guided Diffusion Models. ([Meng et al.](https://arxiv.org/pdf/2210.03142)) + - Consistency Models ([Song et al.](https://arxiv.org/pdf/2303.01469)) + +이중 특히 Consistency Models은 ODE-trajectory에 대한 일관성을 갖도록 하는 모델로서, single step만으로도 이미지를 생성할 수 있기 때문에 반복적인 계산이 필요하지 않다. 그러나 이 모델 또한 2가지의 단점을 가지고 있다: + +  + +1. Pixel space의 Flow-based Model이기 때문에 **high-resolution 이미지 생성**에 적합하지 않음. +2. Conditional(Classifer-free Guidance)한 이미지 생성을 고려하지 않아 **text2img**에 적합하지 않음. + +--- + +본 논문의 제안점은 다음 3가지다: + +  + +- 빠르고 high-resolution 이미지를 생성하기 위한 Latent Consistency Models(LCMs)를 제안한다. LCMs은 영상의 latent space에 Consistency Models 개념을 적용해 매우 적은 step 만으로도 **고품질의 이미지**를 생성할 수 있다. + +- guided consistency distillation을 통해 Stable Diffusion을 매우 적은 step(1~4)으로 sampling 할 수 있는 방법을 제공한다. **Skipping-Step**이라는 테크닉을 통해 학습을 가속화 한다. 2, 4 step Model의 경우 학습에 A100 GPU 32시간 밖에 걸리지 않으며 LAION-5B-Aesthetics dataset에서 SOTA의 성능을 달성했다. + +- LCMs에 대한 새로운 fine-tuning 방식인 Latent Consistency Fine-tuning을 통해 **빠른 추론 속도를 유지하면서도 Custom Dataset에 효율적으로 적용**할 수 있다. + +  + +:::{figure-md} +ldm_01 + +768x768 Resolution image in 1~4 steps. +::: + +## 2. Preliminaries + +### Diffusion Models + +Diffusion Models 혹은 Score-based Models는 데이터에 점진적으로 Gaussian noise를 주입하고 reverse denoise process로 noise를 제거하여 데이터를 sampling하는 기법이다. 반면 forwad process는 원본 데이터 분포인 $p_{data}(x)$를 주변 확률분포인 $q_{t}(x_{t})$로 변환한다: + +$$ +q_{0t}(x_{t}|x_{0})=\mathcal{N}(x_t|\alpha(t)x_0,\sigma^2(t)I) +$$ + +여기서 $\alpha(t)$와 $\sigma(t)$는 noise scheduler를 의미한다. 연속적인 timestep의 관점에서 이를 확률미분방정식(Stochastic Differential Equation, SDE)으로 나타낼 수 있는데, 다음과 같다: + +$$ +f(t)=\frac{d\log{\alpha(t)}}{dt}, g^2(t)=\frac{d\sigma^2(t)}{dt}-2\frac{d\log{\alpha(t)}}{dt}\sigma^2(t). \tag{1} +$$ + +또한 주변 확률분포 $q_t(x)$는 **Ptobability Flow ODE(PF-ODE)**라는 상미분방정식(Ordinary Differential Equation, ODE)을 만족하는데 다음과 같다: + +$$ +\frac{dx_t}{dt}=f(x)x_t-\frac{1}{2}g^2(t)\nabla_x\log{q_t(x_t)}, \ x_T \sim q_T(x_T). \tag{2} +$$ + +이때 Diffusion model은 $-\nabla\log{q_t(x_t)}$(score function)를 예측하는 noise 예측 모델($\epsilon_\theta(x_t,t)$)을 학습시킨다. 학습된 모델은 score function의 근사치를 예측하고 sampling하는데 이를 empirical PF-ODE라 한다 (경험적 PF-ODE): + +$$ +\frac{dx_t}{dt}=f(t)x_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(x_t,t), \ x_T \sim \mathcal{N}(0, \tilde{\sigma}^2I). \tag{3} +$$ + +Classifier-Free Guidance (CFG)는 sampling의 퀄리티를 높이기 위해 GLIDE, Stable Diffusion, DALL$\cdot$E2, Imagen 등 다양한 conditional model에서 사용되었다. CFG의 scale $\omega$가 주어졌을 때 원본 noise prediction은 conditional, unconditional noise prediction을 선형적으로 혼합하여 대체된다: + +$$ +\tilde{\epsilon}_\theta(z_t,\omega, c,t)=(1+\omega)\epsilon_\theta(z_t, c,t)-\omega\epsilon_\theta(z, \emptyset, t). +$$ + +  + +### Consistency Models + +Consistenct Model(CM)은 몇 step 혹은 한번의 step 만으로 데이터를 생성할 수 있는 모델이다. CM의 핵심은 **PF-ODE의 궤적에 어떤 point와 PF-ODE의 solution에 대해 mapping되는 function ($f:(x_t, t) \mapsto x_\epsilon$)을 추정**하는 것이다. + +:::{figure-md} +ldm_02 + +Consistency Models (CM). +::: + +$\epsilon$은 고정된 매우 작은 양수값을 가지며 CM의 function은 자기 자신에 대한 **self-consistency**를 만족해야한다. 즉 어떠한 time step에 대해서도 $x_\epsilon$을 sampling 할 수 있어야 한다. + +$$ +f(x_t,t)=f(x_{t'},t'), \forall t,t' \in [\epsilon, T]. \tag{4} +$$ + +$f_\theta(x, \epsilon)=x$를 만족하는 모델 $f_\theta$는 다음과 같이 정리할 수 있다: + +$$ +f_\theta(x,t)=c_{skip}(t)x+c_{out}(t)F_\theta(x,t). \tag{5} +$$ + +$c_{skip}(t)$와 $c_{out}(t)$는 미분 가능한 함수이며 $c_{skip}=1, c_{out}=0$이기 때문에 $f_\theta(x, \epsilon)=x$를 만족한다. $\theta$는 학습 가능한 파라미터로 $F_\theta$는 심층 신경망을 의미한다. + +  + +CM은 pre-trained 모델에 대한 Distillation 방식과 scratch부터 학습하는 방식이 있는데 주로 **Distillation 방식**을 사용한다. Distillation 방식은 parameter $\theta^-$가 $\theta$를 통해 학습하며 모델에 대한 self-consistency를 위해 다음과 같이 손실함수를 구성한다: + +$$ +\mathcal{L}(\theta,\theta^-;\Phi)=\mathbb{E}_{x,t}\bigg[d\bigg(f_\theta(x_{t_{n+1}, t_{n+1}}), f_{\theta^-}(\hat{x}^\phi_{t_n}, t_n)\bigg)\bigg]. \tag{6} +$$ + +이 때 $\theta^-$는 $\theta$에 대한 지수평균이동(Exponential Moving Average, EMA)이며 $\theta^- \leftarrow \mu\theta^-+(1-\mu)\theta$이다. $d(\cdot, \cdot)$은 두 sample 사이의 거리를 측정하는 지표이다. $\hat{x}^{\phi}_{t_n}$은 $x_{t_{n+1}}$에 대한 $x_{t_n}$을 추정한 값으로 다음과 같다: + +$$ +\hat{x}^\phi_{t_n} \leftarrow x_{t_{n+1}}+(t_{n}-t_{n+1})\Phi(x_{t_{n+1}}, t_{n+1};\phi). \tag{7} +$$ + +$\Phi$는 PF-ODE에 사용되는 ODE Solver로 [Euler](https://en.wikipedia.org/wiki/Euler_method)나 [Heun](https://en.wikipedia.org/wiki/Heun%27s_method) Method등의 수치적인 ODE solver를 사용할 수 있다. 즉 Consistency Distillation은 ODE Solver로 예측한 $\hat{x}^{\phi}_{t_n}$과 $x_{t_{n+1}}$을 입력으로 $f_{\theta^-}$와 $f_\theta$로 **예측한 값의 Consistency를 비교하는 방식으로 Distillation을 수행**한다. + +## 3. Latent Consistency Models + +CM의 한계: + +- ImageNet 64x64, LSUN 256x256 영상에 대한 Generation만 수행 + + - **High Resolution**의 잠재성이 아직 탐구되지 않았음. + - **Classifier-free Guidance(CFG)** 등을 사용하지 않음. + +Latent Consistency Models(LCMs)는 CM의 잠재력을 충분히 발휘하여 좀더 도전적인 task를 수행한다. + +### 3.1 Consistency Distillation in the Latent Space + +본 논문에서는 pre-trained 된 Stable Diffusion에 Consistency Distillation을 적용한 Latent Consistency Distillation (LCD)을 제안한다. LCMs는 LDM(SD)을 기반으로 설계되었기 때문에 $z=\varepsilon(x)$를 통해 $x$를 latent vector로 임베딩하고 $\hat{x}=\mathcal{D}(z)$를 통해 원본 영상으로 복원한다. latent space 상에서 연산이 이뤄지기 때문에 **Computation Cost를 크게 줄일 수 있어** high-resolution 영상을 laptop GPU에서 생성할 수도 있다. + +condition을 추가한 PF-ODE의 reverse process는 다음과 같이 정의된다: + +$$ +\frac{dz_t}{dt}=f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,c,t), \ z_T\sim\mathcal{N}(0,\tilde{\sigma}^2I). \tag{8} +$$ + +$z_t$는 t step의 image latents, $\epsilon_\theta(z_t,c,t)$는 noise 예측 모델, c는 text와 같은 conditional prompt를 의미한다. PF-ODE상에서 모든 t step에 대해 consistency function $f_\theta :(z_t,c,t) \mapsto z_0$이기 때문에 이를 수식으로 정리하자면 다음과 같이 나타낼 수 있다 ($\hat{\epsilon}_\theta$는 noise prediction model.): + +$$ +f_\theta(z,c,t)=c_{skip}(t)z+c_{out}(t)\bigg( \frac{z-\sigma_t\hat{\epsilon}_\theta(z,c,t)}{\alpha_t} \bigg). \ (\epsilon-Prediction) \tag{9} +$$ + +수식을 살펴보면 ddpm 등의 reparameterization trick인 $x_t := \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon$을 변형하여 식에 대입한 것을 알 수 있음. ($x$→$z$로 치환) + +$$ +x_0 = \frac{x_t-\sqrt{1-\bar{\alpha}_t}\epsilon}{\sqrt{\bar{\alpha}_t}}, \ \hat{z}_0 = \frac{z_t-\sigma(t)\hat{\epsilon}_{\theta}(z,c,t)}{\alpha(t)}. +$$ + +CM과 마찬가지로 $c_{skip}(0)=1, c_{out}(0)=0$이고 $\hat{\epsilon}_{\theta}(z,c,t)$는 teacher diffusion model과 유사한 noise 예측 모델 parameter이다. $f_\theta$는 $\epsilon-Prediction$ 외에도 $x-Prediction$이나 $v-Prediction$을 사용할 수도 있다. ($x-Prediction$은 DDPM, $v-prediction$은 PD에서 나온 개념) + +$$ +\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,n}\bigg[ d(f_\theta(z_{t_{n+1}},c,t_{n+1}), f_{\theta^-}(\hat{z}^\psi_{t_n},c,t_n)) \bigg]. \tag{10} +$$ + +$\psi(z_t,t,x,c)$는 ODE solver이며 특정한 time step $t \sim s$ 사이에 대한 Eq. 8의 우항을 근사한 값이다. ODE Solver이기 때문에 **DDIM, DPM-Solver, DPM-Solver++ 등을 사용할 수 있다.** 또한 $\psi$는 학습 및 Distillation시에만 사용한다. 이때 $t_n$은 EDM을 토대로 CM에서 나오는 값이다. 기존 timestep $[t, T]$에 대한 하위 간격으로 $t_1=\epsilon + +2 Stage Distillation. +::: + +t이에 반해 LCMs는 augmented PF-ODE를 해결하는 방식으로 one-stage의 guided Distillation을 제안했다. 일단 CFG에 대한 reverse diffusion process는 다음과 같다: + +$$ +\tilde{\epsilon}_{\theta}(z_t,\omega,c,t):=(1+\omega)\epsilon_\theta(z_t,c,t)-\omega\epsilon_\theta(z_t,\varnothing,t). \tag{12} +$$ + +CFG는 conditional noise 예측값과 unconditional noise 예측값을 선형 결합하여 사용한다. 즉 noise 값이 $\omega$에 따라 변형되므로 **augmented PF-ODE**라고 한다. augmented PF-ODE는 다음과 같이 나타낼 수 있다: + +$$ +\frac{dz_t}{dt}=f(t)z_t+\frac{g^2(t)}{2\sigma_t}\tilde{\epsilon}_\theta(z_t,\omega,c,t), \ z_T\sim\mathcal{N}(0,\tilde{\sigma}^2I). \tag{13} +$$ + +consistency function도 $\omega$를 변수로 받아오기 때문에 $f_\theta:(z_t,\omega,c,t)\mapsto z_0$로 다시 정의된다. Consistency Distillation Loss 또한 다음과 같이 나타낼 수 있다: + +$$ +\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,\omega,n}\bigg[ d\bigg( f_\theta(z_{t_{n+1}},\omega,c,t_{n+1}), f_{\theta^-}(\hat{z}_{t_n}^{\psi,\omega},\omega,c,t_n) \bigg) \bigg] \tag{14} +$$ + +$\omega$와 $n$는 각각 $[\omega_{min}, \omega_{max}]$, $\{1,…,N-1\}$에서 sampling된다. $\hat{z}^{\psi, \omega}_{t_n}$는 이전과 마찬가지로 CFG가 추가된 ODE-Solver를 사용하여 근사한 값을 의미한다. 이때 사용되는 새로운 noise 예측모델 $\tilde{\epsilon}_\theta(z_t,\omega,c,t)$는 Eq. 11처럼 $t_{n+1} \sim t_n$까지 t에 대해 적분 했을 때 다음과 같이 나타낼 수 있다: + +$$ +\hat{z}^{\psi, \omega}_{t_n}-z_{t_n+1}=\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\tilde{\epsilon}_\theta(z_t,\omega,c,t)\bigg)dt +$$ +$$ +=(1+\omega)\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,c,t)\bigg)dt +$$ +$$ +-\omega\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,\varnothing,t)\bigg)dt +$$ +$$ +\approx(1+\omega)\psi(z_{t_{n+1}}, t_{n+1},t_n,c)-\omega\psi(z_{t_{n+1}}, t_{n+1},t_n,\varnothing). \tag{15} +$$ + +마찬가지로 PF-ODE Solver $\psi(\cdot,\cdot,\cdot,\cdot)$에는 DDIM, DPM-Solver, DPM-Solver++ 등을 사용할 수 있다. + +### 3.3 Accelerating Distillation with Skipping Time Steps + +Stable Diffusion 등 보통의 Diffusion Model들은 매우 큰 step을 전체 time step으로 잡고 학습한다. 그러나 이같이 촘촘한 time step은 각 $t_n$과 $t_{n+1}$의 변화량을 감소시키기 때문에 자연스럽게 Consistency Distillation Loss도 작아지게 된다. **Loss가 작아지면 학습의 수렴속도도 느려지게 된다.** 따라서 LCMs는 학습 수렴의 속도를 높이기 위해 time step을 수천에서 수십으로 크기 단축시키는 SKIPPING-STEP 방법을 제안하였다. + +기존 CMs 모델의 경우 time scheduler로 EDM을 사용하고 ODE-Solver로 Euler 방법이나 Heun 방법을 사용한다. 그러나 LCMs는 Eq. 8을 통해 DDIM, DPM-Solver, DPM-Solver++와 같은 효율적인 solver도 효과적으로 데이터를 생성할 수 있다는 것을 증명했다. 따라서 **SKIPPING-STEP 방법은 $t_{n+1} → t_n$ 사이의 Consistency를 비교하는것이 아니라 특정 k-step만큼 거리가 있는 time step에 대한 Consistency를 비교한다.** ($t_{n+k}→t_n$) + +이때 $k$값의 크기는 trade-off 관계를 가진다. 너무작으면 ($k=1$) 기존과 같이 느린 수렴속도를 갖게되며, 너무 큰 값일 때는 ODE solver 를 통해 근사할 때 오차가 매우 커질수 있다. 논문의 저자는 $k=20$을 사용해 **time step을 수천에서 수십으로 대폭 줄여** 학습을 Accelerating 할 수 있었다. Eq. 14에 k값을 추가해 SKIPPING-STEP을 표현할 수 있다. + +$$ +\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,\omega,n}\bigg[ d\bigg( f_\theta(z_{t_{n+k}},\omega,c,t_{n+k}), f_{\theta^-}(\hat{z}_{t_n}^{\psi,\omega},\omega,c,t_n) \bigg) \bigg]. \tag{16} +$$ + +$\hat{z}^{\psi, \omega}_{t_n}$에 대한 수식도 다음과 같이 변경할 수 있다. + +$$ +\hat{z}^{\psi, \omega}_{t_n} \leftarrow z_{t_{n+k}}+(1+\omega)\psi(z_{t_{n+k}}, t_{n+k},t_n,c)-\omega\psi(z_{t_{n+k}}, t_{n+k},t_n,\varnothing). \tag{17} +$$ + +## 3.4 Latent Consistency Fine-tuning for customized dataset + +Stable Diffusion과 같은 Foundation 생성 모델은 거의 대부분의 text-to-image Generation task에서 잘 되지만 가끔 downstream task를 위해 Cunstom dataset에 대한 fine-tuning이 필요할 때가 있다. Latent Consistency Fine-tuning(LCF)는 Custom Dataset도 teacher model에 대한 종속없이 few-step inference를 성공적으로 할수 있도록 한다. 따라서 LCM은 **기존의 Diffusion model에 대한 추가적인 fine tuning 방법론 없이도 Custom Dataset을 바로바로 학습하여 사용**할수 있다. + +따로 추가적인 fine-tuning 방법이 있는것은 아니고 Consisteny Distillation 시 pre-trained 된 LDM을 사용하여 EMA를 통해 Distillation을 하기 때문에 Dataset을 Custom Dataset으로 사용하기만하면 된다. 즉 pre-trained Diffuson model → Custom Dataset fine-tuning → few step inference를 위한 Consistency Distillation을 할 필요 없이 바로학습이 가능하다는 의미이다. + +## 4. Experiments + +### 4.1 Text-To-Image Generation + +3가지 데이터셋에 대한 평가를 진행했다. (LAION-5B, LAION-Aesthetics-6+(12M), LAION-Aesthetics-6.5+(650k)) 앞서말한것처럼 하나의 Resolution이 아닌 512x512, 768x768의 high resolution을 생성했다. 512 size는 $\epsilon$-prediction, 768 size는 $v$-prediction을 사용했고 ODE-Solver로는 DDIM을 사용했다. 앞서말한것처럼 SKIPPING-STEP은 20의 값을 가진다. + +:::{figure-md} +ldm_04 + +Quantitative results at 512 x 512 & 768 x 768 resolution. +::: + +:::{figure-md} +ldm_05 + +Qualitative results on LAION-Aesthetic-6.5+ Dataset. (2,4 steps) +::: + +DDIM, DPM-Solver, DPM-Solver++, Guided-Distill 4가지 모델에 대해 LCM과 성능비교를 했는데 이때 Guided-Distill은 오픈소스 코드가 없기 때문에 논문의 내용과 동일하게 Implementation 해서 성능을 비교하였다. LCM은 같은 메모리 Cost 대비 더 빠르게 수렴하고 더 좋은 품질의 영상을 생성하였다. 특히 Guided-Distill은 2 stage Distillation이지만 LCM은 **1 Stage**만 사용해도 이같은 성능을 보여줬다. + +### 4.2 Abulation Study + +#### ODE Solvers & Skipping-Step Schedule + +augmented PF-ODE를 푸는 solver들(DDIM, DPM, DPM++)을 LCM에 사용할 때 성능 비교와 SKIPPING-STEP schedule의 $k$값에 따른 성능 변화를 비교하였다. 모든 모델은 2,000 iteration에서의 4-step inference로 고정해서 비교했다. + +:::{figure-md} +ldm_06 + +Different ODE solvers and skipping step k. +::: + +Skipping step의 경우 $k$ 값을 올렸을 때 훨씬더 빠르게 수렴하며 때때로 더 좋은 FID 값을 보여주었다. 또한 DPM과 DPM++은 $k$가 50일 때 DDIM보다 더 좋은 성능을 보였다. 이는 **$k$ 값이 클수록 더 큰 ODE approximation error를 가지는 DDIM에 비해 오차가 적기 때문**이다. + +$k=20$일 때, 3가지 모델 모두 좋은 성능이 보였다. + +#### The Effect of Guidance Scale $\omega$ + +일반적으로 $\omega$값이 클수록 CLIP score 같은 품질의 지표는 좋아지지만 작을수록 다양성이 떨어져 FID Score가 떨어진다. 즉 $\omega$의 크기는 **Quality와 Diversity에 대한 trade-off가 있다.** + +:::{figure-md} +ldm_07 + +Different classifier-free guidance scales $\omega$. +::: + +그래프를 보면 2~8 step inference는 성능에 큰 차이를 가지지는 않는것으로 확인된다. 그러나 **1 step inference는 아직 개선의 여지가 있는것**을 확인할 수 있다. + +:::{figure-md} +ldm_08 + +Different classifier-free guidance scales $\omega$. +::: + +$\omega$에 따른 실제 생성 이미지를 비교해 봤을 때 생성 영상의 Quality 차이가 확연하게 들어난다. 즉 Distillation 시에도 CFG를 적용하는 것이 성능을 크게 개선할 수 있다는 것을 증명한다. + +### 4.3 Downstream Consistency Fine-tuning Results + +포켓몬 데이터셋과 심슨 데이터셋에 LCF를 적용했을 때를 비교하였다. 90%는 학습 데이터로, 10%는 검증 데이터로 사용했다. 완벽하진 않지만 Custom Dataset의 style을 잘 catch한 모습을 보여준다. + +:::{figure-md} +ldm_09 + +Latent Consistency Fine-tuning(LCF) on two customized dataset.. $\omega$. +::: + +# Conclusion + LCM은 Consistency Distillation을 Latent 상에 적용하여 **고화질의 영상을 매우 적은 time step으로 inference 할 수 있도록 한 모델**이다. 즉 성능 좋고 고해상도의 영상을 few-step으로 가능하게 만들었다. 특히 Custom Dataset에도 Distillation을 적용했을 때 적은 time step으로도 어느정도의 style을 간단하게 학습하는 결과를 보여주었다. \ No newline at end of file diff --git a/_sources/docs/review/progressive_distillation.md b/_sources/docs/review/progressive_distillation.md old mode 100644 new mode 100755 index 9c01ddf6..f3246ce5 --- a/_sources/docs/review/progressive_distillation.md +++ b/_sources/docs/review/progressive_distillation.md @@ -1,233 +1,233 @@ -``` {admonition} Information -- **Title:** Progressive Distillation for Fast Sampling of Diffusion Models (ICLR 2022) - -- **Reference** - - Paper: [https://arxiv.org/abs/2202.00512](https://arxiv.org/abs/2202.00512) - - Code: [https://github.com/google-research/google-research/tree/master/diffusion_distillation/diffusion_distillation](https://github.com/google-research/google-research/tree/master/diffusion_distillation/diffusion_distillation) - -- **Author:** Sangwoo Jo - -- **Last updated on Nov. 14, 2023** -``` - -# Progressive Distillation for Fast Sampling of Diffusion Models - -## 1. Introduction - -Diffusion model 이 ImageNet generation task 에서 기존 BigGAN-deep 그리고 VQ-VAE-2 모델보다 FID/CAS score 기준으로 더 좋은 성능을 보여주며 많은 각광을 받고 있습니다. 그러나 sampling 속도가 느리다는 치명적인 단점을 가지고 있습니다. - -이를 해결하기 위해, 논문에서는 Progressive Distillation 기법을 소개하게 됩니다. 간략히 설명하자면 사전학습된 $N$-step DDIM 모델을 $N/2$-step student 모델에 distillation 하는 과정을 반복하여 최종적으로 4 steps 만으로도 state-of-the-art 모델을 수천번의 sampling steps 를 거쳐 생성한 이미지들과 유사한 모델 성능을 보여준다고 합니다. - -## 2. Background - Diffusion model in continuous time ## - -### 2.1. Definition - -Continuous 한 time domain 에서의 diffusion model 을 다음과 같은 요소들로 정의합니다. - -- Training data $x \sim p(x)$ -- Latent variables $z = \{z_t | t \in [0,1]\}$ - -여기서 $z_t$ 는 differentiable 한 noise schedule functions $\alpha_t, \sigma_t$ 로 값이 정의되고, 이 함수들은 log *signal-to-noise-ratio* $\lambda_t = \log[\alpha_t^2/\sigma_t^2]$ 가 monotonically decreasing 하도록 설정됩니다. 그리고 이들을 기반으로 다음과 같은 Markovian forward process 를 정의합니다. - -:::{figure-md} -progressive_distillation_01 - -Markovian Forward Process -::: - - where $0 \leq s < t \leq 1$ and $\sigma_{t|s}^2 = (1-e^{\lambda_t - \lambda_s}) \sigma_t^2$ - -### 2.2. Objective - -Diffusion model 의 objective 는 $\hat{x}_{\theta}(z_t)$ 모델에서 $z_t \sim q(z_t | x)$ 와 $\lambda_t$ 를 입력받아 다음과 같이 Mean Squared Error Loss 를 최소화하는 방향으로 원본 이미지 $x$ 를 예측하는 것입니다. 이때, $w(\lambda_t)$ 를 *weighting function* 이라 부릅니다. - -:::{figure-md} -progressive_distillation_02 - -Objective -::: - -where $t \sim U[0,1]$ - -### 2.3. Sampling - -Diffusion model 에서 sampling 하는 방식은 다양하게 존재합니다. - -#### 2.3.1. Ancestral Sampling - DDPM - -첫번째로는 DDPM 논문에서 소개하는 discrete time ancestral sampling 방식입니다. 위에 소개했던 notation 기준으로 reverse process 를 다음과 같이 수식적으로 표현 가능합니다. - -$$ -q(z_s | z_t,x) = N(z_s | \hat{\mu}_{s|t}(z_t,x), \tilde{\sigma}_{s|t}^2I) -$$ - -:::{figure-md} -progressive_distillation_03 - -Reverse Process -::: - -이를 기반으로 $z_1 \sim N(0,I)$ 로부터 다음과 같은 ancestral sampler 를 정의하게 됩니다. 이때, $\gamma$ 는 sampling 시 얼마나 많은 noise 를 추가할지 설정하는 hyperparameter 입니다. - -:::{figure-md} -progressive_distillation_04 - -Ancestral Sampler -::: - -#### 2.3.2. Probability Flow ODE - -반면에, Song et al. (2021c) 에서 forward diffusion process 를 SDE 로 표현할 수 있고, 이를 통한 sampling process 를 *probabiility flow* ODE 로 표현해서 구할 수 있다고 제시합니다. - -:::{figure-md} -progressive_distillation_05 - -Probability flow ODE -::: - -이때, $f(z_t,t) = \frac{d \log \alpha_t}{dt}z_t, g^2(t) = \frac{dσ_t^2}{dt} − 2 \frac{d\log \alpha_t}{dt}\sigma_t^2, \text{and}$ $\nabla_z \log \hat{p}_{\theta}(z_t) = \frac{\alpha_t\hat{x}_{\theta}(z_t) -z_t}{\sigma_t^2}$ 로 정의합니다. - -다시 말해 $z_1 \sim N(0,I)$ 로부터 이미지 $x$ 를 생성하는 task 를 위와 같이 ODE solver 문제로 해석할 수 있고, Euler rule 이나 Runge-Kutta method 등의 전통적인 ODE integrator 보다 DDIM sampler 를 적용했을때 성능이 가장 좋다고 논문에서 제시합니다. 아래 사진은 다양한 Probabiltity Flow ODE solver 들의 128x128 ImageNet 데이터셋 FID 성능을 비교한 결과입니다. - -:::{figure-md} -progressive_distillation_06 - -FID scores on 128 × 128 ImageNet for various probability flow ODE integrators -::: - -참고로 DDIM sampler 를 ODE solver 문제로 해석하면 다음과 같이 표현할 수 있고, 이 수식은 앞으로 자주 보게 될 예정입니다. - -:::{figure-md} -progressive_distillation_07 - -DDIM sampler -::: - -## 3. Progressive Distillation - -Diffusion model 을 더 효율적으로 sampling 하기 위해 소개한 *progressive distillation* 기법은 다음과 같은 절차로 진행됩니다. - -:::{figure-md} -progressive_distillation_08 - -Progressive Distillation -::: - -1. Standard diffusion training 기법으로 Teacher Diffusion Model 학습 -2. Student Model 정의 - Teacher Model 로부터 모델 구조 및 parameter 복사 -3. Student Model 학습 - 1. 이때, original data $x$ 대신에 $\tilde{x}$ 를 target 로 student model 을 학습합니다. $\tilde{x}$ 에 대한 공식은 아래 pseudocode 에 소개되는데, 이는 one-step student sample $\tilde{z}_{t''}$ 과 two-step teacher sample $z_{t''}$ 를 일치시키기 위해 나온 공식입니다. - 2. 2 DDIM steps of teacher model 결과와 1 DDIM step of student model 결과를 일치시키는 것이 핵심입니다. 여기서 $z_t$ 에서 $z_{t-1/N}$ 로 넘어가는 과정을 1 DDIM step 라 정의하고, $N$ 은 총 진행되는 student sampling steps 입니다. - 3. 기존 denoising model 학습 시, $x$ 가 $z_t$ 에 대해 deterministic 하지 않기 때문에 (다른 $x$ 값들에 대해 동일한 $z_t$ 생성 가능) 모델은 사실상 $x$ 가 아닌 weighted average of possible $x$ values 를 예측하는 모델이라고 합니다. 따라서, $z_t$에 대해 deterministic 한 $\tilde{x}(z_t)$ 를 예측하도록 학습한 student model 은 teacher model 보다 더 sharp 한 prediction 을 할 수 있다고 주장합니다. -4. Student Model 이 새로운 Teacher Model 이 되고 sampling steps $N$ → $N/2$ 로 줄어드는 이 과정을 계속 반복 - -이에 대한 pseudocode 도 확인해보겠습니다. - -- **PseudoCode** - - :::{figure-md} - progressive_distillation_09 - - Pseudocode for Progresssive Distillation - ::: - - -## 4. Diffusion Model Parameterization and Training Loss - -이제 denoising model $\hat{x}_{\theta}$ 와 reconstruction loss weight $w(\lambda_t)$ 에 대한 설정값에 대해 자세히 알아보겠습니다. 우선, 논문에서는 일반성을 잃지 않고 (without loss of generalization) *variance-preserving* diffusion process (i.e., $\alpha_t^2 + \sigma_t^2 = 1$ ) 라는 가정을 하게 됩니다. 더 자세하게는 cosine schedule $\alpha_t = cos(0.5\pi t)$ 를 사용합니다. - -DDPM 을 비롯한 대다수의 논문에서 이미지 $x$ 가 아닌 noise $\epsilon$ 를 예측하는 denoising model $\hat{\epsilon}_{\theta}(z_t)$ 를 정의합니다. $\epsilon$-space 에 정의된 손실함수에 $\hat{x_{\theta}}(z_t) = \frac{1}{\alpha_t}(z_t - \sigma_t \hat{\epsilon}_{\theta}(z_t))$ 식을 대입해보겠습니다. - -:::{figure-md} -progressive_distillation_10 - -Training loss on $\epsilon$-space and $x$-space -::: - -따라서, 이는 이미지 $x$ domain 에서 weighted reconstruction loss 를 적용하는 것과 동일하며 이때 weighting function $w(\lambda_t) = exp(\lambda_t), \lambda_t = \log[\alpha_t^2/\sigma_t^2]$ 로 정의할 수 있습니다. 그러나 이러한 standard training procedure 는 progressive distillation 에 적합하지 않다고 주장합니다. - -Standard diffusion training 기법에서는 다양한 범위 내에서의 signal-to-noise ratio $\alpha_t^2/\sigma_t^2$ 에서 모델이 학습되지만, distillation 이 진행될수록 이 signal-to-noise ratio 가 감소한다는 단점을 확인하게 됩니다. 더 자세히 설명하자면, $t$ 가 증가할수록 signal-to-noise-ratio $\alpha_t^2/\sigma_t^2$ 는 0 에 가까워지게 되고, $\hat{x_{\theta}}(z_t) = \frac{1}{\alpha_t}(z_t - \sigma_t \hat{\epsilon}_{\theta}(z_t))$ 에서 $\alpha_t \rightarrow 0$ 이므로 $\hat{\epsilon}_{\theta}(z_t)$ 에 대한 $x$-prediction 변화량이 점차적으로 커지게 됩니다. 이는 여러번의 training step 을 거칠 때 상관없지만, sampling steps 가 줄어들수록 치명적이게 됩니다. 최종적으로 sampling steps=1 일 때까지 progressively distillation 을 적용하면 모델의 입력으로는 단순한 pure noise $\epsilon$ (i.e., $\alpha_t = 0, \sigma_t = 1$ ) 이 들어가게 되고, $\epsilon$-prediction 과 $x$-prediction 의 상관관계가 완전히 사라지게 됩니다. 이는 위 loss function 에서 weighting function $w(\lambda_t) = 0$ 인 부분에서 확인할 수 있습니다. - -그래서 논문에서는 다음과 같은 세가지 방법으로 stable 한 $\hat{x}_{\theta}(z_t)$ prediction 을 구할 수 있는 방법들을 제시합니다. - -:::{figure-md} -progressive_distillation_11 - -Different parameterizations -::: - -Weighting function $w(\lambda_t)$ 도 두 가지 방안으로 실험했습니다. 이는 signal-to-noise ratio 가 0 으로 수렴하는 현상을 방지하도록 설정되었다고 합니다. - -:::{figure-md} -progressive_distillation_12 - -Different loss weighting functions -::: - -:::{figure-md} -progressive_distillation_13 - -Visualization of different loss weighting functions -::: - -## 5. Experiments - -논문에서 32x32 부터 128x128 까지 다양한 resolution 에서 모델 성능을 확인했습니다. 또한, cosine schedule $\alpha_t = cos(0.5 \pi t)$ 그리고 DDPM 에서 소개한 U-Net 아키텍쳐를 사용했으며 부가적으로 Nichol & Dhariwal (2021), Song et al. (2021c) 에서 사용된 BigGAN-style up/downsampling 기법을 활용했습니다. - -### 5.1. Model Parametrization and Training Loss - -아래 지표는 unconditional CIFAR-10 데이터셋에 앞써 소개드린 $\epsilon$-prediction 외에 다른 세 가지 parametrization 기법들로 original diffusion model 의 FID 와 Inception Score 성능을 확인해본 결과입니다. - -:::{figure-md} -progressive_distillation_14 - -Ablation Study on Parameterizations and Loss Weightings -::: - -성능을 비교해본 결과 $v$-prediction/$x$-prediction 과 Truncated SNR loss function 을 사용했을때 성능이 가장 좋은 부분을 확인할 수 있습니다. 또한, $\epsilon$-prediction 과 Truncated SNR loss function 의 조합을 사용하여 학습 시, unstable 한 convergence 를 보이는 현상도 볼 수 있습니다. - -위 실험결과를 바탕으로 progressive distillation 진행시 CIFAR-10 데이터셋에는 $x$-prediction, 그 외 데이터셋에서는 $(x,\epsilon)$-prediction 을 사용했다고 합니다. 더 자세한 hyperparameter setting 은 Appendix E 참조하시면 됩니다. - -### 5.2. Progressive Distillation - -논문에서 CIFAR-10, 64x64 downsampled ImageNet, 128 × 128 LSUN bedrooms, 그리고 128 × 128 LSUN Church-Outdoor 데이터셋에 progressive distillation 을 적용하여 모델 성능을 측정합니다. CIFAR-10 데이터셋 기준으로 teacher model 로부터 progressive distillation 진행 시 8192 steps 부터 시작하였고 batch size=128 로 설정하였습니다. 그 외 resolution 이 큰 데이터셋에 대해서는 1024 steps 부터 시작하고 batch size=2048 로 실험을 진행했습니다. 또한, 매 iteration 마다 $10^{-4}$ 에서 $0$ 으로 learning rate 를 linearly anneal 했다고 합니다. - -FID 성능을 확인해본 결과, 실험을 진행한 모든 4개의 데이터셋에 대해 progressive distillation 을 통해 4-8 sampling steps 만 진행해도 undistilled DDIM 그리고 stochastic sampler 에 준하는 성능을 보여주는 것을 확인할 수 있습니다. 4 sampling steps 까지 progressive distillation 진행하면서 발생하는 computational cost 가 baseline 모델 학습하는 것과 비슷한 부분을 생각했을때 엄청난 장점이라고 생각합니다. - -:::{figure-md} -progressive_distillation_15 - -Comparison between Distilled, DDIM, and Stochastic Sampler -::: - -추가적으로 CIFAR-10 데이터셋에서 타 fast sampling method 들과 FID 성능을 비교해본 결과입니다. - -:::{figure-md} -progressive_distillation_16 - -Comparison of fast sampling results -::: - -그리고 64x64 ImageNet 데이터셋에 distilled 모델로 생성한 예시 이미지들입니다. 동일한 seed 에 대해서 input noise 로부터 output image 까지 mapping 이 잘되는 부분을 확인할 수 있습니다. - -:::{figure-md} -progressive_distillation_17 - -Random samples from distilled 64 × 64 ImageNet models -::: - -마지막으로 distillation scheduling 에 대한 ablation study 도 논문에서 진행했습니다. 첫번째 ablation study 로는 매 distillation iteration 마다 parameter update 횟수를 $50k$ 에서 $25k, 10k, 5k$ 로 점차 줄이면서 FID 성능을 비교해보고, 두번째 ablation study 로는 매 distillation iteration 마다 sampling step 을 2배 대신에 4배씩 줄여가면서 student model 을 학습하여 성능을 비교합니다. 그 결과 parameter update 횟수를 현저히 줄임에도 불구하고 FID 성능이 크게 줄지 않는 반면, 각 iteration 마다 sampling step 을 4배씩 줄이는 학습방식으로는 모델 성능이 좋지 못한 부분을 확인할 수 있습니다. - -:::{figure-md} -progressive_distillation_18 - -Ablation study on fast sampling schedule -::: - -동일하게 CIFAR-10 외 ImageNet 그리고 LSUN 데이터셋에서 fast sampling schedule 을 적용한 성능 결과도 공유합니다. - -:::{figure-md} -progressive_distillation_18 - -50k updates vs 10k updates on ImageNet/LSUN datasets -::: +``` {admonition} Information +- **Title:** Progressive Distillation for Fast Sampling of Diffusion Models (ICLR 2022) + +- **Reference** + - Paper: [https://arxiv.org/abs/2202.00512](https://arxiv.org/abs/2202.00512) + - Code: [https://github.com/google-research/google-research/tree/master/diffusion_distillation/diffusion_distillation](https://github.com/google-research/google-research/tree/master/diffusion_distillation/diffusion_distillation) + +- **Author:** Sangwoo Jo + +- **Last updated on Nov. 14, 2023** +``` + +# Progressive Distillation for Fast Sampling of Diffusion Models + +## 1. Introduction + +Diffusion model 이 ImageNet generation task 에서 기존 BigGAN-deep 그리고 VQ-VAE-2 모델보다 FID/CAS score 기준으로 더 좋은 성능을 보여주며 많은 각광을 받고 있습니다. 그러나 sampling 속도가 느리다는 치명적인 단점을 가지고 있습니다. + +이를 해결하기 위해, 논문에서는 Progressive Distillation 기법을 소개하게 됩니다. 간략히 설명하자면 사전학습된 $N$-step DDIM 모델을 $N/2$-step student 모델에 distillation 하는 과정을 반복하여 최종적으로 4 steps 만으로도 state-of-the-art 모델을 수천번의 sampling steps 를 거쳐 생성한 이미지들과 유사한 모델 성능을 보여준다고 합니다. + +## 2. Background - Diffusion model in continuous time ## + +### 2.1. Definition + +Continuous 한 time domain 에서의 diffusion model 을 다음과 같은 요소들로 정의합니다. + +- Training data $x \sim p(x)$ +- Latent variables $z = \{z_t | t \in [0,1]\}$ + +여기서 $z_t$ 는 differentiable 한 noise schedule functions $\alpha_t, \sigma_t$ 로 값이 정의되고, 이 함수들은 log *signal-to-noise-ratio* $\lambda_t = \log[\alpha_t^2/\sigma_t^2]$ 가 monotonically decreasing 하도록 설정됩니다. 그리고 이들을 기반으로 다음과 같은 Markovian forward process 를 정의합니다. + +:::{figure-md} +progressive_distillation_01 + +Markovian Forward Process +::: + + where $0 \leq s < t \leq 1$ and $\sigma_{t|s}^2 = (1-e^{\lambda_t - \lambda_s}) \sigma_t^2$ + +### 2.2. Objective + +Diffusion model 의 objective 는 $\hat{x}_{\theta}(z_t)$ 모델에서 $z_t \sim q(z_t | x)$ 와 $\lambda_t$ 를 입력받아 다음과 같이 Mean Squared Error Loss 를 최소화하는 방향으로 원본 이미지 $x$ 를 예측하는 것입니다. 이때, $w(\lambda_t)$ 를 *weighting function* 이라 부릅니다. + +:::{figure-md} +progressive_distillation_02 + +Objective +::: + +where $t \sim U[0,1]$ + +### 2.3. Sampling + +Diffusion model 에서 sampling 하는 방식은 다양하게 존재합니다. + +#### 2.3.1. Ancestral Sampling - DDPM + +첫번째로는 DDPM 논문에서 소개하는 discrete time ancestral sampling 방식입니다. 위에 소개했던 notation 기준으로 reverse process 를 다음과 같이 수식적으로 표현 가능합니다. + +$$ +q(z_s | z_t,x) = N(z_s | \hat{\mu}_{s|t}(z_t,x), \tilde{\sigma}_{s|t}^2I) +$$ + +:::{figure-md} +progressive_distillation_03 + +Reverse Process +::: + +이를 기반으로 $z_1 \sim N(0,I)$ 로부터 다음과 같은 ancestral sampler 를 정의하게 됩니다. 이때, $\gamma$ 는 sampling 시 얼마나 많은 noise 를 추가할지 설정하는 hyperparameter 입니다. + +:::{figure-md} +progressive_distillation_04 + +Ancestral Sampler +::: + +#### 2.3.2. Probability Flow ODE + +반면에, Song et al. (2021c) 에서 forward diffusion process 를 SDE 로 표현할 수 있고, 이를 통한 sampling process 를 *probabiility flow* ODE 로 표현해서 구할 수 있다고 제시합니다. + +:::{figure-md} +progressive_distillation_05 + +Probability flow ODE +::: + +이때, $f(z_t,t) = \frac{d \log \alpha_t}{dt}z_t, g^2(t) = \frac{dσ_t^2}{dt} − 2 \frac{d\log \alpha_t}{dt}\sigma_t^2, \text{and}$ $\nabla_z \log \hat{p}_{\theta}(z_t) = \frac{\alpha_t\hat{x}_{\theta}(z_t) -z_t}{\sigma_t^2}$ 로 정의합니다. + +다시 말해 $z_1 \sim N(0,I)$ 로부터 이미지 $x$ 를 생성하는 task 를 위와 같이 ODE solver 문제로 해석할 수 있고, Euler rule 이나 Runge-Kutta method 등의 전통적인 ODE integrator 보다 DDIM sampler 를 적용했을때 성능이 가장 좋다고 논문에서 제시합니다. 아래 사진은 다양한 Probabiltity Flow ODE solver 들의 128x128 ImageNet 데이터셋 FID 성능을 비교한 결과입니다. + +:::{figure-md} +progressive_distillation_06 + +FID scores on 128 × 128 ImageNet for various probability flow ODE integrators +::: + +참고로 DDIM sampler 를 ODE solver 문제로 해석하면 다음과 같이 표현할 수 있고, 이 수식은 앞으로 자주 보게 될 예정입니다. + +:::{figure-md} +progressive_distillation_07 + +DDIM sampler +::: + +## 3. Progressive Distillation + +Diffusion model 을 더 효율적으로 sampling 하기 위해 소개한 *progressive distillation* 기법은 다음과 같은 절차로 진행됩니다. + +:::{figure-md} +progressive_distillation_08 + +Progressive Distillation +::: + +1. Standard diffusion training 기법으로 Teacher Diffusion Model 학습 +2. Student Model 정의 - Teacher Model 로부터 모델 구조 및 parameter 복사 +3. Student Model 학습 + 1. 이때, original data $x$ 대신에 $\tilde{x}$ 를 target 로 student model 을 학습합니다. $\tilde{x}$ 에 대한 공식은 아래 pseudocode 에 소개되는데, 이는 one-step student sample $\tilde{z}_{t''}$ 과 two-step teacher sample $z_{t''}$ 를 일치시키기 위해 나온 공식입니다. + 2. 2 DDIM steps of teacher model 결과와 1 DDIM step of student model 결과를 일치시키는 것이 핵심입니다. 여기서 $z_t$ 에서 $z_{t-1/N}$ 로 넘어가는 과정을 1 DDIM step 라 정의하고, $N$ 은 총 진행되는 student sampling steps 입니다. + 3. 기존 denoising model 학습 시, $x$ 가 $z_t$ 에 대해 deterministic 하지 않기 때문에 (다른 $x$ 값들에 대해 동일한 $z_t$ 생성 가능) 모델은 사실상 $x$ 가 아닌 weighted average of possible $x$ values 를 예측하는 모델이라고 합니다. 따라서, $z_t$에 대해 deterministic 한 $\tilde{x}(z_t)$ 를 예측하도록 학습한 student model 은 teacher model 보다 더 sharp 한 prediction 을 할 수 있다고 주장합니다. +4. Student Model 이 새로운 Teacher Model 이 되고 sampling steps $N$ → $N/2$ 로 줄어드는 이 과정을 계속 반복 + +이에 대한 pseudocode 도 확인해보겠습니다. + +- **PseudoCode** + + :::{figure-md} + progressive_distillation_09 + + Pseudocode for Progresssive Distillation + ::: + + +## 4. Diffusion Model Parameterization and Training Loss + +이제 denoising model $\hat{x}_{\theta}$ 와 reconstruction loss weight $w(\lambda_t)$ 에 대한 설정값에 대해 자세히 알아보겠습니다. 우선, 논문에서는 일반성을 잃지 않고 (without loss of generalization) *variance-preserving* diffusion process (i.e., $\alpha_t^2 + \sigma_t^2 = 1$ ) 라는 가정을 하게 됩니다. 더 자세하게는 cosine schedule $\alpha_t = cos(0.5\pi t)$ 를 사용합니다. + +DDPM 을 비롯한 대다수의 논문에서 이미지 $x$ 가 아닌 noise $\epsilon$ 를 예측하는 denoising model $\hat{\epsilon}_{\theta}(z_t)$ 를 정의합니다. $\epsilon$-space 에 정의된 손실함수에 $\hat{x_{\theta}}(z_t) = \frac{1}{\alpha_t}(z_t - \sigma_t \hat{\epsilon}_{\theta}(z_t))$ 식을 대입해보겠습니다. + +:::{figure-md} +progressive_distillation_10 + +Training loss on $\epsilon$-space and $x$-space +::: + +따라서, 이는 이미지 $x$ domain 에서 weighted reconstruction loss 를 적용하는 것과 동일하며 이때 weighting function $w(\lambda_t) = exp(\lambda_t), \lambda_t = \log[\alpha_t^2/\sigma_t^2]$ 로 정의할 수 있습니다. 그러나 이러한 standard training procedure 는 progressive distillation 에 적합하지 않다고 주장합니다. + +Standard diffusion training 기법에서는 다양한 범위 내에서의 signal-to-noise ratio $\alpha_t^2/\sigma_t^2$ 에서 모델이 학습되지만, distillation 이 진행될수록 이 signal-to-noise ratio 가 감소한다는 단점을 확인하게 됩니다. 더 자세히 설명하자면, $t$ 가 증가할수록 signal-to-noise-ratio $\alpha_t^2/\sigma_t^2$ 는 0 에 가까워지게 되고, $\hat{x_{\theta}}(z_t) = \frac{1}{\alpha_t}(z_t - \sigma_t \hat{\epsilon}_{\theta}(z_t))$ 에서 $\alpha_t \rightarrow 0$ 이므로 $\hat{\epsilon}_{\theta}(z_t)$ 에 대한 $x$-prediction 변화량이 점차적으로 커지게 됩니다. 이는 여러번의 training step 을 거칠 때 상관없지만, sampling steps 가 줄어들수록 치명적이게 됩니다. 최종적으로 sampling steps=1 일 때까지 progressively distillation 을 적용하면 모델의 입력으로는 단순한 pure noise $\epsilon$ (i.e., $\alpha_t = 0, \sigma_t = 1$ ) 이 들어가게 되고, $\epsilon$-prediction 과 $x$-prediction 의 상관관계가 완전히 사라지게 됩니다. 이는 위 loss function 에서 weighting function $w(\lambda_t) = 0$ 인 부분에서 확인할 수 있습니다. + +그래서 논문에서는 다음과 같은 세가지 방법으로 stable 한 $\hat{x}_{\theta}(z_t)$ prediction 을 구할 수 있는 방법들을 제시합니다. + +:::{figure-md} +progressive_distillation_11 + +Different parameterizations +::: + +Weighting function $w(\lambda_t)$ 도 두 가지 방안으로 실험했습니다. 이는 signal-to-noise ratio 가 0 으로 수렴하는 현상을 방지하도록 설정되었다고 합니다. + +:::{figure-md} +progressive_distillation_12 + +Different loss weighting functions +::: + +:::{figure-md} +progressive_distillation_13 + +Visualization of different loss weighting functions +::: + +## 5. Experiments + +논문에서 32x32 부터 128x128 까지 다양한 resolution 에서 모델 성능을 확인했습니다. 또한, cosine schedule $\alpha_t = cos(0.5 \pi t)$ 그리고 DDPM 에서 소개한 U-Net 아키텍쳐를 사용했으며 부가적으로 Nichol & Dhariwal (2021), Song et al. (2021c) 에서 사용된 BigGAN-style up/downsampling 기법을 활용했습니다. + +### 5.1. Model Parametrization and Training Loss + +아래 지표는 unconditional CIFAR-10 데이터셋에 앞써 소개드린 $\epsilon$-prediction 외에 다른 세 가지 parametrization 기법들로 original diffusion model 의 FID 와 Inception Score 성능을 확인해본 결과입니다. + +:::{figure-md} +progressive_distillation_14 + +Ablation Study on Parameterizations and Loss Weightings +::: + +성능을 비교해본 결과 $v$-prediction/$x$-prediction 과 Truncated SNR loss function 을 사용했을때 성능이 가장 좋은 부분을 확인할 수 있습니다. 또한, $\epsilon$-prediction 과 Truncated SNR loss function 의 조합을 사용하여 학습 시, unstable 한 convergence 를 보이는 현상도 볼 수 있습니다. + +위 실험결과를 바탕으로 progressive distillation 진행시 CIFAR-10 데이터셋에는 $x$-prediction, 그 외 데이터셋에서는 $(x,\epsilon)$-prediction 을 사용했다고 합니다. 더 자세한 hyperparameter setting 은 Appendix E 참조하시면 됩니다. + +### 5.2. Progressive Distillation + +논문에서 CIFAR-10, 64x64 downsampled ImageNet, 128 × 128 LSUN bedrooms, 그리고 128 × 128 LSUN Church-Outdoor 데이터셋에 progressive distillation 을 적용하여 모델 성능을 측정합니다. CIFAR-10 데이터셋 기준으로 teacher model 로부터 progressive distillation 진행 시 8192 steps 부터 시작하였고 batch size=128 로 설정하였습니다. 그 외 resolution 이 큰 데이터셋에 대해서는 1024 steps 부터 시작하고 batch size=2048 로 실험을 진행했습니다. 또한, 매 iteration 마다 $10^{-4}$ 에서 $0$ 으로 learning rate 를 linearly anneal 했다고 합니다. + +FID 성능을 확인해본 결과, 실험을 진행한 모든 4개의 데이터셋에 대해 progressive distillation 을 통해 4-8 sampling steps 만 진행해도 undistilled DDIM 그리고 stochastic sampler 에 준하는 성능을 보여주는 것을 확인할 수 있습니다. 4 sampling steps 까지 progressive distillation 진행하면서 발생하는 computational cost 가 baseline 모델 학습하는 것과 비슷한 부분을 생각했을때 엄청난 장점이라고 생각합니다. + +:::{figure-md} +progressive_distillation_15 + +Comparison between Distilled, DDIM, and Stochastic Sampler +::: + +추가적으로 CIFAR-10 데이터셋에서 타 fast sampling method 들과 FID 성능을 비교해본 결과입니다. + +:::{figure-md} +progressive_distillation_16 + +Comparison of fast sampling results +::: + +그리고 64x64 ImageNet 데이터셋에 distilled 모델로 생성한 예시 이미지들입니다. 동일한 seed 에 대해서 input noise 로부터 output image 까지 mapping 이 잘되는 부분을 확인할 수 있습니다. + +:::{figure-md} +progressive_distillation_17 + +Random samples from distilled 64 × 64 ImageNet models +::: + +마지막으로 distillation scheduling 에 대한 ablation study 도 논문에서 진행했습니다. 첫번째 ablation study 로는 매 distillation iteration 마다 parameter update 횟수를 $50k$ 에서 $25k, 10k, 5k$ 로 점차 줄이면서 FID 성능을 비교해보고, 두번째 ablation study 로는 매 distillation iteration 마다 sampling step 을 2배 대신에 4배씩 줄여가면서 student model 을 학습하여 성능을 비교합니다. 그 결과 parameter update 횟수를 현저히 줄임에도 불구하고 FID 성능이 크게 줄지 않는 반면, 각 iteration 마다 sampling step 을 4배씩 줄이는 학습방식으로는 모델 성능이 좋지 못한 부분을 확인할 수 있습니다. + +:::{figure-md} +progressive_distillation_18 + +Ablation study on fast sampling schedule +::: + +동일하게 CIFAR-10 외 ImageNet 그리고 LSUN 데이터셋에서 fast sampling schedule 을 적용한 성능 결과도 공유합니다. + +:::{figure-md} +progressive_distillation_18 + +50k updates vs 10k updates on ImageNet/LSUN datasets +::: diff --git a/_sources/docs/review/t2i_adapter.md b/_sources/docs/review/t2i_adapter.md old mode 100644 new mode 100755 index e5c1842b..b1a5b2f7 --- a/_sources/docs/review/t2i_adapter.md +++ b/_sources/docs/review/t2i_adapter.md @@ -1,366 +1,366 @@ -```{admonition} Information -- **Title:** T2I-Adapter: Learning Adapters to Dig out More Controllable Ability for Text-to-Image Diffusion Models - -- **Reference** - - Paper: [https://arxiv.org/abs/2302.08453](https://arxiv.org/abs/2302.08453) - - Code: [https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines/t2i_adapter](https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines/t2i_adapter) - -- **Author:** Sangwoo Jo - -- **Last updated on Oct. 03, 2023** -``` - -# T2I-Adapter - -## Introduction - -이번 시간에는 Tencent ARC Lab 에서 소개하는 T2I-Adapter 모델에 대해 알아볼 예정입니다. - -Stable Diffusion 을 비롯한 기존의 T2I 모델들이 난해한 prompt (e.g., “A car with flying wings” & “Iron Man with bunny ears”) 을 입력받을 시, 생성되는 이미지 퀄리티가 저하되는 부분을 확인할 수 있는데요. 논문에서는 T2I 모델이 low level (e.g., textures), middle level (e.g., edges), 그리고 high level (e.g., semantics) 에 대한 정보들을 implicit 하게 가지고 있지만, 이를 표현하기 위해서는 text prompt 만으로는 한계가 있고 보다 세밀한 controlling (e.g., color, structure) 이 필요하다고 서술합니다. 즉, T2I 모델의 internal knowledge 와 external guidance 의 alignment 에 대한 추가적인 학습이 필요하다고 주장합니다. - -:::{figure-md} -t2i_adapter_01 - -Effect of External Guidance -::: - -논문에서는 이를 해결하기 위해 T2I-Adapter 모델을 소개하고 다음과 같이 5가지 장점이 있다고 합니다. - -:::{figure-md} -t2i_adapter_02 - -Various Guidance of T2I-Adapter -::: - -- *Plug-and-play* : 기존의 T2I 모델의 generalization ability 유지 -- *Simple and small* : ~77M parameters and ~300M storage - - :::{figure-md} - t2i_adapter_03 - - ControlNet vs T2I-Adapter - ::: - - - ControlNet 같은 경우에 reverse diffusion process 에서 ControlNet 과 Unet 모두 연산작업이 실행됩니다. 이때 ControlNet 은 Unet Encoder 의 구조를 그대로 가져오기 때문에 parameter size 및 storage 용량이 크고, 이는 이미지 생성하는데 큰 bottleneck 이 됩니다. -- *Flexible* : 다양한 adapter (e.g., color, structure) 학습 가능 -- *Composable* : Multiple adapter 적용 가능 -- *Generalizable* : 동일한 구조를 가진 다른 T2I 모델에 동일한 adapter 적용 가능 - -## Method - -### 3.1. Preliminary: Stable Diffusion - -T2I-Adapter 의 기반이 되는 T2I 모델 Stable Diffusion 모델은 기본적으로 two-stage model 이고, autoencoder 와 Unet denoiser 로 구성되어 있습니다. Autoencoder 를 통해 이미지를 latent space 로 바꾸고 다시 복원하는 역할을 하고, Unet denoiser 는 diffusion process 를 통해 다음과 같은 손실함수를 최소화하는 방향으로 학습하게 됩니다. - -$$ -L = \mathbb{E}_{Z_{t}, C, \epsilon, t}(||\epsilon-\epsilon_{\theta}(Z_t, C)||_2^2) -$$ - -- $Z_t = \sqrt{\bar{\alpha}_t}Z_0 + \sqrt{1-\bar{\alpha}_t}\epsilon, \epsilon \sim N(0,I)$ := noised feature map at step t -- $C$ := conditional information -- $\epsilon_{\theta}$ := UNet denoiser - -Inference 시에는 random Gaussian distribution 을 따르는 $Z_T$, 그리고 text prompt 를 CLIP text encoder 에 입력함으로써 생성한 token $y$ 를 cross attention 을 통해 Unet denoiser $\epsilon_{\theta}$ 에 입력합니다. 최종적으로, diffusion process 로부터 생성된 denoise 된 latent feature 를 decoder 를 통해 최종 이미지를 생성하게 됩니다. 자세한 cross attention 하는 방식은 다음과 같습니다. - -:::{figure-md} -t2i_adapter_04 - -Cross Attention -::: - -- $W_Q, W_K, W_V$ := learnable projection matrices -- $\phi(\cdot), \tau(\cdot)$ := learnable embeddings - -### 3.2. Overview of T2I-Adapter - -논문에서는 다음과 같은 형태로 pre-trained 된 Stable Diffusion 을 비롯한 T2I 모델에 Adapter 를 추가하는 방식을 소개합니다. Adapter 의 자세한 구조는 다음과 같습니다. - -:::{figure-md} -t2i_adapter_05 - -Overview of T2I-Adapter -::: - -### 3.3. Adapter Design - -:::{figure-md} -t2i_adapter_06 - -Adapter Design -::: - -Conditional input 은 512x512 의 크기를 가지며, 이는 *pixel unshuffle downsampling* 을 통해 64x64 이미지로 변환이 되어 1개의 convolution layer 와 2개의 residual block 으로 구성된 *scale* 을 4번 통과하게 됩니다. 이때, 각 *scale* 을 거치고 나온 condition feature 를 $F_c^k$ 라 정의합니다. - -최종적으로 multi-scale condition feature $F_c = \{F_c^1, F_c^2, F_c^3, F_c^4\}$ 가 생성되고, 이는 Unet encoder 에서의 intermediate feature $F_{enc} = \{F_{enc}^1, F_{enc}^2, F_{enc}^3, F_{enc}^4\}$ 와 더해지게 됩니다. 이때, dimension 크기는 동일하도록 설정했기 때문에 덧셈 연산하는데 문제 없습니다. - -:::{figure-md} -t2i_adapter_07 - -Multi-Scale Condition Feature -::: - -해당 implementation code 도 살펴보겠습니다. - -- **T2I-Adapter module code** - - ```python - class FullAdapter(nn.Module): - def __init__( - self, - in_channels: int = 3, - channels: List[int] = [320, 640, 1280, 1280], - num_res_blocks: int = 2, - downscale_factor: int = 8, - ): - super().__init__() - - in_channels = in_channels * downscale_factor**2 - - self.unshuffle = nn.PixelUnshuffle(downscale_factor) - self.conv_in = nn.Conv2d(in_channels, channels[0], kernel_size=3, padding=1) - - self.body = nn.ModuleList( - [ - AdapterBlock(channels[0], channels[0], num_res_blocks), - *[ - AdapterBlock(channels[i - 1], channels[i], num_res_blocks, down=True) - for i in range(1, len(channels)) - ], - ] - ) - - self.total_downscale_factor = downscale_factor * 2 ** (len(channels) - 1) - - def forward(self, x: torch.Tensor) -> List[torch.Tensor]: - x = self.unshuffle(x) - x = self.conv_in(x) - - features = [] - - for block in self.body: - x = block(x) - features.append(x) - - return features - ``` - - ```python - class AdapterBlock(nn.Module): - def __init__(self, in_channels, out_channels, num_res_blocks, down=False): - super().__init__() - - self.downsample = None - if down: - self.downsample = Downsample2D(in_channels) - - self.in_conv = None - if in_channels != out_channels: - self.in_conv = nn.Conv2d(in_channels, out_channels, kernel_size=1) - - self.resnets = nn.Sequential( - *[AdapterResnetBlock(out_channels) for _ in range(num_res_blocks)], - ) - - def forward(self, x): - if self.downsample is not None: - x = self.downsample(x) - - if self.in_conv is not None: - x = self.in_conv(x) - - x = self.resnets(x) - - return x - - class AdapterResnetBlock(nn.Module): - def __init__(self, channels): - super().__init__() - self.block1 = nn.Conv2d(channels, channels, kernel_size=3, padding=1) - self.act = nn.ReLU() - self.block2 = nn.Conv2d(channels, channels, kernel_size=1) - - def forward(self, x): - h = x - h = self.block1(h) - h = self.act(h) - h = self.block2(h) - - return h + x - ``` - -- **SD + T2I-Adapter implementation code** - - ```python - # 7. Denoising loop - adapter_state = self.adapter(adapter_input) - for k, v in enumerate(adapter_state): - adapter_state[k] = v * adapter_conditioning_scale - if num_images_per_prompt > 1: - for k, v in enumerate(adapter_state): - adapter_state[k] = v.repeat(num_images_per_prompt, 1, 1, 1) - if do_classifier_free_guidance: - for k, v in enumerate(adapter_state): - adapter_state[k] = torch.cat([v] * 2, dim=0) - - num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order - with self.progress_bar(total=num_inference_steps) as progress_bar: - for i, t in enumerate(timesteps): - # expand the latents if we are doing classifier free guidance - latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents - latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) - - # predict the noise residual - noise_pred = self.unet( - latent_model_input, - t, - encoder_hidden_states=prompt_embeds, - cross_attention_kwargs=cross_attention_kwargs, - down_block_additional_residuals=[state.clone() for state in adapter_state], - ).sample - - # perform guidance - if do_classifier_free_guidance: - noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) - noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond) - - # compute the previous noisy sample x_t -> x_t-1 - latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).prev_sample - ``` - - -Adapter 종류로는 크게 structure 에 대한 conditioning 과 color 에 대한 conditioning 으로 분류할 수 있습니다. Structure controlling 으로는 대표적으로 sketch, depth map, semantic segmentation map, keypose 등이 있습니다. Color map 은 이미지를 우선적으로 *high bicubic downsampling* 을 통해 semantic 및 structural 한 정보를 제외시키고, *nearest upsampling* 기법으로 다시 원본 이미지 크기로 복원하는 작업을 통해 생성합니다. - -앞써 설명한 부분처럼 추가 학습 없이 여러 adapter 로 conditioning 할 수도 있습니다. Multi-adapter 로 controlling 할 시, 다음과 같이 각 adapter 로부터 나온 condition feature 에 weight $w_k$ 를 부여해 최종 condition feature 를 정의하게 됩니다. - -:::{figure-md} -t2i_adapter_08 - -Multi-Adapter Conditioning -::: - -### 3.4. Model Optimization - -모델 학습 시, SD 파라미터는 고정시킨 상태로 T2I-Adapter 파라미터만 학습합니다. 이때, T2-Adapter 손실함수는 SD 학습 시와 유사하게 다음과 같이 정의합니다. - -$$ -L_{AD} = \mathbb{E}_{Z_{0}, t, F_c, \epsilon \sim N(0,I)}[||\epsilon-\epsilon_{\theta}(Z_t, t, \tau(y), F_c)||_2^2] -$$ - -where $t \sim U(0,T)$ - -**Non-uniform time step sampling during training** - -Diffusion 모델 학습 시와 동일하게, time embedding 을 adapter 에 input 으로 넣으면서 성능 개선 효과가 있는 것을 확인했지만 매 time step $t$ 마다 $F_c$ 를 conditioning 하는 것은 computationally expensive 합니다. - -따라서, 논문에서는 DDIM inference sampling 을 크게 3가지 stage (i.e., beginning, middle, late stage) 로 분류하는 방법을 소개합니다. 실험해본 결과, middle 그리고 late stage 에 적용하는 것보다 beginning stage 에서 guidance 를 주는 효과가 더 크다고 합니다. - -:::{figure-md} -t2i_adapter_09 - -DDIM Inference Sampling Stages -::: - -따라서, 최대한 time step $t$ 가 early sampling stage 에 포함되도록 다음 수식처럼 non-uniformly 하게 sampling 작업을 진행했고, 이에 대한 결과도 공유합니다. - -$$ -t = (1-(t/T)^3) \times T, t \in U(0,T) -$$ - -:::{figure-md} -t2i_adapter_10 - -Effect of Cubic Sampling -::: - -## Experiment - -### 4.1. Implementation Details - -T2I-Adapter 학습 시, hyperparameter 및 데이터셋 구축 상세사항은 다음과 같습니다. - -- Hyperparameters - - 10 epochs - - Batch size = 8 - - Learning rate = $1 \times 10^{-5}$ - - Adam optimizer - - 4X NVIDIA Tesla 32G-V100 GPUs (3 days) - -- 실험별 데이터셋 구축 - - *Sketch Map* - - COCO17 데이터셋 - 164K images - - PiDiNet 를 활용해 sketch map 생성 - - *Semantic segmentation map* - - COCO-Stuff 데이터셋 - 164K images - - *Keypoints & Color & Depth maps* - - LAION-AESTHETICS 데이터셋로부터 600K images-text pairs 추출 - - MM-Pose, MiDaS 모델로 각각 Keypoint, Depth map 생성 - -### 4.2. Comparison - -기존 SOTA 모델들과 정량적인 수치로 비교하는데 FID 와 CLIP Score 를 사용하였고, 하단 사진처럼 기존 GAN-based 그리고 diffusion-based method 모델들보다 성능이 좋습니다. - -:::{figure-md} -t2i_adapter_11 - -Qualitative Comparison -::: - -:::{figure-md} -t2i_adapter_12 - -Quantitative Comparisoin -::: - -### 4.3. Applications - -해당 예시들은 다양한 single adapter controlling 에 대한 결과들을 보여줍니다. 특히 인상적인 부분은 sketch 로 controlling 시, sketch 가 정확하지 않아도 이미지 생성에 robust 한 성능을 보여주는 것을 확인할 수 있습니다. - -:::{figure-md} -t2i_adapter_13 - -Visualization of Single-Adapter Controlling -::: - -또한, image editing 도 가능합니다. SD inpainting mode 로 특정 지역을 masking 한 후, T2I-Adapter 를 통해 image editing 을 한 예시 사진입니다. Adapter 없이, SD inpainting 만으로는 성능이 좋지 못하다고 합니다. - -:::{figure-md} -t2i_adapter_14 - -Image Editing with T2I-Adapter -::: - -아래 예시는 multiple adapter 를 적용한 것로 위에서부터 아래로 각각 depth + keypose 그리고 sketch + color map 을 conditioning 한 결과입니다. - -:::{figure-md} -t2i_adapter_15 - -Composable Controlling -::: - -마지막으로, 장점들 중 하나로 명시되었던 generalization ability 를 보여준 사례입니다. 학습 완료한 Adapter 를 동일한 구조를 가진 T2I 모델에 적용 가능한 것을 확인할 수 있습니다. - -:::{figure-md} -t2i_adapter_16 - -Generalizable Controlling -::: - -### 4.4. Ablation Study - -논문에서는 guidance mode, 그리고 complexity 에 대한 ablation study 를 진행했습니다. - -SD 모델은 encoder 그리고 decoder 에 각각 4개의 scale (i.e., 64×64, 32×32, 16×16, 8×8) 을 가지고 있는데, 하단 table 처럼 각각 다른 scale 에 adapter guidance 를 적용하면서 FID 성능을 비교했습니다. Scale Number 가 4보다 작을 경우, large scale 에 순차적으로 guidance 를 적용했습니다. 그 결과, Unet encoder 에만 4 scales 모두 guidance 를 적용하는 것이 성능이 제일 좋다고 합니다. - -:::{figure-md} -t2i_adapter_17 - -Guidance Mode -::: - -또한, condition map 는 비교적 sparse 하기 때문에 더 경량화된 adapter 를 사용해도 성능이 좋은 부분을 하단 예시처럼 확인할 수 있었다고 합니다. 더 자세하게는, adapter block 의 intermediate channel 숫자를 바꿔가며 adapter-small, adapter-tiny 모델을 각각 x4, x8 compression 작업을 진행했습니다. - -:::{figure-md} -t2i_adapter_18 - -Complexity Ablation -::: +```{admonition} Information +- **Title:** T2I-Adapter: Learning Adapters to Dig out More Controllable Ability for Text-to-Image Diffusion Models + +- **Reference** + - Paper: [https://arxiv.org/abs/2302.08453](https://arxiv.org/abs/2302.08453) + - Code: [https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines/t2i_adapter](https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines/t2i_adapter) + +- **Author:** Sangwoo Jo + +- **Last updated on Oct. 03, 2023** +``` + +# T2I-Adapter + +## Introduction + +이번 시간에는 Tencent ARC Lab 에서 소개하는 T2I-Adapter 모델에 대해 알아볼 예정입니다. + +Stable Diffusion 을 비롯한 기존의 T2I 모델들이 난해한 prompt (e.g., “A car with flying wings” & “Iron Man with bunny ears”) 을 입력받을 시, 생성되는 이미지 퀄리티가 저하되는 부분을 확인할 수 있는데요. 논문에서는 T2I 모델이 low level (e.g., textures), middle level (e.g., edges), 그리고 high level (e.g., semantics) 에 대한 정보들을 implicit 하게 가지고 있지만, 이를 표현하기 위해서는 text prompt 만으로는 한계가 있고 보다 세밀한 controlling (e.g., color, structure) 이 필요하다고 서술합니다. 즉, T2I 모델의 internal knowledge 와 external guidance 의 alignment 에 대한 추가적인 학습이 필요하다고 주장합니다. + +:::{figure-md} +t2i_adapter_01 + +Effect of External Guidance +::: + +논문에서는 이를 해결하기 위해 T2I-Adapter 모델을 소개하고 다음과 같이 5가지 장점이 있다고 합니다. + +:::{figure-md} +t2i_adapter_02 + +Various Guidance of T2I-Adapter +::: + +- *Plug-and-play* : 기존의 T2I 모델의 generalization ability 유지 +- *Simple and small* : ~77M parameters and ~300M storage + + :::{figure-md} + t2i_adapter_03 + + ControlNet vs T2I-Adapter + ::: + + - ControlNet 같은 경우에 reverse diffusion process 에서 ControlNet 과 Unet 모두 연산작업이 실행됩니다. 이때 ControlNet 은 Unet Encoder 의 구조를 그대로 가져오기 때문에 parameter size 및 storage 용량이 크고, 이는 이미지 생성하는데 큰 bottleneck 이 됩니다. +- *Flexible* : 다양한 adapter (e.g., color, structure) 학습 가능 +- *Composable* : Multiple adapter 적용 가능 +- *Generalizable* : 동일한 구조를 가진 다른 T2I 모델에 동일한 adapter 적용 가능 + +## Method + +### 3.1. Preliminary: Stable Diffusion + +T2I-Adapter 의 기반이 되는 T2I 모델 Stable Diffusion 모델은 기본적으로 two-stage model 이고, autoencoder 와 Unet denoiser 로 구성되어 있습니다. Autoencoder 를 통해 이미지를 latent space 로 바꾸고 다시 복원하는 역할을 하고, Unet denoiser 는 diffusion process 를 통해 다음과 같은 손실함수를 최소화하는 방향으로 학습하게 됩니다. + +$$ +L = \mathbb{E}_{Z_{t}, C, \epsilon, t}(||\epsilon-\epsilon_{\theta}(Z_t, C)||_2^2) +$$ + +- $Z_t = \sqrt{\bar{\alpha}_t}Z_0 + \sqrt{1-\bar{\alpha}_t}\epsilon, \epsilon \sim N(0,I)$ := noised feature map at step t +- $C$ := conditional information +- $\epsilon_{\theta}$ := UNet denoiser + +Inference 시에는 random Gaussian distribution 을 따르는 $Z_T$, 그리고 text prompt 를 CLIP text encoder 에 입력함으로써 생성한 token $y$ 를 cross attention 을 통해 Unet denoiser $\epsilon_{\theta}$ 에 입력합니다. 최종적으로, diffusion process 로부터 생성된 denoise 된 latent feature 를 decoder 를 통해 최종 이미지를 생성하게 됩니다. 자세한 cross attention 하는 방식은 다음과 같습니다. + +:::{figure-md} +t2i_adapter_04 + +Cross Attention +::: + +- $W_Q, W_K, W_V$ := learnable projection matrices +- $\phi(\cdot), \tau(\cdot)$ := learnable embeddings + +### 3.2. Overview of T2I-Adapter + +논문에서는 다음과 같은 형태로 pre-trained 된 Stable Diffusion 을 비롯한 T2I 모델에 Adapter 를 추가하는 방식을 소개합니다. Adapter 의 자세한 구조는 다음과 같습니다. + +:::{figure-md} +t2i_adapter_05 + +Overview of T2I-Adapter +::: + +### 3.3. Adapter Design + +:::{figure-md} +t2i_adapter_06 + +Adapter Design +::: + +Conditional input 은 512x512 의 크기를 가지며, 이는 *pixel unshuffle downsampling* 을 통해 64x64 이미지로 변환이 되어 1개의 convolution layer 와 2개의 residual block 으로 구성된 *scale* 을 4번 통과하게 됩니다. 이때, 각 *scale* 을 거치고 나온 condition feature 를 $F_c^k$ 라 정의합니다. + +최종적으로 multi-scale condition feature $F_c = \{F_c^1, F_c^2, F_c^3, F_c^4\}$ 가 생성되고, 이는 Unet encoder 에서의 intermediate feature $F_{enc} = \{F_{enc}^1, F_{enc}^2, F_{enc}^3, F_{enc}^4\}$ 와 더해지게 됩니다. 이때, dimension 크기는 동일하도록 설정했기 때문에 덧셈 연산하는데 문제 없습니다. + +:::{figure-md} +t2i_adapter_07 + +Multi-Scale Condition Feature +::: + +해당 implementation code 도 살펴보겠습니다. + +- **T2I-Adapter module code** + + ```python + class FullAdapter(nn.Module): + def __init__( + self, + in_channels: int = 3, + channels: List[int] = [320, 640, 1280, 1280], + num_res_blocks: int = 2, + downscale_factor: int = 8, + ): + super().__init__() + + in_channels = in_channels * downscale_factor**2 + + self.unshuffle = nn.PixelUnshuffle(downscale_factor) + self.conv_in = nn.Conv2d(in_channels, channels[0], kernel_size=3, padding=1) + + self.body = nn.ModuleList( + [ + AdapterBlock(channels[0], channels[0], num_res_blocks), + *[ + AdapterBlock(channels[i - 1], channels[i], num_res_blocks, down=True) + for i in range(1, len(channels)) + ], + ] + ) + + self.total_downscale_factor = downscale_factor * 2 ** (len(channels) - 1) + + def forward(self, x: torch.Tensor) -> List[torch.Tensor]: + x = self.unshuffle(x) + x = self.conv_in(x) + + features = [] + + for block in self.body: + x = block(x) + features.append(x) + + return features + ``` + + ```python + class AdapterBlock(nn.Module): + def __init__(self, in_channels, out_channels, num_res_blocks, down=False): + super().__init__() + + self.downsample = None + if down: + self.downsample = Downsample2D(in_channels) + + self.in_conv = None + if in_channels != out_channels: + self.in_conv = nn.Conv2d(in_channels, out_channels, kernel_size=1) + + self.resnets = nn.Sequential( + *[AdapterResnetBlock(out_channels) for _ in range(num_res_blocks)], + ) + + def forward(self, x): + if self.downsample is not None: + x = self.downsample(x) + + if self.in_conv is not None: + x = self.in_conv(x) + + x = self.resnets(x) + + return x + + class AdapterResnetBlock(nn.Module): + def __init__(self, channels): + super().__init__() + self.block1 = nn.Conv2d(channels, channels, kernel_size=3, padding=1) + self.act = nn.ReLU() + self.block2 = nn.Conv2d(channels, channels, kernel_size=1) + + def forward(self, x): + h = x + h = self.block1(h) + h = self.act(h) + h = self.block2(h) + + return h + x + ``` + +- **SD + T2I-Adapter implementation code** + + ```python + # 7. Denoising loop + adapter_state = self.adapter(adapter_input) + for k, v in enumerate(adapter_state): + adapter_state[k] = v * adapter_conditioning_scale + if num_images_per_prompt > 1: + for k, v in enumerate(adapter_state): + adapter_state[k] = v.repeat(num_images_per_prompt, 1, 1, 1) + if do_classifier_free_guidance: + for k, v in enumerate(adapter_state): + adapter_state[k] = torch.cat([v] * 2, dim=0) + + num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order + with self.progress_bar(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + # expand the latents if we are doing classifier free guidance + latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents + latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) + + # predict the noise residual + noise_pred = self.unet( + latent_model_input, + t, + encoder_hidden_states=prompt_embeds, + cross_attention_kwargs=cross_attention_kwargs, + down_block_additional_residuals=[state.clone() for state in adapter_state], + ).sample + + # perform guidance + if do_classifier_free_guidance: + noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) + noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond) + + # compute the previous noisy sample x_t -> x_t-1 + latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).prev_sample + ``` + + +Adapter 종류로는 크게 structure 에 대한 conditioning 과 color 에 대한 conditioning 으로 분류할 수 있습니다. Structure controlling 으로는 대표적으로 sketch, depth map, semantic segmentation map, keypose 등이 있습니다. Color map 은 이미지를 우선적으로 *high bicubic downsampling* 을 통해 semantic 및 structural 한 정보를 제외시키고, *nearest upsampling* 기법으로 다시 원본 이미지 크기로 복원하는 작업을 통해 생성합니다. + +앞써 설명한 부분처럼 추가 학습 없이 여러 adapter 로 conditioning 할 수도 있습니다. Multi-adapter 로 controlling 할 시, 다음과 같이 각 adapter 로부터 나온 condition feature 에 weight $w_k$ 를 부여해 최종 condition feature 를 정의하게 됩니다. + +:::{figure-md} +t2i_adapter_08 + +Multi-Adapter Conditioning +::: + +### 3.4. Model Optimization + +모델 학습 시, SD 파라미터는 고정시킨 상태로 T2I-Adapter 파라미터만 학습합니다. 이때, T2-Adapter 손실함수는 SD 학습 시와 유사하게 다음과 같이 정의합니다. + +$$ +L_{AD} = \mathbb{E}_{Z_{0}, t, F_c, \epsilon \sim N(0,I)}[||\epsilon-\epsilon_{\theta}(Z_t, t, \tau(y), F_c)||_2^2] +$$ + +where $t \sim U(0,T)$ + +**Non-uniform time step sampling during training** + +Diffusion 모델 학습 시와 동일하게, time embedding 을 adapter 에 input 으로 넣으면서 성능 개선 효과가 있는 것을 확인했지만 매 time step $t$ 마다 $F_c$ 를 conditioning 하는 것은 computationally expensive 합니다. + +따라서, 논문에서는 DDIM inference sampling 을 크게 3가지 stage (i.e., beginning, middle, late stage) 로 분류하는 방법을 소개합니다. 실험해본 결과, middle 그리고 late stage 에 적용하는 것보다 beginning stage 에서 guidance 를 주는 효과가 더 크다고 합니다. + +:::{figure-md} +t2i_adapter_09 + +DDIM Inference Sampling Stages +::: + +따라서, 최대한 time step $t$ 가 early sampling stage 에 포함되도록 다음 수식처럼 non-uniformly 하게 sampling 작업을 진행했고, 이에 대한 결과도 공유합니다. + +$$ +t = (1-(t/T)^3) \times T, t \in U(0,T) +$$ + +:::{figure-md} +t2i_adapter_10 + +Effect of Cubic Sampling +::: + +## Experiment + +### 4.1. Implementation Details + +T2I-Adapter 학습 시, hyperparameter 및 데이터셋 구축 상세사항은 다음과 같습니다. + +- Hyperparameters + - 10 epochs + - Batch size = 8 + - Learning rate = $1 \times 10^{-5}$ + - Adam optimizer + - 4X NVIDIA Tesla 32G-V100 GPUs (3 days) + +- 실험별 데이터셋 구축 + - *Sketch Map* + - COCO17 데이터셋 - 164K images + - PiDiNet 를 활용해 sketch map 생성 + - *Semantic segmentation map* + - COCO-Stuff 데이터셋 - 164K images + - *Keypoints & Color & Depth maps* + - LAION-AESTHETICS 데이터셋로부터 600K images-text pairs 추출 + - MM-Pose, MiDaS 모델로 각각 Keypoint, Depth map 생성 + +### 4.2. Comparison + +기존 SOTA 모델들과 정량적인 수치로 비교하는데 FID 와 CLIP Score 를 사용하였고, 하단 사진처럼 기존 GAN-based 그리고 diffusion-based method 모델들보다 성능이 좋습니다. + +:::{figure-md} +t2i_adapter_11 + +Qualitative Comparison +::: + +:::{figure-md} +t2i_adapter_12 + +Quantitative Comparisoin +::: + +### 4.3. Applications + +해당 예시들은 다양한 single adapter controlling 에 대한 결과들을 보여줍니다. 특히 인상적인 부분은 sketch 로 controlling 시, sketch 가 정확하지 않아도 이미지 생성에 robust 한 성능을 보여주는 것을 확인할 수 있습니다. + +:::{figure-md} +t2i_adapter_13 + +Visualization of Single-Adapter Controlling +::: + +또한, image editing 도 가능합니다. SD inpainting mode 로 특정 지역을 masking 한 후, T2I-Adapter 를 통해 image editing 을 한 예시 사진입니다. Adapter 없이, SD inpainting 만으로는 성능이 좋지 못하다고 합니다. + +:::{figure-md} +t2i_adapter_14 + +Image Editing with T2I-Adapter +::: + +아래 예시는 multiple adapter 를 적용한 것로 위에서부터 아래로 각각 depth + keypose 그리고 sketch + color map 을 conditioning 한 결과입니다. + +:::{figure-md} +t2i_adapter_15 + +Composable Controlling +::: + +마지막으로, 장점들 중 하나로 명시되었던 generalization ability 를 보여준 사례입니다. 학습 완료한 Adapter 를 동일한 구조를 가진 T2I 모델에 적용 가능한 것을 확인할 수 있습니다. + +:::{figure-md} +t2i_adapter_16 + +Generalizable Controlling +::: + +### 4.4. Ablation Study + +논문에서는 guidance mode, 그리고 complexity 에 대한 ablation study 를 진행했습니다. + +SD 모델은 encoder 그리고 decoder 에 각각 4개의 scale (i.e., 64×64, 32×32, 16×16, 8×8) 을 가지고 있는데, 하단 table 처럼 각각 다른 scale 에 adapter guidance 를 적용하면서 FID 성능을 비교했습니다. Scale Number 가 4보다 작을 경우, large scale 에 순차적으로 guidance 를 적용했습니다. 그 결과, Unet encoder 에만 4 scales 모두 guidance 를 적용하는 것이 성능이 제일 좋다고 합니다. + +:::{figure-md} +t2i_adapter_17 + +Guidance Mode +::: + +또한, condition map 는 비교적 sparse 하기 때문에 더 경량화된 adapter 를 사용해도 성능이 좋은 부분을 하단 예시처럼 확인할 수 있었다고 합니다. 더 자세하게는, adapter block 의 intermediate channel 숫자를 바꿔가며 adapter-small, adapter-tiny 모델을 각각 x4, x8 compression 작업을 진행했습니다. + +:::{figure-md} +t2i_adapter_18 + +Complexity Ablation +::: diff --git a/_sources/docs/review/vae.md b/_sources/docs/review/vae.md old mode 100644 new mode 100755 index fde3cd26..82ac5fcf --- a/_sources/docs/review/vae.md +++ b/_sources/docs/review/vae.md @@ -1,175 +1,175 @@ -```{admonition} Information -- **Title:** Auto-Encoding Variational Bayes (ICLR 2014) - -- **Reference** - - Paper: [https://arxiv.org/abs/1312.6114](https://arxiv.org/abs/1312.6114) - - Code: [https://github.com/GunhoChoi/PyTorch-FastCampus](https://github.com/GunhoChoi/PyTorch-FastCampus) - - [Smart Design Lab @KAIST | 딥러닝 Ch.3.3 VAE](https://www.youtube.com/watch?v=GbCAwVVKaHY&t=95s) - -- **Author:** Sangwoo Jo - -- **Editor:** Changhwan Lee - -- **Last updated on Apr. 26, 2024** -``` - -# VAE - - -## Introduction - -논문의 Introduction 에 다음과 같은 문구가 적혀있는데요. - -> "Variational Bayesian (VB) approach involves the optimization of an approximation to the intractable posterior” -> - -이처럼 Variational Autoencoder 는 논문에서 제시하는 Auto-Encoding Variational Bayes(AEVB) 알고리즘 중 하나로, intractable 한 posterior 분포를 다루기 쉬운 뉴럴 네트워크로 근사함으로써 Variational Inference 를 하게 됩니다. - -이가 의미하는 바가 무엇인지 한번 살펴보도록 하겠습니다. - -## Intractability - -Variational Autoencoder(VAE) 는 크게 Encoder 와 Decoder 부분으로 이루어져 있습니다. 더 자세하게는, Encoder는 입력 데이터 $x$ 를 받아서 잠재변수(Latent Variable) $z$ 를 만들어내고, Decoder 는 잠재변수 $z$ 를 활용해서 다시 $x$ 를 복원하게 됩니다. - -:::{figure-md} -vae_01 - -Variational Autoencoder(VAE) Architecture -::: - -Variational Autoencoder (VAE) 는 AutoEncoder 와 달리 확률 분포를 이용해 어떤 새로운 데이터를 생성하는 Decoder 부분에 초점을 둡니다. 이때 논문에서 다음과 같은 assumption 들을 내립니다. 첫번째로 $p_{\theta}(z)$ 와 $p_{\theta}(x|z)$ 는 parametric 한 distribution 을 가지고 있고, 이는 $\theta$ 와 $z$ 에 대해 differentiable 하다는 가정을 내립니다. 이 때, 대표적으로 $p_{\theta}(z)$ 는 Gaussian distribution 을 따르고 $p_{\theta}(x|z)$ 는 생성하고자 하는 데이터 성질에 따라 Bernoulli 혹은 Gaussian distribution 을 따르도록 정의합니다. 그리고 $p_{\theta}(x|z)$ 의 파라미터 $p$ 혹은 $(\mu, \sigma)$ 는 아래 그림과 같이 뉴럴 네트워크로 구성된 Decoder 로부터 계산이 됩니다. - -:::{figure-md} -vae_07 - -Overview of Bernoulli(left) and Gaussian(right) Decoder -::: - -이를 기반으로 우리는 ML/MAP estimation 을 통해 marginal likelihood $p_{\theta}(x)$ 를 최대화시키는 파라미터 $\theta$ 를 구하는 것이 목적입니다. 하지만, $p_{\theta}(x) = \int p_{\theta}(z)p_{\theta}(x|z) \ dz$ 는 intractable 하기 때문에 $p_{\theta}(z|x)$ 를 계산하기 위한 Encoder 가 등장하게 됩니다. - -$$ -p_{\theta}(x) = p_{\theta}(x|z)p_{\theta}(z)/p_{\theta}(z|x) -$$ - -여기서 $p_{\theta}(z|x)$ 역시 intractable 하기 때문에 이를 잘 근사화하는 뉴럴 네트워크 $q_{\phi}(z|x)$ 를 정의하게 되고, 이러한 과정을 변분추론(Variational Inference) 라고 합니다. 아래는 Encoder 와 Decoder 를 함께 도식화한 그림입니다. 정리하자면, MLP Encoder 를 통해 계산된 $\mu$ 와 $\sigma$ 로 잠재변수 $z$ 를 생성하게 되고, 이를 기반으로 Decoder 는 원본 이미지와 유사한 데이터를 생성하게 됩니다. - -:::{figure-md} -vae_08 - -Overview of Gaussian Encoder and Decoder -::: - -해당 implementation code 도 확인해보겠습니다. - -- **Encoder 구현 code** - - ```python - - class Encoder(nn.Module): - def __init__(self): - super(Encoder,self).__init__() - self.fc1_1 = nn.Linear(784, hidden_size) - self.fc1_2 = nn.Linear(784, hidden_size) - self.relu = nn.ReLU() - - def encode(self,x): - x = x.view(batch_size,-1) - mu = self.relu(self.fc1_1(x)) - log_var = self.relu(self.fc1_2(x)) - - return mu,log_var - - def reparametrize(self, mu, logvar): - std = logvar.mul(0.5).exp_() - - eps = torch.FloatTensor(std.size()).normal_() - eps = Variable(eps).cuda() - - return eps.mul(std).add_(mu) - - def forward(self,x): - mu, logvar = self.encode(x) - reparam = self.reparametrize(mu,logvar) - - return mu,logvar,reparam - ``` - -- **Decoder 구현 code** - - ```python - class Decoder(nn.Module): - def __init__(self): - super(Decoder,self).__init__() - self.fc1 = nn.Linear(hidden_size, 784) - self.sigmoid = nn.Sigmoid() - - def forward(self,x): - out = self.fc1(x) - out = self.sigmoid(out) - out = out.view(batch_size,28,28,1) - - return out - ``` - -## SGVB(Stochastic Gradient Variational Bayes) - -이로써 우리는 marginal likelihood $p_{\theta}(x)$ 를 최대화시키는 파라미터 $(\theta, \phi)$ 를 찾으면 되고, 이에 대한 lower bound 를 수식적으로 표현하면 손실함수(loss function) 를 다음과 같이 Reconstruction Error 와 Regularization term 로 분할할 수 있습니다. - -$$ -L(\theta, \phi;x_i) = \arg \min_{\theta, \phi} \sum_{i} -\mathbb{E}\_{q_{\phi}(z|x_i)}[\log(p(x_i|g_{\theta}(z))] + KL(q_{\phi}(z|x_i)||p(z)) -$$ - -Reconstruction Error 는 Decoder 에서 생성하는 데이터가 최대한 원본 데이터와 유사하도록 하는 term 이고, Regularization 은 Encoder 에서 만드는 잠재변수의 분포가 저희가 부여한 prior distribution 이랑 가깝도록 설정하는 term 입니다. 이때, Reconstruction Error 는 다음과 같은 Monte Carlo Estimator $\tilde{\mathcal{L}}^{B}$ 로 근사값을 구할 수 있고, 하나의 sample 을 계산하는 것도 연산량이 많으므로 논문에서는 sample size $L$ 을 1 로 설정합니다. - -$$ \tilde{\mathcal{L}}^{B}(\theta, \phi; x^{(i)})=-D_{KL}(q_{\phi}(z|x^{(i)})||p_{\theta}(z))+\frac{1}{L}\sum^{L}_{l=1} \log p\_\theta (x^{(i)}|z^{(i,l)})) $$ - -Lower bound 에 대한 수식을 변환하여 수식 전체에 대한 Monte Carlo Estimator $\tilde{\mathcal{L}}^{A}$ 로도 근사값을 구할 수 있는데 이는 평균적으로 $\tilde{\mathcal{L}}^{B}$ 에 비해 variance 가 높다고 합니다. - -$$ \tilde{\mathcal{L}}^{A}(\theta,\phi;x^{(i)})=\frac{1}{L}\sum^{L}_{l=1}\log p_{\theta}(x^{(i)},z^{(i,l)})-\log q_{\phi}(z^{(i,l)}|x^{(i)}) $$ - - -## Reparameterization Trick - -논문에서는 모델 학습 시 backpropagation 을 원활히 사용할 수 있도록 reparameterization trick 을 소개합니다. 잠재변수 $z$ 를 Encoder 에서 나온 $\mu$ 와 $\sigma$ 로 직접 샘플링하지 않고, backpropagation 이 가능하도록 Gaussian noise 를 우선적으로 샘플링하고 해당 $\mu$ 와 $\sigma$ 를 각각 더하고 곱하게 됩니다. 이는 $q_{\phi}(z|x)$ 이 Gaussian distribution 을 따른다고 설정했을 때이고, $q_{\phi}(z|x)$ 에 대해 다른 분포를 가정하여 그에 따른 다른 reparameterization trick 을 시도할 수 있다고 논문에 명시되어 있습니다. - -하단에는 Gaussian 분포에 대한 reparameterization trick 를 도식화한 그림입니다. 왼쪽에는 reparameterization trick이 적용되지 않은 경우로 $\mu$ 나 $\sigma$ 값이 고정되어 있어도 $\mathcal{N}(\mu,\sigma^2)$ 에서 샘플링하므로 $z$ 는 랜덤한 값이 되고 loss function 을 $\mu$ 나 $\sigma$ 에 대해 미분할 수 없어 backpropagation 을 적용하기가 어렵습니다. 반면에, 오른쪽처럼 reparameterization trick 을 적용하면, $z$ 가 deterministic 한 형태로 정의되고 $\mu$ 나 $\sigma$ 에 대한 변수로도 미분이 가능해지기 때문에 backpropagation 을 활용하여 모델을 학습시킬 수 있습니다. - -:::{figure-md} -vae_05 - -Overview of Reparameterization Trick -::: - -## Training Algorithm - -모델을 학습하는 전체적인 과정은 아래와 같습니다. - -:::{figure-md} -vae_09 - -Overview of Training Algorithm -::: - -## Experiments -논문에서는 MNIST 와 Frey Face 데이터셋에 대해 AEVB(Auto-Encoder variational Bayesian)와 wake-sleep 알고리즘를 적용해서 비교합니다. 여기서 Frey Face 데이터셋은 continuous 하므로 Gaussian Decoder 를 사용합니다. 실험결과는 아래 그림과 같습니다. - -:::{figure-md} -vae_10 - -Experimental Results - Likelihood lower bound -::: - -해당 그림처럼 lower bound 를 최적화하는데 AEVB 알고리즘이 더 빠르게 수렴하며 모든 실험에서 성능적으로도 더 나은 부분을 확인할 수 있습니다. - -:::{figure-md} -vae_11 - -Experimental Results - Marginal likelihood -::: - -또한, latent variable $z$ 의 차원이 작으면 marginal likelihood 를 직접 Monte Carlo EM 을 할용하여 구할 수 있는데, 이에 대한 결과도 논문에서 보여줍니다. Monte Carlo EM 의 경우 학습 데이터가 많으면 수렴이 되지 않는 부분을 확인할 수 있습니다. - - -## Summary - -AutoEncoder 는 latent space 에 하나의 값으로 지정해줬다면, VAE 는 평균 그리고 분산 파라미터들과 Gaussian 분포를 가진 샘플을 통해 잠재변수를 생성합니다. 그리고 VAE 를 실제로 사용해보면 생성된 데이터 image quality 가 낮다는 단점을 가지고 있다고 합니다. +```{admonition} Information +- **Title:** Auto-Encoding Variational Bayes (ICLR 2014) + +- **Reference** + - Paper: [https://arxiv.org/abs/1312.6114](https://arxiv.org/abs/1312.6114) + - Code: [https://github.com/GunhoChoi/PyTorch-FastCampus](https://github.com/GunhoChoi/PyTorch-FastCampus) + - [Smart Design Lab @KAIST | 딥러닝 Ch.3.3 VAE](https://www.youtube.com/watch?v=GbCAwVVKaHY&t=95s) + +- **Author:** Sangwoo Jo + +- **Editor:** Changhwan Lee + +- **Last updated on Apr. 26, 2024** +``` + +# VAE + + +## Introduction + +논문의 Introduction 에 다음과 같은 문구가 적혀있는데요. + +> "Variational Bayesian (VB) approach involves the optimization of an approximation to the intractable posterior” +> + +이처럼 Variational Autoencoder 는 논문에서 제시하는 Auto-Encoding Variational Bayes(AEVB) 알고리즘 중 하나로, intractable 한 posterior 분포를 다루기 쉬운 뉴럴 네트워크로 근사함으로써 Variational Inference 를 하게 됩니다. + +이가 의미하는 바가 무엇인지 한번 살펴보도록 하겠습니다. + +## Intractability + +Variational Autoencoder(VAE) 는 크게 Encoder 와 Decoder 부분으로 이루어져 있습니다. 더 자세하게는, Encoder는 입력 데이터 $x$ 를 받아서 잠재변수(Latent Variable) $z$ 를 만들어내고, Decoder 는 잠재변수 $z$ 를 활용해서 다시 $x$ 를 복원하게 됩니다. + +:::{figure-md} +vae_01 + +Variational Autoencoder(VAE) Architecture +::: + +Variational Autoencoder (VAE) 는 AutoEncoder 와 달리 확률 분포를 이용해 어떤 새로운 데이터를 생성하는 Decoder 부분에 초점을 둡니다. 이때 논문에서 다음과 같은 assumption 들을 내립니다. 첫번째로 $p_{\theta}(z)$ 와 $p_{\theta}(x|z)$ 는 parametric 한 distribution 을 가지고 있고, 이는 $\theta$ 와 $z$ 에 대해 differentiable 하다는 가정을 내립니다. 이 때, 대표적으로 $p_{\theta}(z)$ 는 Gaussian distribution 을 따르고 $p_{\theta}(x|z)$ 는 생성하고자 하는 데이터 성질에 따라 Bernoulli 혹은 Gaussian distribution 을 따르도록 정의합니다. 그리고 $p_{\theta}(x|z)$ 의 파라미터 $p$ 혹은 $(\mu, \sigma)$ 는 아래 그림과 같이 뉴럴 네트워크로 구성된 Decoder 로부터 계산이 됩니다. + +:::{figure-md} +vae_07 + +Overview of Bernoulli(left) and Gaussian(right) Decoder +::: + +이를 기반으로 우리는 ML/MAP estimation 을 통해 marginal likelihood $p_{\theta}(x)$ 를 최대화시키는 파라미터 $\theta$ 를 구하는 것이 목적입니다. 하지만, $p_{\theta}(x) = \int p_{\theta}(z)p_{\theta}(x|z) \ dz$ 는 intractable 하기 때문에 $p_{\theta}(z|x)$ 를 계산하기 위한 Encoder 가 등장하게 됩니다. + +$$ +p_{\theta}(x) = p_{\theta}(x|z)p_{\theta}(z)/p_{\theta}(z|x) +$$ + +여기서 $p_{\theta}(z|x)$ 역시 intractable 하기 때문에 이를 잘 근사화하는 뉴럴 네트워크 $q_{\phi}(z|x)$ 를 정의하게 되고, 이러한 과정을 변분추론(Variational Inference) 라고 합니다. 아래는 Encoder 와 Decoder 를 함께 도식화한 그림입니다. 정리하자면, MLP Encoder 를 통해 계산된 $\mu$ 와 $\sigma$ 로 잠재변수 $z$ 를 생성하게 되고, 이를 기반으로 Decoder 는 원본 이미지와 유사한 데이터를 생성하게 됩니다. + +:::{figure-md} +vae_08 + +Overview of Gaussian Encoder and Decoder +::: + +해당 implementation code 도 확인해보겠습니다. + +- **Encoder 구현 code** + + ```python + + class Encoder(nn.Module): + def __init__(self): + super(Encoder,self).__init__() + self.fc1_1 = nn.Linear(784, hidden_size) + self.fc1_2 = nn.Linear(784, hidden_size) + self.relu = nn.ReLU() + + def encode(self,x): + x = x.view(batch_size,-1) + mu = self.relu(self.fc1_1(x)) + log_var = self.relu(self.fc1_2(x)) + + return mu,log_var + + def reparametrize(self, mu, logvar): + std = logvar.mul(0.5).exp_() + + eps = torch.FloatTensor(std.size()).normal_() + eps = Variable(eps).cuda() + + return eps.mul(std).add_(mu) + + def forward(self,x): + mu, logvar = self.encode(x) + reparam = self.reparametrize(mu,logvar) + + return mu,logvar,reparam + ``` + +- **Decoder 구현 code** + + ```python + class Decoder(nn.Module): + def __init__(self): + super(Decoder,self).__init__() + self.fc1 = nn.Linear(hidden_size, 784) + self.sigmoid = nn.Sigmoid() + + def forward(self,x): + out = self.fc1(x) + out = self.sigmoid(out) + out = out.view(batch_size,28,28,1) + + return out + ``` + +## SGVB(Stochastic Gradient Variational Bayes) + +이로써 우리는 marginal likelihood $p_{\theta}(x)$ 를 최대화시키는 파라미터 $(\theta, \phi)$ 를 찾으면 되고, 이에 대한 lower bound 를 수식적으로 표현하면 손실함수(loss function) 를 다음과 같이 Reconstruction Error 와 Regularization term 로 분할할 수 있습니다. + +$$ +L(\theta, \phi;x_i) = \arg \min_{\theta, \phi} \sum_{i} -\mathbb{E}\_{q_{\phi}(z|x_i)}[\log(p(x_i|g_{\theta}(z))] + KL(q_{\phi}(z|x_i)||p(z)) +$$ + +Reconstruction Error 는 Decoder 에서 생성하는 데이터가 최대한 원본 데이터와 유사하도록 하는 term 이고, Regularization 은 Encoder 에서 만드는 잠재변수의 분포가 저희가 부여한 prior distribution 이랑 가깝도록 설정하는 term 입니다. 이때, Reconstruction Error 는 다음과 같은 Monte Carlo Estimator $\tilde{\mathcal{L}}^{B}$ 로 근사값을 구할 수 있고, 하나의 sample 을 계산하는 것도 연산량이 많으므로 논문에서는 sample size $L$ 을 1 로 설정합니다. + +$$ \tilde{\mathcal{L}}^{B}(\theta, \phi; x^{(i)})=-D_{KL}(q_{\phi}(z|x^{(i)})||p_{\theta}(z))+\frac{1}{L}\sum^{L}_{l=1} \log p\_\theta (x^{(i)}|z^{(i,l)})) $$ + +Lower bound 에 대한 수식을 변환하여 수식 전체에 대한 Monte Carlo Estimator $\tilde{\mathcal{L}}^{A}$ 로도 근사값을 구할 수 있는데 이는 평균적으로 $\tilde{\mathcal{L}}^{B}$ 에 비해 variance 가 높다고 합니다. + +$$ \tilde{\mathcal{L}}^{A}(\theta,\phi;x^{(i)})=\frac{1}{L}\sum^{L}_{l=1}\log p_{\theta}(x^{(i)},z^{(i,l)})-\log q_{\phi}(z^{(i,l)}|x^{(i)}) $$ + + +## Reparameterization Trick + +논문에서는 모델 학습 시 backpropagation 을 원활히 사용할 수 있도록 reparameterization trick 을 소개합니다. 잠재변수 $z$ 를 Encoder 에서 나온 $\mu$ 와 $\sigma$ 로 직접 샘플링하지 않고, backpropagation 이 가능하도록 Gaussian noise 를 우선적으로 샘플링하고 해당 $\mu$ 와 $\sigma$ 를 각각 더하고 곱하게 됩니다. 이는 $q_{\phi}(z|x)$ 이 Gaussian distribution 을 따른다고 설정했을 때이고, $q_{\phi}(z|x)$ 에 대해 다른 분포를 가정하여 그에 따른 다른 reparameterization trick 을 시도할 수 있다고 논문에 명시되어 있습니다. + +하단에는 Gaussian 분포에 대한 reparameterization trick 를 도식화한 그림입니다. 왼쪽에는 reparameterization trick이 적용되지 않은 경우로 $\mu$ 나 $\sigma$ 값이 고정되어 있어도 $\mathcal{N}(\mu,\sigma^2)$ 에서 샘플링하므로 $z$ 는 랜덤한 값이 되고 loss function 을 $\mu$ 나 $\sigma$ 에 대해 미분할 수 없어 backpropagation 을 적용하기가 어렵습니다. 반면에, 오른쪽처럼 reparameterization trick 을 적용하면, $z$ 가 deterministic 한 형태로 정의되고 $\mu$ 나 $\sigma$ 에 대한 변수로도 미분이 가능해지기 때문에 backpropagation 을 활용하여 모델을 학습시킬 수 있습니다. + +:::{figure-md} +vae_05 + +Overview of Reparameterization Trick +::: + +## Training Algorithm + +모델을 학습하는 전체적인 과정은 아래와 같습니다. + +:::{figure-md} +vae_09 + +Overview of Training Algorithm +::: + +## Experiments +논문에서는 MNIST 와 Frey Face 데이터셋에 대해 AEVB(Auto-Encoder variational Bayesian)와 wake-sleep 알고리즘를 적용해서 비교합니다. 여기서 Frey Face 데이터셋은 continuous 하므로 Gaussian Decoder 를 사용합니다. 실험결과는 아래 그림과 같습니다. + +:::{figure-md} +vae_10 + +Experimental Results - Likelihood lower bound +::: + +해당 그림처럼 lower bound 를 최적화하는데 AEVB 알고리즘이 더 빠르게 수렴하며 모든 실험에서 성능적으로도 더 나은 부분을 확인할 수 있습니다. + +:::{figure-md} +vae_11 + +Experimental Results - Marginal likelihood +::: + +또한, latent variable $z$ 의 차원이 작으면 marginal likelihood 를 직접 Monte Carlo EM 을 할용하여 구할 수 있는데, 이에 대한 결과도 논문에서 보여줍니다. Monte Carlo EM 의 경우 학습 데이터가 많으면 수렴이 되지 않는 부분을 확인할 수 있습니다. + + +## Summary + +AutoEncoder 는 latent space 에 하나의 값으로 지정해줬다면, VAE 는 평균 그리고 분산 파라미터들과 Gaussian 분포를 가진 샘플을 통해 잠재변수를 생성합니다. 그리고 VAE 를 실제로 사용해보면 생성된 데이터 image quality 가 낮다는 단점을 가지고 있다고 합니다. diff --git a/_sources/intro.md b/_sources/intro.md old mode 100644 new mode 100755 index 6b900557..b02d5d7b --- a/_sources/intro.md +++ b/_sources/intro.md @@ -1,45 +1,46 @@ -# Welcome to PseudoDiffusers!! - - -## About Us -This is the repository of PseudoDiffusers team. - -Our aim is to review papers and code related to computer vision generation models, approach them theoretically, and conduct various experiments by fine-tuning diffusion based models. - -[About Us - PseudoLab](https://www.linkedin.com/company/pseudolab/) - -[About Us - PseudoDiffusers](https://chanrankim.notion.site/PseudoDiffusers-b666d39ea1924b4692796e442bebcd44) - -참여 방법: 매주 수요일 오후 9시, 가짜연구소 Discord Room-DH 로 입장! - - -## Publications -**DiffInject: Revisiting Debias via Synthetic Data Generation using Diffusion-based Style Injection** -Donggeun Ko*, Sangwoo Jo*, Dongjun Lee, Namjun Park, Jaekwang KIM -CVPR 2024 Workshop -[PDF](https://openreview.net/pdf?id=jSB5wlUU3p) - - -## Tech Blog Contents -- Preliminary Works -- Image Generation -- Video Generation -- Experiments - - -## Contributors -- 조상우 [Sangwoo Jo] | [Github](https://github.com/jasonjo97) | [Linkedin](https://www.linkedin.com/in/sangwoojo/) | -- 문광수 [Kwangsu Mun] | [Github](https://github.com/mksoo) | [Linkedin](https://www.linkedin.com/in/%EA%B4%91%EC%88%98-%EB%AC%B8-95681b229/) | -- 김지수 [Jisu Kim] | Github | [Linkedin](https://www.linkedin.com/in/%EC%A7%80%EC%88%98-%EA%B9%80-5a0b2320a/) | -- 박범수 [Beomsoo Park] | [Github](https://github.com/hanlyang0522) | Linkedin | -- 지승환 [Seunghwan Ji] | [Github](https://github.com/hwansnaa) | [Linkedin](https://www.linkedin.com/in/%EC%8A%B9%ED%99%98-%EC%A7%80-0169b425a/) | -- 고동근 [Donggeun Sean Ko] | [Github](https://github.com/seanko29) | [Linkedin](https://www.linkedin.com/in/sangwoojo/) | -- 조남경 [Namkyeong Cho] | Github | Linkedin | -- 김선훈 [SeonHoon Kim] | [Github](https://github.com/egshkim) | [Linkedin](https://www.linkedin.com/in/seonhoonkim/) | -- 이준형 [Junhyoung Lee] | [Github](https://github.com/jjuun0) | [Linkedin](https://www.linkedin.com/in/jjuun0) | -- 조형서 [Hyoungseo Cho] | [Github](https://github.com/ChoHyoungSeo) | [Linkedin](https://www.linkedin.com/in/hyoungseo-cho/) | -- 유정화 [Jeonghwa Yoo] | [Github](https://github.com/jeongHwarr) | [Linkedin](https://www.linkedin.com/in/jeonghwa-yoo-8403a716b/) | -- 박세환 [Sehwan Park] | [Github](https://github.com/shp216) | Linkedin | -- 송건학 [Geonhak Song] | [Github](https://github.com/geonhak904) | Linkedin | -- 한동현 [Donghyun Han] | [GitHub](https://github.com/donghyun99) | [Linkedin](https://www.linkedin.com/in/donghyun99/) | -- 이창환 [ChangHwan Lee] | [Github](https://github.com/Hwan-I) | Linkedin +# Welcome to PseudoDiffusers!! + + +## About Us +This is the repository of PseudoDiffusers team. + +Our aim is to review papers and code related to computer vision generation models, approach them theoretically, and conduct various experiments by fine-tuning diffusion based models. + +[About Us - PseudoLab](https://www.linkedin.com/company/pseudolab/) + +[About Us - PseudoDiffusers](https://chanrankim.notion.site/PseudoDiffusers-b666d39ea1924b4692796e442bebcd44) + +참여 방법: 매주 수요일 오후 9시, 가짜연구소 Discord Room-DH 로 입장! + + +## Publications +**DiffInject: Revisiting Debias via Synthetic Data Generation using Diffusion-based Style Injection** +Donggeun Ko*, Sangwoo Jo*, Dongjun Lee, Namjun Park, Jaekwang KIM +CVPR 2024 Workshop +[PDF](https://openreview.net/pdf?id=jSB5wlUU3p) + + +## Tech Blog Contents +- Preliminary Works +- Image Generation +- Video Generation +- 3D Generation +- Experiments + + +## Contributors +- 조상우 [Sangwoo Jo] | [Github](https://github.com/jasonjo97) | [Linkedin](https://www.linkedin.com/in/sangwoojo/) | +- 문광수 [Kwangsu Mun] | [Github](https://github.com/mksoo) | [Linkedin](https://www.linkedin.com/in/%EA%B4%91%EC%88%98-%EB%AC%B8-95681b229/) | +- 김지수 [Jisu Kim] | Github | [Linkedin](https://www.linkedin.com/in/%EC%A7%80%EC%88%98-%EA%B9%80-5a0b2320a/) | +- 박범수 [Beomsoo Park] | [Github](https://github.com/hanlyang0522) | Linkedin | +- 지승환 [Seunghwan Ji] | [Github](https://github.com/hwansnaa) | [Linkedin](https://www.linkedin.com/in/%EC%8A%B9%ED%99%98-%EC%A7%80-0169b425a/) | +- 고동근 [Donggeun Sean Ko] | [Github](https://github.com/seanko29) | [Linkedin](https://www.linkedin.com/in/sangwoojo/) | +- 조남경 [Namkyeong Cho] | Github | Linkedin | +- 김선훈 [SeonHoon Kim] | [Github](https://github.com/egshkim) | [Linkedin](https://www.linkedin.com/in/seonhoonkim/) | +- 이준형 [Junhyoung Lee] | [Github](https://github.com/jjuun0) | [Linkedin](https://www.linkedin.com/in/jjuun0) | +- 조형서 [Hyoungseo Cho] | [Github](https://github.com/ChoHyoungSeo) | [Linkedin](https://www.linkedin.com/in/hyoungseo-cho/) | +- 유정화 [Jeonghwa Yoo] | [Github](https://github.com/jeongHwarr) | [Linkedin](https://www.linkedin.com/in/jeonghwa-yoo-8403a716b/) | +- 박세환 [Sehwan Park] | [Github](https://github.com/shp216) | Linkedin | +- 송건학 [Geonhak Song] | [Github](https://github.com/geonhak904) | Linkedin | +- 한동현 [Donghyun Han] | [GitHub](https://github.com/donghyun99) | [Linkedin](https://www.linkedin.com/in/donghyun99/) | +- 이창환 [ChangHwan Lee] | [Github](https://github.com/Hwan-I) | Linkedin diff --git a/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css b/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css old mode 100644 new mode 100755 index 3225661c..57bec30a --- a/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css +++ b/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css @@ -1 +1 @@ -.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #007bff;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0069d9;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #007bff;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0069d9;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/_sphinx_design_static/design-tabs.js b/_sphinx_design_static/design-tabs.js old mode 100644 new mode 100755 index 36b38cf0..a869cf55 --- a/_sphinx_design_static/design-tabs.js +++ b/_sphinx_design_static/design-tabs.js @@ -1,27 +1,27 @@ -var sd_labels_by_text = {}; - -function ready() { - const li = document.getElementsByClassName("sd-tab-label"); - for (const label of li) { - syncId = label.getAttribute("data-sync-id"); - if (syncId) { - label.onclick = onLabelClick; - if (!sd_labels_by_text[syncId]) { - sd_labels_by_text[syncId] = []; - } - sd_labels_by_text[syncId].push(label); - } - } -} - -function onLabelClick() { - // Activate other inputs with the same sync id. - syncId = this.getAttribute("data-sync-id"); - for (label of sd_labels_by_text[syncId]) { - if (label === this) continue; - label.previousElementSibling.checked = true; - } - window.localStorage.setItem("sphinx-design-last-tab", syncId); -} - -document.addEventListener("DOMContentLoaded", ready, false); +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/_static/PseudoLab_logo.png b/_static/PseudoLab_logo.png old mode 100644 new mode 100755 diff --git a/_static/__init__.py b/_static/__init__.py old mode 100644 new mode 100755 diff --git a/_static/__pycache__/__init__.cpython-36.pyc b/_static/__pycache__/__init__.cpython-36.pyc old mode 100644 new mode 100755 diff --git a/_static/__pycache__/__init__.cpython-37.pyc b/_static/__pycache__/__init__.cpython-37.pyc old mode 100644 new mode 100755 diff --git a/_static/_sphinx_javascript_frameworks_compat.js b/_static/_sphinx_javascript_frameworks_compat.js old mode 100644 new mode 100755 diff --git a/_static/basic.css b/_static/basic.css old mode 100644 new mode 100755 index 9e364ed3..d613287e --- a/_static/basic.css +++ b/_static/basic.css @@ -1,930 +1,930 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 270px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} -nav.contents, -aside.topic, - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ -nav.contents, -aside.topic, - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, - -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, - -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -/* Docutils 0.17 and older (footnotes & citations) */ -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -/* Docutils 0.18+ (footnotes & citations) */ -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -/* Footnotes & citations ends */ - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 270px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} +nav.contents, +aside.topic, + +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ +nav.contents, +aside.topic, + +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, + +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, + +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +/* Docutils 0.17 and older (footnotes & citations) */ +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +/* Docutils 0.18+ (footnotes & citations) */ +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +/* Footnotes & citations ends */ + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } } \ No newline at end of file diff --git a/_static/check-solid.svg b/_static/check-solid.svg old mode 100644 new mode 100755 diff --git a/_static/clipboard.min.js b/_static/clipboard.min.js old mode 100644 new mode 100755 diff --git a/_static/copy-button.svg b/_static/copy-button.svg old mode 100644 new mode 100755 diff --git a/_static/copybutton.css b/_static/copybutton.css old mode 100644 new mode 100755 diff --git a/_static/copybutton.js b/_static/copybutton.js old mode 100644 new mode 100755 index 02c5c82d..f4ec4edc --- a/_static/copybutton.js +++ b/_static/copybutton.js @@ -1,248 +1,248 @@ -// Localization support -const messages = { - 'en': { - 'copy': 'Copy', - 'copy_to_clipboard': 'Copy to clipboard', - 'copy_success': 'Copied!', - 'copy_failure': 'Failed to copy', - }, - 'es' : { - 'copy': 'Copiar', - 'copy_to_clipboard': 'Copiar al portapapeles', - 'copy_success': '¡Copiado!', - 'copy_failure': 'Error al copiar', - }, - 'de' : { - 'copy': 'Kopieren', - 'copy_to_clipboard': 'In die Zwischenablage kopieren', - 'copy_success': 'Kopiert!', - 'copy_failure': 'Fehler beim Kopieren', - }, - 'fr' : { - 'copy': 'Copier', - 'copy_to_clipboard': 'Copié dans le presse-papier', - 'copy_success': 'Copié !', - 'copy_failure': 'Échec de la copie', - }, - 'ru': { - 'copy': 'Скопировать', - 'copy_to_clipboard': 'Скопировать в буфер', - 'copy_success': 'Скопировано!', - 'copy_failure': 'Не удалось скопировать', - }, - 'zh-CN': { - 'copy': '复制', - 'copy_to_clipboard': '复制到剪贴板', - 'copy_success': '复制成功!', - 'copy_failure': '复制失败', - }, - 'it' : { - 'copy': 'Copiare', - 'copy_to_clipboard': 'Copiato negli appunti', - 'copy_success': 'Copiato!', - 'copy_failure': 'Errore durante la copia', - } -} - -let locale = 'en' -if( document.documentElement.lang !== undefined - && messages[document.documentElement.lang] !== undefined ) { - locale = document.documentElement.lang -} - -let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; -if (doc_url_root == '#') { - doc_url_root = ''; -} - -/** - * SVG files for our copy buttons - */ -let iconCheck = ` - ${messages[locale]['copy_success']} - - -` - -// If the user specified their own SVG use that, otherwise use the default -let iconCopy = ``; -if (!iconCopy) { - iconCopy = ` - ${messages[locale]['copy_to_clipboard']} - - - -` -} - -/** - * Set up copy/paste for code blocks - */ - -const runWhenDOMLoaded = cb => { - if (document.readyState != 'loading') { - cb() - } else if (document.addEventListener) { - document.addEventListener('DOMContentLoaded', cb) - } else { - document.attachEvent('onreadystatechange', function() { - if (document.readyState == 'complete') cb() - }) - } -} - -const codeCellId = index => `codecell${index}` - -// Clears selected text since ClipboardJS will select the text when copying -const clearSelection = () => { - if (window.getSelection) { - window.getSelection().removeAllRanges() - } else if (document.selection) { - document.selection.empty() - } -} - -// Changes tooltip text for a moment, then changes it back -// We want the timeout of our `success` class to be a bit shorter than the -// tooltip and icon change, so that we can hide the icon before changing back. -var timeoutIcon = 2000; -var timeoutSuccessClass = 1500; - -const temporarilyChangeTooltip = (el, oldText, newText) => { - el.setAttribute('data-tooltip', newText) - el.classList.add('success') - // Remove success a little bit sooner than we change the tooltip - // So that we can use CSS to hide the copybutton first - setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) - setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) -} - -// Changes the copy button icon for two seconds, then changes it back -const temporarilyChangeIcon = (el) => { - el.innerHTML = iconCheck; - setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) -} - -const addCopyButtonToCodeCells = () => { - // If ClipboardJS hasn't loaded, wait a bit and try again. This - // happens because we load ClipboardJS asynchronously. - if (window.ClipboardJS === undefined) { - setTimeout(addCopyButtonToCodeCells, 250) - return - } - - // Add copybuttons to all of our code cells - const COPYBUTTON_SELECTOR = 'div.highlight pre'; - const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) - codeCells.forEach((codeCell, index) => { - const id = codeCellId(index) - codeCell.setAttribute('id', id) - - const clipboardButton = id => - `` - codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) - }) - -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -/** - * Removes excluded text from a Node. - * - * @param {Node} target Node to filter. - * @param {string} exclude CSS selector of nodes to exclude. - * @returns {DOMString} Text from `target` with text removed. - */ -function filterText(target, exclude) { - const clone = target.cloneNode(true); // clone as to not modify the live DOM - if (exclude) { - // remove excluded nodes - clone.querySelectorAll(exclude).forEach(node => node.remove()); - } - return clone.innerText; -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} - - -var copyTargetText = (trigger) => { - var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); - - // get filtered text - let exclude = '.linenos, .gp'; - - let text = filterText(target, exclude); - return formatCopyText(text, '', false, true, true, true, '', '') -} - - // Initialize with a callback so we can modify the text before copy - const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) - - // Update UI with error/success messages - clipboard.on('success', event => { - clearSelection() - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) - temporarilyChangeIcon(event.trigger) - }) - - clipboard.on('error', event => { - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) - }) -} - +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/_static/copybutton_funcs.js b/_static/copybutton_funcs.js old mode 100644 new mode 100755 diff --git a/_static/css/blank.css b/_static/css/blank.css old mode 100644 new mode 100755 index 8a686ec7..80c40fb4 --- a/_static/css/blank.css +++ b/_static/css/blank.css @@ -1,2 +1,2 @@ -/* This file is intentionally left blank to override the stylesheet of the +/* This file is intentionally left blank to override the stylesheet of the parent theme via theme.conf. The parent style we import directly in theme.css */ \ No newline at end of file diff --git a/_static/css/index.73d71520a4ca3b99cfee5594769eaaae.css b/_static/css/index.73d71520a4ca3b99cfee5594769eaaae.css old mode 100644 new mode 100755 index 948a8bf1..dfa47cdc --- a/_static/css/index.73d71520a4ca3b99cfee5594769eaaae.css +++ b/_static/css/index.73d71520a4ca3b99cfee5594769eaaae.css @@ -1,6 +1,6 @@ -/*! - * Bootstrap v4.5.0 (https://getbootstrap.com/) - * Copyright 2011-2020 The Bootstrap Authors - * Copyright 2011-2020 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) +/*! + * Bootstrap v4.5.0 (https://getbootstrap.com/) + * Copyright 2011-2020 The Bootstrap Authors + * Copyright 2011-2020 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;line-height:1.5;color:#212529;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;background-color:transparent}a:hover{color:#0056b3}a:not([href]),a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\00A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1400px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1400px}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{display:flex;align-items:center;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#fff;border:1px solid #adb5bd}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(1.5em + .75rem + 2px)}.custom-file-input{z-index:2;margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{left:0;z-index:1;height:calc(1.5em + .75rem + 2px);font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0,0,0,0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255,255,255,0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb,.breadcrumb-item{display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid;border-right:.25em solid transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.85714%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}html{font-size:15px}body{background-color:#fff;font-family:Lato,sans-serif;font-weight:400;line-height:1.65;color:#333;padding-top:75px}p{margin-bottom:1.15rem;font-size:1em}p.rubric{border-bottom:1px solid #c9c9c9}a{color:#005b81;text-decoration:none}a:hover{color:#e32e00;text-decoration:underline}a.headerlink{color:#c60f0f;font-size:.8em;padding:0 4px;text-decoration:none}a.headerlink:hover{background-color:#c60f0f;color:#fff}.header-style,h1,h2,h3,h4,h5,h6{margin:2.75rem 0 1.05rem;font-family:Open Sans,sans-serif;font-weight:400;line-height:1.15}.header-style:before,h1:before,h2:before,h3:before,h4:before,h5:before,h6:before{display:block;content:"";height:80px;margin:-80px 0 0}h1{margin-top:0;font-size:2.488em}h1,h2{color:#130654}h2{font-size:2.074em}h3{font-size:1.728em}h4{font-size:1.44em}h5{font-size:1.2em}h6{font-size:1em}.text_small,small{font-size:.833em}hr{border:0;border-top:1px solid #e5e5e5}pre{padding:10px;background-color:#fafafa;color:#222;line-height:1.2em;border:1px solid #c9c9c9;margin:1.5em 0;box-shadow:1px 1px 1px #d8d8d8}.navbar{position:fixed}.navbar-brand{position:relative;height:45px;width:auto}.navbar-brand img{max-width:100%;height:100%;width:auto}.navbar-light{background:#fff!important;box-shadow:0 .125rem .25rem 0 rgba(0,0,0,.11)}.navbar-nav li a{padding:0 15px}.navbar-nav>.active>.nav-link{font-weight:600;color:#130654!important}.navbar-header a{padding:0 15px}.admonition{margin:1.5625em auto;padding:0 .6rem .8rem!important;overflow:hidden;page-break-inside:avoid;border-left:.2rem solid #007bff;border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .05rem rgba(0,0,0,.1);transition:color .25s,background-color .25s,border-color .25s}.admonition :last-child{margin-bottom:0}.admonition p.admonition-title~*{padding:0 1.4rem}.admonition>ol,.admonition>ul{margin-left:1em}.admonition .admonition-title{position:relative;margin:0 -.6rem!important;padding:.4rem .6rem .4rem 2rem;font-weight:700;background-color:rgba(68,138,255,.1)}.admonition .admonition-title:before{position:absolute;left:.6rem;width:1rem;height:1rem;color:#007bff;font-family:Font Awesome\ 5 Free;font-weight:900;content:""}.admonition .admonition-title+*{margin-top:.4em}.admonition.attention{border-color:#fd7e14}.admonition.attention .admonition-title{background-color:#ffedcc}.admonition.attention .admonition-title:before{color:#fd7e14;content:""}.admonition.caution{border-color:#fd7e14}.admonition.caution .admonition-title{background-color:#ffedcc}.admonition.caution .admonition-title:before{color:#fd7e14;content:""}.admonition.warning{border-color:#dc3545}.admonition.warning .admonition-title{background-color:#fdf3f2}.admonition.warning .admonition-title:before{color:#dc3545;content:""}.admonition.danger{border-color:#dc3545}.admonition.danger .admonition-title{background-color:#fdf3f2}.admonition.danger .admonition-title:before{color:#dc3545;content:""}.admonition.error{border-color:#dc3545}.admonition.error .admonition-title{background-color:#fdf3f2}.admonition.error .admonition-title:before{color:#dc3545;content:""}.admonition.hint{border-color:#ffc107}.admonition.hint .admonition-title{background-color:#fff6dd}.admonition.hint .admonition-title:before{color:#ffc107;content:""}.admonition.tip{border-color:#ffc107}.admonition.tip .admonition-title{background-color:#fff6dd}.admonition.tip .admonition-title:before{color:#ffc107;content:""}.admonition.important{border-color:#007bff}.admonition.important .admonition-title{background-color:#e7f2fa}.admonition.important .admonition-title:before{color:#007bff;content:""}.admonition.note{border-color:#007bff}.admonition.note .admonition-title{background-color:#e7f2fa}.admonition.note .admonition-title:before{color:#007bff;content:""}div.deprecated{margin-bottom:10px;margin-top:10px;padding:7px;color:#b94a48;background-color:#f3e5e5;border:1px solid #eed3d7;border-radius:.5rem}div.deprecated p{display:inline}.topic{background-color:#eee}.seealso dd{margin-top:0;margin-bottom:0}.viewcode-back{font-family:Lato,sans-serif}.viewcode-block:target{background-color:#f4debf;border-top:1px solid #ac9;border-bottom:1px solid #ac9}table.field-list{border-collapse:separate;border-spacing:10px;margin-left:1px}table.field-list th.field-name{padding:1px 8px 1px 5px;white-space:nowrap;background-color:#eee}table.field-list td.field-body p{font-style:italic}table.field-list td.field-body p>strong{font-style:normal}table.field-list td.field-body blockquote{border-left:none;margin:0 0 .3em;padding-left:30px}.table.autosummary td:first-child{white-space:nowrap}.footer{width:100%;border-top:1px solid #ccc;padding-top:10px}.bd-search{position:relative;padding:1rem 15px;margin-right:-15px;margin-left:-15px}.bd-search .icon{position:absolute;color:#a4a6a7;left:25px;top:25px}.bd-search input{border-radius:0;border:0;border-bottom:1px solid #e5e5e5;padding-left:35px}.bd-toc{-ms-flex-order:2;order:2;height:calc(100vh - 2rem);overflow-y:auto}@supports (position:-webkit-sticky) or (position:sticky){.bd-toc{position:-webkit-sticky;position:sticky;top:5rem;height:calc(100vh - 5rem);overflow-y:auto}}.bd-toc .onthispage{color:#a4a6a7}.section-nav{padding-left:0;border-left:1px solid #eee;border-bottom:none}.section-nav ul{padding-left:1rem}.toc-entry,.toc-entry a{display:block}.toc-entry a{padding:.125rem 1.5rem;color:#77757a}@media (min-width:1200px){.toc-entry a{padding-right:0}}.toc-entry a:hover{color:rgba(0,0,0,.85);text-decoration:none}.bd-sidebar{padding-top:1em}@media (min-width:768px){.bd-sidebar{border-right:1px solid rgba(0,0,0,.1)}@supports (position:-webkit-sticky) or (position:sticky){.bd-sidebar{position:-webkit-sticky;position:sticky;top:76px;z-index:1000;height:calc(100vh - 4rem)}}}.bd-links{padding-top:1rem;padding-bottom:1rem;margin-right:-15px;margin-left:-15px}@media (min-width:768px){@supports (position:-webkit-sticky) or (position:sticky){.bd-links{max-height:calc(100vh - 9rem);overflow-y:auto}}}@media (min-width:768px){.bd-links{display:block!important}}.bd-sidenav{display:none}.bd-content{padding-top:20px}.bd-content .section{max-width:100%}.bd-content .section table{display:block;overflow:auto}.bd-toc-link{display:block;padding:.25rem 1.5rem;font-weight:600;color:rgba(0,0,0,.65)}.bd-toc-link:hover{color:rgba(0,0,0,.85);text-decoration:none}.bd-toc-item.active{margin-bottom:1rem}.bd-toc-item.active:not(:first-child){margin-top:1rem}.bd-toc-item.active>.bd-toc-link{color:rgba(0,0,0,.85)}.bd-toc-item.active>.bd-toc-link:hover{background-color:transparent}.bd-toc-item.active>.bd-sidenav{display:block}.bd-sidebar .nav>li>a{display:block;padding:.25rem 1.5rem;font-size:.9em;color:rgba(0,0,0,.65)}.bd-sidebar .nav>li>a:hover{color:#130654;text-decoration:none;background-color:transparent}.bd-sidebar .nav>.active:hover>a,.bd-sidebar .nav>.active>a{font-weight:600;color:#130654}.bd-sidebar .nav>li>ul{list-style:none;padding:.25rem 1.5rem}.bd-sidebar .nav>li>ul>li>a{display:block;padding:.25rem 1.5rem;font-size:.9em;color:rgba(0,0,0,.65)}.bd-sidebar .nav>li>ul>.active:hover>a,.bd-sidebar .nav>li>ul>.active>a{font-weight:600;color:#130654}.toc-h2{font-size:.85rem}.toc-h3{font-size:.75rem}.toc-h4{font-size:.65rem}.toc-entry>.nav-link.active{font-weight:600;color:#130654;background-color:transparent;border-left:2px solid #563d7c}.nav-link:hover{border-style:none}#navbar-main-elements li.nav-item i{font-size:.7rem;padding-left:2px;vertical-align:middle}.bd-toc .nav .nav{display:none}.bd-toc .nav .nav.visible,.bd-toc .nav>.active>ul{display:block}.prev-next-bottom{margin:20px 0}.prev-next-bottom a.left-prev,.prev-next-bottom a.right-next{padding:10px;border:1px solid rgba(0,0,0,.2);max-width:45%;overflow-x:hidden;color:rgba(0,0,0,.65)}.prev-next-bottom a.left-prev{float:left}.prev-next-bottom a.left-prev:before{content:"<< "}.prev-next-bottom a.right-next{float:right}.prev-next-bottom a.right-next:after{content:" >>"}.alert{padding-bottom:0}.alert-info a{color:#e83e8c}i.fab{vertical-align:middle;font-style:normal;font-size:1.5rem;line-height:1.25}i.fa-github-square:before{color:#333}i.fa-twitter-square:before{color:#55acee}.tocsection{border-left:1px solid #eee;padding:.3rem 1.5rem}.tocsection i{padding-right:.5rem}.editthispage{padding-top:2rem}.editthispage a{color:#130754} \ No newline at end of file diff --git a/_static/css/index.ff1ffe594081f20da1ef19478df9384b.css b/_static/css/index.ff1ffe594081f20da1ef19478df9384b.css old mode 100644 new mode 100755 index 9b1c5d79..c95bced9 --- a/_static/css/index.ff1ffe594081f20da1ef19478df9384b.css +++ b/_static/css/index.ff1ffe594081f20da1ef19478df9384b.css @@ -1,6 +1,6 @@ -/*! - * Bootstrap v4.5.0 (https://getbootstrap.com/) - * Copyright 2011-2020 The Bootstrap Authors - * Copyright 2011-2020 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) +/*! + * Bootstrap v4.5.0 (https://getbootstrap.com/) + * Copyright 2011-2020 The Bootstrap Authors + * Copyright 2011-2020 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:540px;--breakpoint-md:720px;--breakpoint-lg:960px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;line-height:1.5;color:#212529;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;background-color:transparent}a:hover{color:#0056b3}a:not([href]),a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\00A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:540px){.container{max-width:540px}}@media (min-width:720px){.container{max-width:720px}}@media (min-width:960px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1400px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:540px){.container,.container-sm{max-width:540px}}@media (min-width:720px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:960px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1400px}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width:540px){.col-sm{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width:720px){.col-md{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width:960px){.col-lg{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;min-width:0;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width:539.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:719.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:959.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:540px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{display:flex;align-items:center;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:540px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:720px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:960px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#fff;border:1px solid #adb5bd}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(1.5em + .75rem + 2px)}.custom-file-input{z-index:2;margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{left:0;z-index:1;height:calc(1.5em + .75rem + 2px);font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:539.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:540px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:719.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:720px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:959.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:960px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0,0,0,0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255,255,255,0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:540px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:540px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:540px){.card-columns{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb,.breadcrumb-item{display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:540px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:540px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:720px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:960px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:540px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:min-content}.modal-sm{max-width:300px}}@media (min-width:960px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid;border-right:.25em solid transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:540px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:720px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:960px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.85714%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:540px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:720px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:960px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:540px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:720px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:960px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:540px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:720px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:960px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:540px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:720px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:960px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:960px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}html{font-size:var(--pst-font-size-base);scroll-padding-top:calc(var(--pst-header-height) + 12px)}body{padding-top:calc(var(--pst-header-height) + 20px);background-color:#fff;font-family:var(--pst-font-family-base);font-weight:400;line-height:1.65;color:rgba(var(--pst-color-text-base),1)}p{margin-bottom:1.15rem;font-size:1em;color:rgba(var(--pst-color-paragraph),1)}p.rubric{border-bottom:1px solid #c9c9c9}a{color:rgba(var(--pst-color-link),1);text-decoration:none}a:hover{color:rgba(var(--pst-color-link-hover),1);text-decoration:underline}a.headerlink{color:rgba(var(--pst-color-headerlink),1);font-size:.8em;padding:0 4px;text-decoration:none}a.headerlink:hover{background-color:rgba(var(--pst-color-headerlink),1);color:rgba(var(--pst-color-headerlink-hover),1)}.heading-style,h1,h2,h3,h4,h5,h6{margin:2.75rem 0 1.05rem;font-family:var(--pst-font-family-heading);font-weight:400;line-height:1.15}h1{margin-top:0;font-size:var(--pst-font-size-h1);color:rgba(var(--pst-color-h1),1)}h2{font-size:var(--pst-font-size-h2);color:rgba(var(--pst-color-h2),1)}h3{font-size:var(--pst-font-size-h3);color:rgba(var(--pst-color-h3),1)}h4{font-size:var(--pst-font-size-h4);color:rgba(var(--pst-color-h4),1)}h5{font-size:var(--pst-font-size-h5);color:rgba(var(--pst-color-h5),1)}h6{font-size:var(--pst-font-size-h6);color:rgba(var(--pst-color-h6),1)}.text_small,small{font-size:var(--pst-font-size-milli)}hr{border:0;border-top:1px solid #e5e5e5}code,kbd,pre,samp{font-family:var(--pst-font-family-monospace)}code{color:rgba(var(--pst-color-inline-code),1)}pre{margin:1.5em 0;padding:10px;background-color:rgba(var(--pst-color-preformatted-background),1);color:rgba(var(--pst-color-preformatted-text),1);line-height:1.2em;border:1px solid #c9c9c9;border-radius:.2rem;box-shadow:1px 1px 1px #d8d8d8}dd{margin-top:3px;margin-bottom:10px;margin-left:30px}.navbar{position:fixed;min-height:var(--pst-header-height);width:100%;padding:0}.navbar .container-xl{height:100%}@media (min-width:960px){.navbar #navbar-end>.navbar-end-item{display:inline-block}}.navbar-brand{position:relative;height:var(--pst-header-height);width:auto;padding:.5rem 0}.navbar-brand img{max-width:100%;height:100%;width:auto}.navbar-light{background:#fff!important;box-shadow:0 .125rem .25rem 0 rgba(0,0,0,.11)}.navbar-light .navbar-nav li a.nav-link{padding:0 .5rem;color:rgba(var(--pst-color-navbar-link),1)}.navbar-light .navbar-nav li a.nav-link:hover{color:rgba(var(--pst-color-navbar-link-hover),1)}.navbar-light .navbar-nav>.active>.nav-link{font-weight:600;color:rgba(var(--pst-color-navbar-link-active),1)}.navbar-header a{padding:0 15px}.admonition,div.admonition{margin:1.5625em auto;padding:0 .6rem .8rem;overflow:hidden;page-break-inside:avoid;border-left:.2rem solid;border-left-color:rgba(var(--pst-color-admonition-default),1);border-bottom-color:rgba(var(--pst-color-admonition-default),1);border-right-color:rgba(var(--pst-color-admonition-default),1);border-top-color:rgba(var(--pst-color-admonition-default),1);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);transition:color .25s,background-color .25s,border-color .25s}.admonition :last-child,div.admonition :last-child{margin-bottom:0}.admonition p.admonition-title~*,div.admonition p.admonition-title~*{padding:0 1.4rem}.admonition>ol,.admonition>ul,div.admonition>ol,div.admonition>ul{margin-left:1em}.admonition>.admonition-title,div.admonition>.admonition-title{position:relative;margin:0 -.6rem;padding:.4rem .6rem .4rem 2rem;font-weight:700;background-color:rgba(var(--pst-color-admonition-default),.1)}.admonition>.admonition-title:before,div.admonition>.admonition-title:before{position:absolute;left:.6rem;width:1rem;height:1rem;color:rgba(var(--pst-color-admonition-default),1);font-family:Font Awesome\ 5 Free;font-weight:900;content:var(--pst-icon-admonition-default)}.admonition>.admonition-title+*,div.admonition>.admonition-title+*{margin-top:.4em}.admonition.attention,div.admonition.attention{border-color:rgba(var(--pst-color-admonition-attention),1)}.admonition.attention>.admonition-title,div.admonition.attention>.admonition-title{background-color:rgba(var(--pst-color-admonition-attention),.1)}.admonition.attention>.admonition-title:before,div.admonition.attention>.admonition-title:before{color:rgba(var(--pst-color-admonition-attention),1);content:var(--pst-icon-admonition-attention)}.admonition.caution,div.admonition.caution{border-color:rgba(var(--pst-color-admonition-caution),1)}.admonition.caution>.admonition-title,div.admonition.caution>.admonition-title{background-color:rgba(var(--pst-color-admonition-caution),.1)}.admonition.caution>.admonition-title:before,div.admonition.caution>.admonition-title:before{color:rgba(var(--pst-color-admonition-caution),1);content:var(--pst-icon-admonition-caution)}.admonition.warning,div.admonition.warning{border-color:rgba(var(--pst-color-admonition-warning),1)}.admonition.warning>.admonition-title,div.admonition.warning>.admonition-title{background-color:rgba(var(--pst-color-admonition-warning),.1)}.admonition.warning>.admonition-title:before,div.admonition.warning>.admonition-title:before{color:rgba(var(--pst-color-admonition-warning),1);content:var(--pst-icon-admonition-warning)}.admonition.danger,div.admonition.danger{border-color:rgba(var(--pst-color-admonition-danger),1)}.admonition.danger>.admonition-title,div.admonition.danger>.admonition-title{background-color:rgba(var(--pst-color-admonition-danger),.1)}.admonition.danger>.admonition-title:before,div.admonition.danger>.admonition-title:before{color:rgba(var(--pst-color-admonition-danger),1);content:var(--pst-icon-admonition-danger)}.admonition.error,div.admonition.error{border-color:rgba(var(--pst-color-admonition-error),1)}.admonition.error>.admonition-title,div.admonition.error>.admonition-title{background-color:rgba(var(--pst-color-admonition-error),.1)}.admonition.error>.admonition-title:before,div.admonition.error>.admonition-title:before{color:rgba(var(--pst-color-admonition-error),1);content:var(--pst-icon-admonition-error)}.admonition.hint,div.admonition.hint{border-color:rgba(var(--pst-color-admonition-hint),1)}.admonition.hint>.admonition-title,div.admonition.hint>.admonition-title{background-color:rgba(var(--pst-color-admonition-hint),.1)}.admonition.hint>.admonition-title:before,div.admonition.hint>.admonition-title:before{color:rgba(var(--pst-color-admonition-hint),1);content:var(--pst-icon-admonition-hint)}.admonition.tip,div.admonition.tip{border-color:rgba(var(--pst-color-admonition-tip),1)}.admonition.tip>.admonition-title,div.admonition.tip>.admonition-title{background-color:rgba(var(--pst-color-admonition-tip),.1)}.admonition.tip>.admonition-title:before,div.admonition.tip>.admonition-title:before{color:rgba(var(--pst-color-admonition-tip),1);content:var(--pst-icon-admonition-tip)}.admonition.important,div.admonition.important{border-color:rgba(var(--pst-color-admonition-important),1)}.admonition.important>.admonition-title,div.admonition.important>.admonition-title{background-color:rgba(var(--pst-color-admonition-important),.1)}.admonition.important>.admonition-title:before,div.admonition.important>.admonition-title:before{color:rgba(var(--pst-color-admonition-important),1);content:var(--pst-icon-admonition-important)}.admonition.note,div.admonition.note{border-color:rgba(var(--pst-color-admonition-note),1)}.admonition.note>.admonition-title,div.admonition.note>.admonition-title{background-color:rgba(var(--pst-color-admonition-note),.1)}.admonition.note>.admonition-title:before,div.admonition.note>.admonition-title:before{color:rgba(var(--pst-color-admonition-note),1);content:var(--pst-icon-admonition-note)}table.field-list{border-collapse:separate;border-spacing:10px;margin-left:1px}table.field-list th.field-name{padding:1px 8px 1px 5px;white-space:nowrap;background-color:#eee}table.field-list td.field-body p{font-style:italic}table.field-list td.field-body p>strong{font-style:normal}table.field-list td.field-body blockquote{border-left:none;margin:0 0 .3em;padding-left:30px}.table.autosummary td:first-child{white-space:nowrap}.sig{font-family:var(--pst-font-family-monospace)}.sig-inline.c-texpr,.sig-inline.cpp-texpr{font-family:unset}.sig.c .k,.sig.c .kt,.sig.c .m,.sig.c .s,.sig.c .sc,.sig.cpp .k,.sig.cpp .kt,.sig.cpp .m,.sig.cpp .s,.sig.cpp .sc{color:rgba(var(--pst-color-text-base),1)}.sig-name{color:rgba(var(--pst-color-inline-code),1)}blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}dt.label>span.brackets:not(:only-child):before{content:"["}dt.label>span.brackets:not(:only-child):after{content:"]"}a.footnote-reference{vertical-align:super;font-size:small}div.deprecated{margin-bottom:10px;margin-top:10px;padding:7px;background-color:#f3e5e5;border:1px solid #eed3d7;border-radius:.5rem}div.deprecated p{color:#b94a48;display:inline}.topic{background-color:#eee}.seealso dd{margin-top:0;margin-bottom:0}.viewcode-back{font-family:var(--pst-font-family-base)}.viewcode-block:target{background-color:#f4debf;border-top:1px solid #ac9;border-bottom:1px solid #ac9}span.guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}footer{width:100%;border-top:1px solid #ccc;padding:10px}footer .footer-item p{margin-bottom:0}.bd-search{position:relative;padding:1rem 15px;margin-right:-15px;margin-left:-15px}.bd-search .icon{position:absolute;color:#a4a6a7;left:25px;top:25px}.bd-search input{border-radius:0;border:0;border-bottom:1px solid #e5e5e5;padding-left:35px}.bd-toc{-ms-flex-order:2;order:2;height:calc(100vh - 2rem);overflow-y:auto}@supports (position:-webkit-sticky) or (position:sticky){.bd-toc{position:-webkit-sticky;position:sticky;top:calc(var(--pst-header-height) + 20px);height:calc(100vh - 5rem);overflow-y:auto}}.bd-toc .onthispage{color:#a4a6a7}.section-nav{padding-left:0;border-left:1px solid #eee;border-bottom:none}.section-nav ul{padding-left:1rem}.toc-entry,.toc-entry a{display:block}.toc-entry a{padding:.125rem 1.5rem;color:rgba(var(--pst-color-toc-link),1)}@media (min-width:1200px){.toc-entry a{padding-right:0}}.toc-entry a:hover{color:rgba(var(--pst-color-toc-link-hover),1);text-decoration:none}.bd-sidebar{padding-top:1em}@media (min-width:720px){.bd-sidebar{border-right:1px solid rgba(0,0,0,.1)}@supports (position:-webkit-sticky) or (position:sticky){.bd-sidebar{position:-webkit-sticky;position:sticky;top:calc(var(--pst-header-height) + 20px);z-index:1000;height:calc(100vh - var(--pst-header-height) - 20px)}}}.bd-sidebar.no-sidebar{border-right:0}.bd-links{padding-top:1rem;padding-bottom:1rem;margin-right:-15px;margin-left:-15px}@media (min-width:720px){.bd-links{display:block}@supports (position:-webkit-sticky) or (position:sticky){.bd-links{max-height:calc(100vh - 11rem);overflow-y:auto}}}.bd-sidenav{display:none}.bd-content{padding-top:20px}.bd-content .section{max-width:100%}.bd-content .section table{display:block;overflow:auto}.bd-toc-link{display:block;padding:.25rem 1.5rem;font-weight:600;color:rgba(0,0,0,.65)}.bd-toc-link:hover{color:rgba(0,0,0,.85);text-decoration:none}.bd-toc-item.active{margin-bottom:1rem}.bd-toc-item.active:not(:first-child){margin-top:1rem}.bd-toc-item.active>.bd-toc-link{color:rgba(0,0,0,.85)}.bd-toc-item.active>.bd-toc-link:hover{background-color:transparent}.bd-toc-item.active>.bd-sidenav{display:block}nav.bd-links p.caption{font-size:var(--pst-sidebar-caption-font-size);text-transform:uppercase;font-weight:700;position:relative;margin-top:1.25em;margin-bottom:.5em;padding:0 1.5rem;color:rgba(var(--pst-color-sidebar-caption),1)}nav.bd-links p.caption:first-child{margin-top:0}.bd-sidebar .nav{font-size:var(--pst-sidebar-font-size)}.bd-sidebar .nav ul{list-style:none;padding:0 0 0 1.5rem}.bd-sidebar .nav li>a{display:block;padding:.25rem 1.5rem;color:rgba(var(--pst-color-sidebar-link),1)}.bd-sidebar .nav li>a:hover{color:rgba(var(--pst-color-sidebar-link-hover),1);text-decoration:none;background-color:transparent}.bd-sidebar .nav li>a.reference.external:after{font-family:Font Awesome\ 5 Free;font-weight:900;content:"\f35d";font-size:.75em;margin-left:.3em}.bd-sidebar .nav .active:hover>a,.bd-sidebar .nav .active>a{font-weight:600;color:rgba(var(--pst-color-sidebar-link-active),1)}.toc-h2{font-size:.85rem}.toc-h3{font-size:.75rem}.toc-h4{font-size:.65rem}.toc-entry>.nav-link.active{font-weight:600;color:#130654;color:rgba(var(--pst-color-toc-link-active),1);background-color:transparent;border-left:2px solid rgba(var(--pst-color-toc-link-active),1)}.nav-link:hover{border-style:none}#navbar-main-elements li.nav-item i{font-size:.7rem;padding-left:2px;vertical-align:middle}.bd-toc .nav .nav{display:none}.bd-toc .nav .nav.visible,.bd-toc .nav>.active>ul{display:block}.prev-next-area{margin:20px 0}.prev-next-area p{margin:0 .3em;line-height:1.3em}.prev-next-area i{font-size:1.2em}.prev-next-area a{display:flex;align-items:center;border:none;padding:10px;max-width:45%;overflow-x:hidden;color:rgba(0,0,0,.65);text-decoration:none}.prev-next-area a p.prev-next-title{color:rgba(var(--pst-color-link),1);font-weight:600;font-size:1.1em}.prev-next-area a:hover p.prev-next-title{text-decoration:underline}.prev-next-area a .prev-next-info{flex-direction:column;margin:0 .5em}.prev-next-area a .prev-next-info .prev-next-subtitle{text-transform:capitalize}.prev-next-area a.left-prev{float:left}.prev-next-area a.right-next{float:right}.prev-next-area a.right-next div.prev-next-info{text-align:right}.alert{padding-bottom:0}.alert-info a{color:#e83e8c}#navbar-icon-links i.fa,#navbar-icon-links i.fab,#navbar-icon-links i.far,#navbar-icon-links i.fas{vertical-align:middle;font-style:normal;font-size:1.5rem;line-height:1.25}#navbar-icon-links i.fa-github-square:before{color:#333}#navbar-icon-links i.fa-twitter-square:before{color:#55acee}#navbar-icon-links i.fa-gitlab:before{color:#548}#navbar-icon-links i.fa-bitbucket:before{color:#0052cc}.tocsection{border-left:1px solid #eee;padding:.3rem 1.5rem}.tocsection i{padding-right:.5rem}.editthispage{padding-top:2rem}.editthispage a{color:var(--pst-color-sidebar-link-active)}.xr-wrap[hidden]{display:block!important}.toctree-checkbox{position:absolute;display:none}.toctree-checkbox~ul{display:none}.toctree-checkbox~label i{transform:rotate(0deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label i{transform:rotate(180deg)}.bd-sidebar li{position:relative}.bd-sidebar label{position:absolute;top:0;right:0;height:30px;width:30px;cursor:pointer;display:flex;justify-content:center;align-items:center}.bd-sidebar label:hover{background:rgba(var(--pst-color-sidebar-expander-background-hover),1)}.bd-sidebar label i{display:inline-block;font-size:.75rem;text-align:center}.bd-sidebar label i:hover{color:rgba(var(--pst-color-sidebar-link-hover),1)}.bd-sidebar li.has-children>.reference{padding-right:30px}div.doctest>div.highlight span.gp,span.linenos,table.highlighttable td.linenos{user-select:none;-webkit-user-select:text;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.docutils.container{padding-left:unset;padding-right:unset} \ No newline at end of file diff --git a/_static/css/theme.css b/_static/css/theme.css old mode 100644 new mode 100755 index 2e03fe37..aca94290 --- a/_static/css/theme.css +++ b/_static/css/theme.css @@ -1,120 +1,120 @@ -/* Provided by the Sphinx base theme template at build time */ -@import "../basic.css"; - -:root { - /***************************************************************************** - * Theme config - **/ - --pst-header-height: 60px; - - /***************************************************************************** - * Font size - **/ - --pst-font-size-base: 15px; /* base font size - applied at body / html level */ - - /* heading font sizes */ - --pst-font-size-h1: 36px; - --pst-font-size-h2: 32px; - --pst-font-size-h3: 26px; - --pst-font-size-h4: 21px; - --pst-font-size-h5: 18px; - --pst-font-size-h6: 16px; - - /* smaller then heading font sizes*/ - --pst-font-size-milli: 12px; - - --pst-sidebar-font-size: .9em; - --pst-sidebar-caption-font-size: .9em; - - /***************************************************************************** - * Font family - **/ - /* These are adapted from https://systemfontstack.com/ */ - --pst-font-family-base-system: -apple-system, BlinkMacSystemFont, Segoe UI, "Helvetica Neue", - Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; - --pst-font-family-monospace-system: "SFMono-Regular", Menlo, Consolas, Monaco, - Liberation Mono, Lucida Console, monospace; - - --pst-font-family-base: var(--pst-font-family-base-system); - --pst-font-family-heading: var(--pst-font-family-base); - --pst-font-family-monospace: var(--pst-font-family-monospace-system); - - /***************************************************************************** - * Color - * - * Colors are defined in rgb string way, "red, green, blue" - **/ - --pst-color-primary: 19, 6, 84; - --pst-color-success: 40, 167, 69; - --pst-color-info: 0, 123, 255; /*23, 162, 184;*/ - --pst-color-warning: 255, 193, 7; - --pst-color-danger: 220, 53, 69; - --pst-color-text-base: 51, 51, 51; - - --pst-color-h1: var(--pst-color-primary); - --pst-color-h2: var(--pst-color-primary); - --pst-color-h3: var(--pst-color-text-base); - --pst-color-h4: var(--pst-color-text-base); - --pst-color-h5: var(--pst-color-text-base); - --pst-color-h6: var(--pst-color-text-base); - --pst-color-paragraph: var(--pst-color-text-base); - --pst-color-link: 0, 91, 129; - --pst-color-link-hover: 227, 46, 0; - --pst-color-headerlink: 198, 15, 15; - --pst-color-headerlink-hover: 255, 255, 255; - --pst-color-preformatted-text: 34, 34, 34; - --pst-color-preformatted-background: 250, 250, 250; - --pst-color-inline-code: 232, 62, 140; - - --pst-color-active-navigation: 19, 6, 84; - --pst-color-navbar-link: 77, 77, 77; - --pst-color-navbar-link-hover: var(--pst-color-active-navigation); - --pst-color-navbar-link-active: var(--pst-color-active-navigation); - --pst-color-sidebar-link: 77, 77, 77; - --pst-color-sidebar-link-hover: var(--pst-color-active-navigation); - --pst-color-sidebar-link-active: var(--pst-color-active-navigation); - --pst-color-sidebar-expander-background-hover: 244, 244, 244; - --pst-color-sidebar-caption: 77, 77, 77; - --pst-color-toc-link: 119, 117, 122; - --pst-color-toc-link-hover: var(--pst-color-active-navigation); - --pst-color-toc-link-active: var(--pst-color-active-navigation); - - /***************************************************************************** - * Icon - **/ - - /* font awesome icons*/ - --pst-icon-check-circle: '\f058'; - --pst-icon-info-circle: '\f05a'; - --pst-icon-exclamation-triangle: '\f071'; - --pst-icon-exclamation-circle: '\f06a'; - --pst-icon-times-circle: '\f057'; - --pst-icon-lightbulb: '\f0eb'; - - /***************************************************************************** - * Admonitions - **/ - - --pst-color-admonition-default: var(--pst-color-info); - --pst-color-admonition-note: var(--pst-color-info); - --pst-color-admonition-attention: var(--pst-color-warning); - --pst-color-admonition-caution: var(--pst-color-warning); - --pst-color-admonition-warning: var(--pst-color-warning); - --pst-color-admonition-danger: var(--pst-color-danger); - --pst-color-admonition-error: var(--pst-color-danger); - --pst-color-admonition-hint: var(--pst-color-success); - --pst-color-admonition-tip: var(--pst-color-success); - --pst-color-admonition-important: var(--pst-color-success); - - --pst-icon-admonition-default: var(--pst-icon-info-circle); - --pst-icon-admonition-note: var(--pst-icon-info-circle); - --pst-icon-admonition-attention: var(--pst-icon-exclamation-circle); - --pst-icon-admonition-caution: var(--pst-icon-exclamation-triangle); - --pst-icon-admonition-warning: var(--pst-icon-exclamation-triangle); - --pst-icon-admonition-danger: var(--pst-icon-exclamation-triangle); - --pst-icon-admonition-error: var(--pst-icon-times-circle); - --pst-icon-admonition-hint: var(--pst-icon-lightbulb); - --pst-icon-admonition-tip: var(--pst-icon-lightbulb); - --pst-icon-admonition-important: var(--pst-icon-exclamation-circle); - -} +/* Provided by the Sphinx base theme template at build time */ +@import "../basic.css"; + +:root { + /***************************************************************************** + * Theme config + **/ + --pst-header-height: 60px; + + /***************************************************************************** + * Font size + **/ + --pst-font-size-base: 15px; /* base font size - applied at body / html level */ + + /* heading font sizes */ + --pst-font-size-h1: 36px; + --pst-font-size-h2: 32px; + --pst-font-size-h3: 26px; + --pst-font-size-h4: 21px; + --pst-font-size-h5: 18px; + --pst-font-size-h6: 16px; + + /* smaller then heading font sizes*/ + --pst-font-size-milli: 12px; + + --pst-sidebar-font-size: .9em; + --pst-sidebar-caption-font-size: .9em; + + /***************************************************************************** + * Font family + **/ + /* These are adapted from https://systemfontstack.com/ */ + --pst-font-family-base-system: -apple-system, BlinkMacSystemFont, Segoe UI, "Helvetica Neue", + Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; + --pst-font-family-monospace-system: "SFMono-Regular", Menlo, Consolas, Monaco, + Liberation Mono, Lucida Console, monospace; + + --pst-font-family-base: var(--pst-font-family-base-system); + --pst-font-family-heading: var(--pst-font-family-base); + --pst-font-family-monospace: var(--pst-font-family-monospace-system); + + /***************************************************************************** + * Color + * + * Colors are defined in rgb string way, "red, green, blue" + **/ + --pst-color-primary: 19, 6, 84; + --pst-color-success: 40, 167, 69; + --pst-color-info: 0, 123, 255; /*23, 162, 184;*/ + --pst-color-warning: 255, 193, 7; + --pst-color-danger: 220, 53, 69; + --pst-color-text-base: 51, 51, 51; + + --pst-color-h1: var(--pst-color-primary); + --pst-color-h2: var(--pst-color-primary); + --pst-color-h3: var(--pst-color-text-base); + --pst-color-h4: var(--pst-color-text-base); + --pst-color-h5: var(--pst-color-text-base); + --pst-color-h6: var(--pst-color-text-base); + --pst-color-paragraph: var(--pst-color-text-base); + --pst-color-link: 0, 91, 129; + --pst-color-link-hover: 227, 46, 0; + --pst-color-headerlink: 198, 15, 15; + --pst-color-headerlink-hover: 255, 255, 255; + --pst-color-preformatted-text: 34, 34, 34; + --pst-color-preformatted-background: 250, 250, 250; + --pst-color-inline-code: 232, 62, 140; + + --pst-color-active-navigation: 19, 6, 84; + --pst-color-navbar-link: 77, 77, 77; + --pst-color-navbar-link-hover: var(--pst-color-active-navigation); + --pst-color-navbar-link-active: var(--pst-color-active-navigation); + --pst-color-sidebar-link: 77, 77, 77; + --pst-color-sidebar-link-hover: var(--pst-color-active-navigation); + --pst-color-sidebar-link-active: var(--pst-color-active-navigation); + --pst-color-sidebar-expander-background-hover: 244, 244, 244; + --pst-color-sidebar-caption: 77, 77, 77; + --pst-color-toc-link: 119, 117, 122; + --pst-color-toc-link-hover: var(--pst-color-active-navigation); + --pst-color-toc-link-active: var(--pst-color-active-navigation); + + /***************************************************************************** + * Icon + **/ + + /* font awesome icons*/ + --pst-icon-check-circle: '\f058'; + --pst-icon-info-circle: '\f05a'; + --pst-icon-exclamation-triangle: '\f071'; + --pst-icon-exclamation-circle: '\f06a'; + --pst-icon-times-circle: '\f057'; + --pst-icon-lightbulb: '\f0eb'; + + /***************************************************************************** + * Admonitions + **/ + + --pst-color-admonition-default: var(--pst-color-info); + --pst-color-admonition-note: var(--pst-color-info); + --pst-color-admonition-attention: var(--pst-color-warning); + --pst-color-admonition-caution: var(--pst-color-warning); + --pst-color-admonition-warning: var(--pst-color-warning); + --pst-color-admonition-danger: var(--pst-color-danger); + --pst-color-admonition-error: var(--pst-color-danger); + --pst-color-admonition-hint: var(--pst-color-success); + --pst-color-admonition-tip: var(--pst-color-success); + --pst-color-admonition-important: var(--pst-color-success); + + --pst-icon-admonition-default: var(--pst-icon-info-circle); + --pst-icon-admonition-note: var(--pst-icon-info-circle); + --pst-icon-admonition-attention: var(--pst-icon-exclamation-circle); + --pst-icon-admonition-caution: var(--pst-icon-exclamation-triangle); + --pst-icon-admonition-warning: var(--pst-icon-exclamation-triangle); + --pst-icon-admonition-danger: var(--pst-icon-exclamation-triangle); + --pst-icon-admonition-error: var(--pst-icon-times-circle); + --pst-icon-admonition-hint: var(--pst-icon-lightbulb); + --pst-icon-admonition-tip: var(--pst-icon-lightbulb); + --pst-icon-admonition-important: var(--pst-icon-exclamation-circle); + +} diff --git a/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css b/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css old mode 100644 new mode 100755 index 3225661c..57bec30a --- a/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css +++ b/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css @@ -1 +1 @@ -.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #007bff;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0069d9;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #007bff;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0069d9;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/_static/design-tabs.js b/_static/design-tabs.js old mode 100644 new mode 100755 index 36b38cf0..a869cf55 --- a/_static/design-tabs.js +++ b/_static/design-tabs.js @@ -1,27 +1,27 @@ -var sd_labels_by_text = {}; - -function ready() { - const li = document.getElementsByClassName("sd-tab-label"); - for (const label of li) { - syncId = label.getAttribute("data-sync-id"); - if (syncId) { - label.onclick = onLabelClick; - if (!sd_labels_by_text[syncId]) { - sd_labels_by_text[syncId] = []; - } - sd_labels_by_text[syncId].push(label); - } - } -} - -function onLabelClick() { - // Activate other inputs with the same sync id. - syncId = this.getAttribute("data-sync-id"); - for (label of sd_labels_by_text[syncId]) { - if (label === this) continue; - label.previousElementSibling.checked = true; - } - window.localStorage.setItem("sphinx-design-last-tab", syncId); -} - -document.addEventListener("DOMContentLoaded", ready, false); +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/_static/doctools.js b/_static/doctools.js old mode 100644 new mode 100755 diff --git a/_static/documentation_options.js b/_static/documentation_options.js old mode 100644 new mode 100755 index 30637825..f48413d2 --- a/_static/documentation_options.js +++ b/_static/documentation_options.js @@ -1,14 +1,14 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '', - NAVIGATION_WITH_KEYS: true, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: false, +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: false, }; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png old mode 100644 new mode 100755 diff --git a/_static/images/logo_binder.svg b/_static/images/logo_binder.svg old mode 100644 new mode 100755 diff --git a/_static/images/logo_colab.png b/_static/images/logo_colab.png old mode 100644 new mode 100755 diff --git a/_static/images/logo_deepnote.svg b/_static/images/logo_deepnote.svg old mode 100644 new mode 100755 diff --git a/_static/images/logo_jupyterhub.svg b/_static/images/logo_jupyterhub.svg old mode 100644 new mode 100755 diff --git a/_static/jquery-3.5.1.js b/_static/jquery-3.5.1.js old mode 100644 new mode 100755 index 50937333..55460159 --- a/_static/jquery-3.5.1.js +++ b/_static/jquery-3.5.1.js @@ -1,10872 +1,10872 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " {% endmacro %} {% macro body_post() %} - - + + {% endmacro %} \ No newline at end of file diff --git a/docs/experiments/js_exp.html b/docs/experiments/js_exp.html old mode 100644 new mode 100755 index 7cce5580..5ee91d07 --- a/docs/experiments/js_exp.html +++ b/docs/experiments/js_exp.html @@ -1,805 +1,824 @@ - - - - - - - - - - - - Synthetic Data with Stable Diffusion for Foliar Disease Classification — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

Synthetic Data with Stable Diffusion for Foliar Disease Classification

- -
- -
-
- - - - -
- -
-

Information

-
    -
  • Title: Synthetic Data with Stable Diffusion for Foliar Disease Classification

  • -
  • Author: Jisu Kim

  • -
  • Last updated on Jul. 05, 2023

  • -
-
-
-

Synthetic Data with Stable Diffusion for Foliar Disease Classification#

-
-

1. 개요#

-
    -
  • 사과 나무의 잎에 생기는 질병을 이미지로 판별하는 Kaggle competition (링크)에서 아이디어를 얻어서 진행한 프로젝트입니다.

  • -
  • 해당 competition은 사과나무 잎에 걸린 질병에 따라 잎 이미지를 4개의 class로 분류하는 task입니다.

  • -
-
-4classes -
-

Fig. 545 4 classes of leaves#

-
-
-
    -
  • competition을 설명한 article (링크)에서 전체적인 accuracy는 97%이지만 multiple diseases class의 경우 accuracy가 51%에 불과했다고 언급합니다.

  • -
  • multiple diseases class의 이미지 개수가 다른 class에 비해 적은 점에 주목했고, stable diffusion을 사용하여 해당 클래스의 데이터 개수를 늘려서 classifier 학습에 사용하면 더 좋은 성능의 classifier를 얻을 수 있을 것으로 기대했습니다.

  • -
-
-
-

2. Baseline 구축#

-
    -
  • 문제 상황을 재현하기 위해 기존 데이터로 image classifier를 학습하여 baseline으로 잡았습니다.

  • -
  • 모델은 pretrained된 ResNet18에 linear layer를 붙여서 사용했습니다.

  • -
  • 전체 accuracy는 97.7%, class별 accuracy는 healthy: 99.6%, multiple diseases: 73.6%, rust: 99.2%, scab: 98.1%

  • -
  • multiple diseases class는 이미지 개수 91개로 다른 클래스들에 비해서 개수가 적습니다.

  • -
  • class별 data imbalance가 성능을 낮추는 원인일 것이라 가정하고 stable diffusion으로 multiple diseases class의 data를 추가로 생성해보기로 했습니다.

  • -
  • multiple diseases class 예시

  • -
-
-multiple_ex -
-

Fig. 546 4 classes of leaves#

-
-
-
-
-

3. Stable diffusion fine tuning#

-
    -
  • pretraned stable diffusion의 경우 multiple diseases class에 대한 정보가 없어서 이미지를 생성할 경우 아래와 같이 관련없는 이미지가 생성됩니다.

  • -
-
-multiple_sd -
-

Fig. 547 prompt: “a photo of leaves with multiple diseases#

-
-
-
    -
  • 따라서 stable diffusion model (링크)에 해당 class에 대한 정보를 넣어주기 위해 dreambooth (링크)를 사용하여 stable diffusion을 fine tuning했습니다.

  • -
  • training에 사용한 prompt는 “a photo of a <diseaes-leaf> leaf”이며, 생성한 이미지의 예시는 아래와 같습니다.

  • -
  • 생성 이미지 예시

  • -
-
-multiple_db -
-

Fig. 548 prompt: “a photo of a <diseaes-leaf> leaf”#

-
-
-
    -
  • prompt engineering을 수행하던 중 의도하지않은 결과를 발견했습니다.

  • -
  • 아래는 이에 대한 예시로 fine tuning 전의 stable diffusion model의 결과와 비교입니다.

  • -
  • 상황1 (prompt: “a photo of a leaf”)

  • -
-
-leaf_sd -
-

Fig. 549 fine tuning 전#

-
-
-
-leaf_db -
-

Fig. 550 fine tuning 후#

-
-
-
    -
  • 상황1을 보면 multiple diseases class 정보를 담은 unique identifier <diseaes-leaf>가 없음에도 multiple diseases의 정보를 담은 잎들만 생성됩니다. 이는 같은 class (leaf)에 속하는 다른 이미지들을 생성해내지 못하고 있다는 것입니다. 이 현상을 language drift라고 하며, 모델이 multiple diseases class의 leaf가 아닌 일반적인 leaf class에 관한 정보를 잊어버렸기 때문입니다.

  • -
  • 상황2 (prompt: “a photo”)

  • -
-
-photo_sd -
-

Fig. 551 fine tuning 전#

-
-
-
-photo_db -
-

Fig. 552 fine tuning 후#

-
-
-
    -
  • 상황2를 보면 photo라는 prompt만 사용하였는데도 생성한 이미지들에 multiple diseases class의 특징들이 나타납니다.

  • -
  • dreambooth에서는 language drift를 prior preservation loss를 사용해서 해결하였으므로 같은 방법을 사용했습니다. 상황2를 해결하기 위해 training prompt에서 “photo”를 제외하고 최대한 단순한 prompt “<diseases-leaf> leaf”를 사용하여 stable diffusion model을 다시 fine tuning했습니다.

  • -
-
-multiple_pp -
-

Fig. 553 multiple diseases class 이미지 생성 결과, prompt: “<diseaes-leaf> leaf”#

-
-
-
-leaf_pp -
-

Fig. 554 leaf 생성 결과, prompt: “leaf”#

-
-
-
    -
  • 재훈련 결과, fine tuning 이후에도 기존 stable diffusion model로 “leaf”를 생성하였을 때와 비슷한 이미지가 생성됩니다.

  • -
-
-photo_pp -
-

Fig. 555 photo 생성 결과, prompt: “photo”#

-
-
-
    -
  • “photo”의 경우에는 여전히 multiple diseases class의 영향을 받은 것같은 이미지들이 생성됩니다. photo의 경우에는 여러 대상들과 사용되는 일반적인 특성을 가지고있어서 그런 것이라는 생각이 들었고, 이를 체크해보기 위해 특정한 대상들과 photo와 비슷한 용도로 사용되는 다른 prompt들로 이미지들을 생성보았습니다.

  • -
  • 특정한 대상 세가지로는 cat, sea, pirate을 사용했고, photo와 비슷하게 사용되는 텍스트 세가지는 illustration, animation, wallpaper를 사용했습니다. (이미지는 글 마지막 부분의 appendix에 있습니다.)

  • -
  • 이미지 생성 결과, 특정한 대상을 지칭하는 텍스트의 경우 대상의 특징이 잘 드러나는 이미지가 생성되었지만, 여러 대상과 함께 쓰이는 텍스트의 경우 잎사귀의 특징을 가지는 이미지들이 일부 생성되었습니다.

  • -
-
-
-

4. 성능 비교#

-
    -
  • fine tuning한 stable diffusion model로 multiple diseases class의 이미지를 400장 생성하여 classifier를 다시 훈련했습니다.

  • -
-

baseline

-
    -
  • 전체 accuracy는 97.7%, class별 accuracy는 healthy: 99.6%, multiple diseases: 73.6%, rust: 99.2%, scab: 98.1%

  • -
-
-result_base -
-

Fig. 556 result_base#

-
-
-

생성한 이미지를 추가 데이터로 활용한 경우

-
    -
  • 전체 accuracy는 97.9%, class별 accuracy는 healthy: 98.1%, multiple diseases: 84.6%, rust: 98.2%, scab: 99.3%

  • -
-
-result_new -
-

Fig. 557 result_now#

-
-
-
    -
  • kaggle에서 제공하는 test set에 적용했을 때는 baseline이 94.6%, stable diffusion으로 생성한 이미지들을 사용한 경우가 93.7%여서 baseline보다 좋은 성능을 얻지는 못 했습니다.

  • -
-
-
-

5. Discussion#

-
    -
  • stable diffusion 훈련 중간중간에 일정 step마다 이미지를 생성하게해서 훈련에 대한 모니터링이 있으면 좋겠다는 생각을 했습니다.

  • -
  • stable diffusion 훈련시 hyperparameter tuning을 좀 더 철저하게 해야겠다는 생각을 했습니다.

  • -
  • stable diffusion으로 생성한 이미지가 실제로 multiple diseases class 조건을 만족하는지 검수할 방안이 필요합니다.

  • -
  • multiple diseases 내에서도 카테고리를 나눌 수 있다면 나눠서 각각에 대한 stable diffusion model을 fine tuning할 수도 있을 것입니다.

  • -
  • 다른 diffusion model fine tuning 방법을 활용해볼 수도 있을 것입니다.

  • -
  • submission score에서 baseline을 이기지 못 했지만 text-to-image model을 이용한 synthetic data의 가능성을 볼 수 있었다고 생각합니다.

  • -
-
-
-

6. Appendix#

-
    -
  • 앞에서 언급한 prompt에 대한 이미지 생성 예시입니다. 일부 이미지는 NSFW로 판단되어 검은색으로 나왔습니다.

  • -
-
-cat -
-

Fig. 558 cat 생성 결과, prompt: “cat”#

-
-
-
-sea -
-

Fig. 559 sea 생성 결과, prompt: “sea”#

-
-
-
-pirate -
-

Fig. 560 pirate 생성 결과, prompt: “pirate”#

-
-
-
-illustration -
-

Fig. 561 illustration 생성 결과, prompt: “illustration”#

-
-
-
-animation -
-

Fig. 562 animation 생성 결과, prompt: “animation”#

-
-
-
-wallpaper -
-

Fig. 563 wallpaper 생성 결과, prompt: “wallpaper”#

-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Synthetic Data with Stable Diffusion for Foliar Disease Classification — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Synthetic Data with Stable Diffusion for Foliar Disease Classification

+ +
+ +
+
+ + + + +
+ +
+

Information

+
    +
  • Title: Synthetic Data with Stable Diffusion for Foliar Disease Classification

  • +
  • Author: Jisu Kim

  • +
  • Last updated on Jul. 05, 2023

  • +
+
+
+

Synthetic Data with Stable Diffusion for Foliar Disease Classification#

+
+

1. 개요#

+
    +
  • 사과 나무의 잎에 생기는 질병을 이미지로 판별하는 Kaggle competition (링크)에서 아이디어를 얻어서 진행한 프로젝트입니다.

  • +
  • 해당 competition은 사과나무 잎에 걸린 질병에 따라 잎 이미지를 4개의 class로 분류하는 task입니다.

  • +
+
+4classes +
+

Fig. 545 4 classes of leaves#

+
+
+
    +
  • competition을 설명한 article (링크)에서 전체적인 accuracy는 97%이지만 multiple diseases class의 경우 accuracy가 51%에 불과했다고 언급합니다.

  • +
  • multiple diseases class의 이미지 개수가 다른 class에 비해 적은 점에 주목했고, stable diffusion을 사용하여 해당 클래스의 데이터 개수를 늘려서 classifier 학습에 사용하면 더 좋은 성능의 classifier를 얻을 수 있을 것으로 기대했습니다.

  • +
+
+
+

2. Baseline 구축#

+
    +
  • 문제 상황을 재현하기 위해 기존 데이터로 image classifier를 학습하여 baseline으로 잡았습니다.

  • +
  • 모델은 pretrained된 ResNet18에 linear layer를 붙여서 사용했습니다.

  • +
  • 전체 accuracy는 97.7%, class별 accuracy는 healthy: 99.6%, multiple diseases: 73.6%, rust: 99.2%, scab: 98.1%

  • +
  • multiple diseases class는 이미지 개수 91개로 다른 클래스들에 비해서 개수가 적습니다.

  • +
  • class별 data imbalance가 성능을 낮추는 원인일 것이라 가정하고 stable diffusion으로 multiple diseases class의 data를 추가로 생성해보기로 했습니다.

  • +
  • multiple diseases class 예시

  • +
+
+multiple_ex +
+

Fig. 546 4 classes of leaves#

+
+
+
+
+

3. Stable diffusion fine tuning#

+
    +
  • pretraned stable diffusion의 경우 multiple diseases class에 대한 정보가 없어서 이미지를 생성할 경우 아래와 같이 관련없는 이미지가 생성됩니다.

  • +
+
+multiple_sd +
+

Fig. 547 prompt: “a photo of leaves with multiple diseases#

+
+
+
    +
  • 따라서 stable diffusion model (링크)에 해당 class에 대한 정보를 넣어주기 위해 dreambooth (링크)를 사용하여 stable diffusion을 fine tuning했습니다.

  • +
  • training에 사용한 prompt는 “a photo of a <diseaes-leaf> leaf”이며, 생성한 이미지의 예시는 아래와 같습니다.

  • +
  • 생성 이미지 예시

  • +
+
+multiple_db +
+

Fig. 548 prompt: “a photo of a <diseaes-leaf> leaf”#

+
+
+
    +
  • prompt engineering을 수행하던 중 의도하지않은 결과를 발견했습니다.

  • +
  • 아래는 이에 대한 예시로 fine tuning 전의 stable diffusion model의 결과와 비교입니다.

  • +
  • 상황1 (prompt: “a photo of a leaf”)

  • +
+
+leaf_sd +
+

Fig. 549 fine tuning 전#

+
+
+
+leaf_db +
+

Fig. 550 fine tuning 후#

+
+
+
    +
  • 상황1을 보면 multiple diseases class 정보를 담은 unique identifier <diseaes-leaf>가 없음에도 multiple diseases의 정보를 담은 잎들만 생성됩니다. 이는 같은 class (leaf)에 속하는 다른 이미지들을 생성해내지 못하고 있다는 것입니다. 이 현상을 language drift라고 하며, 모델이 multiple diseases class의 leaf가 아닌 일반적인 leaf class에 관한 정보를 잊어버렸기 때문입니다.

  • +
  • 상황2 (prompt: “a photo”)

  • +
+
+photo_sd +
+

Fig. 551 fine tuning 전#

+
+
+
+photo_db +
+

Fig. 552 fine tuning 후#

+
+
+
    +
  • 상황2를 보면 photo라는 prompt만 사용하였는데도 생성한 이미지들에 multiple diseases class의 특징들이 나타납니다.

  • +
  • dreambooth에서는 language drift를 prior preservation loss를 사용해서 해결하였으므로 같은 방법을 사용했습니다. 상황2를 해결하기 위해 training prompt에서 “photo”를 제외하고 최대한 단순한 prompt “<diseases-leaf> leaf”를 사용하여 stable diffusion model을 다시 fine tuning했습니다.

  • +
+
+multiple_pp +
+

Fig. 553 multiple diseases class 이미지 생성 결과, prompt: “<diseaes-leaf> leaf”#

+
+
+
+leaf_pp +
+

Fig. 554 leaf 생성 결과, prompt: “leaf”#

+
+
+
    +
  • 재훈련 결과, fine tuning 이후에도 기존 stable diffusion model로 “leaf”를 생성하였을 때와 비슷한 이미지가 생성됩니다.

  • +
+
+photo_pp +
+

Fig. 555 photo 생성 결과, prompt: “photo”#

+
+
+
    +
  • “photo”의 경우에는 여전히 multiple diseases class의 영향을 받은 것같은 이미지들이 생성됩니다. photo의 경우에는 여러 대상들과 사용되는 일반적인 특성을 가지고있어서 그런 것이라는 생각이 들었고, 이를 체크해보기 위해 특정한 대상들과 photo와 비슷한 용도로 사용되는 다른 prompt들로 이미지들을 생성보았습니다.

  • +
  • 특정한 대상 세가지로는 cat, sea, pirate을 사용했고, photo와 비슷하게 사용되는 텍스트 세가지는 illustration, animation, wallpaper를 사용했습니다. (이미지는 글 마지막 부분의 appendix에 있습니다.)

  • +
  • 이미지 생성 결과, 특정한 대상을 지칭하는 텍스트의 경우 대상의 특징이 잘 드러나는 이미지가 생성되었지만, 여러 대상과 함께 쓰이는 텍스트의 경우 잎사귀의 특징을 가지는 이미지들이 일부 생성되었습니다.

  • +
+
+
+

4. 성능 비교#

+
    +
  • fine tuning한 stable diffusion model로 multiple diseases class의 이미지를 400장 생성하여 classifier를 다시 훈련했습니다.

  • +
+

baseline

+
    +
  • 전체 accuracy는 97.7%, class별 accuracy는 healthy: 99.6%, multiple diseases: 73.6%, rust: 99.2%, scab: 98.1%

  • +
+
+result_base +
+

Fig. 556 result_base#

+
+
+

생성한 이미지를 추가 데이터로 활용한 경우

+
    +
  • 전체 accuracy는 97.9%, class별 accuracy는 healthy: 98.1%, multiple diseases: 84.6%, rust: 98.2%, scab: 99.3%

  • +
+
+result_new +
+

Fig. 557 result_now#

+
+
+
    +
  • kaggle에서 제공하는 test set에 적용했을 때는 baseline이 94.6%, stable diffusion으로 생성한 이미지들을 사용한 경우가 93.7%여서 baseline보다 좋은 성능을 얻지는 못 했습니다.

  • +
+
+
+

5. Discussion#

+
    +
  • stable diffusion 훈련 중간중간에 일정 step마다 이미지를 생성하게해서 훈련에 대한 모니터링이 있으면 좋겠다는 생각을 했습니다.

  • +
  • stable diffusion 훈련시 hyperparameter tuning을 좀 더 철저하게 해야겠다는 생각을 했습니다.

  • +
  • stable diffusion으로 생성한 이미지가 실제로 multiple diseases class 조건을 만족하는지 검수할 방안이 필요합니다.

  • +
  • multiple diseases 내에서도 카테고리를 나눌 수 있다면 나눠서 각각에 대한 stable diffusion model을 fine tuning할 수도 있을 것입니다.

  • +
  • 다른 diffusion model fine tuning 방법을 활용해볼 수도 있을 것입니다.

  • +
  • submission score에서 baseline을 이기지 못 했지만 text-to-image model을 이용한 synthetic data의 가능성을 볼 수 있었다고 생각합니다.

  • +
+
+
+

6. Appendix#

+
    +
  • 앞에서 언급한 prompt에 대한 이미지 생성 예시입니다. 일부 이미지는 NSFW로 판단되어 검은색으로 나왔습니다.

  • +
+
+cat +
+

Fig. 558 cat 생성 결과, prompt: “cat”#

+
+
+
+sea +
+

Fig. 559 sea 생성 결과, prompt: “sea”#

+
+
+
+pirate +
+

Fig. 560 pirate 생성 결과, prompt: “pirate”#

+
+
+
+illustration +
+

Fig. 561 illustration 생성 결과, prompt: “illustration”#

+
+
+
+animation +
+

Fig. 562 animation 생성 결과, prompt: “animation”#

+
+
+
+wallpaper +
+

Fig. 563 wallpaper 생성 결과, prompt: “wallpaper”#

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/experiments/swjo_exp.html b/docs/experiments/swjo_exp.html old mode 100644 new mode 100755 index 2a15a971..9ed2b8fa --- a/docs/experiments/swjo_exp.html +++ b/docs/experiments/swjo_exp.html @@ -1,883 +1,902 @@ - - - - - - - - - - - - Training DreamBooth on Naver Webtoon Face Dataset — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

Training DreamBooth on Naver Webtoon Face Dataset

- -
- -
-
- - - - -
- -
-

Information

-
    -
  • Title: Training DreamBooth on Naver Webtoon Face Dataset

  • -
  • Author: Sangwoo Jo

  • -
  • Last updated on Jul. 09, 2023

  • -
-
-
-

Training DreamBooth on Naver Webtoon Face Dataset#

-
-

Introduction#

-

이번 포스팅에서는 DreamBooth 를 직접 학습해보고 실험한 결과들을 공유할려고 합니다.

-

우선적으로 학습데이터는 bryandlee/naver-webtoon-data 에 공개된 YOLOv5 모델 및 Waifu2x 후처리 기법을 활용하여 프리드로우에 등장하는 인물 사진들을 수집했습니다. 논문에서는 3-5 장으로 fine-tuning 이 가능하다고 제시되어있지만, 인물 사진 같은 경우 더 많은 데이터로 학습하면 성능이 더 좋아져서 15-20 장의 이미지로 학습하였습니다. 학습한 이미지들 예시입니다.

-
-swjo_exp_01 -
-

Fig. 564 Training Data#

-
-
-

DreamBooth 를 실험하면서 대표적으로 instance prompt, guidance scale, negative prompt, 그리고 마지막으로 prior preservation loss 를 반영하는 정도를 조절하는 prior_loss_weight 를 바꿔가면서 학습해보았습니다. 사전학습된 text-to-image 모델로 처음에는 hakurei/waifu-diffusion 모델을 시도해봤지만 결과가 만족스럽지 못해 runwayml/stable-diffusion-v1-5 모델로 fine-tuning 작업을 진행했습니다.

-
-
-

Ablation Studies#

-
-

Prior Preservation Loss#

-

Prior Preservation Loss 를 제외한 동일한 configuration 으로 모델 학습한 결과입니다.

-
# with prior-preservation loss
-MODEL_NAME = “runwayml/stable-diffusion-v1-5”
-instance_prompt = "A photo of sks girl"
-class_prompt = "A photo of a girl"
-
-python3 train_dreambooth.py \
-  --pretrained_model_name_or_path=$MODEL_NAME \
-  --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
-  --output_dir=$OUTPUT_DIR \
-  --revision="fp16" \
-  --with_prior_preservation --prior_loss_weight=1.0 \
-  --seed=1337 \
-  --resolution=512 \
-  --train_batch_size=1 \
-  --train_text_encoder \
-  --mixed_precision="fp16" \
-  --use_8bit_adam \
-  --gradient_accumulation_steps=1 --gradient_checkpointing \
-  --learning_rate=1e-6 \
-  --lr_scheduler="constant" \
-  --lr_warmup_steps=0 \
-  --num_class_images=200 \
-  --sample_batch_size=4 \
-  --max_train_steps=800 \
-  --save_interval=100 \
-  --save_sample_prompt="A photo of sks girl" \
-  --concepts_list="concepts_list.json"
-
-
-
# w/o prior-preservation loss
-MODEL_NAME = “runwayml/stable-diffusion-v1-5”
-instance_prompt = "A photo of sks girl"
-class_prompt = "A photo of a girl"
-
-python3 train_dreambooth.py \
-  --pretrained_model_name_or_path=$MODEL_NAME \
-  --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
-  --output_dir=$OUTPUT_DIR \
-  --revision="fp16" \
-  --with_prior_preservation --prior_loss_weight=0.0 \
-  --seed=1337 \
-  --resolution=512 \
-  --train_batch_size=1 \
-  --train_text_encoder \
-  --mixed_precision="fp16" \
-  --use_8bit_adam \
-  --gradient_accumulation_steps=1 --gradient_checkpointing \
-  --learning_rate=1e-6 \
-  --lr_scheduler="constant" \
-  --lr_warmup_steps=0 \
-  --num_class_images=200 \
-  --sample_batch_size=4 \
-  --max_train_steps=800 \
-  --save_interval=100 \
-  --save_sample_prompt="A photo of sks girl" \
-  --concepts_list="concepts_list.json"
-
-
-

아래 그림처럼 동일한 inference prompt 를 입력했을 때, prior preservation loss 를 제외함으로써 input images 에 더 가까운 웹툰 사진들을 생성할 수 있었습니다. 또한, 핑크색 머리를 한 이민지 캐릭터를 어느 정도 잘 생성하는 부분도 확인할 수 있습니다.

-
    -
  • Inference Prompt: “A photo of sks girl with pink hair” (with prior-preservation loss)

  • -
-
-swjo_exp_02 -
-

Fig. 565 With Prior Preservation Loss#

-
-
-
    -
  • Inference Prompt: ” A photo of sks girl with pink hair” (w/o prior-preservation loss)

  • -
-
-swjo_exp_03 -
-

Fig. 566 Without Prior Preservation Loss#

-
-
-
-
-

Negative Prompt#

-

Negative Prompt 에 대한 Ablation Study 도 진행했습니다. 캐릭터의 부자연스러운 부분이나 저해상도 이미지들을 생성하는 경우들이 종종 발생했는데, negative prompt 를 통해 더 좋은 퀄리티의 웹툰 캐릭터를 생성할 수 있었습니다.

-
    -
  • Inference Prompt: ” A photo of sks girl with pink hair” (w/o negative prompt)

  • -
-
-swjo_exp_03 -
-

Fig. 567 Without Negative Prompt#

-
-
-
    -
  • Inference Prompt: ” A photo of sks girl with pink hair”

    -

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    -
  • -
-
-swjo_exp_04 -
-

Fig. 568 With Negative Prompt#

-
-
-
-
-

Instance Prompt / Guidance Scale#

-

DreamBooth 논문에서 제시한 instance prompt 외에 “A photo of a girl in the style of sks” 라는 prompt 로 학습을 시도해보기도 했습니다. sks 라는 unique identifier 에 특정 여자 캐릭터에 대한 정보뿐만 아니라 프리드로우 그림체 자체를 담아내기 위한 목적이였습니다.

-
# different instance prompt with prior-preservation loss
-MODEL_NAME = “runwayml/stable-diffusion-v1-5”
-instance_prompt = "A photo of a girl in the style of sks"
-class_prompt = "A photo of a girl"
-
-python3 train_dreambooth.py \
-  --pretrained_model_name_or_path=$MODEL_NAME \
-  --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
-  --output_dir=$OUTPUT_DIR \
-  --revision="fp16" \
-  --with_prior_preservation --prior_loss_weight=1.0 \
-  --seed=1337 \
-  --resolution=512 \
-  --train_batch_size=1 \
-  --train_text_encoder \
-  --mixed_precision="fp16" \
-  --use_8bit_adam \
-  --gradient_accumulation_steps=1 --gradient_checkpointing \
-  --learning_rate=1e-6 \
-  --lr_scheduler="constant" \
-  --lr_warmup_steps=0 \
-  --num_class_images=200 \
-  --sample_batch_size=4 \
-  --max_train_steps=800 \
-  --save_interval=100 \
-  --save_sample_prompt="A photo of sks girl" \
-  --concepts_list="concepts_list.json"
-
-
-
# different instance prompt w/o prior-preservation loss
-MODEL_NAME = “runwayml/stable-diffusion-v1-5”
-instance_prompt = "A photo of a girl in the style of sks"
-class_prompt = "A photo of a girl"
-
-python3 train_dreambooth.py \
-  --pretrained_model_name_or_path=$MODEL_NAME \
-  --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
-  --output_dir=$OUTPUT_DIR \
-  --revision="fp16" \
-  --with_prior_preservation --prior_loss_weight=0.0 \
-  --seed=1337 \
-  --resolution=512 \
-  --train_batch_size=1 \
-  --train_text_encoder \
-  --mixed_precision="fp16" \
-  --use_8bit_adam \
-  --gradient_accumulation_steps=1 --gradient_checkpointing \
-  --learning_rate=1e-6 \
-  --lr_scheduler="constant" \
-  --lr_warmup_steps=0 \
-  --num_class_images=200 \
-  --sample_batch_size=4 \
-  --max_train_steps=800 \
-  --save_interval=100 \
-  --save_sample_prompt="A photo of sks girl" \
-  --concepts_list="concepts_list.json"
-
-
-

Inference 시, 프리드로우의 그림체가 반영된 남자가 생성되도록 prompt 를 “A photo of a boy in the style of sks” 로 입력했을때의 결과입니다. DreamBooth 혹은 사전학습된 text-to-image 모델을 프리드로우 작가님의 웹툰 장면들로 전체적으로 학습하게 된다면 더 다양한 inference 결과들을 볼 수 있을 것 같습니다.

-
    -
  • Inference Prompt: “A photo of a boy in the style of sks” (num_inference_steps = 24 / with prior-preservation loss)

    -

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    -
  • -
-
-swjo_exp_05 -
-

Fig. 569 Instance Prompt#

-
-
-

Inference step 을 늘려가면서 추론된 인물 이미지의 퀄리티가 상승하는 부분도 확인할 수 있었습니다. 또한, guidance scale 에 대한 실험도 진행했는데 guidance scale 이 작을수록 prompt 와 무관한 random 한 이미지들을 생성하게 됩니다. 최종적으로 num_inference steps 와 guidance scale 의 값은 각각 100 과 7.5 로 설정하였습니다.

-
    -
  • Inference Prompt: “A photo of a boy in the style of sks” (num_inference_steps=100 / with prior-preservation loss)

  • -
-
-swjo_exp_06 -
-

Fig. 570 Increasing Number of Inference Steps#

-
-
-
    -
  • Inference Prompt: “A photo of a boy in the style of sks” (num_inference_steps = 100 / with prior-preservation loss)

    -

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    -
  • -
-
-swjo_exp_07 -
-

Fig. 571 Increasing Number of Inference Steps / Negative Prompt#

-
-
-
    -
  • Inference Prompt: “A photo of a boy in the style of sks” (num_inference_steps = 100 / with prior-preservation loss)

    -

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    -

    + guidance_scale = 4

    -
  • -
-
-swjo_exp_08 -
-

Fig. 572 Guidance Scale#

-
-
-

동일한 inference prompt 로 prior-preservation loss 를 제외해본 결과, 생성된 남자의 머리카락이 더 길어지고 더 여성스러운 생김새를 가지는 놀라운 사실도 발견했습니다.

-
    -
  • Inference Prompt: “A photo of a boy in the style of sks” (num_inference_steps = 100 / w/o prior-preservation loss)

    -

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    -
  • -
-
-swjo_exp_09 -
-

Fig. 573 Without Prior Preservation Loss#

-
-
-
-
-
-

Appendix#

-

그 외 다양한 inference prompt 에 따른 재미있는 실험결과들을 공유합니다. 아직 손의 모양을 text-to-image 모델이 생성하지 못하는 부분도 재차 확인할 수 있었습니다.

-
    -
  • Inference Prompt: “A photo of a boy climbing up the mountain in the style of sks” (num_inference_steps = 100 / w/o prior-preservation loss)

    -

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    -
  • -
-
-swjo_exp_10 -
-

Fig. 574 Appendix 1#

-
-
-
    -
  • Inference Prompt: “A painting of a boy in the style of sks” (num_inference_steps = 100 / w/o prior-preservation loss)

    -

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    -
  • -
-
-swjo_exp_11 -
-

Fig. 575 Appendix 2#

-
-
-
    -
  • Inference Prompt: “A hand drawing of a boy in the style of sks” (num_inference_steps = 100 / w/o prior-preservation loss)

    -

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    -
  • -
-
-swjo_exp_12 -
-

Fig. 576 Appendix 3#

-
-
-

마지막으로 하단의 좌측과 우측 사진은 각각 “A photo of sks girl” 그리고 “A photo of a girl in the style of sks” 이라는 prompt 로 DreamBooth 모델을 각각 학습한 후, 나비를 생성하라는 동일한 prompt 로 추론해본 결과입니다. sks 가 수식하는 명사가 girl 이 아닌 style 이도록 prompt 를 수정함으로써, butterfly 사진을 생성할때 조금이나마 더 프리드로우 웹툰의 그림체를 반영할 수 있었던 부분도 확인할 수 있었습니다.

-
    -
  • Inference Prompt: “A photo of a butterfly in the style of sks” (num_inference_steps = 100 / with prior-preservation loss)

  • -
-
-swjo_exp_13 -
-

Fig. 577 Appendix 4#

-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Training DreamBooth on Naver Webtoon Face Dataset — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Training DreamBooth on Naver Webtoon Face Dataset

+ +
+ +
+
+ + + + +
+ +
+

Information

+
    +
  • Title: Training DreamBooth on Naver Webtoon Face Dataset

  • +
  • Author: Sangwoo Jo

  • +
  • Last updated on Jul. 09, 2023

  • +
+
+
+

Training DreamBooth on Naver Webtoon Face Dataset#

+
+

Introduction#

+

이번 포스팅에서는 DreamBooth 를 직접 학습해보고 실험한 결과들을 공유할려고 합니다.

+

우선적으로 학습데이터는 bryandlee/naver-webtoon-data 에 공개된 YOLOv5 모델 및 Waifu2x 후처리 기법을 활용하여 프리드로우에 등장하는 인물 사진들을 수집했습니다. 논문에서는 3-5 장으로 fine-tuning 이 가능하다고 제시되어있지만, 인물 사진 같은 경우 더 많은 데이터로 학습하면 성능이 더 좋아져서 15-20 장의 이미지로 학습하였습니다. 학습한 이미지들 예시입니다.

+
+swjo_exp_01 +
+

Fig. 564 Training Data#

+
+
+

DreamBooth 를 실험하면서 대표적으로 instance prompt, guidance scale, negative prompt, 그리고 마지막으로 prior preservation loss 를 반영하는 정도를 조절하는 prior_loss_weight 를 바꿔가면서 학습해보았습니다. 사전학습된 text-to-image 모델로 처음에는 hakurei/waifu-diffusion 모델을 시도해봤지만 결과가 만족스럽지 못해 runwayml/stable-diffusion-v1-5 모델로 fine-tuning 작업을 진행했습니다.

+
+
+

Ablation Studies#

+
+

Prior Preservation Loss#

+

Prior Preservation Loss 를 제외한 동일한 configuration 으로 모델 학습한 결과입니다.

+
# with prior-preservation loss
+MODEL_NAME = “runwayml/stable-diffusion-v1-5”
+instance_prompt = "A photo of sks girl"
+class_prompt = "A photo of a girl"
+
+python3 train_dreambooth.py \
+  --pretrained_model_name_or_path=$MODEL_NAME \
+  --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
+  --output_dir=$OUTPUT_DIR \
+  --revision="fp16" \
+  --with_prior_preservation --prior_loss_weight=1.0 \
+  --seed=1337 \
+  --resolution=512 \
+  --train_batch_size=1 \
+  --train_text_encoder \
+  --mixed_precision="fp16" \
+  --use_8bit_adam \
+  --gradient_accumulation_steps=1 --gradient_checkpointing \
+  --learning_rate=1e-6 \
+  --lr_scheduler="constant" \
+  --lr_warmup_steps=0 \
+  --num_class_images=200 \
+  --sample_batch_size=4 \
+  --max_train_steps=800 \
+  --save_interval=100 \
+  --save_sample_prompt="A photo of sks girl" \
+  --concepts_list="concepts_list.json"
+
+
+
# w/o prior-preservation loss
+MODEL_NAME = “runwayml/stable-diffusion-v1-5”
+instance_prompt = "A photo of sks girl"
+class_prompt = "A photo of a girl"
+
+python3 train_dreambooth.py \
+  --pretrained_model_name_or_path=$MODEL_NAME \
+  --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
+  --output_dir=$OUTPUT_DIR \
+  --revision="fp16" \
+  --with_prior_preservation --prior_loss_weight=0.0 \
+  --seed=1337 \
+  --resolution=512 \
+  --train_batch_size=1 \
+  --train_text_encoder \
+  --mixed_precision="fp16" \
+  --use_8bit_adam \
+  --gradient_accumulation_steps=1 --gradient_checkpointing \
+  --learning_rate=1e-6 \
+  --lr_scheduler="constant" \
+  --lr_warmup_steps=0 \
+  --num_class_images=200 \
+  --sample_batch_size=4 \
+  --max_train_steps=800 \
+  --save_interval=100 \
+  --save_sample_prompt="A photo of sks girl" \
+  --concepts_list="concepts_list.json"
+
+
+

아래 그림처럼 동일한 inference prompt 를 입력했을 때, prior preservation loss 를 제외함으로써 input images 에 더 가까운 웹툰 사진들을 생성할 수 있었습니다. 또한, 핑크색 머리를 한 이민지 캐릭터를 어느 정도 잘 생성하는 부분도 확인할 수 있습니다.

+
    +
  • Inference Prompt: “A photo of sks girl with pink hair” (with prior-preservation loss)

  • +
+
+swjo_exp_02 +
+

Fig. 565 With Prior Preservation Loss#

+
+
+
    +
  • Inference Prompt: ” A photo of sks girl with pink hair” (w/o prior-preservation loss)

  • +
+
+swjo_exp_03 +
+

Fig. 566 Without Prior Preservation Loss#

+
+
+
+
+

Negative Prompt#

+

Negative Prompt 에 대한 Ablation Study 도 진행했습니다. 캐릭터의 부자연스러운 부분이나 저해상도 이미지들을 생성하는 경우들이 종종 발생했는데, negative prompt 를 통해 더 좋은 퀄리티의 웹툰 캐릭터를 생성할 수 있었습니다.

+
    +
  • Inference Prompt: ” A photo of sks girl with pink hair” (w/o negative prompt)

  • +
+
+swjo_exp_03 +
+

Fig. 567 Without Negative Prompt#

+
+
+
    +
  • Inference Prompt: ” A photo of sks girl with pink hair”

    +

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    +
  • +
+
+swjo_exp_04 +
+

Fig. 568 With Negative Prompt#

+
+
+
+
+

Instance Prompt / Guidance Scale#

+

DreamBooth 논문에서 제시한 instance prompt 외에 “A photo of a girl in the style of sks” 라는 prompt 로 학습을 시도해보기도 했습니다. sks 라는 unique identifier 에 특정 여자 캐릭터에 대한 정보뿐만 아니라 프리드로우 그림체 자체를 담아내기 위한 목적이였습니다.

+
# different instance prompt with prior-preservation loss
+MODEL_NAME = “runwayml/stable-diffusion-v1-5”
+instance_prompt = "A photo of a girl in the style of sks"
+class_prompt = "A photo of a girl"
+
+python3 train_dreambooth.py \
+  --pretrained_model_name_or_path=$MODEL_NAME \
+  --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
+  --output_dir=$OUTPUT_DIR \
+  --revision="fp16" \
+  --with_prior_preservation --prior_loss_weight=1.0 \
+  --seed=1337 \
+  --resolution=512 \
+  --train_batch_size=1 \
+  --train_text_encoder \
+  --mixed_precision="fp16" \
+  --use_8bit_adam \
+  --gradient_accumulation_steps=1 --gradient_checkpointing \
+  --learning_rate=1e-6 \
+  --lr_scheduler="constant" \
+  --lr_warmup_steps=0 \
+  --num_class_images=200 \
+  --sample_batch_size=4 \
+  --max_train_steps=800 \
+  --save_interval=100 \
+  --save_sample_prompt="A photo of sks girl" \
+  --concepts_list="concepts_list.json"
+
+
+
# different instance prompt w/o prior-preservation loss
+MODEL_NAME = “runwayml/stable-diffusion-v1-5”
+instance_prompt = "A photo of a girl in the style of sks"
+class_prompt = "A photo of a girl"
+
+python3 train_dreambooth.py \
+  --pretrained_model_name_or_path=$MODEL_NAME \
+  --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
+  --output_dir=$OUTPUT_DIR \
+  --revision="fp16" \
+  --with_prior_preservation --prior_loss_weight=0.0 \
+  --seed=1337 \
+  --resolution=512 \
+  --train_batch_size=1 \
+  --train_text_encoder \
+  --mixed_precision="fp16" \
+  --use_8bit_adam \
+  --gradient_accumulation_steps=1 --gradient_checkpointing \
+  --learning_rate=1e-6 \
+  --lr_scheduler="constant" \
+  --lr_warmup_steps=0 \
+  --num_class_images=200 \
+  --sample_batch_size=4 \
+  --max_train_steps=800 \
+  --save_interval=100 \
+  --save_sample_prompt="A photo of sks girl" \
+  --concepts_list="concepts_list.json"
+
+
+

Inference 시, 프리드로우의 그림체가 반영된 남자가 생성되도록 prompt 를 “A photo of a boy in the style of sks” 로 입력했을때의 결과입니다. DreamBooth 혹은 사전학습된 text-to-image 모델을 프리드로우 작가님의 웹툰 장면들로 전체적으로 학습하게 된다면 더 다양한 inference 결과들을 볼 수 있을 것 같습니다.

+
    +
  • Inference Prompt: “A photo of a boy in the style of sks” (num_inference_steps = 24 / with prior-preservation loss)

    +

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    +
  • +
+
+swjo_exp_05 +
+

Fig. 569 Instance Prompt#

+
+
+

Inference step 을 늘려가면서 추론된 인물 이미지의 퀄리티가 상승하는 부분도 확인할 수 있었습니다. 또한, guidance scale 에 대한 실험도 진행했는데 guidance scale 이 작을수록 prompt 와 무관한 random 한 이미지들을 생성하게 됩니다. 최종적으로 num_inference steps 와 guidance scale 의 값은 각각 100 과 7.5 로 설정하였습니다.

+
    +
  • Inference Prompt: “A photo of a boy in the style of sks” (num_inference_steps=100 / with prior-preservation loss)

  • +
+
+swjo_exp_06 +
+

Fig. 570 Increasing Number of Inference Steps#

+
+
+
    +
  • Inference Prompt: “A photo of a boy in the style of sks” (num_inference_steps = 100 / with prior-preservation loss)

    +

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    +
  • +
+
+swjo_exp_07 +
+

Fig. 571 Increasing Number of Inference Steps / Negative Prompt#

+
+
+
    +
  • Inference Prompt: “A photo of a boy in the style of sks” (num_inference_steps = 100 / with prior-preservation loss)

    +

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    +

    + guidance_scale = 4

    +
  • +
+
+swjo_exp_08 +
+

Fig. 572 Guidance Scale#

+
+
+

동일한 inference prompt 로 prior-preservation loss 를 제외해본 결과, 생성된 남자의 머리카락이 더 길어지고 더 여성스러운 생김새를 가지는 놀라운 사실도 발견했습니다.

+
    +
  • Inference Prompt: “A photo of a boy in the style of sks” (num_inference_steps = 100 / w/o prior-preservation loss)

    +

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    +
  • +
+
+swjo_exp_09 +
+

Fig. 573 Without Prior Preservation Loss#

+
+
+
+
+
+

Appendix#

+

그 외 다양한 inference prompt 에 따른 재미있는 실험결과들을 공유합니다. 아직 손의 모양을 text-to-image 모델이 생성하지 못하는 부분도 재차 확인할 수 있었습니다.

+
    +
  • Inference Prompt: “A photo of a boy climbing up the mountain in the style of sks” (num_inference_steps = 100 / w/o prior-preservation loss)

    +

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    +
  • +
+
+swjo_exp_10 +
+

Fig. 574 Appendix 1#

+
+
+
    +
  • Inference Prompt: “A painting of a boy in the style of sks” (num_inference_steps = 100 / w/o prior-preservation loss)

    +

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    +
  • +
+
+swjo_exp_11 +
+

Fig. 575 Appendix 2#

+
+
+
    +
  • Inference Prompt: “A hand drawing of a boy in the style of sks” (num_inference_steps = 100 / w/o prior-preservation loss)

    +

    + Negative Prompt: “ugly, disfigured, deformed, low resolution”

    +
  • +
+
+swjo_exp_12 +
+

Fig. 576 Appendix 3#

+
+
+

마지막으로 하단의 좌측과 우측 사진은 각각 “A photo of sks girl” 그리고 “A photo of a girl in the style of sks” 이라는 prompt 로 DreamBooth 모델을 각각 학습한 후, 나비를 생성하라는 동일한 prompt 로 추론해본 결과입니다. sks 가 수식하는 명사가 girl 이 아닌 style 이도록 prompt 를 수정함으로써, butterfly 사진을 생성할때 조금이나마 더 프리드로우 웹툰의 그림체를 반영할 수 있었던 부분도 확인할 수 있었습니다.

+
    +
  • Inference Prompt: “A photo of a butterfly in the style of sks” (num_inference_steps = 100 / with prior-preservation loss)

  • +
+
+swjo_exp_13 +
+

Fig. 577 Appendix 4#

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/markdown-example.html b/docs/markdown-example.html old mode 100644 new mode 100755 index feff5461..c64bc3a9 --- a/docs/markdown-example.html +++ b/docs/markdown-example.html @@ -1,332 +1,332 @@ - - - - - - - - This is an h1 tag — PseudoLab [Study Name] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - -
- -
- -
- - - - - - - - - - - - - - - - -
- - -
- -
- Contents -
- - -
-
-
-
- -
- -

Jupyter Book은 markdown 문서를 지원합니다.

-

아래와 같은 예시 코드를 입력하면 markdown 문법이 적용됩니다.

-
# This is an h1 tag
-## This is an h2 tag
-###### This is an h6 tag
-
-*This text will be italic*
-_This will also be italic_
-
-**This text will be bold**
-__This will also be bold__
-
-_You **can** combine them_
-
-* Item 1
-* Item 2
-  * Item 2a
-  * Item 2b
-
-1. Item 1
-1. Item 2
-1. Item 3
-   1. Item 3a
-   1. Item 3b
-
-
-

입력 결과

-
-

This is an h1 tag

-
-

This is an h2 tag

-
-

This is an h6 tag

-

This text will be italic -This will also be italic

-

This text will be bold -This will also be bold

-

You can combine them

-
    -
  • Item 1

  • -
  • Item 2

    -
      -
    • Item 2a

    • -
    • Item 2b

    • -
    -
  • -
-
    -
  1. Item 1

  2. -
  3. Item 2

  4. -
  5. Item 3

    -
      -
    1. Item 3a

    2. -
    3. Item 3b

    4. -
    -
  6. -
-
-
-
- - - - -
- -
-
- - - -
-
-

- - By PseudoLab
- - © Copyright 2020.
-

-
-
-
- - -
-
- - - - - - - + + + + + + + + This is an h1 tag — PseudoLab [Study Name] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + +
+ + +
+ +
+ Contents +
+ + +
+
+
+
+ +
+ +

Jupyter Book은 markdown 문서를 지원합니다.

+

아래와 같은 예시 코드를 입력하면 markdown 문법이 적용됩니다.

+
# This is an h1 tag
+## This is an h2 tag
+###### This is an h6 tag
+
+*This text will be italic*
+_This will also be italic_
+
+**This text will be bold**
+__This will also be bold__
+
+_You **can** combine them_
+
+* Item 1
+* Item 2
+  * Item 2a
+  * Item 2b
+
+1. Item 1
+1. Item 2
+1. Item 3
+   1. Item 3a
+   1. Item 3b
+
+
+

입력 결과

+
+

This is an h1 tag

+
+

This is an h2 tag

+
+

This is an h6 tag

+

This text will be italic +This will also be italic

+

This text will be bold +This will also be bold

+

You can combine them

+
    +
  • Item 1

  • +
  • Item 2

    +
      +
    • Item 2a

    • +
    • Item 2b

    • +
    +
  • +
+
    +
  1. Item 1

  2. +
  3. Item 2

  4. +
  5. Item 3

    +
      +
    1. Item 3a

    2. +
    3. Item 3b

    4. +
    +
  6. +
+
+
+
+ + + + +
+ +
+
+ + + +
+
+

+ + By PseudoLab
+ + © Copyright 2020.
+

+
+
+
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/notebook-example.html b/docs/notebook-example.html old mode 100644 new mode 100755 index c843e403..16805566 --- a/docs/notebook-example.html +++ b/docs/notebook-example.html @@ -1,286 +1,286 @@ - - - - - - - - .ipynb 파일 활용 — PseudoLab [Study Name] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - -
- -
- -
- - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
- -
- -
-

.ipynb 파일 활용

-

Jupyter Book에선 .ipynb파일 또한 지원합니다. 아래와 같이 코드를 입력하고, 그에 대응하는 출력물을 함께 웹페이지로 구성 가능합니다.

-
-
-
import matplotlib.pyplot as plt
-
-plt.plot([3,1,2,1,3])
-
-
-
-
-
[<matplotlib.lines.Line2D at 0x21ff8e508e0>]
-
-
-../_images/notebook-example_2_1.png -
-
-

공식 홈페이지를 참고하여 interactive한 시각화도 가능합니다.

-
- - - - -
- -
-
- - - -
-
-

- - By PseudoLab
- - © Copyright 2020.
-

-
-
-
- - -
-
- - - - - - - + + + + + + + + .ipynb 파일 활용 — PseudoLab [Study Name] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
+ +
+ +
+

.ipynb 파일 활용

+

Jupyter Book에선 .ipynb파일 또한 지원합니다. 아래와 같이 코드를 입력하고, 그에 대응하는 출력물을 함께 웹페이지로 구성 가능합니다.

+
+
+
import matplotlib.pyplot as plt
+
+plt.plot([3,1,2,1,3])
+
+
+
+
+
[<matplotlib.lines.Line2D at 0x21ff8e508e0>]
+
+
+../_images/notebook-example_2_1.png +
+
+

공식 홈페이지를 참고하여 interactive한 시각화도 가능합니다.

+
+ + + + +
+ +
+
+ + + +
+
+

+ + By PseudoLab
+ + © Copyright 2020.
+

+
+
+
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/review/A_Study_on_the_Evaluation_of_Generative_Models.html b/docs/review/A_Study_on_the_Evaluation_of_Generative_Models.html old mode 100644 new mode 100755 index c3e08ced..868bb835 --- a/docs/review/A_Study_on_the_Evaluation_of_Generative_Models.html +++ b/docs/review/A_Study_on_the_Evaluation_of_Generative_Models.html @@ -1,923 +1,942 @@ - - - - - - - - - - - - A Study on the Evaluation of Generative Models — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

A Study on the Evaluation of Generative Models#

-
-

학습 자료#

-

A Study on the Evaluation of Generative Models

-

https://arxiv.org/pdf/2206.10935.pdf

-
-
-
-

0. Abstract#

-
    -
  • GAN, Diffusion등 생성 모델의 놀라운 발전이 이어지고있다.

  • -
  • 다만 이러한 생성모델을 평가하는 척도(metric)의 선정은 아직 어려운 문제로 남아있다.

  • -
  • 그나마 Inception Score(IS)나, FID Score를 통해 모델을 평가하고있지만 이 metric들도 완전하지 않음

  • -
  • 이 논문을 통해

    -
      -
    • 생성 평가의 지표에 대해 한번더 고찰하고

    • -
    • 현존하는 Metric에 대한 방향을 제시

    • -
    -
  • -
-
-
-

1. Introduction#

-
    -
  • 최근 GAN, Diffusion 등 Implicit generative model들이 뛰어난 성능을 보여줌

  • -
  • 하지만 다른 task(classification, segmentation 등)와는 다르게 생성 모델의 metric을 정하는것은 challenging ( classification ; P&R, F1 score / segmentation ; IOU(Intersection Over Union)

  • -
  • 그나마 이미지의 featue map이나 classfier score를 사용하는 FiD, Inception score가 잘 쓰이는 추세

  • -
  • 위 metric의 단점

    -
      -
    1. real 이미지 분포의 space에서 해당 수치가 정말 유의미한 연관이 있는지 증명되지 않음

    2. -
    3. pretrained model의 거대한 train set이 specific 이미지의 feature에 얼마나 좋은 성능을 미치는지 알수 없음(inception net ; imagenet / ddpm ; face)

    4. -
    -
  • -
  • Human study의 직관적인 방식도 있지만 time과 cost를 매우 필요로한다는 점과 model의 Diversity는 측정하기 어렵다는 단점

    -
      -
    • e.g ) 하나의 좋은 이미지만 생성해도 좋은 score를 받을 수 있음

    • -
    -
  • -
  • 이 논문에서는

    -
      -
    1. Image-GPT 모델을 통해 high quality의 new synthetic dataset을 생성

    2. -
    3. 여러 모델을 위의 데이터로 학습하고 FiD, IS등 다양한 metric을 측정

    4. -
    5. 이를 실제 KL Divergence, Reverse KL Divergence 값과 비교해서 metric의 유효성을 검증

    6. -
    7. FID, IS등 다양한 metric의 base model로 쓰이는 Inception-V3과 CLIP 의 비교를 통해 Inception-V3 모델의 적합성을 검증

    8. -
    -
  • -
-
-
-

2. BackGround#

-
-

2.1. KL-Divergence(Kullback-Leibler divergence)#

-
    -
  • 두 확률분포의 유사도를 측정하는 지표

  • -
-
-\[ -KL(P || Q) = \sum_{x} P(x) \log\left(\frac{P(x)}{Q(x)}\right) -\]
-
    -
  • 특징

    -
      -
    • lower is better

    • -
    • KL ≥ 0, (KL(p, q) = 0, if p ==q)

    • -
    • KL(p, q) ≠ KL(q, p) // not symmetric

    • -
    • Reverse Kullback-Leibler Divergence(RKL) = KL(q, p)

    • -
    • 대부분 P가 True distribution, Q가 estimated distribution

    • -
    -
  • -
-
-
-

2.2. Inception Score(IS)#

-
    -
  • 생성된 이미지의 Fidelity와 Diversity를 측정

    -
      -
    • fidelity : 특정 Label의 이미지를 얼마나 잘 예측하는지

    • -
    • diversity : 다양한 class의 이미지들을 얼마나 고르게 생성해내는지

      -
      -A_Study_on_the_Evaluation_of_Generative_Models_01 -
      -

      Fig. 35 Image 1#

      -
      -
      -
    • -
    -
  • -
-
-\[ -\text{IS}(G) = \exp\left(\mathbb{E}_x \left[D_{\text{KL}}(P(y|x) \, || \, P(y))\right]\right) -\]
-
    -
  • 특징

    -
      -
    • \(P(y|x)\) ; 모델의 Fidelity, \(P(y)\); 모델의 Diversity

    • -
    • higher is better

    • -
    -
  • -
-
-
-

2.3. FiD(Fréchet Inception Distance)#

-
    -
  • real 이미지와 generated 이미지의 Feature vector를 추출 후 평균과 공분산을 통해 계산(Frechet distance)하는 평가지표

  • -
-
-\[ -FID = \lVert \mu_x - \mu_g \rVert^2 + \text{Tr}(\Sigma_x + \Sigma_g - 2(\Sigma_x\Sigma_g)^{1/2}) -\]
-
    -
  • 특징

    -
      -
    • Inception-V3의 마지막 pooling layer의 feature map을 사용

    • -
    • Lower is better

    • -
    • \(\mu_x - \mu_g\); 이미지의 Quality를 측정

    • -
    • \(\text{Tr}(\Sigma_x + \Sigma_g - 2(\Sigma_x\Sigma_g)^{1/2}\); 모델의 Diversity를 측정

    • -
    -
  • -
-
-
-

2.4. Kernel Inception Distance#

-
    -
  • FiD에서 Frechet distance를 사용하는 대신 kernel trick을 사용해 확률 분포의 유사도를 계산

  • -
  • 특징

    -
      -
    • 적은 데이터셋의 평가에 효과적임

    • -
    • FiD metric보다 속도가 오래걸림 (FiD : O(n), KiD : O(n^2))

    • -
    -
  • -
-
-
-

2.5. FID∞ & IS∞#

-
    -
  • 해당 논문에서 FiD와 IS metric에 bias가 있음을 증명하고 dataset의 sampling 기법을 변경(gaussian random sampling → sobol sequence sampling)하여 unbiased 한 metric을 제안

    -
    -A_Study_on_the_Evaluation_of_Generative_Models_02 -
    -

    Fig. 36 Image 2#

    -
    -
    -
  • -
-
-
-

2.5. Clean FiD#

-
    -
  • Inception-v3에 이미지를 통과하기위해 image resize 과정이 포함되는데 이는 score값에 영향을 줄수 있어 best percformance의 metric을 측정하기 위한 all in one process를 제안

  • -
-
-
-
-

3. Synthetic dataset as a benchmark#

-
-A_Study_on_the_Evaluation_of_Generative_Models_03 -
-

Fig. 37 Image 3#

-
-
-
    -
  • imagenet의 데이터를 ImageGPT를 통해 재생성(a.k.a. NotImageNet)

    -
      -
    • imageGPT

      -
        -
      • vision 분야에 transformer(in gpt-2)를 사용 + labeling dataset이 필요없는 자기지도 학습 방식

        -
        -A_Study_on_the_Evaluation_of_Generative_Models_04 -
        -

        Fig. 38 Image 4#

        -
        -
        -
      • -
      • imagenet challenge에서도 상당한 score를 보임

      • -
      -
    • -
    -
  • -
  • 이를 생성모델에 통과한 \(P_{2}(\hat{x})\)\(P_{1}(\hat{x})\) 두 분포를 비교

  • -
  • 한계

    -
      -
    • explicit model에만 적용 가능하고 implicit model에는 적용할 수 없음

    • -
    • explicit model : 생성되는 데이터의 분포를 명시적으로 모델링하여 학습하고 주로 Gaussian Noise로부터 이미지를 생성 (VAE …)

    • -
    • implicit model : 데이터의 생성 과정에 대해 학습하고 주로 주어진 데이터 분포로부터 샘플링하여 학습 (GAN …)

    • -
    -
  • -
-
-
-

4. Comparison between evaluation metrics#

-

4.1. Volatility

-
-A_Study_on_the_Evaluation_of_Generative_Models_05 -
-

Fig. 39 Image 5#

-
-
-
    -
  • KL, RKL은 적은 양의 Epoch(15-20) 후에 바로 수렴하는 방면 FID와 IS는 큰 변동성을 보임

  • -
  • 모델의 Capacity가 증가할수록 KL과 RKL의 수치가 개선되는 것을 확인

  • -
  • FID나 IS가 KL, RKL의 그래프와 매우 다른 형태를 띄는것을 확인(특히 IS)

  • -
-
-A_Study_on_the_Evaluation_of_Generative_Models_06 -
-

Fig. 40 Image 6#

-
-
-
    -
  • FID나 (negative)IS가 KL과는 높은 colleration을 보이지만 RKL과는 높지 않은 colleration을 보인다.

  • -
  • 모델의 Capacity에 따라 KL, RKL의 수치 변화는 크지 않은 데 반해 FID나 IS는 굉장히 큰 수치의 변화를 보여준다.

  • -
-

4.1. Ranking Colleration

-
    -
  • 여러 모델에 대해 metric 별로 순위를 매겨 순위의 유사도를 비교

  • -
  • Kendall’s τ

    -
      -
    • ranking이 매겨진 수열 사이의 유사도를 측정

    • -
    -
    from scipy import stats
    ->>> h = [1, 2, 3, 4, 5]
    ->>> w = [1, 2, 3, 4, 5]
    ->>> z = [3, 4, 1, 2, 5]
    ->>> stats.kendalltau(h, w)
    -SignificanceResult(statistic=0.9999999999999999, pvalue=0.016666666666666666)
    ->>> stats.kendalltau(h, w)
    -SignificanceResult(statistic=0.19999999999999998, pvalue=0.8166666666666667)
    -
    -
    -
  • -
  • Result

    -
    -A_Study_on_the_Evaluation_of_Generative_Models_07 -
    -

    Fig. 41 Image 7#

    -
    -
    -
      -
    • KL - RKL의 유사도는 매우 높음(0.889)

    • -
    • KL과의 유사도를 비교해보면 FID infinity > FID > IS

    • -
    • CleanFID-KID(0.96)을 제외한 나머지 metric간 유사도는 굉장히 낮음

    • -
    • Inception network 기반의 metric 중에서는 FID infinity이 가장 높고, IS와 IS infinity score가 가장 낮음

    • -
    -
  • -
-
-
-

5. Is Inception all we need?#

-
    -
  • FID, Inception Score 등 대부분의 metric이 이미지의 feature 혹은 score 측정을 위해 inception-v3를 사용하는데 과연 적절한가?

  • -
  • 가정

    -
      -
    • FID, FID infinity는 feature space가 gaussian distribution을 따른다는 가정하에 측정되는 score

    • -
    -
  • -
  • 실험

    -
      -
    1. 따라서 생성 모델을 통해 10K의 이미지를 생성하고

    2. -
    3. 원본의 20K의 이미지를 sampling

    4. -
    5. 각각의 이미지를 Inception network와 CLIP network를 통해 feature vector를 추출

    6. -
    7. Gaussian model에 feature vector를 fitting

    8. -
    9. 이때 gaussian model을 기반으로 각 샘플의 확률값을 계산한다.

    10. -
    -
  • -
  • 결과

    -
    -A_Study_on_the_Evaluation_of_Generative_Models_08 -
    -

    Fig. 42 Image 8#

    -
    -
    -
      -
    • 확률 값이 낮은 tail 부분의 feature vector의 원본 이미지들을 퀄리티가 낮아야함

    • -
    • 실제로 tail 부분의 확률을 갖는 이미지들을 확인해보면 CLIP을 보면 확실히 퀄리티가 떨어지는 반면 Inception의 이미지들은 좋은 퀄리티를 보이고 있음 → Gaussian 분포의 가정에 위배

    • -
    -
  • -
-

5.2 Normality test for latent representation

-
    -
  • 위의 feature vector들을 1 Dimension에 투영시켜 normal distribution을 따르는 지 확인한다.

  • -
  • 실험

    -
      -
    1. Inception, CLIP을 통해 feature vector를 추출한다.

    2. -
    3. linear transformation 연산을 통해 각각 1-D로 투영시킨다.

    4. -
    5. 각각의 p-value를 구한다.

      -
        -
      1. p-value : 어떠한 사건이 우연히 일어날 확률

      2. -
      3. if p-value < 0.05 ; 우연히 발생할 확률이 거의 없다. 인과관계가 있다.

      4. -
      5. if p-value > 0.05 ; 우연히 발생할 확률이 크다. 인과관계가 없다.

      6. -
      7. gaussian normal distribution은 random을 기반으로하기때문에 인과관계가 작아야한다. 즉, p-value가 커야한다.

      8. -
      -
    6. -
    -
  • -
  • 결과

    -
    -A_Study_on_the_Evaluation_of_Generative_Models_09 -
    -

    Fig. 43 Image 9#

    -
    -
    -
      -
    • 모든 test dataset에 대해 CLIP의 p-value값은 0.05를 넘어 random성을 유지하지만, Inception은 0.05보다 낮은 값을 보여 random성을 유지하지 못한다.

    • -
    • 따라서, Inception net을 통한 metric 측정보다 CLIP을 통한 metric 측정을 제안한다.

    • -
    -
  • -
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + A Study on the Evaluation of Generative Models — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

A Study on the Evaluation of Generative Models#

+
+

학습 자료#

+

A Study on the Evaluation of Generative Models

+

https://arxiv.org/pdf/2206.10935.pdf

+
+
+
+

0. Abstract#

+
    +
  • GAN, Diffusion등 생성 모델의 놀라운 발전이 이어지고있다.

  • +
  • 다만 이러한 생성모델을 평가하는 척도(metric)의 선정은 아직 어려운 문제로 남아있다.

  • +
  • 그나마 Inception Score(IS)나, FID Score를 통해 모델을 평가하고있지만 이 metric들도 완전하지 않음

  • +
  • 이 논문을 통해

    +
      +
    • 생성 평가의 지표에 대해 한번더 고찰하고

    • +
    • 현존하는 Metric에 대한 방향을 제시

    • +
    +
  • +
+
+
+

1. Introduction#

+
    +
  • 최근 GAN, Diffusion 등 Implicit generative model들이 뛰어난 성능을 보여줌

  • +
  • 하지만 다른 task(classification, segmentation 등)와는 다르게 생성 모델의 metric을 정하는것은 challenging ( classification ; P&R, F1 score / segmentation ; IOU(Intersection Over Union)

  • +
  • 그나마 이미지의 featue map이나 classfier score를 사용하는 FiD, Inception score가 잘 쓰이는 추세

  • +
  • 위 metric의 단점

    +
      +
    1. real 이미지 분포의 space에서 해당 수치가 정말 유의미한 연관이 있는지 증명되지 않음

    2. +
    3. pretrained model의 거대한 train set이 specific 이미지의 feature에 얼마나 좋은 성능을 미치는지 알수 없음(inception net ; imagenet / ddpm ; face)

    4. +
    +
  • +
  • Human study의 직관적인 방식도 있지만 time과 cost를 매우 필요로한다는 점과 model의 Diversity는 측정하기 어렵다는 단점

    +
      +
    • e.g ) 하나의 좋은 이미지만 생성해도 좋은 score를 받을 수 있음

    • +
    +
  • +
  • 이 논문에서는

    +
      +
    1. Image-GPT 모델을 통해 high quality의 new synthetic dataset을 생성

    2. +
    3. 여러 모델을 위의 데이터로 학습하고 FiD, IS등 다양한 metric을 측정

    4. +
    5. 이를 실제 KL Divergence, Reverse KL Divergence 값과 비교해서 metric의 유효성을 검증

    6. +
    7. FID, IS등 다양한 metric의 base model로 쓰이는 Inception-V3과 CLIP 의 비교를 통해 Inception-V3 모델의 적합성을 검증

    8. +
    +
  • +
+
+
+

2. BackGround#

+
+

2.1. KL-Divergence(Kullback-Leibler divergence)#

+
    +
  • 두 확률분포의 유사도를 측정하는 지표

  • +
+
+\[ +KL(P || Q) = \sum_{x} P(x) \log\left(\frac{P(x)}{Q(x)}\right) +\]
+
    +
  • 특징

    +
      +
    • lower is better

    • +
    • KL ≥ 0, (KL(p, q) = 0, if p ==q)

    • +
    • KL(p, q) ≠ KL(q, p) // not symmetric

    • +
    • Reverse Kullback-Leibler Divergence(RKL) = KL(q, p)

    • +
    • 대부분 P가 True distribution, Q가 estimated distribution

    • +
    +
  • +
+
+
+

2.2. Inception Score(IS)#

+
    +
  • 생성된 이미지의 Fidelity와 Diversity를 측정

    +
      +
    • fidelity : 특정 Label의 이미지를 얼마나 잘 예측하는지

    • +
    • diversity : 다양한 class의 이미지들을 얼마나 고르게 생성해내는지

      +
      +A_Study_on_the_Evaluation_of_Generative_Models_01 +
      +

      Fig. 35 Image 1#

      +
      +
      +
    • +
    +
  • +
+
+\[ +\text{IS}(G) = \exp\left(\mathbb{E}_x \left[D_{\text{KL}}(P(y|x) \, || \, P(y))\right]\right) +\]
+
    +
  • 특징

    +
      +
    • \(P(y|x)\) ; 모델의 Fidelity, \(P(y)\); 모델의 Diversity

    • +
    • higher is better

    • +
    +
  • +
+
+
+

2.3. FiD(Fréchet Inception Distance)#

+
    +
  • real 이미지와 generated 이미지의 Feature vector를 추출 후 평균과 공분산을 통해 계산(Frechet distance)하는 평가지표

  • +
+
+\[ +FID = \lVert \mu_x - \mu_g \rVert^2 + \text{Tr}(\Sigma_x + \Sigma_g - 2(\Sigma_x\Sigma_g)^{1/2}) +\]
+
    +
  • 특징

    +
      +
    • Inception-V3의 마지막 pooling layer의 feature map을 사용

    • +
    • Lower is better

    • +
    • \(\mu_x - \mu_g\); 이미지의 Quality를 측정

    • +
    • \(\text{Tr}(\Sigma_x + \Sigma_g - 2(\Sigma_x\Sigma_g)^{1/2}\); 모델의 Diversity를 측정

    • +
    +
  • +
+
+
+

2.4. Kernel Inception Distance#

+
    +
  • FiD에서 Frechet distance를 사용하는 대신 kernel trick을 사용해 확률 분포의 유사도를 계산

  • +
  • 특징

    +
      +
    • 적은 데이터셋의 평가에 효과적임

    • +
    • FiD metric보다 속도가 오래걸림 (FiD : O(n), KiD : O(n^2))

    • +
    +
  • +
+
+
+

2.5. FID∞ & IS∞#

+
    +
  • 해당 논문에서 FiD와 IS metric에 bias가 있음을 증명하고 dataset의 sampling 기법을 변경(gaussian random sampling → sobol sequence sampling)하여 unbiased 한 metric을 제안

    +
    +A_Study_on_the_Evaluation_of_Generative_Models_02 +
    +

    Fig. 36 Image 2#

    +
    +
    +
  • +
+
+
+

2.5. Clean FiD#

+
    +
  • Inception-v3에 이미지를 통과하기위해 image resize 과정이 포함되는데 이는 score값에 영향을 줄수 있어 best percformance의 metric을 측정하기 위한 all in one process를 제안

  • +
+
+
+
+

3. Synthetic dataset as a benchmark#

+
+A_Study_on_the_Evaluation_of_Generative_Models_03 +
+

Fig. 37 Image 3#

+
+
+
    +
  • imagenet의 데이터를 ImageGPT를 통해 재생성(a.k.a. NotImageNet)

    +
      +
    • imageGPT

      +
        +
      • vision 분야에 transformer(in gpt-2)를 사용 + labeling dataset이 필요없는 자기지도 학습 방식

        +
        +A_Study_on_the_Evaluation_of_Generative_Models_04 +
        +

        Fig. 38 Image 4#

        +
        +
        +
      • +
      • imagenet challenge에서도 상당한 score를 보임

      • +
      +
    • +
    +
  • +
  • 이를 생성모델에 통과한 \(P_{2}(\hat{x})\)\(P_{1}(\hat{x})\) 두 분포를 비교

  • +
  • 한계

    +
      +
    • explicit model에만 적용 가능하고 implicit model에는 적용할 수 없음

    • +
    • explicit model : 생성되는 데이터의 분포를 명시적으로 모델링하여 학습하고 주로 Gaussian Noise로부터 이미지를 생성 (VAE …)

    • +
    • implicit model : 데이터의 생성 과정에 대해 학습하고 주로 주어진 데이터 분포로부터 샘플링하여 학습 (GAN …)

    • +
    +
  • +
+
+
+

4. Comparison between evaluation metrics#

+

4.1. Volatility

+
+A_Study_on_the_Evaluation_of_Generative_Models_05 +
+

Fig. 39 Image 5#

+
+
+
    +
  • KL, RKL은 적은 양의 Epoch(15-20) 후에 바로 수렴하는 방면 FID와 IS는 큰 변동성을 보임

  • +
  • 모델의 Capacity가 증가할수록 KL과 RKL의 수치가 개선되는 것을 확인

  • +
  • FID나 IS가 KL, RKL의 그래프와 매우 다른 형태를 띄는것을 확인(특히 IS)

  • +
+
+A_Study_on_the_Evaluation_of_Generative_Models_06 +
+

Fig. 40 Image 6#

+
+
+
    +
  • FID나 (negative)IS가 KL과는 높은 colleration을 보이지만 RKL과는 높지 않은 colleration을 보인다.

  • +
  • 모델의 Capacity에 따라 KL, RKL의 수치 변화는 크지 않은 데 반해 FID나 IS는 굉장히 큰 수치의 변화를 보여준다.

  • +
+

4.1. Ranking Colleration

+
    +
  • 여러 모델에 대해 metric 별로 순위를 매겨 순위의 유사도를 비교

  • +
  • Kendall’s τ

    +
      +
    • ranking이 매겨진 수열 사이의 유사도를 측정

    • +
    +
    from scipy import stats
    +>>> h = [1, 2, 3, 4, 5]
    +>>> w = [1, 2, 3, 4, 5]
    +>>> z = [3, 4, 1, 2, 5]
    +>>> stats.kendalltau(h, w)
    +SignificanceResult(statistic=0.9999999999999999, pvalue=0.016666666666666666)
    +>>> stats.kendalltau(h, w)
    +SignificanceResult(statistic=0.19999999999999998, pvalue=0.8166666666666667)
    +
    +
    +
  • +
  • Result

    +
    +A_Study_on_the_Evaluation_of_Generative_Models_07 +
    +

    Fig. 41 Image 7#

    +
    +
    +
      +
    • KL - RKL의 유사도는 매우 높음(0.889)

    • +
    • KL과의 유사도를 비교해보면 FID infinity > FID > IS

    • +
    • CleanFID-KID(0.96)을 제외한 나머지 metric간 유사도는 굉장히 낮음

    • +
    • Inception network 기반의 metric 중에서는 FID infinity이 가장 높고, IS와 IS infinity score가 가장 낮음

    • +
    +
  • +
+
+
+

5. Is Inception all we need?#

+
    +
  • FID, Inception Score 등 대부분의 metric이 이미지의 feature 혹은 score 측정을 위해 inception-v3를 사용하는데 과연 적절한가?

  • +
  • 가정

    +
      +
    • FID, FID infinity는 feature space가 gaussian distribution을 따른다는 가정하에 측정되는 score

    • +
    +
  • +
  • 실험

    +
      +
    1. 따라서 생성 모델을 통해 10K의 이미지를 생성하고

    2. +
    3. 원본의 20K의 이미지를 sampling

    4. +
    5. 각각의 이미지를 Inception network와 CLIP network를 통해 feature vector를 추출

    6. +
    7. Gaussian model에 feature vector를 fitting

    8. +
    9. 이때 gaussian model을 기반으로 각 샘플의 확률값을 계산한다.

    10. +
    +
  • +
  • 결과

    +
    +A_Study_on_the_Evaluation_of_Generative_Models_08 +
    +

    Fig. 42 Image 8#

    +
    +
    +
      +
    • 확률 값이 낮은 tail 부분의 feature vector의 원본 이미지들을 퀄리티가 낮아야함

    • +
    • 실제로 tail 부분의 확률을 갖는 이미지들을 확인해보면 CLIP을 보면 확실히 퀄리티가 떨어지는 반면 Inception의 이미지들은 좋은 퀄리티를 보이고 있음 → Gaussian 분포의 가정에 위배

    • +
    +
  • +
+

5.2 Normality test for latent representation

+
    +
  • 위의 feature vector들을 1 Dimension에 투영시켜 normal distribution을 따르는 지 확인한다.

  • +
  • 실험

    +
      +
    1. Inception, CLIP을 통해 feature vector를 추출한다.

    2. +
    3. linear transformation 연산을 통해 각각 1-D로 투영시킨다.

    4. +
    5. 각각의 p-value를 구한다.

      +
        +
      1. p-value : 어떠한 사건이 우연히 일어날 확률

      2. +
      3. if p-value < 0.05 ; 우연히 발생할 확률이 거의 없다. 인과관계가 있다.

      4. +
      5. if p-value > 0.05 ; 우연히 발생할 확률이 크다. 인과관계가 없다.

      6. +
      7. gaussian normal distribution은 random을 기반으로하기때문에 인과관계가 작아야한다. 즉, p-value가 커야한다.

      8. +
      +
    6. +
    +
  • +
  • 결과

    +
    +A_Study_on_the_Evaluation_of_Generative_Models_09 +
    +

    Fig. 43 Image 9#

    +
    +
    +
      +
    • 모든 test dataset에 대해 CLIP의 p-value값은 0.05를 넘어 random성을 유지하지만, Inception은 0.05보다 낮은 값을 보여 random성을 유지하지 못한다.

    • +
    • 따라서, Inception net을 통한 metric 측정보다 CLIP을 통한 metric 측정을 제안한다.

    • +
    +
  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/Animate_Anyone.html b/docs/review/Animate_Anyone.html old mode 100644 new mode 100755 index 7d1880b6..8f94a916 --- a/docs/review/Animate_Anyone.html +++ b/docs/review/Animate_Anyone.html @@ -1,1011 +1,1030 @@ - - - - - - - - - - - - Animate Anyone — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

Animate Anyone#

-
-title_fig -
-

Fig. 514 Animate Anyone Example Figure#

-
-
-
-

Abstract#

-
    -
  • Diffusion 모델들이 visual generation 연구에 주류가 되었지만, image-to-video 영역에서는 어려움이 있다. 특히, character animation에서 캐릭터의 상세 정보의 일관성을 유지하는 것은 큰 문제이다.

  • -
  • reference image의 복잡한 appearance 특징의 일관성을 유지하기 위해서 spatial attention feature과 통합할 ReferenceNet 설계

  • -
  • controllability와 continuity을 위해서 효과적인 pose guider 도입.

  • -
  • 비디오 프레임간 부드러운 전이를 위해 효과적인 effective temporal modeling 도입

  • -
  • 이를 통해 어떠한 임의의 캐릭터에 대해서도 animate할 수 있고 우월성을 보임

  • -
-
-
-

1. Introduction#

-

Character Animation History

-
    -
  • Character Animation은 source character 이미지로부터 사실적인 비디오를 animate하는 작업으로 GAN을 시작으로 많은 연구가 진행되어왔다.

  • -
  • 그러나 생성된 이미지 또는 비디오는 local distortion, blurred details, semantic inconsistency, temporal instability 문제가 있어 널리 사용되기에는 어려움이 있어왔다.

  • -
-

Diffusion 기반 image-to-video 예시

-
    -
  • 최근 diffusion model의 우수성에 따라 image-to-video task에 diffusion model을 활용하려는 연구들이 보였다.

  • -
  • DreamPose (23.04)

    -
      -
    • Stable Diffusion을 확장한 fashion image-to-video 합성을 가능하는데 초점을 맞췄다.

    • -
    • 본 모델은 CLIP과 VAE feature를 통합한 adpatar module를 제안했다.

    • -
    • 그러나 consistent 결과를 위해서 input sample에 대해 추가 finetuning이 필요하고 운용 효율이 떨어진다.

    • -
    -
  • -
  • DisCO (23.07)

    -
      -
    • Stable Diffusion을 수정하여 human dance generation 진행

    • -
    • CLIP과 ControlNet을 활용한 통합 모델 구축

    • -
    • 그러나 character detail 보존에 어려움을 겪고 frame간 jittering issue 존재

    • -
    -
  • -
-

Character Animation 관점에서의 Text-to-image generation 한계

-
    -
  • text-to-image generation & video generation에 시각적 품질과 다양성에 큰 진전이 있어왔지만, 복잡한 detail을 잘 살리는 것이 어렵고 정확도 측면에서도 부정확한 부분이 있다.

  • -
  • 더욱이, 실질적 character 움직임을 다룰 때, 일관성 측면에서 안정적이고 연속적인 영상을 만들어내는 것이 어렵다.

  • -
  • 현재는 일반성과 일관성을 동시에 만족하는 character animation 방법을 찾을 수 없어 본 논문에서 Animate Anyone 방법을 제안한다.

  • -
-

Animate Anyone 모델 구조 요약

-
    -
  • appearance consistency를 위한 ReferenceNet 도입.

    -
      -
    • spatial attention를 사용하는 UNet으로 ReferenceNet feature과 통합

    • -
    • 이는 모델로 하여금 일관된 feature space에서 reference image의 관계성을 종합적으로 학습하게 함

    • -
    -
  • -
  • pose controllability를 위한 lightweight pose guider 도입.

    -
      -
    • 효과적인 pose control signal을 denoising 절차에 통합함.

    • -
    -
  • -
  • temporal stability를 위한 temporal layer 도입

    -
      -
    • 연속적이고 부드러운 temporal motion process와 동시에 고해상도 detail quality 보존을 위한 frame간 관계성 학습

    • -
    -
  • -
-

제안 모델의 결과

-
    -
  • 5K character video clip 인터넷 데이터 세트로 훈련

  • -
  • 장점 1) character appearance의 spatial & temporal consistency을 효과적으로 유지

  • -
  • 장점 2) temporal jitter & flickering과 같은 문제 없는 높은 신뢰도의 비디오 생성

  • -
  • 장점 3) 어떠한 character image에도 animation video 생성 가능

  • -
  • benchmark에 대한 결과 또한 우수성 증명

  • -
-
- -
-

3. Methods#

-

목표 : character animation을 위한 pose-guided image-to-video 합성

-
-

3.1 Preliminary: Stable Diffusion#

-
-eq_1 -
-

Fig. 515 Eq (1) Stable Diffusion Objective#

-
-
-

\(\epsilon_\theta\) : UNet func

-

\(c\) : conditional embedding

-

\(z\) : image latent

-

\(t\) : timestep

-

\(z_t\) : noise latent

-

CLIP ViT-L/14 text encoder

-

denoising UNet : 4 downsample layers , 1 middle layer, 4 upsample layers.

-

각 Res-Trans block별 2D convolution, self-attention, cross-attention로 구성

-
-
-

3.2 Network Architecture#

-

Overview

-
-figure_2 -
-

Fig. 516 Figure 2 Animate Anyone Overview#

-
-
-

3가지 중요 요소 통합

-
    -
  1. ReferenceNet : reference image로부터 character의 appearance features encoding

  2. -
  3. Pose Guider : 제어가능한 character movements를 위한 motion control signal encoding

  4. -
  5. Temporal layer : character motion 연속성을 위한 temporal relationship encoding

  6. -
-

ReferenceNet

-
    -
  • text보다 image가 더 low-level detailed feature를 통한 일관성 유지 정보를 내포함.

  • -
  • 이에 따라 최근 CLIP image encoder가 text encoder보다 많이 사용되었지만, detail consistency에는 역부족

    -
      -
    • 이유 1: CLIP image encoder는 224x224의 저해상도 이미지들로 구성되어 중요한 세부정보 손실이 있을 수 있다.

    • -
    • 이유 2: CLIP은 text에 더욱 부합하게 훈련되어 high-level feature matching에 강조되고 이에 따라 feature encoding에 있어 detail feature에 부족함이 존재

    • -
    -
  • -
  • 이에 따라 reference image feature extraction network인 ReferenceNet 고안 (이때 temporal layer 제외)

  • -
  • ReferenceNet은 SD로 초기화하고 각각 독립적으로 update 수행하고 UNet과 통합

  • -
  • self-attention layer를 spatial attention layer로 변경

  • -
  • Feature map : \(x_1 \in \mathcal{R}^{t \times h \times w \times c }\) (UNet ), \(x_2 \in \mathcal{R}^{h \times w \times c }\) (ReferenceNet) 이 주어졌을 때, \(x_2\)를 t번 곱해 w축에 따라 \(x_1\)과 concat

  • -
  • self-attention을 수행하고 feature map의 반을 결과로 뽑음.

  • -
  • 2가지 장점

    -
      -
      1. -
      2. 사전 학습된 image feature model SD를 사용함에 따라 초기값이 잘 정의된 것 사용가능.

      3. -
      -
    • -
      1. -
      2. UNet과 ReferenceNet의 초기값이 공유되고 동일한 네트워크 구조를 가짐에 따라 UNet은 (동일한 feature space에 상관관계가 있는) ReferenceNet feature 중 선별적으로 feature 학습이 가능

      3. -
      -
    • -
    -
  • -
  • CLIP image encoder를 cross-attention에 도입

    -
      -
    • reference image의 semantic feature를 제공함에 따라 신속한 전체 네트워크 훈련 초기값 설정 가능.

    • -
    -
  • -
  • ControlNet은 target image와 공간적으로 align된 정보를 활용 → 부적합

  • -
  • 본 방법에서는 reference image와 target image가 공간적으로는 관계되어있지만, align되지 않음.

  • -
  • 타 diffusion 기반 video generation에서는 모든 video frame에 대해 denoising을 진행

  • -
  • ReferenceNet은 feature 추출할 때 한 번만 필요

  • -
  • 효과 : inference 단계에서 계산량이 증가하지 않는다.

  • -
-

Pose Guider

-
    -
  • ControlNet은 robust한 conditional 생성을 입증해왔지만, 추가 Fine-tuning이 필요했었다.

  • -
  • 저자들은 추가적인 계산량 증가를 막기위해 추가적인 control network를 통합하지 않고 lightweight Pose Guider 도입

  • -
  • noise latent와 동일 해상도를 가지는 pose 이미지 align을 위해 four convolution layers (4×4 kernels, 2×2 strides, using 16,32,64,128 channels) 사용

  • -
  • Gaussian weights 초기화, final projection layer에서 zero convolution 도입.

  • -
-

Temporal Layer

-
    -
  • 이미 많은 곳에서 T2I 모델에 temporal layer를 통합했을 때 frame간 temporal dependency가 가능함을 보임.

  • -
  • 본 방법에서는 U-Net 내 Res-Trans block 안에 있는 spatial-attention과 cross-attention 진행 후에 temporal layer 추가

  • -
  • 순서 1) reshape : \(x \in \mathcal{R}^{b \times t \times h \times w \times c }\)\(x \in \mathcal{R}^{(b \times h \times w) \times t \times c }\)

  • -
  • 순서 2) temporal attention 수행 → residual connection

  • -
  • 효과 : appearance details에 대한 temporal smoothness & continuity

  • -
-
-
-

3.3 Training Strategy#

-
    -
  • 훈련 두 단계

  • -
  • 첫 번째 단계

    -
      -
    • temporal layer를 제외한 single-frame noise를 입력으로 받는 모델 학습

    • -
    • ReferenceNet & Pose Guider

    • -
    • reference 이미지는 전체 비디오 클립에서 랜덤으로 선택

    • -
    • 초기 weight는 사전학습된 SD weight

    • -
    • Pose Guider는 마지막 projection layer를 제외한 모든 layer gaussian weight 초기화

    • -
    • VAE Encoder, Decoder, CLIP image encoder 는 그대로

    • -
    -
  • -
  • 두 번째 단계

    -
      -
    • 첫 번째 단계에서 훈련한 모델 속 temporal layer만 훈련

    • -
    • temporal layer 초기값 : AnimateDiff pretrained weight

    • -
    • 입력 : 24frame video clip

    • -
    -
  • -
-
-
-
-

4. Experiments#

-
-

4.1 Implementations#

-
    -
  • Data : 5K character video clips (2-10 seconds long) 인터넷에서 다운로드

  • -
  • Pose Estimation Model : DWPose(Distillation for Whole-body Pose estimator) (23.07) IDEA-Research/DWPose -(the student’s head with only 20% training time as a plug-and-play training strategy)

  • -
  • GPU : 4 NVIDIA A100 GPUs

  • -
  • 첫 번째 훈련 단계 : 768×768 해상도 video frame sampled, resized, and center-cropped 30,000 steps, batch size 64.

  • -
  • 두 번째 훈련 단계 : temporal layer 10,000 steps 24-frame video sequences, batch size 4.

  • -
  • learning rates : 1e-5.

  • -
  • Inference 단계 : reference image의 캐릭터 skeleton의 길이에 근사하기 위해서 유도된 pose skeleton의 길이 rescale

  • -
  • DDIM sampler, 20 steps

  • -
  • 긴 영상 생성을 위해 temporal aggregation method 채택

  • -
  • Evaluation : benchmark dataset 2개(UBC fashion video dataset, Tik-Tok dataset) 사용

  • -
-
-
-

4.2 Qualitative Results#

-
-figure_3 -
-

Fig. 517 Figure 3 Qualitative Results#

-
-
-
    -
  • 전신이 나오는 임의의 characters, 절반 길이의 portraits, cartoon characters, humanoid characters에 대해 animation

  • -
  • reference image와 유사한 temporal consistency를 보이는 사실적인 결과 생성

  • -
-
-
-

4.3 Comparisons#

-
    -
  • SSIM, PSNR, LPIPS, FVD(Fréchet Video Distance)

  • -
-

Fashion Video Synthesis

-
-table1 -
-

Fig. 518 Table 1 Quantitative Comparison for fashion video synthesis#

-
-
-
    -
  • Quantitative comparison - Table 1

    -
      -
    • UBC fashion video dataset -(500 training & 100 testing videos로 구성, 각 video 약 500 frames)

    • -
    -
  • -
-
-figure_4 -
-

Fig. 519 Figure 4 Qualitative comparison for fashion video synthesis#

-
-
-
    -
  • DreamPose & BDMM은 옷의 일관성을 잃어버리는 문제. 색과 섬세한 구조적 요소에 대한 error 발생

  • -
  • 반면, 제안 방법은 옷의 세부 내용까지 일관성있게 보존됨.

  • -
-

Human Dance Generation

-
-table2 -
-

Fig. 520 Table 2 Quantitative comparison for human dance generation#

-
-
-
    -
  • Quantitative comparison - Table 2

    -
      -
    • TikTok dataset -(340 training & 100 testing single human dancing videos (10-15s))

    • -
    -
  • -
-
-figure_5 -
-

Fig. 521 Figure 5 Qualitative comparison between DisCo and Animate Anyone method#

-
-
-
    -
  • DisCo에서는 인물 foreground mask를 위해 SAM 활용하는 pipeline 활용

  • -
  • 그러나 본 방법에서는 masking 없이 모델 자체가 subject motion으로부터 전경과 배경의 구분 가능

  • -
  • 복잡한 dance sequence에서도 시각적으로 연속적인 motion을 보여줌. robustness

  • -
-

General Image-to-Video Methods

-
-figure_6 -
-

Fig. 522 Figure 6 Qualitative comparison with image-to-video methods#

-
-
-
    -
  • 비교 모델 : AnimateDiff & Gen-2

  • -
  • reference image에 대한 외관 신뢰도만 비교

  • -
  • image-to-video 방법은 얼굴이 일관되게 유지되는 문제에 봉착된 상황 속에서 다른 모델 대비 제안 모델이 긴 시간동안 apperance consistency 유지

  • -
-
-
-

4.4 Ablation study#

-
-figure_7 -
-

Fig. 523 Figure 7 Ablation study of different design#

-
-
-
-table_3 -
-

Fig. 524 Table 3 Quantitative comparison for ablation study#

-
-
-
    -
  • ReferenceNet design 효과성 증명을 위한 Ablation study

    -
      -
    • (1) CLIP image encoder만 사용

    • -
    • (2) 초기 finetuning SD 이후 reference image 기반 ControlNet training

    • -
    • (3) 위 2 방법론 통합

    • -
    -
  • -
  • 결론 : ReferenceNet를 사용하는 것이 모든 방법 대비 가장 좋았다.

  • -
-
-
-
-

5. Limitations#

-
    -
    1. -
    2. 손의 안정적인 움직임을 보이는 것에 어려움을 보임. 가끔 왜곡, motion blur 발생

    3. -
    -
  • -
    1. -
    2. 제공하는 이미지는 한 측면만 보이기 때문에 보이지 않은 부분에 대해서는 ill-posed problem으로 불안정

    3. -
    -
  • -
    1. -
    2. DDPM 활용에 따른 non-diffusion 기반 모델 대비 낮은 operational efficiency

    3. -
    -
  • -
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Animate Anyone — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

Animate Anyone#

+
+title_fig +
+

Fig. 514 Animate Anyone Example Figure#

+
+
+
+

Abstract#

+
    +
  • Diffusion 모델들이 visual generation 연구에 주류가 되었지만, image-to-video 영역에서는 어려움이 있다. 특히, character animation에서 캐릭터의 상세 정보의 일관성을 유지하는 것은 큰 문제이다.

  • +
  • reference image의 복잡한 appearance 특징의 일관성을 유지하기 위해서 spatial attention feature과 통합할 ReferenceNet 설계

  • +
  • controllability와 continuity을 위해서 효과적인 pose guider 도입.

  • +
  • 비디오 프레임간 부드러운 전이를 위해 효과적인 effective temporal modeling 도입

  • +
  • 이를 통해 어떠한 임의의 캐릭터에 대해서도 animate할 수 있고 우월성을 보임

  • +
+
+
+

1. Introduction#

+

Character Animation History

+
    +
  • Character Animation은 source character 이미지로부터 사실적인 비디오를 animate하는 작업으로 GAN을 시작으로 많은 연구가 진행되어왔다.

  • +
  • 그러나 생성된 이미지 또는 비디오는 local distortion, blurred details, semantic inconsistency, temporal instability 문제가 있어 널리 사용되기에는 어려움이 있어왔다.

  • +
+

Diffusion 기반 image-to-video 예시

+
    +
  • 최근 diffusion model의 우수성에 따라 image-to-video task에 diffusion model을 활용하려는 연구들이 보였다.

  • +
  • DreamPose (23.04)

    +
      +
    • Stable Diffusion을 확장한 fashion image-to-video 합성을 가능하는데 초점을 맞췄다.

    • +
    • 본 모델은 CLIP과 VAE feature를 통합한 adpatar module를 제안했다.

    • +
    • 그러나 consistent 결과를 위해서 input sample에 대해 추가 finetuning이 필요하고 운용 효율이 떨어진다.

    • +
    +
  • +
  • DisCO (23.07)

    +
      +
    • Stable Diffusion을 수정하여 human dance generation 진행

    • +
    • CLIP과 ControlNet을 활용한 통합 모델 구축

    • +
    • 그러나 character detail 보존에 어려움을 겪고 frame간 jittering issue 존재

    • +
    +
  • +
+

Character Animation 관점에서의 Text-to-image generation 한계

+
    +
  • text-to-image generation & video generation에 시각적 품질과 다양성에 큰 진전이 있어왔지만, 복잡한 detail을 잘 살리는 것이 어렵고 정확도 측면에서도 부정확한 부분이 있다.

  • +
  • 더욱이, 실질적 character 움직임을 다룰 때, 일관성 측면에서 안정적이고 연속적인 영상을 만들어내는 것이 어렵다.

  • +
  • 현재는 일반성과 일관성을 동시에 만족하는 character animation 방법을 찾을 수 없어 본 논문에서 Animate Anyone 방법을 제안한다.

  • +
+

Animate Anyone 모델 구조 요약

+
    +
  • appearance consistency를 위한 ReferenceNet 도입.

    +
      +
    • spatial attention를 사용하는 UNet으로 ReferenceNet feature과 통합

    • +
    • 이는 모델로 하여금 일관된 feature space에서 reference image의 관계성을 종합적으로 학습하게 함

    • +
    +
  • +
  • pose controllability를 위한 lightweight pose guider 도입.

    +
      +
    • 효과적인 pose control signal을 denoising 절차에 통합함.

    • +
    +
  • +
  • temporal stability를 위한 temporal layer 도입

    +
      +
    • 연속적이고 부드러운 temporal motion process와 동시에 고해상도 detail quality 보존을 위한 frame간 관계성 학습

    • +
    +
  • +
+

제안 모델의 결과

+
    +
  • 5K character video clip 인터넷 데이터 세트로 훈련

  • +
  • 장점 1) character appearance의 spatial & temporal consistency을 효과적으로 유지

  • +
  • 장점 2) temporal jitter & flickering과 같은 문제 없는 높은 신뢰도의 비디오 생성

  • +
  • 장점 3) 어떠한 character image에도 animation video 생성 가능

  • +
  • benchmark에 대한 결과 또한 우수성 증명

  • +
+
+ +
+

3. Methods#

+

목표 : character animation을 위한 pose-guided image-to-video 합성

+
+

3.1 Preliminary: Stable Diffusion#

+
+eq_1 +
+

Fig. 515 Eq (1) Stable Diffusion Objective#

+
+
+

\(\epsilon_\theta\) : UNet func

+

\(c\) : conditional embedding

+

\(z\) : image latent

+

\(t\) : timestep

+

\(z_t\) : noise latent

+

CLIP ViT-L/14 text encoder

+

denoising UNet : 4 downsample layers , 1 middle layer, 4 upsample layers.

+

각 Res-Trans block별 2D convolution, self-attention, cross-attention로 구성

+
+
+

3.2 Network Architecture#

+

Overview

+
+figure_2 +
+

Fig. 516 Figure 2 Animate Anyone Overview#

+
+
+

3가지 중요 요소 통합

+
    +
  1. ReferenceNet : reference image로부터 character의 appearance features encoding

  2. +
  3. Pose Guider : 제어가능한 character movements를 위한 motion control signal encoding

  4. +
  5. Temporal layer : character motion 연속성을 위한 temporal relationship encoding

  6. +
+

ReferenceNet

+
    +
  • text보다 image가 더 low-level detailed feature를 통한 일관성 유지 정보를 내포함.

  • +
  • 이에 따라 최근 CLIP image encoder가 text encoder보다 많이 사용되었지만, detail consistency에는 역부족

    +
      +
    • 이유 1: CLIP image encoder는 224x224의 저해상도 이미지들로 구성되어 중요한 세부정보 손실이 있을 수 있다.

    • +
    • 이유 2: CLIP은 text에 더욱 부합하게 훈련되어 high-level feature matching에 강조되고 이에 따라 feature encoding에 있어 detail feature에 부족함이 존재

    • +
    +
  • +
  • 이에 따라 reference image feature extraction network인 ReferenceNet 고안 (이때 temporal layer 제외)

  • +
  • ReferenceNet은 SD로 초기화하고 각각 독립적으로 update 수행하고 UNet과 통합

  • +
  • self-attention layer를 spatial attention layer로 변경

  • +
  • Feature map : \(x_1 \in \mathcal{R}^{t \times h \times w \times c }\) (UNet ), \(x_2 \in \mathcal{R}^{h \times w \times c }\) (ReferenceNet) 이 주어졌을 때, \(x_2\)를 t번 곱해 w축에 따라 \(x_1\)과 concat

  • +
  • self-attention을 수행하고 feature map의 반을 결과로 뽑음.

  • +
  • 2가지 장점

    +
      +
      1. +
      2. 사전 학습된 image feature model SD를 사용함에 따라 초기값이 잘 정의된 것 사용가능.

      3. +
      +
    • +
      1. +
      2. UNet과 ReferenceNet의 초기값이 공유되고 동일한 네트워크 구조를 가짐에 따라 UNet은 (동일한 feature space에 상관관계가 있는) ReferenceNet feature 중 선별적으로 feature 학습이 가능

      3. +
      +
    • +
    +
  • +
  • CLIP image encoder를 cross-attention에 도입

    +
      +
    • reference image의 semantic feature를 제공함에 따라 신속한 전체 네트워크 훈련 초기값 설정 가능.

    • +
    +
  • +
  • ControlNet은 target image와 공간적으로 align된 정보를 활용 → 부적합

  • +
  • 본 방법에서는 reference image와 target image가 공간적으로는 관계되어있지만, align되지 않음.

  • +
  • 타 diffusion 기반 video generation에서는 모든 video frame에 대해 denoising을 진행

  • +
  • ReferenceNet은 feature 추출할 때 한 번만 필요

  • +
  • 효과 : inference 단계에서 계산량이 증가하지 않는다.

  • +
+

Pose Guider

+
    +
  • ControlNet은 robust한 conditional 생성을 입증해왔지만, 추가 Fine-tuning이 필요했었다.

  • +
  • 저자들은 추가적인 계산량 증가를 막기위해 추가적인 control network를 통합하지 않고 lightweight Pose Guider 도입

  • +
  • noise latent와 동일 해상도를 가지는 pose 이미지 align을 위해 four convolution layers (4×4 kernels, 2×2 strides, using 16,32,64,128 channels) 사용

  • +
  • Gaussian weights 초기화, final projection layer에서 zero convolution 도입.

  • +
+

Temporal Layer

+
    +
  • 이미 많은 곳에서 T2I 모델에 temporal layer를 통합했을 때 frame간 temporal dependency가 가능함을 보임.

  • +
  • 본 방법에서는 U-Net 내 Res-Trans block 안에 있는 spatial-attention과 cross-attention 진행 후에 temporal layer 추가

  • +
  • 순서 1) reshape : \(x \in \mathcal{R}^{b \times t \times h \times w \times c }\)\(x \in \mathcal{R}^{(b \times h \times w) \times t \times c }\)

  • +
  • 순서 2) temporal attention 수행 → residual connection

  • +
  • 효과 : appearance details에 대한 temporal smoothness & continuity

  • +
+
+
+

3.3 Training Strategy#

+
    +
  • 훈련 두 단계

  • +
  • 첫 번째 단계

    +
      +
    • temporal layer를 제외한 single-frame noise를 입력으로 받는 모델 학습

    • +
    • ReferenceNet & Pose Guider

    • +
    • reference 이미지는 전체 비디오 클립에서 랜덤으로 선택

    • +
    • 초기 weight는 사전학습된 SD weight

    • +
    • Pose Guider는 마지막 projection layer를 제외한 모든 layer gaussian weight 초기화

    • +
    • VAE Encoder, Decoder, CLIP image encoder 는 그대로

    • +
    +
  • +
  • 두 번째 단계

    +
      +
    • 첫 번째 단계에서 훈련한 모델 속 temporal layer만 훈련

    • +
    • temporal layer 초기값 : AnimateDiff pretrained weight

    • +
    • 입력 : 24frame video clip

    • +
    +
  • +
+
+
+
+

4. Experiments#

+
+

4.1 Implementations#

+
    +
  • Data : 5K character video clips (2-10 seconds long) 인터넷에서 다운로드

  • +
  • Pose Estimation Model : DWPose(Distillation for Whole-body Pose estimator) (23.07) IDEA-Research/DWPose +(the student’s head with only 20% training time as a plug-and-play training strategy)

  • +
  • GPU : 4 NVIDIA A100 GPUs

  • +
  • 첫 번째 훈련 단계 : 768×768 해상도 video frame sampled, resized, and center-cropped 30,000 steps, batch size 64.

  • +
  • 두 번째 훈련 단계 : temporal layer 10,000 steps 24-frame video sequences, batch size 4.

  • +
  • learning rates : 1e-5.

  • +
  • Inference 단계 : reference image의 캐릭터 skeleton의 길이에 근사하기 위해서 유도된 pose skeleton의 길이 rescale

  • +
  • DDIM sampler, 20 steps

  • +
  • 긴 영상 생성을 위해 temporal aggregation method 채택

  • +
  • Evaluation : benchmark dataset 2개(UBC fashion video dataset, Tik-Tok dataset) 사용

  • +
+
+
+

4.2 Qualitative Results#

+
+figure_3 +
+

Fig. 517 Figure 3 Qualitative Results#

+
+
+
    +
  • 전신이 나오는 임의의 characters, 절반 길이의 portraits, cartoon characters, humanoid characters에 대해 animation

  • +
  • reference image와 유사한 temporal consistency를 보이는 사실적인 결과 생성

  • +
+
+
+

4.3 Comparisons#

+
    +
  • SSIM, PSNR, LPIPS, FVD(Fréchet Video Distance)

  • +
+

Fashion Video Synthesis

+
+table1 +
+

Fig. 518 Table 1 Quantitative Comparison for fashion video synthesis#

+
+
+
    +
  • Quantitative comparison - Table 1

    +
      +
    • UBC fashion video dataset +(500 training & 100 testing videos로 구성, 각 video 약 500 frames)

    • +
    +
  • +
+
+figure_4 +
+

Fig. 519 Figure 4 Qualitative comparison for fashion video synthesis#

+
+
+
    +
  • DreamPose & BDMM은 옷의 일관성을 잃어버리는 문제. 색과 섬세한 구조적 요소에 대한 error 발생

  • +
  • 반면, 제안 방법은 옷의 세부 내용까지 일관성있게 보존됨.

  • +
+

Human Dance Generation

+
+table2 +
+

Fig. 520 Table 2 Quantitative comparison for human dance generation#

+
+
+
    +
  • Quantitative comparison - Table 2

    +
      +
    • TikTok dataset +(340 training & 100 testing single human dancing videos (10-15s))

    • +
    +
  • +
+
+figure_5 +
+

Fig. 521 Figure 5 Qualitative comparison between DisCo and Animate Anyone method#

+
+
+
    +
  • DisCo에서는 인물 foreground mask를 위해 SAM 활용하는 pipeline 활용

  • +
  • 그러나 본 방법에서는 masking 없이 모델 자체가 subject motion으로부터 전경과 배경의 구분 가능

  • +
  • 복잡한 dance sequence에서도 시각적으로 연속적인 motion을 보여줌. robustness

  • +
+

General Image-to-Video Methods

+
+figure_6 +
+

Fig. 522 Figure 6 Qualitative comparison with image-to-video methods#

+
+
+
    +
  • 비교 모델 : AnimateDiff & Gen-2

  • +
  • reference image에 대한 외관 신뢰도만 비교

  • +
  • image-to-video 방법은 얼굴이 일관되게 유지되는 문제에 봉착된 상황 속에서 다른 모델 대비 제안 모델이 긴 시간동안 apperance consistency 유지

  • +
+
+
+

4.4 Ablation study#

+
+figure_7 +
+

Fig. 523 Figure 7 Ablation study of different design#

+
+
+
+table_3 +
+

Fig. 524 Table 3 Quantitative comparison for ablation study#

+
+
+
    +
  • ReferenceNet design 효과성 증명을 위한 Ablation study

    +
      +
    • (1) CLIP image encoder만 사용

    • +
    • (2) 초기 finetuning SD 이후 reference image 기반 ControlNet training

    • +
    • (3) 위 2 방법론 통합

    • +
    +
  • +
  • 결론 : ReferenceNet를 사용하는 것이 모든 방법 대비 가장 좋았다.

  • +
+
+
+
+

5. Limitations#

+
    +
    1. +
    2. 손의 안정적인 움직임을 보이는 것에 어려움을 보임. 가끔 왜곡, motion blur 발생

    3. +
    +
  • +
    1. +
    2. 제공하는 이미지는 한 측면만 보이기 때문에 보이지 않은 부분에 대해서는 ill-posed problem으로 불안정

    3. +
    +
  • +
    1. +
    2. DDPM 활용에 따른 non-diffusion 기반 모델 대비 낮은 operational efficiency

    3. +
    +
  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/BBDM.html b/docs/review/BBDM.html old mode 100644 new mode 100755 index 2090006b..b9e28284 --- a/docs/review/BBDM.html +++ b/docs/review/BBDM.html @@ -1,1452 +1,1470 @@ - - - - - - - - - - - - BBDM — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

BBDM

- -
-
- -
-
-
- - - - -
- -
-

Information

- -
-
-

BBDM#

-
    -
  • BBDM

    -
      -
    • BBDM 은 Brownian Bridge 를 Diffusion Model 에 도입한 최초의 모델

    • -
    • Image to Image Translation 분야에서 Conditional Diffusion Models 의 한계를 극복함

    • -
    -
  • -
-


BBDM 을 이해하기 위해서는 Brownian motion process 와 Brownian Bridge 를 이해해야함. Brownian motion process 는 stochastic process 에 해당함.

-
    -
  • Stochastic Process

    -
      -
    • 시간의 흐름에 따라 불확실성을 가지고 변하는 확률 변수들의 집합

    • -
    • Stochastic process 는 \(X_t\) 와 같이 나타낼 수 있는데,
      -여기서 X 는 확률 변수를,
      -t 는 확률 변수가 관찰된 시간을 나타냄

    • -
    • X 와 t 는 각각 Discrete 혹은 Continuous 로 구분할 수 있음

      -
        -
      • Discrete RANDOM VARIABLE & Discrete TIME

      • -
      • Discrete RANDOM VARIABLE & Continuous TIME

      • -
      • Continuous RANDOM VARIABLE & Discrete TIME

      • -
      • Continuous RANDOM VARIABLE & Continuous TIME

      • -
      -
    • -
    -
  • -
  • Brownian Motion Process (Wiener Process) 소개

    -
      -
    • Brownian Motion

      -
        -
      • 유체의 미소입자가 불규칙하게 운동하는 현상

      • -
      -
      -img_00 -
      -

      Fig. 309 굴뚝에서 퍼져나간 연기 사진을 오른쪽으로 90도 회전시킨 사진#

      -
      -
      -
    • -
    -


    위 사진으로부터 Brownian motion process 를 직관적으로 이해해볼 수 있음.

    -
      -
    • Brownian Motion Process (Wiener Process)

      -
        -
      • Brownian Motion 을 연속 시간 확률 과정으로 모델링한 것

      • -
      -
      -img_01 -
      -

      Fig. 310 \(W_0\) = 0 이고 max time T=1000 인 Wiener Process 를 100번 Sampling 한 결과#

      -
      -
      -
    • -
    • Brownian Motion Process (Wiener Process)
      -Continuous RANDOM VARIABLE & Continuous TIME 를 갖는 Stochastic Process 로,
      -\(W_t\) 와 같이 나타낸다.

    • -
    -
  • -
  • Brownian Motion Process (Wiener Process) 를 이해해보자

    -
      -
    • 가정해보자

      -
        -
      1. \(t = 0 → W_t = W_0 = 0\) 이라고 하자.

      2. -
      3. 쉽게 이해하기 위해, TIME t 가 Discrete 하다고 가정해보자.
        -(BBDM 은 t 를 정수 0~1000 으로 설정)

      4. -
      -
    • -
    • Requirements

      -
        -
      1. Brownian Motion Process 는 Stochastic Process 이다.
        -TIME t 마다 stochasticity 가 부여되어야 한다.

      2. -
      3. 시간 간격과 W 의 변화량이 비례해야 한다.
        -(즉, 더 오래 지났을수록 더 많이 변한다.)

      4. -
      -
    • -
    • Notation

      -
      -img_02 -
      -

      Fig. 311 Source : https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB#

      -
      -
      -
        -
      • \(\Delta t\) = 시간 간격

      • -
      • n = 살펴보고자 하는 시간 간격의 수

      • -
      • \(T = n * \Delta t\)

      • -
      • i.i.d \(\epsilon_t \sim N(0, 1)\)

      • -
      • \(\Delta W_t\) = t 시점에서 그 다음 시간 간격까지 증가한 W 의 값 -\(= W_{t+\Delta t} - W_t\) -= \(\epsilon_t \sqrt {\Delta t}\)

      • -
      -
    • -
    • 이해

      -
        -
      • \(\Delta W_t = W_{t+\Delta t} - W_t = \epsilon_t \sqrt {\Delta t}\) 라고 정의해 본 근거를 -위의 Requirements 에서 찾아보면..

        -
          -
        • 확률 변수 \(\epsilon\) 를 도입함으로써 stochasticity 부여

        • -
        • \(\Delta t\) 를 도입함으로써 시간 간격도 고려 가능

        • -
        -
      • -
      • 그렇다면 왜 하필 \(\sqrt {\Delta t}\) 를 곱했을까?

        -
          -
        1. \(\Delta t\) 가 0 에 가까워질 때, \(\sqrt{\Delta t}\) 는 천천히 0 에 수렴함. -만약 TIME t 가 continuous 하다면, \(\Delta t\) 는 매우 작은 값이 됨. -\(\Delta W_t = \epsilon_t {\Delta t}\) 라면 \(\Delta W_t\) 가 너무 작아짐.

        2. -
        3. \(\Delta t\) 가 커질 때, \(\sqrt{\Delta t}\) 는 천천히 커짐

        4. -
        -
      • -
      • 주의할 사항

        -
          -
        • i.i.d \(\epsilon_t \sim N(0, 1)\) 이므로, -\(\Delta W_t = \epsilon_t \sqrt {\Delta t}\) 에서 \(\Delta W_0\)\(\Delta W_1\) 은 서로 독립인 것이 맞지만, -\(W_0\)\(W_1\) 이 독립이라는 말은 아님.

        • -
        -
      • -
      • \(\Delta W_0 = \epsilon_0 \sqrt {\Delta t}\) 이므로, -\(W_{\Delta t} = W_0 + \epsilon_0 \sqrt {\Delta t} = 0 + \epsilon_0 \sqrt {\Delta t} = \epsilon_0 \sqrt {\Delta t}\)

      • -
      • \(\Delta W_{\Delta t} = \epsilon_{\Delta t} \sqrt {\Delta t}\) 이므로, -\(W_{2\Delta t} = W_{\Delta t} + \epsilon_{\Delta t} \sqrt {\Delta t} = (\epsilon_0 + \epsilon_{\Delta t}) * \sqrt {\Delta t}\)

        -
          -
        • \(Var(\Delta W_{\Delta t}) = Var(\epsilon_{\Delta t} \sqrt {\Delta t}) = Var(\epsilon_{\Delta t}) * \sqrt {\Delta t}^2 = 1 * \sqrt {\Delta t}^2 = \Delta t\)

        • -
        • \(\mathbb{E}(\Delta W_{\Delta t}) = \mathbb{E}(\epsilon_{\Delta t} \sqrt {\Delta t}) = \mathbb{E}(\epsilon_{\Delta t}) * \sqrt {\Delta t} = 0 * \sqrt {\Delta t} = 0\)

        • -
        -
      • -
      • \(\Delta W_{T-\Delta t} = \epsilon_{T-\Delta t} \sqrt {\Delta t}\) -\(W_T = (\epsilon_0 + \epsilon_{\Delta t} + \epsilon_{2\Delta t} + ... + \epsilon_{T-\Delta t}) * \sqrt {\Delta t}\)

        -
          -
        • \(\mathbb{E}(W_T) = 0\)

        • -
        • \(Var(W_T) = n * \Delta t = T\) (각각의 \(\epsilon\) 은 서로 i.i.d 이므로 공분산은 0)

        • -
        • 즉, \(W_T \sim N(0,T)\)

        • -
        -
      • -
      -
      -img_03 -
      -

      Fig. 312 Source : https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB#

      -
      -
      -

      파란색 점들은, Brownian Motion Process 를 1번 Sampling 한 결과임 (one representation) 를 나타냄

      -
      -img_04 -
      -

      Fig. 313 Source : https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB#

      -
      -
      -
        -
      • t=0 부터 t=T 까지 Wiener Process 를 수행하면,
        -\(W_t\)\(W_T - W_0\) 만큼 변한다.

        -
          -
        • \((W_T - W_0) \sim N(0, T-0)\)

        • -
        • \((W_{t_2}-W_{t_1}) \sim N(0,t_2-t_1)\)

          -
            -
          • ex. 5분 에서 10분으로 Wiener Process 를 진행하면, \(W_5\) 는 0 이 아닐 수 있으나, 그 변화량 \((W_{t_{10}}-W_{t_5})\) 은 N(0, 10 - 5) 를 따른다.

          • -
          -
        • -
        -
      • -
      -
    • -
    -
  • -
  • Brownian Bridge

    -
      -
    • X 가 Standard Wiener Process 라고 하자.
      -0 시점과 T 시점의 X 값을 알고,
      -0<t<T 일 때, -두 점을 선형으로 연결하는 Linear Bridge X(t) 는 다음과 같다.

    • -
    -
    -img_05 -
    -

    Fig. 314 Brownian Bridge 이해를 위한 Linear Bridge#

    -
    -
    -

    Brownian Bridge 는 Standard Wiener Process 의 Conditional Probability Distribution 이다.
    -Starting state W(0) 과 Ending state W(T) 의 값에 Conditioned 되어 있다.
    -아래와 같이 정의될 수 있다.

    -
    -img_06 -
    -

    Fig. 315 Brownian Bridge#

    -
    -
    -


    아래의 그림을 보면, 0 이라는 시작값과 123 이라는 마지막 값에 conditioned 되어 있는 것을 확인할 수 있다.
    Brownian Bridge 의 분산은 0 에서 시작해서 증가하다가, T/2 시점에서 최대가 되었다가, 이후로는 감소하여 마지막엔 0 에 수렴하게된다.

    -
    -img_08 -
    -

    Fig. 316 \(W_0\) = 0 에서 \(W_1000\) = 123 까지 100개의 Brownian Bridge 를 샘플링한 결과#

    -
    -
    -
  • -
  • Abstrcat

    -
    -img_09 -
    -

    Fig. 317 Conditional Diffusion Models 와 BBDM 의 비교#

    -
    -
    -
      -
    • 기존의 Diffusion 모델들은,
      -Image-to-Image 변환을 Conditional generation process 로 다룸.
      -이로 인해, 매우 상이한 도메인 사이의 변환에는 어려움이 있음.

    • -
    • 이를 해결하기 위해,
      -본 논문은 Brownian Bridge 에 기반한 Image-to-Image 변환 방법을 제시

    • -
    • BBDM 은 Conditional generation process 가 아닌
      -Stochastic Brownian Bridge Process 로 두 도메인 사이의 변환을 모델링하므로,
      Bidirectional Diffusion Process 임.

    • -
    • Brownian Bridge diffusion process 를 Image-to-Image 변환에 접목한 최초의 논문임

    • -
    • BBDM 모델의 훌륭한 성능을 실험적으로 증명함

    • -
    -
  • -
-
    -
  1. Introduction

    -
      -
    • I2I 변환에서 Non-diffusion models 의 한계

      -
        -
      • Pix2Pix 와 같은 conditional GANsfideltiy 가 높았으나, -학습이 어렵고, DIversity 가 떨어진다.

        -
          -
        • Diversity 가 떨어지는 이유 : conditional GANs 는 input image 를 output image 에 one-to-one mapping 하는 방법을 학습하기 때문

        • -
        -
      • -
      • VAE 같은 생성형 모델들은 GANs 만큼의 I2I 성능이 안나오고, -Applicability 가 GANs 보다 떨어진다.

      • -
      -
    • -
    • I2I 변환에서 conditional diffusion models 의 한계

      -
        -
      • conditional diffusion models 는 reference image 의 encoded feature 를 직접 U-Net 에 통합시킴으로써 diffusion models 의 reverse process 를 guide 함

      • -
      • 하지만 이렇게 생성된 결과가 desired conditional distribution 을 추론해낸다는 명료한 이론적 근거가 없음

      • -
      • 대부분의 conditional diffusion models 는 generalization 이 잘 안되므로, -conditional input domain 과 output domain 이 유사한 -몇몇 applications 에서만 잘 활용될 수 있음

        -
          -
        • ex. inpainting 혹은 super-resolution

        • -
        -
      • -
      • LDM 이 latent space 에서 diffusion process 를 수행함으로써 -generalization 을 개선하긴 했으나 여전히 conditional generation process

      • -
      • LDM 의 경우, 복잡한 attention mechanism 으로 multi-modal condition 이 주어지므로, 이론적 근거를 제시하기가 더 힘듦

      • -
      -
    • -
    • 본 논문에서 제안하는 BBDM 모델

      -
      -img_10 -
      -

      Fig. 318 BBDM 의 아키텍쳐#

      -
      -
      -
        -
      • BBDM 모델은 input 과 output 도메인 간의 mapping 을 -Brownian Bridge stochastic process 를 통해 구축

      • -
      • 가속을 위해 Latent space 에서 diffusion process 를 수행함

      • -
      -
    • -
    -
      -
    1. Related Work

      -
        -
      • 2.1. Image-to-Image Translation

        -
          -
        • introduction 참고

        • -
        -
      • -
      • 2,2. Duffusion Models

        -
          -
        • Diffusion Models 의 simplified objective 를 잠깐 살펴보면, 다음과 같음.

        • -
        -
        -img_11 -
        -

        Fig. 319 Diffusion Models 의 Simplified objective#

        -
        -
        -
          -
        • 대부분의 conditional Diffusion Modelscondition 을 objective 에 직접 “주입”.
          -아래의 그림을 보면, conditional input image y 가 삽입된 것을 볼 수 있음.

        • -
        -
        -img_12 -
        -

        Fig. 320 Conditional Diffusion Models 의 Simplified objective#

        -
        -
        -
          -
        • \(p(x_t|y)\) 가 objective 에 드러나 있지 않으므로, -desired conditional distribution 에 도달할 수 있을 것이라는 이론적 보장이 없음

        • -
        -
      • -
      • 2.3. Brownian Bridge

        -
          -
        • Brownian Bridgediffusion process 동안의 확률 분포가 -starting state (t=0)ending state (t=T)conditioned 되어 있는, -time stochastic model

        • -
        -
        -img_13 -
        -

        Fig. 321 식(3)#

        -
        -
        -

        앞서 보았던 Brownian Bridge 의 평균과 분산을 구해보자.
        -위의 식과 같은 의미임을 알 수 있다.

        -
        -img_06 -
        -

        Fig. 322 Brownian Bridge#

        -
        -
        -
        -
      • -
      -
    2. -
    3. Method

      -
        -
      • 3.1. Brownian Bridge Diffusion Model (BBDM)

        -
          -
        • Conditional diffusion models : Gaussian noise 를 향해 Forward process 진행

        • -
        • BBDM : conditional input y 자체를 향해 Brownian Bridge process 진행

        • -
        -
        -img_09 -
        -

        Fig. 323 Conditional Diffusion Models 와 BBDM 의 비교#

        -
        -
        -
        -
          -
        • VQGAN 의 latent space 에서 diffusion process 를 수행

        • -
        • xA 도메인 영상의 latent features 이고,
          -yB 도메인 영상의 latent features 일 때,
          -Forward diffusion process 는 다음과 같이 정의

        • -
        -
        -img_14 -
        -

        Fig. 324 식(4)#

        -
        -
        -
          -
        • T 는 diffusion process 의 total steps 이다.

        • -
        • \(δ_t\)분산이다.

        • -
        • 식 (3) 에 나타난 분산 \(δ_t={t(T −t)\over T}\) 를 사용하게 되면, -가능한 최대 분산값은, middle step 인 \(T\over 2\) 에서의 분산값인 \(δ_{T\over 2} = {T \over 4}\) 가 됨

        • -
        • T 값이 커지면, 최대 분산값도 커지는데, 이 분산 값은 다루기에 너무 큼

        • -
        • \(x_0,y \sim N(0,I)\) 이면서 서로 독립일 때, -Brownian Bridge diffusion process 를 위한 분산 scheduling 을 -다음과 같이 해볼 수 있다.

        • -
        -
        -img_15 -
        -

        Fig. 325 Brownian Bridge diffusion process 를 위한 분산 Scheduling#

        -
        -
        -
          -
        • 만약 t 는 양의 정수의 discrete time 이고, 그 최댓값인 T=1000 이라면 -\(\delta_t\) 는 아래 그림과 같게 된다.

        • -
        -
        -img_16 -
        -

        Fig. 326 \(\delta_t\) 를 시각화한 결과#

        -
        -
        -
        -

        \(m_t = t\overT\) 이고, \(\delta_t = 2(m_t - m_t^2)\) 이므로,

        -
          -
        • diffusion process 가 시작하는 t = 0 에서는, \(m_0\) = 0 이고, -평균은 \(x_0\) 이며 -분산은 0 이 된다.

        • -
        • diffusion process 가 끝나는 t = T 에서는, -\(m_T\) = 1 이고, -평균은 y 이고, -분산은 0 이 된다.

        • -
        • 분산이, -diffusion process 의 중간 지점까지는 최대 0.5 까지 증가하다가,
          -중간 지점부터 끝나는 지점까지는 0 으로 감소

        • -
        • Brownian Bridge diffusion process 에서의 sampling diversity 는 -최대 분산값,
          즉 middle step 인 \(t = {T\over 2}\) 에서의 분산값에 의해 결정

        • -
        • 분산을 스케일링하는 변수 s 를 두어 sampling diversity 를 조절할 수 있다.

        • -
        -
        -img_17 -
        -

        Fig. 327 식(5) : sampling diversity 조절을 위한 계수 s 가 포함된 분산 scheduling#

        -
        -
        -
          -
        • 이 논문에서 s 의 디폴트 값은 1 -

        • -
        -
      • -
      • 3.1.1 Forward Process

        -
          -
        • 식 (4) 에서는 step t 에서의 marginal distribution 만 제공

        • -
        • training 과 inference process 를 위해서는 forward transition probability\(q_{BB}(x_t|x_{t-1}, y)\) 를 알아야함

        • -
        • 식 (4) 에 의해, \(x_0\)\(y\) 가 주어졌을 때의 \(x_t\) \(x_{t-1}\) 은 다음과 같이 쓸 수 있음

        • -
        -
        -img_14 -
        -

        Fig. 328 식(4)#

        -
        -
        -
        -img_18 -
        -

        Fig. 329 식(6) & 식(7)#

        -
        -
        -
          -
        • 참고. 위 식 (7) 의 \(m_ty\)\(m_{t-1}y\) 로 쓰는 것이 옳음

        • -
        -
        -img_19 -
        -

        Fig. 330 \(\epsilon\) 은 i.i.d 하게 N(0, I) 를 따른다#

        -
        -
        -
          -
        • 식 (6) 의 \(x_0\) 를 식 (7) 의 \(x_0\) 로 대체하면, -Forward transition probability \(q_{BB}(x_t|x_{t-1}, y)\) 가 아래의 식 (8) 과 같이 유도됨

        • -
        -
        -img_20 -
        -

        Fig. 331 식(8)#

        -
        -
        -
          -
        • 증명

          -
            -
          • 식(7) 을 다음과 같이 쓸 수 있음

            -
              -
            • \(x_0 = {x_{t-1}-m_{t-1}y-\sqrt {\delta_{t-1}} \epsilon_{t-1} \over 1-m_{t-1}}\)

            • -
            -
          • -
          • 식(6) 의 \(x_0\) 에 위의 \(x_0\) 를 대입

            -
              -
            • \(x_t = {(1-m_t)x_{t-1} \over (1-m_{t-1})} - {(1-m_t)m_{t-1}y \over (1-m_{t-1})} - {(1-m_t)\sqrt {\delta_{t-1}}\epsilon_{t-1} \over (1-m_{t-1})} + m_ty + \sqrt{\delta_t} \epsilon_t\)

            • -
            • \(= {(1-m_t)x_{t-1} \over (1-m_{t-1})} + y(m_t - {(1-m_t) \over (1-m_{t-1})}m_{t-1}) + \sqrt {\delta_t}\epsilon_t - {(1-m_t)\sqrt {\delta_{t-1}}\epsilon_{t-1} \over (1-m_{t-1})}\)

            • -
            -
          • -
          -
        • -
        • 이후, \(Var(x_t)\) 를 구하면, 아래의 \(\delta_{t|t-1}\) 와 같이 유도됨

        • -
        -
        -img_21 -
        -

        Fig. 332 \(\delta_{t|t-1}\)#

        -
        -
        -
          -
        • t=T 가 될 때 \(m_T = 1\) 인데, 이때 식(8) 에 의해 \(x_T = y\) 임. -↓ -”아, Forward diffusion process 는 확실히.. -A 도메인으로부터 B 도메인으로의 fixed mapping 을 정의하는구나”

        • -
        -
      • -
      • 3.1.2 Reverse Process

        -
          -
        • conditional diffusion modelsreverse process 는,
          -Gaussian noise 로부터 시작하며,
          -매 스텝마다 조금씩 noise 를 제거해나감

        • -
        • 반면, BBDM 의 Brownian Bridge process 는 \(x_T = y\) 로 둠으로써,
          -conditional input 그 자체에서 Reverse process 를 시작

        • -
        -
        -img_22 -
        -

        Fig. 333 식(9)#

        -
        -
        -
          -
        • \(\mu_\theta (x_t,t)\) 는 U-Net 에 의해 예측된 노이즈 평균값이며, \(\tilde{\delta_t}\) 는 노이즈의 분산

        • -
        • DDPM 처럼, 임의의 parameters \(\theta\) 를 갖는 신경망 U-Net 은 \(\mu_\theta (x_t,t)\) 를 학습

        • -
        -
      • -
      • 3.1.3. Training Objective

        -
          -
        • 참고.

          -
            -
          • 예전 DDPM 의 Loss 는 다음과 같았음.

          • -
          -
        • -
        -
        -img_23 -
        -

        Fig. 334 DDPM 의 Loss#

        -
        -
        -
          -
        • 그리고, 이로부터 simplified 된 objective 는 다음과 같음

        • -
        -
        -img_11 -
        -

        Fig. 335 DDPM 의 simplified objective#

        -
        -
        -
          -
        • Brownian Bridge diffusion processELBO

        • -
        -
        -img_24 -
        -

        Fig. 336 식(10) : BBDM 의 ELBO#

        -
        -
        -
          -
        • 첫 번째 term : \(x_T\) 가 곧 y 이므로 무시할 수 있음

        • -
        • 세 번째 term : 매우 작은 값이 되므로 무시할 수 있음

        • -
        • 베이즈 이론과 Markov chain property 를 식 (4) 와 식 (8) 에 적용하여, -다음과 같이 식 (11) 이 도출된다.

        • -
        • 참고. Markovian Chain

          -
            -
          • \(q(x_t|x_{t-1}) = q(x_t|x_{t-1}, x_{t-2}, … , x_0)\)

          • -
          • Markov chain property 에 의해,
            -\(q_{BB}(x_t|x_{t-1},y) = q_{BB}(x_t|x_{t-1},x_0,y)\) 가 성립됨을 활용

          • -
          -
        • -
        • 식(4)

        • -
        -
        -img_14 -
        -

        Fig. 337 식(4)#

        -
        -
        -
          -
        • 식(8)

        • -
        -
        -img_20 -
        -

        Fig. 338 식(8)#

        -
        -
        -
          -
        • 식(11) & 식(13)

        • -
        -
        -img_25 -
        -

        Fig. 339 식(11)#

        -
        -
        -
        -img_26 -
        -

        Fig. 340 식(13)#

        -
        -
        -
          -
        • 증명

        • -
        • \({q_{BB}(x_{t}|x_{t-1},y)q_{BB}(x_{t-1}|x_{0},y)\over q_{BB}(x_{t}|x_{0},y)}\)

        • -
        • \(= {{q_{BB}(x_{t},x_{t-1},y) \over q_{BB}(x_{t-1},y)} {q_{BB}(x_{t-1},x_{0},y) \over q_{BB}(x_{0},y)} \over {q_{BB}(x_{t},x_{0},y)\over q_{BB}(x_{0},y)}}\)

        • -
        • \(= q_{BB}(x_{t}|x_{t-1},y){q_{BB}(x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}\)

        • -
        • \(= q_{BB}(x_{t}|x_{t-1},x_{0},y){q_{BB}(x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}\)

        • -
        • \(= {q_{BB}(x_{t},x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}\)

        • -
        • \(= q_{BB}(x_{t-1}|x_{t},x_{0},y)\)

        • -
        • 위 식 (11) 의 평균은, 식 (12) 와 같이 정리됨

        • -
        -
        -img_27 -
        -

        Fig. 341 식(12)#

        -
        -
        -
          -
        • 식(4) 와 식(12) 를 통합하고 Reparameterization method 를 사용해서 -\(\tilde {\mu_t}\) 를 다음과 같이 변형할 수 있음

        • -
        -
        -img_28 -
        -

        Fig. 342 식(12) 의 변형#

        -
        -
        -
          -
        • 참고. 식(4)

        • -
        -
        -img_14 -
        -

        Fig. 343 식(4)#

        -
        -
        -
          -
        • 하지만, 실제로 U-Net 은 전체 \(\tilde {\mu_t}\) 를 예측하는 것이 아니라, -노이즈를 예측하도록 학습됨.

        • -
        • 이 내용을 식에 명시하기 위해, -식(9) 에 명시된 \(\mu_\theta\) 를 식(14) 와 같이 다시 써볼 수 있음.
          -\(x_t\) 와 y, 그리고 예측된 노이즈 \(\epsilon_\theta\) 의 linear combination 으로 다시 써보는
          것임.

        • -
        -
        -img_22 -
        -

        Fig. 344 식(9)#

        -
        -
        -
        -img_29 -
        -

        Fig. 345 식(14)#

        -
        -
        -
          -
        • 그런데, 아래 그림을 참고해보면 우리는 \(\tilde {\mu_t}\) 에 근사하도록 \(\mu_\theta\) 를 학습시켜야함.

        • -
        -
        -img_30 -
        -

        Fig. 346 \(\tilde {\mu}_t\) 의 정리된 식#

        -
        -
        -
          -
        • 즉, \(\epsilon_\theta (x_t,t)\)\(m_t(y-x_0)+\sqrt {\delta_t}\epsilon\) 을 근사하도록 학습되어야하는 것임.

        • -
        • ELBO 의 두 번째 term 을 다시 살펴보면,

          -
            -
          • 두 번째 term : \(D_{KL}(q_{BB}(x_{t-1}|x_t, x_0, y)||p_\theta (x_{t-1}|x_t,y))\)

            -
              -
            • \(arg \space min_\theta \space D_{KL}(q_{BB}(x_{t-1}|x_t, x_0, y)||p_\theta (x_{t-1}|x_t,y))\) -=\(arg \space min_\theta \space (\tilde {\mu}_t(x_t,y) - \mu_\theta (x_t,y,t))\) -=\(arg \space min_\theta \space (c_{\epsilon_t}(m_t(y-x_0) + \sqrt {\delta_t}\epsilon) - c_{\epsilon_t}\epsilon_\theta(x_t,t))\) -=\(arg \space min_\theta \space (c_{\epsilon_t} (m_t(y-x_0) + \sqrt {\delta_t}\epsilon - \epsilon_\theta(x_t,t)))\)

            • -
            -
          • -
          • 따라서, ELBO 는 다음과 같이 단순화될 수 있음

          • -
          -
          -img_31 -
          -

          Fig. 347 BBDM 의 Simplified ELBO#

          -
          -
          -
        • -
        • Training Algorithm 정리

        • -
        -
        -img_32 -
        -

        Fig. 348 Algorithm 1 : Training. 마치 DDPM 에서 그러했듯이, BBDM 도 실제 Loss 에는 Simplified ELBO 에서의 계수 \(C_{\epsilon_t}\) 가 빠진 것을 확인할 수 있다.#

        -
        -
        -
      • -
      • 3.2. Accelerated Sampling Processes

        -
          -
        • DDIM 과 비슷하게, BBDM 의 inference processes 도 -non-Markovian process 를 사용해서 가속시킬 수 있음

        • -
        • Sampling steps 의 길이를 S 라고 두었을 때, -inference processlatent varibales \(x_{1:T}\) 의 subset 에 의해 다음과 같이 정의됨

        • -
        • latent varibales \(x_{1:T}\) 의 subset

        • -
        -
        -img_33 -
        -

        Fig. 349 latent varibales \(x_{1:T}\) 의 subset#

        -
        -
        -
          -
        • inference process

        • -
        -
        -img_34 -
        -

        Fig. 350 inference process#

        -
        -
        -
          -
        • Sampling Algorithm

        • -
        -
        -img_35 -
        -

        Fig. 351 Algorithm 2 : Sampling#

        -
        -
        -
          -
        • 본 논문에서는 S 값의 디폴트200 으로 두었음

        • -
        -
      • -
      -
    4. -
    5. Experiments

      -
        -
      • 4.1. Experiment Setup

        -
          -
        • 모델 & 하이퍼마라미터

          -
            -
          • BBDM 프레임워크는 pretrained VQGAN 과 BBDM 으로 이루어짐

          • -
          • Latent Diffusion Model 에서 사용된 것과 같은 pretrained VQGAN 을 사용

          • -
          • training stage 에서의 time steps 는 1,000

          • -
          • inference stage 에서의 sampling steps 는 200

          • -
          -
        • -
        • Evaluation

          -
            -
          • FID 와 LPIPS 사용

          • -
          • 생성물의 diversity 를 평가하기 위해서, -하나의 conditional input y 마다 5개의 샘플을 생성하고, -각 픽셀 마다의 표준편차의 평균을 구함. -그 후 전체 test 데이터셋에 대해서 평균 냄.

          • -
          -
        • -
        • Datasets

          -
            -
          • BBDM 의 I2I 변환 능력을 평가하기 위해서, 여러 task 로 실험함

          • -
          -
            -
          1. Semantic Synthesis 능력을 CelebAMask-HQ dataset 으로 실험

            -
              -
            1. semantic layout 만 주고 photorealistic 한 images 를 생성해내는 능력 평가

            2. -
            -
          2. -
          3. sketch-to-photo 능력을 edges2shoes 와 edges2handbags 로 실험

            -
              -
            1. edges 만 주고 realistic images 생성해내는 능력 평가

            2. -
            -
          4. -
          5. style transfer 능력을 faces2comics 로 실험

            -
              -
            1. 위 두 실험은 서로 상이한 domains 간의 변환 능력을 평가했다면, -Style transfer 실험에서는 서로 비슷한 domains 간의 I2I 변환 능력을 평가

            2. -
            -
          6. -
          -
        • -
        -
      • -
      • 4.2. Qualitative Comparison

        -
        -img_36 -
        -

        Fig. 352 Figure 3. CelebAMask-HQ 데이터셋에 대한 추론 결과#

        -
        -
        -
        -img_37 -
        -

        Fig. 353 Figure 4. 다른 Image-to-Image 변환 task 에 대한 추론 결과#

        -
        -
        -
        -img_38 -
        -

        Fig. 354 Figure 5. 다른 Image-to-Image 변환 task 에 대한 추론 결과#

        -
        -
        -
          -
        • Pix2Pix 는 지도 학습 방식으로 학습하므로, 괜찮은 결과를 냄

        • -
        • 반면 CycleGAN작은 스케일의 데이터셋에서는 성능이 떨어짐

        • -
        • DRIT++ 은 GAN 기반 모델들 중에서는 좋은 성능을 냈으나, -변환된 이미지들이 oversmoothed 되어 있었고, -ground truth distribution 과는 거리가 멀었음

        • -
        • conditional diffusion model 인 CDELDM 은 -GAN 기반 모델들보다는 좋은 성능을 냈으나, -conditional information 에 큰 영향을 받음

          -
            -
          • Figure 3 의 첫 번째 줄을 보면 irregular occlusions 가 나타나는데, -CDE 와 LDM 은 이에 큰 영향을 받음

          • -
          -
        • -
        • 반면 BBDM 은 두 도메인 간의 직접적인 diffusion process 를 학습하므로 -이러한 문제로부터 자유로움

        • -
        • 또한 Brownian Bridge 의 stochastic 한 특성으로 인해 -fidelity 와 diversity 가 높은 이미지들을 생성해냄

        • -
        -
      • -
      • 4.3. Quantitative Comparison

        -
          -
        • Table 1 과 2 를 보면, BBDM 이 모든 실험에서 가장 좋은 FID 값을 기록했으며, 훌륭한 LPIPS 값을 기록함

        • -
        -
        -img_39 -
        -

        Fig. 355 Table 1. CelebAMask-HQ 데이터셋에 대한 FID, LPIPS 성능은 BBDM 이 가장 뛰어남#

        -
        -
        -
        -img_40 -
        -

        Fig. 356 Table 2. BBDM 은 FID, LPIPS 점수가 매우 뛰어났음#

        -
        -
        -
      • -
      • 4.4. 다른 Translation Tasks

        -
          -
        • BBDM 의 generalization 성능을 검증하기 위해서, 다른 tasks 에 대해서도 실험했음

        • -
        • 아래 그림과 같이, 다른 tasks 에서도 camparable 한 성능을 기록함

        • -
        -
        -img_41 -
        -

        Fig. 357 Figure 6. Face-to-label, 색상화, inpainting 등의 다른 tasks 에서도 뛰어난 성능을 기록함#

        -
        -
        -
      • -
      • 4.5. Ablation Study

        -
          -
        • pre-trained latent space 의 영향

          -
          -img_42 -
          -

          Fig. 358 Table 3. BBDM 은 LDM 에 비해 Downsampling factor 에 대해 robust 했음#

          -
          -
          -
            -
          • BBDM 과 LDM 에 대해서, -VQGAN downsampling factor각각 4, 8, 16 으로 두고 성능 비교 실험 수행

          • -
          • BBDM 은 down sampling factor 에 robust 했음

          • -
          -
        • -
        • Sampling steps 의 영향

          -
            -
          • Sampling steps 가 작을 때 (200 이하) 는, 조금만 늘려도 성능이 크게 증가

          • -
          -
          -img_43 -
          -

          Fig. 359 Table 4. 200 이상의 Sampling Steps 에서는 Steps 를 키워도 성능 변화가 미미함#

          -
          -
          -
          -
        • -
        • Brownian Bridge 의 maximum variance 의 영향

          -
          -img_44 -
          -

          Fig. 360 Table 5. Sampling diversity 조절 계수에 의해 실제로 Diversity 가 조절 되었음#

          -
          -
          -
            -
          • 식 (5) 에 나타난 것처럼, scaling factor s 의 값을 변경함으로써, -Brownian Bridge 의 최대 분산값 (t = T/2 일 때의 분산값) 조절 가능. -이렇게 diversity 조절 가능.

          • -
          -
          -img_17 -
          -

          Fig. 361 식(5)#

          -
          -
          -
        • -
        -
      • -
      -
    6. -
    7. Conclusion and Future Work

      -
        -
      • Brownian Bridge 에 기반한 새로운 I2I 변환 방법 제시

      • -
      • 이 방법은 기존의 conditional 한 방법과 달리, -Brownian Bridge diffusion process 를 통해 두 도메인 간의 mapping 을 직접 학습

      • -
      • 여러 tasks 에서의 실험을 통해 BBDM 의 성능 검증

      • -
      • text-to-image 와 같은 multi-modal tasks 에도 BBDM 을 적용해볼 예정

      • -
      -
    8. -
    -
  2. -
- -
- - - - -
- - - - - - -
- - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + BBDM — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

BBDM

+ +
+
+ +
+
+
+ + + + +
+ +
+

Information

+ +
+
+

BBDM#

+
    +
  • BBDM

    +
      +
    • BBDM 은 Brownian Bridge 를 Diffusion Model 에 도입한 최초의 모델

    • +
    • Image to Image Translation 분야에서 Conditional Diffusion Models 의 한계를 극복함

    • +
    +
  • +
+


BBDM 을 이해하기 위해서는 Brownian motion process 와 Brownian Bridge 를 이해해야함. Brownian motion process 는 stochastic process 에 해당함.

+
    +
  • Stochastic Process

    +
      +
    • 시간의 흐름에 따라 불확실성을 가지고 변하는 확률 변수들의 집합

    • +
    • Stochastic process 는 \(X_t\) 와 같이 나타낼 수 있는데,
      +여기서 X 는 확률 변수를,
      +t 는 확률 변수가 관찰된 시간을 나타냄

    • +
    • X 와 t 는 각각 Discrete 혹은 Continuous 로 구분할 수 있음

      +
        +
      • Discrete RANDOM VARIABLE & Discrete TIME

      • +
      • Discrete RANDOM VARIABLE & Continuous TIME

      • +
      • Continuous RANDOM VARIABLE & Discrete TIME

      • +
      • Continuous RANDOM VARIABLE & Continuous TIME

      • +
      +
    • +
    +
  • +
  • Brownian Motion Process (Wiener Process) 소개

    +
      +
    • Brownian Motion

      +
        +
      • 유체의 미소입자가 불규칙하게 운동하는 현상

      • +
      +
      +img_00 +
      +

      Fig. 309 굴뚝에서 퍼져나간 연기 사진을 오른쪽으로 90도 회전시킨 사진#

      +
      +
      +
    • +
    +


    위 사진으로부터 Brownian motion process 를 직관적으로 이해해볼 수 있음.

    +
      +
    • Brownian Motion Process (Wiener Process)

      +
        +
      • Brownian Motion 을 연속 시간 확률 과정으로 모델링한 것

      • +
      +
      +img_01 +
      +

      Fig. 310 \(W_0\) = 0 이고 max time T=1000 인 Wiener Process 를 100번 Sampling 한 결과#

      +
      +
      +
    • +
    • Brownian Motion Process (Wiener Process)
      +Continuous RANDOM VARIABLE & Continuous TIME 를 갖는 Stochastic Process 로,
      +\(W_t\) 와 같이 나타낸다.

    • +
    +
  • +
  • Brownian Motion Process (Wiener Process) 를 이해해보자

    +
      +
    • 가정해보자

      +
        +
      1. \(t = 0 → W_t = W_0 = 0\) 이라고 하자.

      2. +
      3. 쉽게 이해하기 위해, TIME t 가 Discrete 하다고 가정해보자.
        +(BBDM 은 t 를 정수 0~1000 으로 설정)

      4. +
      +
    • +
    • Requirements

      +
        +
      1. Brownian Motion Process 는 Stochastic Process 이다.
        +TIME t 마다 stochasticity 가 부여되어야 한다.

      2. +
      3. 시간 간격과 W 의 변화량이 비례해야 한다.
        +(즉, 더 오래 지났을수록 더 많이 변한다.)

      4. +
      +
    • +
    • Notation

      +
      +img_02 +
      +

      Fig. 311 Source : https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB#

      +
      +
      +
        +
      • \(\Delta t\) = 시간 간격

      • +
      • n = 살펴보고자 하는 시간 간격의 수

      • +
      • \(T = n * \Delta t\)

      • +
      • i.i.d \(\epsilon_t \sim N(0, 1)\)

      • +
      • \(\Delta W_t\) = t 시점에서 그 다음 시간 간격까지 증가한 W 의 값 +\(= W_{t+\Delta t} - W_t\) += \(\epsilon_t \sqrt {\Delta t}\)

      • +
      +
    • +
    • 이해

      +
        +
      • \(\Delta W_t = W_{t+\Delta t} - W_t = \epsilon_t \sqrt {\Delta t}\) 라고 정의해 본 근거를 +위의 Requirements 에서 찾아보면..

        +
          +
        • 확률 변수 \(\epsilon\) 를 도입함으로써 stochasticity 부여

        • +
        • \(\Delta t\) 를 도입함으로써 시간 간격도 고려 가능

        • +
        +
      • +
      • 그렇다면 왜 하필 \(\sqrt {\Delta t}\) 를 곱했을까?

        +
          +
        1. \(\Delta t\) 가 0 에 가까워질 때, \(\sqrt{\Delta t}\) 는 천천히 0 에 수렴함. +만약 TIME t 가 continuous 하다면, \(\Delta t\) 는 매우 작은 값이 됨. +\(\Delta W_t = \epsilon_t {\Delta t}\) 라면 \(\Delta W_t\) 가 너무 작아짐.

        2. +
        3. \(\Delta t\) 가 커질 때, \(\sqrt{\Delta t}\) 는 천천히 커짐

        4. +
        +
      • +
      • 주의할 사항

        +
          +
        • i.i.d \(\epsilon_t \sim N(0, 1)\) 이므로, +\(\Delta W_t = \epsilon_t \sqrt {\Delta t}\) 에서 \(\Delta W_0\)\(\Delta W_1\) 은 서로 독립인 것이 맞지만, +\(W_0\)\(W_1\) 이 독립이라는 말은 아님.

        • +
        +
      • +
      • \(\Delta W_0 = \epsilon_0 \sqrt {\Delta t}\) 이므로, +\(W_{\Delta t} = W_0 + \epsilon_0 \sqrt {\Delta t} = 0 + \epsilon_0 \sqrt {\Delta t} = \epsilon_0 \sqrt {\Delta t}\)

      • +
      • \(\Delta W_{\Delta t} = \epsilon_{\Delta t} \sqrt {\Delta t}\) 이므로, +\(W_{2\Delta t} = W_{\Delta t} + \epsilon_{\Delta t} \sqrt {\Delta t} = (\epsilon_0 + \epsilon_{\Delta t}) * \sqrt {\Delta t}\)

        +
          +
        • \(Var(\Delta W_{\Delta t}) = Var(\epsilon_{\Delta t} \sqrt {\Delta t}) = Var(\epsilon_{\Delta t}) * \sqrt {\Delta t}^2 = 1 * \sqrt {\Delta t}^2 = \Delta t\)

        • +
        • \(\mathbb{E}(\Delta W_{\Delta t}) = \mathbb{E}(\epsilon_{\Delta t} \sqrt {\Delta t}) = \mathbb{E}(\epsilon_{\Delta t}) * \sqrt {\Delta t} = 0 * \sqrt {\Delta t} = 0\)

        • +
        +
      • +
      • \(\Delta W_{T-\Delta t} = \epsilon_{T-\Delta t} \sqrt {\Delta t}\) +\(W_T = (\epsilon_0 + \epsilon_{\Delta t} + \epsilon_{2\Delta t} + ... + \epsilon_{T-\Delta t}) * \sqrt {\Delta t}\)

        +
          +
        • \(\mathbb{E}(W_T) = 0\)

        • +
        • \(Var(W_T) = n * \Delta t = T\) (각각의 \(\epsilon\) 은 서로 i.i.d 이므로 공분산은 0)

        • +
        • 즉, \(W_T \sim N(0,T)\)

        • +
        +
      • +
      +
      +img_03 +
      +

      Fig. 312 Source : https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB#

      +
      +
      +

      파란색 점들은, Brownian Motion Process 를 1번 Sampling 한 결과임 (one representation) 를 나타냄

      +
      +img_04 +
      +

      Fig. 313 Source : https://www.youtube.com/watch?v=ld0rxwAJpkM&ab_channel=finRGB#

      +
      +
      +
        +
      • t=0 부터 t=T 까지 Wiener Process 를 수행하면,
        +\(W_t\)\(W_T - W_0\) 만큼 변한다.

        +
          +
        • \((W_T - W_0) \sim N(0, T-0)\)

        • +
        • \((W_{t_2}-W_{t_1}) \sim N(0,t_2-t_1)\)

          +
            +
          • ex. 5분 에서 10분으로 Wiener Process 를 진행하면, \(W_5\) 는 0 이 아닐 수 있으나, 그 변화량 \((W_{t_{10}}-W_{t_5})\) 은 N(0, 10 - 5) 를 따른다.

          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
  • Brownian Bridge

    +
      +
    • X 가 Standard Wiener Process 라고 하자.
      +0 시점과 T 시점의 X 값을 알고,
      +0<t<T 일 때, +두 점을 선형으로 연결하는 Linear Bridge X(t) 는 다음과 같다.

    • +
    +
    +img_05 +
    +

    Fig. 314 Brownian Bridge 이해를 위한 Linear Bridge#

    +
    +
    +

    Brownian Bridge 는 Standard Wiener Process 의 Conditional Probability Distribution 이다.
    +Starting state W(0) 과 Ending state W(T) 의 값에 Conditioned 되어 있다.
    +아래와 같이 정의될 수 있다.

    +
    +img_06 +
    +

    Fig. 315 Brownian Bridge#

    +
    +
    +


    아래의 그림을 보면, 0 이라는 시작값과 123 이라는 마지막 값에 conditioned 되어 있는 것을 확인할 수 있다.
    Brownian Bridge 의 분산은 0 에서 시작해서 증가하다가, T/2 시점에서 최대가 되었다가, 이후로는 감소하여 마지막엔 0 에 수렴하게된다.

    +
    +img_08 +
    +

    Fig. 316 \(W_0\) = 0 에서 \(W_1000\) = 123 까지 100개의 Brownian Bridge 를 샘플링한 결과#

    +
    +
    +
  • +
  • Abstrcat

    +
    +img_09 +
    +

    Fig. 317 Conditional Diffusion Models 와 BBDM 의 비교#

    +
    +
    +
      +
    • 기존의 Diffusion 모델들은,
      +Image-to-Image 변환을 Conditional generation process 로 다룸.
      +이로 인해, 매우 상이한 도메인 사이의 변환에는 어려움이 있음.

    • +
    • 이를 해결하기 위해,
      +본 논문은 Brownian Bridge 에 기반한 Image-to-Image 변환 방법을 제시

    • +
    • BBDM 은 Conditional generation process 가 아닌
      +Stochastic Brownian Bridge Process 로 두 도메인 사이의 변환을 모델링하므로,
      Bidirectional Diffusion Process 임.

    • +
    • Brownian Bridge diffusion process 를 Image-to-Image 변환에 접목한 최초의 논문임

    • +
    • BBDM 모델의 훌륭한 성능을 실험적으로 증명함

    • +
    +
  • +
+
    +
  1. Introduction

    +
      +
    • I2I 변환에서 Non-diffusion models 의 한계

      +
        +
      • Pix2Pix 와 같은 conditional GANsfideltiy 가 높았으나, +학습이 어렵고, DIversity 가 떨어진다.

        +
          +
        • Diversity 가 떨어지는 이유 : conditional GANs 는 input image 를 output image 에 one-to-one mapping 하는 방법을 학습하기 때문

        • +
        +
      • +
      • VAE 같은 생성형 모델들은 GANs 만큼의 I2I 성능이 안나오고, +Applicability 가 GANs 보다 떨어진다.

      • +
      +
    • +
    • I2I 변환에서 conditional diffusion models 의 한계

      +
        +
      • conditional diffusion models 는 reference image 의 encoded feature 를 직접 U-Net 에 통합시킴으로써 diffusion models 의 reverse process 를 guide 함

      • +
      • 하지만 이렇게 생성된 결과가 desired conditional distribution 을 추론해낸다는 명료한 이론적 근거가 없음

      • +
      • 대부분의 conditional diffusion models 는 generalization 이 잘 안되므로, +conditional input domain 과 output domain 이 유사한 +몇몇 applications 에서만 잘 활용될 수 있음

        +
          +
        • ex. inpainting 혹은 super-resolution

        • +
        +
      • +
      • LDM 이 latent space 에서 diffusion process 를 수행함으로써 +generalization 을 개선하긴 했으나 여전히 conditional generation process

      • +
      • LDM 의 경우, 복잡한 attention mechanism 으로 multi-modal condition 이 주어지므로, 이론적 근거를 제시하기가 더 힘듦

      • +
      +
    • +
    • 본 논문에서 제안하는 BBDM 모델

      +
      +img_10 +
      +

      Fig. 318 BBDM 의 아키텍쳐#

      +
      +
      +
        +
      • BBDM 모델은 input 과 output 도메인 간의 mapping 을 +Brownian Bridge stochastic process 를 통해 구축

      • +
      • 가속을 위해 Latent space 에서 diffusion process 를 수행함

      • +
      +
    • +
    +
      +
    1. Related Work

      +
        +
      • 2.1. Image-to-Image Translation

        +
          +
        • introduction 참고

        • +
        +
      • +
      • 2,2. Duffusion Models

        +
          +
        • Diffusion Models 의 simplified objective 를 잠깐 살펴보면, 다음과 같음.

        • +
        +
        +img_11 +
        +

        Fig. 319 Diffusion Models 의 Simplified objective#

        +
        +
        +
          +
        • 대부분의 conditional Diffusion Modelscondition 을 objective 에 직접 “주입”.
          +아래의 그림을 보면, conditional input image y 가 삽입된 것을 볼 수 있음.

        • +
        +
        +img_12 +
        +

        Fig. 320 Conditional Diffusion Models 의 Simplified objective#

        +
        +
        +
          +
        • \(p(x_t|y)\) 가 objective 에 드러나 있지 않으므로, +desired conditional distribution 에 도달할 수 있을 것이라는 이론적 보장이 없음

        • +
        +
      • +
      • 2.3. Brownian Bridge

        +
          +
        • Brownian Bridgediffusion process 동안의 확률 분포가 +starting state (t=0)ending state (t=T)conditioned 되어 있는, +time stochastic model

        • +
        +
        +img_13 +
        +

        Fig. 321 식(3)#

        +
        +
        +

        앞서 보았던 Brownian Bridge 의 평균과 분산을 구해보자.
        +위의 식과 같은 의미임을 알 수 있다.

        +
        +img_06 +
        +

        Fig. 322 Brownian Bridge#

        +
        +
        +
        +
      • +
      +
    2. +
    3. Method

      +
        +
      • 3.1. Brownian Bridge Diffusion Model (BBDM)

        +
          +
        • Conditional diffusion models : Gaussian noise 를 향해 Forward process 진행

        • +
        • BBDM : conditional input y 자체를 향해 Brownian Bridge process 진행

        • +
        +
        +img_09 +
        +

        Fig. 323 Conditional Diffusion Models 와 BBDM 의 비교#

        +
        +
        +
        +
          +
        • VQGAN 의 latent space 에서 diffusion process 를 수행

        • +
        • xA 도메인 영상의 latent features 이고,
          +yB 도메인 영상의 latent features 일 때,
          +Forward diffusion process 는 다음과 같이 정의

        • +
        +
        +img_14 +
        +

        Fig. 324 식(4)#

        +
        +
        +
          +
        • T 는 diffusion process 의 total steps 이다.

        • +
        • \(δ_t\)분산이다.

        • +
        • 식 (3) 에 나타난 분산 \(δ_t={t(T −t)\over T}\) 를 사용하게 되면, +가능한 최대 분산값은, middle step 인 \(T\over 2\) 에서의 분산값인 \(δ_{T\over 2} = {T \over 4}\) 가 됨

        • +
        • T 값이 커지면, 최대 분산값도 커지는데, 이 분산 값은 다루기에 너무 큼

        • +
        • \(x_0,y \sim N(0,I)\) 이면서 서로 독립일 때, +Brownian Bridge diffusion process 를 위한 분산 scheduling 을 +다음과 같이 해볼 수 있다.

        • +
        +
        +img_15 +
        +

        Fig. 325 Brownian Bridge diffusion process 를 위한 분산 Scheduling#

        +
        +
        +
          +
        • 만약 t 는 양의 정수의 discrete time 이고, 그 최댓값인 T=1000 이라면 +\(\delta_t\) 는 아래 그림과 같게 된다.

        • +
        +
        +img_16 +
        +

        Fig. 326 \(\delta_t\) 를 시각화한 결과#

        +
        +
        +
        +

        \(m_t = t\overT\) 이고, \(\delta_t = 2(m_t - m_t^2)\) 이므로,

        +
          +
        • diffusion process 가 시작하는 t = 0 에서는, \(m_0\) = 0 이고, +평균은 \(x_0\) 이며 +분산은 0 이 된다.

        • +
        • diffusion process 가 끝나는 t = T 에서는, +\(m_T\) = 1 이고, +평균은 y 이고, +분산은 0 이 된다.

        • +
        • 분산이, +diffusion process 의 중간 지점까지는 최대 0.5 까지 증가하다가,
          +중간 지점부터 끝나는 지점까지는 0 으로 감소

        • +
        • Brownian Bridge diffusion process 에서의 sampling diversity 는 +최대 분산값,
          즉 middle step 인 \(t = {T\over 2}\) 에서의 분산값에 의해 결정

        • +
        • 분산을 스케일링하는 변수 s 를 두어 sampling diversity 를 조절할 수 있다.

        • +
        +
        +img_17 +
        +

        Fig. 327 식(5) : sampling diversity 조절을 위한 계수 s 가 포함된 분산 scheduling#

        +
        +
        +
          +
        • 이 논문에서 s 의 디폴트 값은 1 +

        • +
        +
      • +
      • 3.1.1 Forward Process

        +
          +
        • 식 (4) 에서는 step t 에서의 marginal distribution 만 제공

        • +
        • training 과 inference process 를 위해서는 forward transition probability\(q_{BB}(x_t|x_{t-1}, y)\) 를 알아야함

        • +
        • 식 (4) 에 의해, \(x_0\)\(y\) 가 주어졌을 때의 \(x_t\) \(x_{t-1}\) 은 다음과 같이 쓸 수 있음

        • +
        +
        +img_14 +
        +

        Fig. 328 식(4)#

        +
        +
        +
        +img_18 +
        +

        Fig. 329 식(6) & 식(7)#

        +
        +
        +
          +
        • 참고. 위 식 (7) 의 \(m_ty\)\(m_{t-1}y\) 로 쓰는 것이 옳음

        • +
        +
        +img_19 +
        +

        Fig. 330 \(\epsilon\) 은 i.i.d 하게 N(0, I) 를 따른다#

        +
        +
        +
          +
        • 식 (6) 의 \(x_0\) 를 식 (7) 의 \(x_0\) 로 대체하면, +Forward transition probability \(q_{BB}(x_t|x_{t-1}, y)\) 가 아래의 식 (8) 과 같이 유도됨

        • +
        +
        +img_20 +
        +

        Fig. 331 식(8)#

        +
        +
        +
          +
        • 증명

          +
            +
          • 식(7) 을 다음과 같이 쓸 수 있음

            +
              +
            • \(x_0 = {x_{t-1}-m_{t-1}y-\sqrt {\delta_{t-1}} \epsilon_{t-1} \over 1-m_{t-1}}\)

            • +
            +
          • +
          • 식(6) 의 \(x_0\) 에 위의 \(x_0\) 를 대입

            +
              +
            • \(x_t = {(1-m_t)x_{t-1} \over (1-m_{t-1})} - {(1-m_t)m_{t-1}y \over (1-m_{t-1})} - {(1-m_t)\sqrt {\delta_{t-1}}\epsilon_{t-1} \over (1-m_{t-1})} + m_ty + \sqrt{\delta_t} \epsilon_t\)

            • +
            • \(= {(1-m_t)x_{t-1} \over (1-m_{t-1})} + y(m_t - {(1-m_t) \over (1-m_{t-1})}m_{t-1}) + \sqrt {\delta_t}\epsilon_t - {(1-m_t)\sqrt {\delta_{t-1}}\epsilon_{t-1} \over (1-m_{t-1})}\)

            • +
            +
          • +
          +
        • +
        • 이후, \(Var(x_t)\) 를 구하면, 아래의 \(\delta_{t|t-1}\) 와 같이 유도됨

        • +
        +
        +img_21 +
        +

        Fig. 332 \(\delta_{t|t-1}\)#

        +
        +
        +
          +
        • t=T 가 될 때 \(m_T = 1\) 인데, 이때 식(8) 에 의해 \(x_T = y\) 임. +↓ +”아, Forward diffusion process 는 확실히.. +A 도메인으로부터 B 도메인으로의 fixed mapping 을 정의하는구나”

        • +
        +
      • +
      • 3.1.2 Reverse Process

        +
          +
        • conditional diffusion modelsreverse process 는,
          +Gaussian noise 로부터 시작하며,
          +매 스텝마다 조금씩 noise 를 제거해나감

        • +
        • 반면, BBDM 의 Brownian Bridge process 는 \(x_T = y\) 로 둠으로써,
          +conditional input 그 자체에서 Reverse process 를 시작

        • +
        +
        +img_22 +
        +

        Fig. 333 식(9)#

        +
        +
        +
          +
        • \(\mu_\theta (x_t,t)\) 는 U-Net 에 의해 예측된 노이즈 평균값이며, \(\tilde{\delta_t}\) 는 노이즈의 분산

        • +
        • DDPM 처럼, 임의의 parameters \(\theta\) 를 갖는 신경망 U-Net 은 \(\mu_\theta (x_t,t)\) 를 학습

        • +
        +
      • +
      • 3.1.3. Training Objective

        +
          +
        • 참고.

          +
            +
          • 예전 DDPM 의 Loss 는 다음과 같았음.

          • +
          +
        • +
        +
        +img_23 +
        +

        Fig. 334 DDPM 의 Loss#

        +
        +
        +
          +
        • 그리고, 이로부터 simplified 된 objective 는 다음과 같음

        • +
        +
        +img_11 +
        +

        Fig. 335 DDPM 의 simplified objective#

        +
        +
        +
          +
        • Brownian Bridge diffusion processELBO

        • +
        +
        +img_24 +
        +

        Fig. 336 식(10) : BBDM 의 ELBO#

        +
        +
        +
          +
        • 첫 번째 term : \(x_T\) 가 곧 y 이므로 무시할 수 있음

        • +
        • 세 번째 term : 매우 작은 값이 되므로 무시할 수 있음

        • +
        • 베이즈 이론과 Markov chain property 를 식 (4) 와 식 (8) 에 적용하여, +다음과 같이 식 (11) 이 도출된다.

        • +
        • 참고. Markovian Chain

          +
            +
          • \(q(x_t|x_{t-1}) = q(x_t|x_{t-1}, x_{t-2}, … , x_0)\)

          • +
          • Markov chain property 에 의해,
            +\(q_{BB}(x_t|x_{t-1},y) = q_{BB}(x_t|x_{t-1},x_0,y)\) 가 성립됨을 활용

          • +
          +
        • +
        • 식(4)

        • +
        +
        +img_14 +
        +

        Fig. 337 식(4)#

        +
        +
        +
          +
        • 식(8)

        • +
        +
        +img_20 +
        +

        Fig. 338 식(8)#

        +
        +
        +
          +
        • 식(11) & 식(13)

        • +
        +
        +img_25 +
        +

        Fig. 339 식(11)#

        +
        +
        +
        +img_26 +
        +

        Fig. 340 식(13)#

        +
        +
        +
          +
        • 증명

        • +
        • \({q_{BB}(x_{t}|x_{t-1},y)q_{BB}(x_{t-1}|x_{0},y)\over q_{BB}(x_{t}|x_{0},y)}\)

        • +
        • \(= {{q_{BB}(x_{t},x_{t-1},y) \over q_{BB}(x_{t-1},y)} {q_{BB}(x_{t-1},x_{0},y) \over q_{BB}(x_{0},y)} \over {q_{BB}(x_{t},x_{0},y)\over q_{BB}(x_{0},y)}}\)

        • +
        • \(= q_{BB}(x_{t}|x_{t-1},y){q_{BB}(x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}\)

        • +
        • \(= q_{BB}(x_{t}|x_{t-1},x_{0},y){q_{BB}(x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}\)

        • +
        • \(= {q_{BB}(x_{t},x_{t-1},x_{0},y)\over q_{BB}(x_{t},x_{0},y)}\)

        • +
        • \(= q_{BB}(x_{t-1}|x_{t},x_{0},y)\)

        • +
        • 위 식 (11) 의 평균은, 식 (12) 와 같이 정리됨

        • +
        +
        +img_27 +
        +

        Fig. 341 식(12)#

        +
        +
        +
          +
        • 식(4) 와 식(12) 를 통합하고 Reparameterization method 를 사용해서 +\(\tilde {\mu_t}\) 를 다음과 같이 변형할 수 있음

        • +
        +
        +img_28 +
        +

        Fig. 342 식(12) 의 변형#

        +
        +
        +
          +
        • 참고. 식(4)

        • +
        +
        +img_14 +
        +

        Fig. 343 식(4)#

        +
        +
        +
          +
        • 하지만, 실제로 U-Net 은 전체 \(\tilde {\mu_t}\) 를 예측하는 것이 아니라, +노이즈를 예측하도록 학습됨.

        • +
        • 이 내용을 식에 명시하기 위해, +식(9) 에 명시된 \(\mu_\theta\) 를 식(14) 와 같이 다시 써볼 수 있음.
          +\(x_t\) 와 y, 그리고 예측된 노이즈 \(\epsilon_\theta\) 의 linear combination 으로 다시 써보는
          것임.

        • +
        +
        +img_22 +
        +

        Fig. 344 식(9)#

        +
        +
        +
        +img_29 +
        +

        Fig. 345 식(14)#

        +
        +
        +
          +
        • 그런데, 아래 그림을 참고해보면 우리는 \(\tilde {\mu_t}\) 에 근사하도록 \(\mu_\theta\) 를 학습시켜야함.

        • +
        +
        +img_30 +
        +

        Fig. 346 \(\tilde {\mu}_t\) 의 정리된 식#

        +
        +
        +
          +
        • 즉, \(\epsilon_\theta (x_t,t)\)\(m_t(y-x_0)+\sqrt {\delta_t}\epsilon\) 을 근사하도록 학습되어야하는 것임.

        • +
        • ELBO 의 두 번째 term 을 다시 살펴보면,

          +
            +
          • 두 번째 term : \(D_{KL}(q_{BB}(x_{t-1}|x_t, x_0, y)||p_\theta (x_{t-1}|x_t,y))\)

            +
              +
            • \(arg \space min_\theta \space D_{KL}(q_{BB}(x_{t-1}|x_t, x_0, y)||p_\theta (x_{t-1}|x_t,y))\) +=\(arg \space min_\theta \space (\tilde {\mu}_t(x_t,y) - \mu_\theta (x_t,y,t))\) +=\(arg \space min_\theta \space (c_{\epsilon_t}(m_t(y-x_0) + \sqrt {\delta_t}\epsilon) - c_{\epsilon_t}\epsilon_\theta(x_t,t))\) +=\(arg \space min_\theta \space (c_{\epsilon_t} (m_t(y-x_0) + \sqrt {\delta_t}\epsilon - \epsilon_\theta(x_t,t)))\)

            • +
            +
          • +
          • 따라서, ELBO 는 다음과 같이 단순화될 수 있음

          • +
          +
          +img_31 +
          +

          Fig. 347 BBDM 의 Simplified ELBO#

          +
          +
          +
        • +
        • Training Algorithm 정리

        • +
        +
        +img_32 +
        +

        Fig. 348 Algorithm 1 : Training. 마치 DDPM 에서 그러했듯이, BBDM 도 실제 Loss 에는 Simplified ELBO 에서의 계수 \(C_{\epsilon_t}\) 가 빠진 것을 확인할 수 있다.#

        +
        +
        +
      • +
      • 3.2. Accelerated Sampling Processes

        +
          +
        • DDIM 과 비슷하게, BBDM 의 inference processes 도 +non-Markovian process 를 사용해서 가속시킬 수 있음

        • +
        • Sampling steps 의 길이를 S 라고 두었을 때, +inference processlatent varibales \(x_{1:T}\) 의 subset 에 의해 다음과 같이 정의됨

        • +
        • latent varibales \(x_{1:T}\) 의 subset

        • +
        +
        +img_33 +
        +

        Fig. 349 latent varibales \(x_{1:T}\) 의 subset#

        +
        +
        +
          +
        • inference process

        • +
        +
        +img_34 +
        +

        Fig. 350 inference process#

        +
        +
        +
          +
        • Sampling Algorithm

        • +
        +
        +img_35 +
        +

        Fig. 351 Algorithm 2 : Sampling#

        +
        +
        +
          +
        • 본 논문에서는 S 값의 디폴트200 으로 두었음

        • +
        +
      • +
      +
    4. +
    5. Experiments

      +
        +
      • 4.1. Experiment Setup

        +
          +
        • 모델 & 하이퍼마라미터

          +
            +
          • BBDM 프레임워크는 pretrained VQGAN 과 BBDM 으로 이루어짐

          • +
          • Latent Diffusion Model 에서 사용된 것과 같은 pretrained VQGAN 을 사용

          • +
          • training stage 에서의 time steps 는 1,000

          • +
          • inference stage 에서의 sampling steps 는 200

          • +
          +
        • +
        • Evaluation

          +
            +
          • FID 와 LPIPS 사용

          • +
          • 생성물의 diversity 를 평가하기 위해서, +하나의 conditional input y 마다 5개의 샘플을 생성하고, +각 픽셀 마다의 표준편차의 평균을 구함. +그 후 전체 test 데이터셋에 대해서 평균 냄.

          • +
          +
        • +
        • Datasets

          +
            +
          • BBDM 의 I2I 변환 능력을 평가하기 위해서, 여러 task 로 실험함

          • +
          +
            +
          1. Semantic Synthesis 능력을 CelebAMask-HQ dataset 으로 실험

            +
              +
            1. semantic layout 만 주고 photorealistic 한 images 를 생성해내는 능력 평가

            2. +
            +
          2. +
          3. sketch-to-photo 능력을 edges2shoes 와 edges2handbags 로 실험

            +
              +
            1. edges 만 주고 realistic images 생성해내는 능력 평가

            2. +
            +
          4. +
          5. style transfer 능력을 faces2comics 로 실험

            +
              +
            1. 위 두 실험은 서로 상이한 domains 간의 변환 능력을 평가했다면, +Style transfer 실험에서는 서로 비슷한 domains 간의 I2I 변환 능력을 평가

            2. +
            +
          6. +
          +
        • +
        +
      • +
      • 4.2. Qualitative Comparison

        +
        +img_36 +
        +

        Fig. 352 Figure 3. CelebAMask-HQ 데이터셋에 대한 추론 결과#

        +
        +
        +
        +img_37 +
        +

        Fig. 353 Figure 4. 다른 Image-to-Image 변환 task 에 대한 추론 결과#

        +
        +
        +
        +img_38 +
        +

        Fig. 354 Figure 5. 다른 Image-to-Image 변환 task 에 대한 추론 결과#

        +
        +
        +
          +
        • Pix2Pix 는 지도 학습 방식으로 학습하므로, 괜찮은 결과를 냄

        • +
        • 반면 CycleGAN작은 스케일의 데이터셋에서는 성능이 떨어짐

        • +
        • DRIT++ 은 GAN 기반 모델들 중에서는 좋은 성능을 냈으나, +변환된 이미지들이 oversmoothed 되어 있었고, +ground truth distribution 과는 거리가 멀었음

        • +
        • conditional diffusion model 인 CDELDM 은 +GAN 기반 모델들보다는 좋은 성능을 냈으나, +conditional information 에 큰 영향을 받음

          +
            +
          • Figure 3 의 첫 번째 줄을 보면 irregular occlusions 가 나타나는데, +CDE 와 LDM 은 이에 큰 영향을 받음

          • +
          +
        • +
        • 반면 BBDM 은 두 도메인 간의 직접적인 diffusion process 를 학습하므로 +이러한 문제로부터 자유로움

        • +
        • 또한 Brownian Bridge 의 stochastic 한 특성으로 인해 +fidelity 와 diversity 가 높은 이미지들을 생성해냄

        • +
        +
      • +
      • 4.3. Quantitative Comparison

        +
          +
        • Table 1 과 2 를 보면, BBDM 이 모든 실험에서 가장 좋은 FID 값을 기록했으며, 훌륭한 LPIPS 값을 기록함

        • +
        +
        +img_39 +
        +

        Fig. 355 Table 1. CelebAMask-HQ 데이터셋에 대한 FID, LPIPS 성능은 BBDM 이 가장 뛰어남#

        +
        +
        +
        +img_40 +
        +

        Fig. 356 Table 2. BBDM 은 FID, LPIPS 점수가 매우 뛰어났음#

        +
        +
        +
      • +
      • 4.4. 다른 Translation Tasks

        +
          +
        • BBDM 의 generalization 성능을 검증하기 위해서, 다른 tasks 에 대해서도 실험했음

        • +
        • 아래 그림과 같이, 다른 tasks 에서도 camparable 한 성능을 기록함

        • +
        +
        +img_41 +
        +

        Fig. 357 Figure 6. Face-to-label, 색상화, inpainting 등의 다른 tasks 에서도 뛰어난 성능을 기록함#

        +
        +
        +
      • +
      • 4.5. Ablation Study

        +
          +
        • pre-trained latent space 의 영향

          +
          +img_42 +
          +

          Fig. 358 Table 3. BBDM 은 LDM 에 비해 Downsampling factor 에 대해 robust 했음#

          +
          +
          +
            +
          • BBDM 과 LDM 에 대해서, +VQGAN downsampling factor각각 4, 8, 16 으로 두고 성능 비교 실험 수행

          • +
          • BBDM 은 down sampling factor 에 robust 했음

          • +
          +
        • +
        • Sampling steps 의 영향

          +
            +
          • Sampling steps 가 작을 때 (200 이하) 는, 조금만 늘려도 성능이 크게 증가

          • +
          +
          +img_43 +
          +

          Fig. 359 Table 4. 200 이상의 Sampling Steps 에서는 Steps 를 키워도 성능 변화가 미미함#

          +
          +
          +
          +
        • +
        • Brownian Bridge 의 maximum variance 의 영향

          +
          +img_44 +
          +

          Fig. 360 Table 5. Sampling diversity 조절 계수에 의해 실제로 Diversity 가 조절 되었음#

          +
          +
          +
            +
          • 식 (5) 에 나타난 것처럼, scaling factor s 의 값을 변경함으로써, +Brownian Bridge 의 최대 분산값 (t = T/2 일 때의 분산값) 조절 가능. +이렇게 diversity 조절 가능.

          • +
          +
          +img_17 +
          +

          Fig. 361 식(5)#

          +
          +
          +
        • +
        +
      • +
      +
    6. +
    7. Conclusion and Future Work

      +
        +
      • Brownian Bridge 에 기반한 새로운 I2I 변환 방법 제시

      • +
      • 이 방법은 기존의 conditional 한 방법과 달리, +Brownian Bridge diffusion process 를 통해 두 도메인 간의 mapping 을 직접 학습

      • +
      • 여러 tasks 에서의 실험을 통해 BBDM 의 성능 검증

      • +
      • text-to-image 와 같은 multi-modal tasks 에도 BBDM 을 적용해볼 예정

      • +
      +
    8. +
    +
  2. +
+ +
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/CM3leon.html b/docs/review/CM3leon.html old mode 100644 new mode 100755 index 2c151aa1..7202bcc3 --- a/docs/review/CM3leon.html +++ b/docs/review/CM3leon.html @@ -1,1034 +1,1053 @@ - - - - - - - - - - - - CM3leon — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

CM3leon#

-
-cm3leon_result -
-

Fig. 279 CM3leon result#

-
-
-
    -
  • 복잡하게 구성된 객체(손, 텍스트)도 잘 생성한다.

  • -
-
-

Abstract & 1. Introduction#

-
    -
  • CM3Leon

    -
      -
    • 텍스트와 이미지 둘 다 잘 생성하는 능력을 가진 검색-증강, 토큰 기반, 디코더 전용 멀티 모달 모델이다.

    • -
    • CM3 멀티 모델 아키텍처를 사용하며 scaling up 및 다양한 구조적-스타일 데이터에 tunning 할 수 있는 능력을 가졌다.

    • -
    -
  • -
  • Training

    -
      -
    • 처음에는 멀티 모달 모델을 “텍스트 기반” language 모델에 맞도록 학습했다. (large scale의 검색 증강 pretraining 단계를 포함한다.)

      -
        -
      • 데이터는 라이센스가 있는 Shutterstock의 large-scale로 학습한다.

      • -
      -
    • -
    • 그 후 supervised fine tuning (SFT) 단계로 진행했다.

      -
        -
      • 입력과 출력 모두 이미지와 텍스트 토큰을 섞을 수 있다.

      • -
      -
    • -
    -
  • -
  • 기존 이미지 생성 모델은 텍스트 프롬프트에 맞는 이미지만 잘 생성하는데,

    -
      -
    • CM3leon은 텍스트와 이미지 모두 잘 생성한다.

      -
        -
      • 이미지 생성

        -
          -
        • 고해상도 output을 생성할 수 있는 self-contained contrastive decoding 방법을 소개한다.

        • -
        • text guided iamge editing 부터 image controlled generation, segmentation까지 가능하다.

        • -
        -
      • -
      • 텍스트 생성

        -
          -
        • Shutterstock의 3억 개의 텍스트 토큰으로 학습했는데, image-to-text generation도 잘 수행한다.

        • -
        -
      • -
      -
    • -
    -
  • -
  • 학습 연산을 5배로 줄였다.

  • -
  • zero shot COCO로 FID를 측정한 결과 4.88 점으로, Google의 Parti 모델의 성능과 비슷한 수준을 달성했다.

  • -
-
-
-
-

2. Pretraining#

-
    -
  • RA-CM3를 기반으로 T2I 도메인에서 토큰 기반 디코더 모델의 잠재력을 연구했다.

  • -
-
-

2.1 Data#

-
-

Image Tokenization#

-
    -
  • Gafni의 image tokenizer를 사용했다.

    -
      -
    • 이 tokenizer는 256x256 이미지를 8192개의 vocabulary에서 1024개의 토큰으로 인코딩을 진행한다.

    • -
    -
  • -
  • 텍스트에서는, Zhang의 커스텀 tokenizer(56320 vocabulary size)를 학습했다.

  • -
  • 추가로, 새로운 스페셜한 토큰인 **<break>**을 소개한다.

  • -
-
-figure_8_9 -
-

Fig. 280 Figure_8_9#

-
-
-
-   이는 modality간 transition을 하게 한다.
-
-
-
-
-

Retrieval Augmentation#

-
    -
  • 목적: 입력 sequence에 맞춰 관련성이 높고 다양한 멀티 모달 문서(from memory bank)를 검색하는 것이다.

    -
      -
    • dense retriever 와 retrieval strategy을 포함하고 있다.

    • -
    -
  • -
  • dense retriever

    -
      -
    • 쿼리 \(q\) (예: input sequence)와 memory bank \(\mathcal M\) 로부터 후보 문서 \(m\) 를 가지고 관련성 점수\(r(q, m)\) 를 return 해준다.

    • -
    • dense retriver 방법은 CLIP 기반인 bi-encoder 구조를 따랐다. (Karpukhin)

      -
        -
      • 멀티 모달 문서를 text / image 파트로 분리하고, 각각 CLIP 인코더(ViT-B-32)를 통해 인코딩을 한다.

      • -
      • 그 후 문서의 vector representation로써 두 개를 평균을 낸다.

      • -
      -
    • -
    • 최종 검색은 관련성 점수에 따라 정렬된 후보 문서 목록을 얻기 위해 Maximum Inner Product Search로 수행한다.

    • -
    -
  • -
  • 학습 때 generator를 위한 유용한 검색 문서를 추출하기 위해 세 가지 요소를 고려했다.

    -
      -
    • relevance

      -
        -
      • 검색된 문서는 입력 sequence에 관련있어야 한다.

      • -
      • CLIP 기반 dense retriever 점수를 사용한다.

      • -
      -
    • -
    • modality

      -
        -
      • 이미지와 텍스트로 구성된 멀티 모달 문서로 검색 > 이미지 또는 텍스트로 검색하는 것이다.

      • -
      -
    • -
    • diversity

      -
        -
      • 다양성은 검색된 문서에서 중복성을 피하기 위한 필수적인 절차다.

      • -
      • 단순하게 관련성 점수에 기반해 top K 문서만 가져온다면 중복이 발생할 수 있다.

        -
          -
        • 또한 downstream pretraining 에 안좋은 영향을 끼칠 수 있다.

        • -
        -
      • -
      • 실제로, 관련성 점수가 0.9 이하로 검색된 문서로 사용했고,

        -
          -
        • query dropout(검색에 사용된 쿼리의 일부 20% 토큰을 삭제)를 적용했다.

        • -
        • 따라서 다양성과 학습에 정규화를 시켰다.

        • -
        -
      • -
      -
    • -
    -
  • -
  • 이미지와 텍스트를 기반으로 각각 두 개의 문서를 검색한다.

  • -
  • 학습에서는 데이터셋의 모든 캡션-이미지 쌍에 대해 검색된 샘플 3개를 무작위로 선택한다.

    -
      -
    • 이는 사실상 사전 학습에서 사용할 수 있는 토큰 수의 4배이다.

    • -
    -
  • -
-
-
-
-

2.2 Objective Function#

-
    -
  • CM3 objective

    -
      -
    • input

      -
        -
      • "Image of a chameleon: [image]" 을 변형시켜 "Image of <mask>: [image] <infill> a chameleon” 로 표현한다. -: <mask>, <infill> 이 추가되었고, 단어의 재배치가 진행됐다.

      • -
      -
    • -
    • 학습에는 일반적인 다음 토큰을 예측하는 loss를 사용했다.

      -
        -
      • 그 결과 이미지, 텍스트 둘 다 생성하는 다용도 모델의 결과를 가져왔다.

      • -
      -
    • -
    • caption-to-image generation에서는 CM3가 “Image of a chameleon:” 프롬프트로 부터 이미지를 생성하고,

      -
        -
      • image-to-caption generation에서는 CM3는 “Image of <mask>: [image] <infill>” 프롬프트를 활용한다.

      • -
      -
    • -
    -
  • -
-
-
-

2.3 Model#

-
    -
  • CM3Leon 모델은 디코더만 사용하는 transformer 아키텍쳐를 사용한다.

  • -
  • Zhang에 비해 bias term, dropout, layer norm의 학습 가능한 파라미터를 제거했다.

  • -
  • sequence length를 2048 → 4096까지 확장했다.

  • -
  • weight 초기화: 평균 0, 표준 편차 0.006 인 truncated(표준 편차 3으로 잘린) normal distribution 사용했다.

  • -
  • output layer: 0으로 초기화, 0에 가까운 표준 편차 0.0002로 positional embedding 초기화한다.

  • -
  • Metaseq로 학습됐다.

  • -
-
-
-

2.4 Training#

-
-training_result -
-

Fig. 281 Training result#

-
-
-
    -
  • 세 가지 모델 사이즈(350M, 760M, 7B)로 학습 진행했다. (→ 1.4T(Trillion), 1.9T, 2.4T tokens)

    -
      -
    • 주요한 하이퍼 파라미터는 learning rate, batch size로 멀티모달 scaling 에 맞게 설정했다.

    • -
    -
  • -
  • 참고

    -
      -
    • Perplexity, PPL: 언어 모델의 평가 방법 중 하나이다. (헷갈리는 정도, 값이 낮을 수록 좋다.)

    • -
    -
  • -
-
-
-

3. Text-To-Image Results#

-
-

3.1 Importance of Decoding Strategies#

-
    -
  • autoregressive T2I 모델에서 decoding 알고리즘에 대해 상당한 연구가 진행되어 왔다.

    -
      -
    • 그 중 DALL-E는 최종 아웃풋의 퀄리티가 향상되는 결과를 가져왔다.

      -
        -
      • DALL-E 는 temperature 샘플링과 512개 후보 프롬프트에 CLIP re-ranking 전략을 채택했다.

      • -
      -
    • -
    • PARTI 와 Make-A-Scene 과 같은 모델은 토큰 기반의 classifier-free guidance로, re-ranking에 대해 오직 16 개의 샘플만 필요하게 됨으로써 후보의 수를 줄였다.

    • -
    -
  • -
-
-
-

Temperatured Sampling#

-
    -
  • autoregressive 모델에서 확률적 기술로 사용된다.

    -
      -
    • 이 방법은 샘플링에서 softmax의 temperature를 수정해 예측 무작위성을 제어한다.

    • -
      • -
      • Classifier Free Guidance 적용했다.

      • -
      -
    • -
    -
  • -
-
-
-

TopP Sampling#

-
    -
  • nucleus 샘플링으로도 불리고, 미리 정의한 임계값을 초과하는 누적 확률을 가진 가장 작은 상위 토큰 세트에서 샘플링을 포함한다.

    -
      -
      • -
      • Classifier Free Guidance 적용했다.

      • -
      -
    • -
    -
  • -
-
-
-

Classifier Free Guidance (CFG)#

-
-\[\begin{split} -\begin{aligned} -& \operatorname{logits}_{\text {cond }}=T\left(t_y \mid t_x\right), \text { logits }_{\text {uncond }}=T\left(t_y \mid<\bf { mask }>\right) \\ -& \operatorname{logits}_{\mathrm{cf}}=\operatorname{logits}_{\text {uncond }}+\alpha_c \cdot\left(\text { logits }_{\text {cond }}-\text { logits }_{\text {uncond }}\right) -\end{aligned} -\end{split}\]
-
    -
  • CFG는 unconditional 샘플을 conditional 샘플에 맞도록 하는 것을 의미한다.

  • -
  • unconditional 샘플을 text를 CM3 목표의 마스크 토큰으로 대체한다.

  • -
  • 이는 CM3 목표를 사용한 학습의 핵심 이점 중 하나이며, finetuning 없이, classifier 없는 guidance를 수행할 수 있다.

  • -
  • 추론에서는 두 개의 토큰 stream을 생성한다.

    -
      -
    • 입력 텍스트에 따라 달라지는 토큰 stream과

    • -
    • mask 토큰에 따라 condition된 unconditional 토큰 stream

    • -
    -
  • -
-
-
-

Contrastive Decoding TopK (CD-K)#

-
    -
  • CFG에서 logit의 뺄셈 연산이 텍스트에서 contrastive decoding 방법의 log probability를 뺄셈하는 연산과 비슷하다.

  • -
-
-
-
-

3.2 Quantitative Evaluation#

-
-evalution -
-

Fig. 282 Evaluation#

-
-
-
    -
  • MS-COCO (30K) zero shot 예측, FID 측정했다.

    -
      -
    • CM3Leon-7B 모델이 FID 4.88 점으로 가장 좋다.

    • -
    -
  • -
  • retrieval-augmented decoder-only 모델의 효율성이 좋다.

    -
      -
    • CM3Leon-7B 모델이 추론에서 1개/2개로 검색된 예제로 동작할 때 우수한 FID 점수를 기록했다.

      -
        -
      • 이는 고품질 이미지를 생성하는 능력을 확장시키는 검색의 중요성을 보여준다.

      • -
      -
    • -
    -
  • -
-
-
-

4. Supervised Fine-Tuning#

-
-figure_5 -
-

Fig. 283 Figure5#

-
-
-
    -
  • Supervised fine-tuning (SFT)는 LLM에서 중요한 학습 단계이다.

    -
      -
    • 명령어 또는 프롬프트를 잘 이해하는 것을 도와주며, zero shot task에서도 향상되는 결과를 얻었다.

    • -
    -
  • -
  • 명령어 튜닝이 다양한 task에 멀티모달 모델 성능을 눈에 띄게 증폭시키는 것을 발견했다.

  • -
  • CM3Leon을 이미지와 텍스트 task를 섞어 넓은 범위에서 fine tuning 했다.

  • -
  • finetuning 과정은 pretraining 단계를 따르며, task instruction과 출력을 결합해 동일한 CM3 objective를 사용한다.

  • -
-
-

4.1 Instructable Image Generation#

-
-figure_6 -
-

Fig. 284 Figure6#

-
-
-
-
-

Text-Guided Image Editing#

-
    -
  • text instruction 에 기반한 initial image를 수정하는 task이다.

  • -
  • InstructPix2Pix 방법 사용했다.

  • -
  • 예시: “하늘의 색을 파란색으로 변경해줘”와 같은 프롬프트로 이미지 편집이 가능하다.

    -
      -
    • 이것은 CM3leon이 텍스트와 이미지를 동시에 이해하고 있어서 가능하다.

    • -
    -
  • -
-
-
-

Image-to-Image Grounded Generation#

-
    -
  • 다양한 feature과 텍스트 프롬프트로 grounding image를 생산하는 task이다.

  • -
  • ControlNet 적용했다.

  • -
-
-
-

Spatially Grounded Image Generation#

-
-figure_6_1 -
-

Fig. 285 Figure6-1#

-
-
-
    -
  • 이미지 생성에 있어서 공간적 정보(위치)를 텍스트 프롬프트에 통합시킬 수 있도록 하는 task이다.

  • -
-
-
-

Image captioning & visual question answering task#

-
-figure_16 -
-

Fig. 286 Figure16#

-
-
-
    -
  • Flamingo(1000억 토큰), OpenFlamingo(400억 토큰)에 비해 CM3leon(30억 토큰)은 적은 토큰임에도 불구하고, 동등한 성능을 달성했다.

  • -
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + CM3leon — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

CM3leon#

+
+cm3leon_result +
+

Fig. 279 CM3leon result#

+
+
+
    +
  • 복잡하게 구성된 객체(손, 텍스트)도 잘 생성한다.

  • +
+
+

Abstract & 1. Introduction#

+
    +
  • CM3Leon

    +
      +
    • 텍스트와 이미지 둘 다 잘 생성하는 능력을 가진 검색-증강, 토큰 기반, 디코더 전용 멀티 모달 모델이다.

    • +
    • CM3 멀티 모델 아키텍처를 사용하며 scaling up 및 다양한 구조적-스타일 데이터에 tunning 할 수 있는 능력을 가졌다.

    • +
    +
  • +
  • Training

    +
      +
    • 처음에는 멀티 모달 모델을 “텍스트 기반” language 모델에 맞도록 학습했다. (large scale의 검색 증강 pretraining 단계를 포함한다.)

      +
        +
      • 데이터는 라이센스가 있는 Shutterstock의 large-scale로 학습한다.

      • +
      +
    • +
    • 그 후 supervised fine tuning (SFT) 단계로 진행했다.

      +
        +
      • 입력과 출력 모두 이미지와 텍스트 토큰을 섞을 수 있다.

      • +
      +
    • +
    +
  • +
  • 기존 이미지 생성 모델은 텍스트 프롬프트에 맞는 이미지만 잘 생성하는데,

    +
      +
    • CM3leon은 텍스트와 이미지 모두 잘 생성한다.

      +
        +
      • 이미지 생성

        +
          +
        • 고해상도 output을 생성할 수 있는 self-contained contrastive decoding 방법을 소개한다.

        • +
        • text guided iamge editing 부터 image controlled generation, segmentation까지 가능하다.

        • +
        +
      • +
      • 텍스트 생성

        +
          +
        • Shutterstock의 3억 개의 텍스트 토큰으로 학습했는데, image-to-text generation도 잘 수행한다.

        • +
        +
      • +
      +
    • +
    +
  • +
  • 학습 연산을 5배로 줄였다.

  • +
  • zero shot COCO로 FID를 측정한 결과 4.88 점으로, Google의 Parti 모델의 성능과 비슷한 수준을 달성했다.

  • +
+
+
+
+

2. Pretraining#

+
    +
  • RA-CM3를 기반으로 T2I 도메인에서 토큰 기반 디코더 모델의 잠재력을 연구했다.

  • +
+
+

2.1 Data#

+
+

Image Tokenization#

+
    +
  • Gafni의 image tokenizer를 사용했다.

    +
      +
    • 이 tokenizer는 256x256 이미지를 8192개의 vocabulary에서 1024개의 토큰으로 인코딩을 진행한다.

    • +
    +
  • +
  • 텍스트에서는, Zhang의 커스텀 tokenizer(56320 vocabulary size)를 학습했다.

  • +
  • 추가로, 새로운 스페셜한 토큰인 **<break>**을 소개한다.

  • +
+
+figure_8_9 +
+

Fig. 280 Figure_8_9#

+
+
+
-   이는 modality간 transition을 하게 한다.
+
+
+
+
+

Retrieval Augmentation#

+
    +
  • 목적: 입력 sequence에 맞춰 관련성이 높고 다양한 멀티 모달 문서(from memory bank)를 검색하는 것이다.

    +
      +
    • dense retriever 와 retrieval strategy을 포함하고 있다.

    • +
    +
  • +
  • dense retriever

    +
      +
    • 쿼리 \(q\) (예: input sequence)와 memory bank \(\mathcal M\) 로부터 후보 문서 \(m\) 를 가지고 관련성 점수\(r(q, m)\) 를 return 해준다.

    • +
    • dense retriver 방법은 CLIP 기반인 bi-encoder 구조를 따랐다. (Karpukhin)

      +
        +
      • 멀티 모달 문서를 text / image 파트로 분리하고, 각각 CLIP 인코더(ViT-B-32)를 통해 인코딩을 한다.

      • +
      • 그 후 문서의 vector representation로써 두 개를 평균을 낸다.

      • +
      +
    • +
    • 최종 검색은 관련성 점수에 따라 정렬된 후보 문서 목록을 얻기 위해 Maximum Inner Product Search로 수행한다.

    • +
    +
  • +
  • 학습 때 generator를 위한 유용한 검색 문서를 추출하기 위해 세 가지 요소를 고려했다.

    +
      +
    • relevance

      +
        +
      • 검색된 문서는 입력 sequence에 관련있어야 한다.

      • +
      • CLIP 기반 dense retriever 점수를 사용한다.

      • +
      +
    • +
    • modality

      +
        +
      • 이미지와 텍스트로 구성된 멀티 모달 문서로 검색 > 이미지 또는 텍스트로 검색하는 것이다.

      • +
      +
    • +
    • diversity

      +
        +
      • 다양성은 검색된 문서에서 중복성을 피하기 위한 필수적인 절차다.

      • +
      • 단순하게 관련성 점수에 기반해 top K 문서만 가져온다면 중복이 발생할 수 있다.

        +
          +
        • 또한 downstream pretraining 에 안좋은 영향을 끼칠 수 있다.

        • +
        +
      • +
      • 실제로, 관련성 점수가 0.9 이하로 검색된 문서로 사용했고,

        +
          +
        • query dropout(검색에 사용된 쿼리의 일부 20% 토큰을 삭제)를 적용했다.

        • +
        • 따라서 다양성과 학습에 정규화를 시켰다.

        • +
        +
      • +
      +
    • +
    +
  • +
  • 이미지와 텍스트를 기반으로 각각 두 개의 문서를 검색한다.

  • +
  • 학습에서는 데이터셋의 모든 캡션-이미지 쌍에 대해 검색된 샘플 3개를 무작위로 선택한다.

    +
      +
    • 이는 사실상 사전 학습에서 사용할 수 있는 토큰 수의 4배이다.

    • +
    +
  • +
+
+
+
+

2.2 Objective Function#

+
    +
  • CM3 objective

    +
      +
    • input

      +
        +
      • "Image of a chameleon: [image]" 을 변형시켜 "Image of <mask>: [image] <infill> a chameleon” 로 표현한다. +: <mask>, <infill> 이 추가되었고, 단어의 재배치가 진행됐다.

      • +
      +
    • +
    • 학습에는 일반적인 다음 토큰을 예측하는 loss를 사용했다.

      +
        +
      • 그 결과 이미지, 텍스트 둘 다 생성하는 다용도 모델의 결과를 가져왔다.

      • +
      +
    • +
    • caption-to-image generation에서는 CM3가 “Image of a chameleon:” 프롬프트로 부터 이미지를 생성하고,

      +
        +
      • image-to-caption generation에서는 CM3는 “Image of <mask>: [image] <infill>” 프롬프트를 활용한다.

      • +
      +
    • +
    +
  • +
+
+
+

2.3 Model#

+
    +
  • CM3Leon 모델은 디코더만 사용하는 transformer 아키텍쳐를 사용한다.

  • +
  • Zhang에 비해 bias term, dropout, layer norm의 학습 가능한 파라미터를 제거했다.

  • +
  • sequence length를 2048 → 4096까지 확장했다.

  • +
  • weight 초기화: 평균 0, 표준 편차 0.006 인 truncated(표준 편차 3으로 잘린) normal distribution 사용했다.

  • +
  • output layer: 0으로 초기화, 0에 가까운 표준 편차 0.0002로 positional embedding 초기화한다.

  • +
  • Metaseq로 학습됐다.

  • +
+
+
+

2.4 Training#

+
+training_result +
+

Fig. 281 Training result#

+
+
+
    +
  • 세 가지 모델 사이즈(350M, 760M, 7B)로 학습 진행했다. (→ 1.4T(Trillion), 1.9T, 2.4T tokens)

    +
      +
    • 주요한 하이퍼 파라미터는 learning rate, batch size로 멀티모달 scaling 에 맞게 설정했다.

    • +
    +
  • +
  • 참고

    +
      +
    • Perplexity, PPL: 언어 모델의 평가 방법 중 하나이다. (헷갈리는 정도, 값이 낮을 수록 좋다.)

    • +
    +
  • +
+
+
+

3. Text-To-Image Results#

+
+

3.1 Importance of Decoding Strategies#

+
    +
  • autoregressive T2I 모델에서 decoding 알고리즘에 대해 상당한 연구가 진행되어 왔다.

    +
      +
    • 그 중 DALL-E는 최종 아웃풋의 퀄리티가 향상되는 결과를 가져왔다.

      +
        +
      • DALL-E 는 temperature 샘플링과 512개 후보 프롬프트에 CLIP re-ranking 전략을 채택했다.

      • +
      +
    • +
    • PARTI 와 Make-A-Scene 과 같은 모델은 토큰 기반의 classifier-free guidance로, re-ranking에 대해 오직 16 개의 샘플만 필요하게 됨으로써 후보의 수를 줄였다.

    • +
    +
  • +
+
+
+

Temperatured Sampling#

+
    +
  • autoregressive 모델에서 확률적 기술로 사용된다.

    +
      +
    • 이 방법은 샘플링에서 softmax의 temperature를 수정해 예측 무작위성을 제어한다.

    • +
      • +
      • Classifier Free Guidance 적용했다.

      • +
      +
    • +
    +
  • +
+
+
+

TopP Sampling#

+
    +
  • nucleus 샘플링으로도 불리고, 미리 정의한 임계값을 초과하는 누적 확률을 가진 가장 작은 상위 토큰 세트에서 샘플링을 포함한다.

    +
      +
      • +
      • Classifier Free Guidance 적용했다.

      • +
      +
    • +
    +
  • +
+
+
+

Classifier Free Guidance (CFG)#

+
+\[\begin{split} +\begin{aligned} +& \operatorname{logits}_{\text {cond }}=T\left(t_y \mid t_x\right), \text { logits }_{\text {uncond }}=T\left(t_y \mid<\bf { mask }>\right) \\ +& \operatorname{logits}_{\mathrm{cf}}=\operatorname{logits}_{\text {uncond }}+\alpha_c \cdot\left(\text { logits }_{\text {cond }}-\text { logits }_{\text {uncond }}\right) +\end{aligned} +\end{split}\]
+
    +
  • CFG는 unconditional 샘플을 conditional 샘플에 맞도록 하는 것을 의미한다.

  • +
  • unconditional 샘플을 text를 CM3 목표의 마스크 토큰으로 대체한다.

  • +
  • 이는 CM3 목표를 사용한 학습의 핵심 이점 중 하나이며, finetuning 없이, classifier 없는 guidance를 수행할 수 있다.

  • +
  • 추론에서는 두 개의 토큰 stream을 생성한다.

    +
      +
    • 입력 텍스트에 따라 달라지는 토큰 stream과

    • +
    • mask 토큰에 따라 condition된 unconditional 토큰 stream

    • +
    +
  • +
+
+
+

Contrastive Decoding TopK (CD-K)#

+
    +
  • CFG에서 logit의 뺄셈 연산이 텍스트에서 contrastive decoding 방법의 log probability를 뺄셈하는 연산과 비슷하다.

  • +
+
+
+
+

3.2 Quantitative Evaluation#

+
+evalution +
+

Fig. 282 Evaluation#

+
+
+
    +
  • MS-COCO (30K) zero shot 예측, FID 측정했다.

    +
      +
    • CM3Leon-7B 모델이 FID 4.88 점으로 가장 좋다.

    • +
    +
  • +
  • retrieval-augmented decoder-only 모델의 효율성이 좋다.

    +
      +
    • CM3Leon-7B 모델이 추론에서 1개/2개로 검색된 예제로 동작할 때 우수한 FID 점수를 기록했다.

      +
        +
      • 이는 고품질 이미지를 생성하는 능력을 확장시키는 검색의 중요성을 보여준다.

      • +
      +
    • +
    +
  • +
+
+
+

4. Supervised Fine-Tuning#

+
+figure_5 +
+

Fig. 283 Figure5#

+
+
+
    +
  • Supervised fine-tuning (SFT)는 LLM에서 중요한 학습 단계이다.

    +
      +
    • 명령어 또는 프롬프트를 잘 이해하는 것을 도와주며, zero shot task에서도 향상되는 결과를 얻었다.

    • +
    +
  • +
  • 명령어 튜닝이 다양한 task에 멀티모달 모델 성능을 눈에 띄게 증폭시키는 것을 발견했다.

  • +
  • CM3Leon을 이미지와 텍스트 task를 섞어 넓은 범위에서 fine tuning 했다.

  • +
  • finetuning 과정은 pretraining 단계를 따르며, task instruction과 출력을 결합해 동일한 CM3 objective를 사용한다.

  • +
+
+

4.1 Instructable Image Generation#

+
+figure_6 +
+

Fig. 284 Figure6#

+
+
+
+
+

Text-Guided Image Editing#

+
    +
  • text instruction 에 기반한 initial image를 수정하는 task이다.

  • +
  • InstructPix2Pix 방법 사용했다.

  • +
  • 예시: “하늘의 색을 파란색으로 변경해줘”와 같은 프롬프트로 이미지 편집이 가능하다.

    +
      +
    • 이것은 CM3leon이 텍스트와 이미지를 동시에 이해하고 있어서 가능하다.

    • +
    +
  • +
+
+
+

Image-to-Image Grounded Generation#

+
    +
  • 다양한 feature과 텍스트 프롬프트로 grounding image를 생산하는 task이다.

  • +
  • ControlNet 적용했다.

  • +
+
+
+

Spatially Grounded Image Generation#

+
+figure_6_1 +
+

Fig. 285 Figure6-1#

+
+
+
    +
  • 이미지 생성에 있어서 공간적 정보(위치)를 텍스트 프롬프트에 통합시킬 수 있도록 하는 task이다.

  • +
+
+
+

Image captioning & visual question answering task#

+
+figure_16 +
+

Fig. 286 Figure16#

+
+
+
    +
  • Flamingo(1000억 토큰), OpenFlamingo(400억 토큰)에 비해 CM3leon(30억 토큰)은 적은 토큰임에도 불구하고, 동등한 성능을 달성했다.

  • +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/ConceptLab.html b/docs/review/ConceptLab.html old mode 100644 new mode 100755 index 1537d200..1f06f97c --- a/docs/review/ConceptLab.html +++ b/docs/review/ConceptLab.html @@ -1,836 +1,855 @@ - - - - - - - - - - - - ConceptLab — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

ConceptLab#

-
-

Introduction#

-

본 논문에서는 Creative Generation의 일환으로, 새롭고 창의적인 개념을 생성하는 내용을 다룹니다. 최근 text-to-image 생성 기술과 Personalization 기술이 크게 발전함에 따라 이미지 생성 뿐만 아니라 개인화된 개념을 생설할 수 있게 되었습니다. 이러한 강력한 모델을 사용하여 모델에 명시적으로 설명되지 않은 새로운 창의적 개념을 생성할 수 있을까요?

-
-ConceptLab01 -
-

Fig. 393 ConceptLab#

-
-
-
- -
-

Prelimiaries#

-

Latent Diffusion Models
-Latent Diffusion Model에서는 오토인코더의 latent space 내에서 diffusion 과정이 진행됩니다. 먼저, 인고더 \(E\)는 주어진 이미지 \(x\)를 latent code \(z\)로 매핑하는 것을 목표로 합니다. 이때, z=E(x)가 됩니다. 동시에 디코더 D는 원본 입력 이미지를 재구성하도록 합니다. DDPM의 경우 아래 주어진 손실을 최소화하도록 학습합니다.

-
-\[ -L = E_{z,y,\epsilon,t} [||\epsilon - \epsilon_{\theta}(z_{t}, t, c)||_{2}^{2}] -\]
-

denoising network \(\epsilon \theta\) 는 잠재 코드 \(zt\)에 추가된 잡음 \(\epsilon\)을 제거합니다. 이 과정에서 현재 시간 단계 t와 조건 벡터 c도 고려됩니다.

-

Diffusion Prior
-일반적으로 Diffusion model은 CLIP 텍스트 인코딩에서 직접 파생된 조건 벡터 \(c\)를 활용하여 주어진 텍스트 프롬프트 \(y\)에 대해 훈련됩니다. \(Ramesh et al\)에서 text-to-image 생성 문제를 2가지 단계로 decompose 합니다. 먼저, Diffusion Prior 모델을 활용하여 주어진 텍스트 프롬프트로부터 이미지 임베딩을 예측합니다. 다음으로, 이 이미지 임베딩에 조건을 부여하여 이미지를 생성하는 diffusion decoder로 보내집니다. 훈련 또한 일반적으로 두 독립적인 단계로 이루어집니다.

-
-\[ -L_{prior} = E_{e,y,t} [||e - P_{\theta]}(e_{t},t,y)||_{2}^{2}] -\]
-

Diffusion 디코더는 이미지 임베딩을 조건 \(c\)와 위 Latent Diffusion Model에 정의된 손실을 활용하여 훈련됩니다. 그 다음 diffusion prior model \(P\theta\)는 임베딩 \(e_{t}\)로부터 denoise 된 이미지 임베딩 \(e\)를 직접 예측합니다. 이 두 단계 접근법은 이미지 다양성을 향상시키며 중간 CLIP 이미지 임베딩에 직접 접근하고 해당 공간에서 직접 제약을 할 수 있게 합니다.

-
-ConceptLab03 -
-

Fig. 395 ConceptLab#

-
-
-
-
-

Method#

-

ConceptLab은 생성하고자 하는 새로운 개념을 대표하는 단일 임베딩 \(v_{*}\)를 최적화합니다. 이후 주어진 카테고리에 유사하면서도 기존 멤버들과 다른 특성을 가지도록 손실 집합을 계산합니다. 훈련하는 동안, 현재 생성된 새로운 개념을 바탕으로 negative contraints를 더하기 위해 pretrained BLIP-2 VQA 모델을 활용합니다.

-
-

The Constraints#

-

본 연구에서는 긍정적 제약 \(C_{pos}\)와 부정적 제약 \(C_{neg}\) 두 가지를 활용합니다. 각 제약 조건은 텍스트 토큰을 활용하여 정의됩니다.

-
-
-

The Objective#

-

본 연구에서는 두가지 제약 조건을 바탕으로 하여 새로운 개념을 대표하는 임베딩 \(v_{*}\)와 각 제약 조건 간의 유사도를 측정합니다. -우선, \(v_{*}\)와 각 제약 단어 \(c\)를 동일한 무작위 샘플링된 프롬프트 y에 통합합니다. 각 문장은 CLIP 텍스트 임베딩으로 인코딩되며, 이것이 텍스트 제약 조건을 정의합니다. 텍스트 프롬프트를 diffusion prior 모델에 통과시키면, 프롬프트의 특정 인스턴스가 생성됩니다. 이러한 방식으로 \(E_{y}(v_{*}\)가 diffusion prior를 통과하면 모든 \(v_{*}\)가 텍스트 제약 조건과 일치하도록 일관된 생성을 얻을 수 있습니다. 반면, 긍정 및 부정 제약 조건은 가능한 광범위하게 유지하고자 diffusion prior를 통과하지 않습니다. 이에 따라 본 연구에서의 손실 함수는 다음과 같이 정의됩니다:

-
-\[ -S(C,v_{*}) = E_{c \sim C}[\langle E_{y}(c), P(E_{y}(v_{*}))\rangle] -\]
-
-\[ -L = S(C_{neg}, v_{*}) + \lambda(1-S(C_{pos}, v_{*})) -\]
-

즉, 학습된 임베딩 v에서 생성된 샘플링된 이미지 임베딩 \(P(E_{y}(v_{*}))\)\(C_{neg}\)에 의해 정의된 텍스트 제약 조건에서 멀어지고 \(C_{pos}\)의 제약조건에 가까워지도록 합니다.

-
-
-
-

Regularization#

-

정규화는 제약 조건 집합이 클 때 특정 멤버로의 collapsing을 방지하는 데 사용됩니다. 부정적 제약에 대한 최대 유사도를 측정하는 추가 손실 함수를 사용하는데 아래와 같이 정의됩니다:

-
-\[ -S_{max}(C,v_{*}) = max_{c \sim C}(\langle E_{y}, P(E_{y}(v_{*}))\rangle) -\]
-

이 유사도 측정 방식은 전체 손실 함수에 통합되며, \(S(C,v_{*})\)와 평균 냄으로써 \(v_{*}\)에 가장 가까운 제약 조건에 더 큰 패널티를 부여합니다.

-
-ConceptLab04 -
-

Fig. 396 훈련 과정 중 BLIP-2 모델을 사용하여 현재 개념에 가장 가까운 단어를 추론하고, 이를 제약 조건에 추가하는 과정을 거칩니다.#

-
-
-
-

Adaptive Negatives#

-

많은 부정적 제약 조건을 수동으로 적용하는 것은 힘들고, 광범위한 카테고리의 가장 관련성 높은 멤버들을 정확하게 대표하지 못할 수도 있습니다. 이를 해결하기 위해, 훈련 중 부정적 제약 조건 집합을 점진적으로 확장하는 adaptive scheme을 제안합니다. 생성된 이미지를 사전 훈련된 BLIP-2 VQA 모델에 질의하여 이미지에 현재 존재하는 카테고리의 멤버가 무엇인지 식별하도록 합니다. 이후 결과로 나온 인스턴스를 훈련의 나머지 부분에 대한 부정적 제약 조건에 추가합니다.

-
-ConceptLab05 -
-

Fig. 397 여러 단계에 걸쳐 생성된 이미지 결과를 보여줍니다. 훈련 과정에서 부정적 제약 조건이 지속적으로 조정되고 확장되었음을 보여줍니다.#

-
-
-
-
-

Evolutionary Generation#

-

주어진 개념 셋에 대해 개념을 혼합하기 위해 먼저 각 개념에서 이미지를 생성하여 이미지 제약 조건 \(C_{im}\) 을 만듭니다. 각 이미지는 CLIP 이미지 인코더 \(E_{im}(c)\)를 통과하여 임베딩 세트를 생성합니다. 학습 가능한 개념 \(v_{mix}\)를 주어진 임베딩에 더 가깝게 만드는 수정된 손실 함수를 적용합니다.:

-
-\[ -L_{mix} = 1 - E_{c \sim C}[\langle E_{im}(c), P(E_{y}(v_{mix}))\rangle] -\]
-

이 손실 함수는 생성된 개념이나 실제 이미지에 적용될 수 있으며, 창의적인 생성물의 계층ㅇ적 생성을 위해 반복적으로 적용될 수 있습니다. 또, 생성된 결과물에 대한 각 개념의 영향을 더 잘 제어하기 위해 가중치 항목이 추가적으로 적용될 수 있습니다.

-
-ConceptLab06 -
-

Fig. 398 그림에는 훈련에 사용된 긍정적 개념이 왼쪽에 표시되어 있습니다. 이는 모델이 어떤 개념을 기반으로 창의적 이미지를 생성했는지를 알 수 있습니다. 모든 결과는 Adaptive Negative 기법을 활용했습니다.#

-
-
-
-ConceptLab07 -
-

Fig. 399 ConceptLab이 제안한 다양한 이미지로 프롬프트와 Adaptive Negative 기법을 적용했습니다.#

-
-
-
-ConceptLab08 -
-

Fig. 400 ConceptLab은 생성된 개념들을 혼합하여 새롭고 독특한 창조물을 반복적으로 학습할 수 있습니다. 그림의 가장 윗줄에서는 Adaptive Negative 기법을 적용하여 학습된 개념들을 보여줍니다. 이어지는 줄에서는 Evolutionary Generation 과정을 통해 얻어진 개념들을 보여줍니다.#

-
-
-
-
-
-

Experiments#

-

ConceptLab의 효과를 입증하기 위해 정성적 및 정량적 평가를 진행했습니다.

-
-

Result#

-
-
-

Creative Generation#

-

위 그림들에서 볼 수 있듯이 모든 결과는 Adaptive Negative를 적용하였고 훈련 시드를 달리하며 다양한 개념을 생성할 수 있는 능력이 있음을 볼 수 있습니다. 또, ConceptLab은 학습된 창의적 개념을 새로운 장면에 배치할 수 있습니다. 이 생성물들은 배경 변경, 스타일 변경, 새로운 창조등 다양하게 활용 가능합니다.

-
-ConceptLab09 -
-

Fig. 401 ConceptLab을 활용한 Concept Mixing의 결과를 보여줍니다.#

-
-
-
-
-

Concept Mixing#

-

Concept Mixing은 다양한 실제 개념들의 독특한 특성을 합쳐 하이브리드 개념을 형성하는 방법을 보여줍니다. 이 방법은 오직 긍정적 제약 조건만을 활용합니다. 예를 들어, 첫 번째 줄에는 랍스터의 주요 특징(생상과 집게발)을 거북이의 특징(등껍질)과 융합하는 것을 볼 수 있습니다.

-
-ConceptLab10 -
-

Fig. 402 위 그림은 ConceptLab에 의해 학습된 개념들이 여러 세대에 걸쳐 어떻게 발전하는지 보여줍니다.#

-
-
-
-
-

Comparisons#

-
-
-

Evaluation Setup#

-

ConceptLab은 Stable Diffusion2와 Kandinsky 2.1 두 모델과 함께 평가했습니다. Kandinsky의 경우, 더 유리한 결과를 위해 부정적 프롬프트는 Latent Diffusion Model이 아닌 Diffusion Prior Model에 적용했습니다.

-
-
-

Qualitative Comparisons#

-

ConceptLab은 긍정적 토근과 부정적 제약 조건 모두에 일관되게 맞춰질 수 있습니다. 즉, ConceptLab은 다중 제약 조건을 효과적으로 처리하고, 특정 개념에 대한 일관된 표현을 학습할 수 있는 능력을 갖추고 있습니다.

-
-
-

Quantitative Comparisons#

-

정량적 평가를 위해 각 방법이 긍정적 개념을 포함하며, 주어진 부정적 개념과 닮지 않은 이미지를 생성하는 능력을 측정했습니다. 평가에는 애완동물, 식물, 과일, 가구, 악기의 5가지 카테고리를 활용했습니다. 각 도메인에 세 가지 다른 부정적 개념 쌍을 고려하고, 각 조합에 대해 ConceptLab을 5개의 랜덤 시드로 훈련하여 총 75개의 학습된 개념을 얻었습니다. 각 학습된 개념에 대해 “A photo of a \(S_{*}\) 프롬프트를 활용하여 32개의 이미지를 생성했습니다. Stable Diffusionr과 kandinsky 모델에서는 부정적 프롬프트를 사용하고, 같은 긍정적 및 부정적 개념 쌍에 대해 160개의 이미지를 생성합니다. 측정 기준으로는 먼저 각 개념의 긍정적 유사성을 타겟 카테고리와의 CLIP 공간 유사성 계산을 통해 특정됩니다. 다음으로는 긍정적 제약과 부정적 제약 사이의 거리를 측정합니다. 이는 생성된 이미지와 모든 부정적 개념 사이의 최대 유사성 계산을 통해 이루어집니다. 결과적으로 ConceptLab은 5가지 모든 도메인에서 긍정적 CLIP 유사성에서 일관되게 우월한 성능을 보였고 타겟 카테고리에 속하는 이미지를 신뢰성 있게 생성했습니다. 또한, 부정적 거리 측정에서 ConceptLab은 모든 카테고리에서 Stable Diffusion을, 4가지 카테고리에서 Kandinsky를 능가했습니다.

-
-ConceptLab11 -
-

Fig. 403 User Study#

-
-
-
-
-
-

Limitations#

-

Personalization과 유사하게, 학습된 개념을 포함하는 프롬프트를 사용하여 새로운 이미지를 생성하는 것이 항상 개념의 특성을 다양한 프롬프트에 걸쳐 유지하지는 못합니다. 또, 최적화 과정 자체가 항상 원하는 결과를 가져오지는 않습니다. “비행기”나 “물고기”와 같은 일부 클래스의 경우 ConceptLab은 창의적 개념을 생성하는데 여전히 어려움이 있습니다. 이는 BLIP-2에 의해 생성되는 부정적 제약과 관련이 있습니다.

-
-ConceptLab12 -
-

Fig. 404 Limitations#

-
-
-
-
-

Conclusion#

-

본 논문에서는 text-to-image diffusion model을 활용하여 창의적 생성을 위한 새로운 접근 방법을 소개했습니다. 주어진 광범위한 카테고리에 속하는 새로운 개념을 학습하기 위해 Diffusion Prior 모델 사용을 제안했습니다. 또, Prior Constraints라는 긍정적 및 부정적 제약 조건들을 diffusion prior 출력에 적용했습니다. 최적화 과정에서는 VQA 모델을 활용하여 독특하면서도 기존 멤버들과의 명확한 구별을 보장했습니다. 이후 실험을 통해 본 방법의 효과성을 입증했으며 시각적으로 다양하고 매력적인 개념을 생성할 수 있었습니다.

-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + ConceptLab — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

ConceptLab#

+
+

Introduction#

+

본 논문에서는 Creative Generation의 일환으로, 새롭고 창의적인 개념을 생성하는 내용을 다룹니다. 최근 text-to-image 생성 기술과 Personalization 기술이 크게 발전함에 따라 이미지 생성 뿐만 아니라 개인화된 개념을 생설할 수 있게 되었습니다. 이러한 강력한 모델을 사용하여 모델에 명시적으로 설명되지 않은 새로운 창의적 개념을 생성할 수 있을까요?

+
+ConceptLab01 +
+

Fig. 393 ConceptLab#

+
+
+
+ +
+

Prelimiaries#

+

Latent Diffusion Models
+Latent Diffusion Model에서는 오토인코더의 latent space 내에서 diffusion 과정이 진행됩니다. 먼저, 인고더 \(E\)는 주어진 이미지 \(x\)를 latent code \(z\)로 매핑하는 것을 목표로 합니다. 이때, z=E(x)가 됩니다. 동시에 디코더 D는 원본 입력 이미지를 재구성하도록 합니다. DDPM의 경우 아래 주어진 손실을 최소화하도록 학습합니다.

+
+\[ +L = E_{z,y,\epsilon,t} [||\epsilon - \epsilon_{\theta}(z_{t}, t, c)||_{2}^{2}] +\]
+

denoising network \(\epsilon \theta\) 는 잠재 코드 \(zt\)에 추가된 잡음 \(\epsilon\)을 제거합니다. 이 과정에서 현재 시간 단계 t와 조건 벡터 c도 고려됩니다.

+

Diffusion Prior
+일반적으로 Diffusion model은 CLIP 텍스트 인코딩에서 직접 파생된 조건 벡터 \(c\)를 활용하여 주어진 텍스트 프롬프트 \(y\)에 대해 훈련됩니다. \(Ramesh et al\)에서 text-to-image 생성 문제를 2가지 단계로 decompose 합니다. 먼저, Diffusion Prior 모델을 활용하여 주어진 텍스트 프롬프트로부터 이미지 임베딩을 예측합니다. 다음으로, 이 이미지 임베딩에 조건을 부여하여 이미지를 생성하는 diffusion decoder로 보내집니다. 훈련 또한 일반적으로 두 독립적인 단계로 이루어집니다.

+
+\[ +L_{prior} = E_{e,y,t} [||e - P_{\theta]}(e_{t},t,y)||_{2}^{2}] +\]
+

Diffusion 디코더는 이미지 임베딩을 조건 \(c\)와 위 Latent Diffusion Model에 정의된 손실을 활용하여 훈련됩니다. 그 다음 diffusion prior model \(P\theta\)는 임베딩 \(e_{t}\)로부터 denoise 된 이미지 임베딩 \(e\)를 직접 예측합니다. 이 두 단계 접근법은 이미지 다양성을 향상시키며 중간 CLIP 이미지 임베딩에 직접 접근하고 해당 공간에서 직접 제약을 할 수 있게 합니다.

+
+ConceptLab03 +
+

Fig. 395 ConceptLab#

+
+
+
+
+

Method#

+

ConceptLab은 생성하고자 하는 새로운 개념을 대표하는 단일 임베딩 \(v_{*}\)를 최적화합니다. 이후 주어진 카테고리에 유사하면서도 기존 멤버들과 다른 특성을 가지도록 손실 집합을 계산합니다. 훈련하는 동안, 현재 생성된 새로운 개념을 바탕으로 negative contraints를 더하기 위해 pretrained BLIP-2 VQA 모델을 활용합니다.

+
+

The Constraints#

+

본 연구에서는 긍정적 제약 \(C_{pos}\)와 부정적 제약 \(C_{neg}\) 두 가지를 활용합니다. 각 제약 조건은 텍스트 토큰을 활용하여 정의됩니다.

+
+
+

The Objective#

+

본 연구에서는 두가지 제약 조건을 바탕으로 하여 새로운 개념을 대표하는 임베딩 \(v_{*}\)와 각 제약 조건 간의 유사도를 측정합니다. +우선, \(v_{*}\)와 각 제약 단어 \(c\)를 동일한 무작위 샘플링된 프롬프트 y에 통합합니다. 각 문장은 CLIP 텍스트 임베딩으로 인코딩되며, 이것이 텍스트 제약 조건을 정의합니다. 텍스트 프롬프트를 diffusion prior 모델에 통과시키면, 프롬프트의 특정 인스턴스가 생성됩니다. 이러한 방식으로 \(E_{y}(v_{*}\)가 diffusion prior를 통과하면 모든 \(v_{*}\)가 텍스트 제약 조건과 일치하도록 일관된 생성을 얻을 수 있습니다. 반면, 긍정 및 부정 제약 조건은 가능한 광범위하게 유지하고자 diffusion prior를 통과하지 않습니다. 이에 따라 본 연구에서의 손실 함수는 다음과 같이 정의됩니다:

+
+\[ +S(C,v_{*}) = E_{c \sim C}[\langle E_{y}(c), P(E_{y}(v_{*}))\rangle] +\]
+
+\[ +L = S(C_{neg}, v_{*}) + \lambda(1-S(C_{pos}, v_{*})) +\]
+

즉, 학습된 임베딩 v에서 생성된 샘플링된 이미지 임베딩 \(P(E_{y}(v_{*}))\)\(C_{neg}\)에 의해 정의된 텍스트 제약 조건에서 멀어지고 \(C_{pos}\)의 제약조건에 가까워지도록 합니다.

+
+
+
+

Regularization#

+

정규화는 제약 조건 집합이 클 때 특정 멤버로의 collapsing을 방지하는 데 사용됩니다. 부정적 제약에 대한 최대 유사도를 측정하는 추가 손실 함수를 사용하는데 아래와 같이 정의됩니다:

+
+\[ +S_{max}(C,v_{*}) = max_{c \sim C}(\langle E_{y}, P(E_{y}(v_{*}))\rangle) +\]
+

이 유사도 측정 방식은 전체 손실 함수에 통합되며, \(S(C,v_{*})\)와 평균 냄으로써 \(v_{*}\)에 가장 가까운 제약 조건에 더 큰 패널티를 부여합니다.

+
+ConceptLab04 +
+

Fig. 396 훈련 과정 중 BLIP-2 모델을 사용하여 현재 개념에 가장 가까운 단어를 추론하고, 이를 제약 조건에 추가하는 과정을 거칩니다.#

+
+
+
+

Adaptive Negatives#

+

많은 부정적 제약 조건을 수동으로 적용하는 것은 힘들고, 광범위한 카테고리의 가장 관련성 높은 멤버들을 정확하게 대표하지 못할 수도 있습니다. 이를 해결하기 위해, 훈련 중 부정적 제약 조건 집합을 점진적으로 확장하는 adaptive scheme을 제안합니다. 생성된 이미지를 사전 훈련된 BLIP-2 VQA 모델에 질의하여 이미지에 현재 존재하는 카테고리의 멤버가 무엇인지 식별하도록 합니다. 이후 결과로 나온 인스턴스를 훈련의 나머지 부분에 대한 부정적 제약 조건에 추가합니다.

+
+ConceptLab05 +
+

Fig. 397 여러 단계에 걸쳐 생성된 이미지 결과를 보여줍니다. 훈련 과정에서 부정적 제약 조건이 지속적으로 조정되고 확장되었음을 보여줍니다.#

+
+
+
+
+

Evolutionary Generation#

+

주어진 개념 셋에 대해 개념을 혼합하기 위해 먼저 각 개념에서 이미지를 생성하여 이미지 제약 조건 \(C_{im}\) 을 만듭니다. 각 이미지는 CLIP 이미지 인코더 \(E_{im}(c)\)를 통과하여 임베딩 세트를 생성합니다. 학습 가능한 개념 \(v_{mix}\)를 주어진 임베딩에 더 가깝게 만드는 수정된 손실 함수를 적용합니다.:

+
+\[ +L_{mix} = 1 - E_{c \sim C}[\langle E_{im}(c), P(E_{y}(v_{mix}))\rangle] +\]
+

이 손실 함수는 생성된 개념이나 실제 이미지에 적용될 수 있으며, 창의적인 생성물의 계층ㅇ적 생성을 위해 반복적으로 적용될 수 있습니다. 또, 생성된 결과물에 대한 각 개념의 영향을 더 잘 제어하기 위해 가중치 항목이 추가적으로 적용될 수 있습니다.

+
+ConceptLab06 +
+

Fig. 398 그림에는 훈련에 사용된 긍정적 개념이 왼쪽에 표시되어 있습니다. 이는 모델이 어떤 개념을 기반으로 창의적 이미지를 생성했는지를 알 수 있습니다. 모든 결과는 Adaptive Negative 기법을 활용했습니다.#

+
+
+
+ConceptLab07 +
+

Fig. 399 ConceptLab이 제안한 다양한 이미지로 프롬프트와 Adaptive Negative 기법을 적용했습니다.#

+
+
+
+ConceptLab08 +
+

Fig. 400 ConceptLab은 생성된 개념들을 혼합하여 새롭고 독특한 창조물을 반복적으로 학습할 수 있습니다. 그림의 가장 윗줄에서는 Adaptive Negative 기법을 적용하여 학습된 개념들을 보여줍니다. 이어지는 줄에서는 Evolutionary Generation 과정을 통해 얻어진 개념들을 보여줍니다.#

+
+
+
+
+
+

Experiments#

+

ConceptLab의 효과를 입증하기 위해 정성적 및 정량적 평가를 진행했습니다.

+
+

Result#

+
+
+

Creative Generation#

+

위 그림들에서 볼 수 있듯이 모든 결과는 Adaptive Negative를 적용하였고 훈련 시드를 달리하며 다양한 개념을 생성할 수 있는 능력이 있음을 볼 수 있습니다. 또, ConceptLab은 학습된 창의적 개념을 새로운 장면에 배치할 수 있습니다. 이 생성물들은 배경 변경, 스타일 변경, 새로운 창조등 다양하게 활용 가능합니다.

+
+ConceptLab09 +
+

Fig. 401 ConceptLab을 활용한 Concept Mixing의 결과를 보여줍니다.#

+
+
+
+
+

Concept Mixing#

+

Concept Mixing은 다양한 실제 개념들의 독특한 특성을 합쳐 하이브리드 개념을 형성하는 방법을 보여줍니다. 이 방법은 오직 긍정적 제약 조건만을 활용합니다. 예를 들어, 첫 번째 줄에는 랍스터의 주요 특징(생상과 집게발)을 거북이의 특징(등껍질)과 융합하는 것을 볼 수 있습니다.

+
+ConceptLab10 +
+

Fig. 402 위 그림은 ConceptLab에 의해 학습된 개념들이 여러 세대에 걸쳐 어떻게 발전하는지 보여줍니다.#

+
+
+
+
+

Comparisons#

+
+
+

Evaluation Setup#

+

ConceptLab은 Stable Diffusion2와 Kandinsky 2.1 두 모델과 함께 평가했습니다. Kandinsky의 경우, 더 유리한 결과를 위해 부정적 프롬프트는 Latent Diffusion Model이 아닌 Diffusion Prior Model에 적용했습니다.

+
+
+

Qualitative Comparisons#

+

ConceptLab은 긍정적 토근과 부정적 제약 조건 모두에 일관되게 맞춰질 수 있습니다. 즉, ConceptLab은 다중 제약 조건을 효과적으로 처리하고, 특정 개념에 대한 일관된 표현을 학습할 수 있는 능력을 갖추고 있습니다.

+
+
+

Quantitative Comparisons#

+

정량적 평가를 위해 각 방법이 긍정적 개념을 포함하며, 주어진 부정적 개념과 닮지 않은 이미지를 생성하는 능력을 측정했습니다. 평가에는 애완동물, 식물, 과일, 가구, 악기의 5가지 카테고리를 활용했습니다. 각 도메인에 세 가지 다른 부정적 개념 쌍을 고려하고, 각 조합에 대해 ConceptLab을 5개의 랜덤 시드로 훈련하여 총 75개의 학습된 개념을 얻었습니다. 각 학습된 개념에 대해 “A photo of a \(S_{*}\) 프롬프트를 활용하여 32개의 이미지를 생성했습니다. Stable Diffusionr과 kandinsky 모델에서는 부정적 프롬프트를 사용하고, 같은 긍정적 및 부정적 개념 쌍에 대해 160개의 이미지를 생성합니다. 측정 기준으로는 먼저 각 개념의 긍정적 유사성을 타겟 카테고리와의 CLIP 공간 유사성 계산을 통해 특정됩니다. 다음으로는 긍정적 제약과 부정적 제약 사이의 거리를 측정합니다. 이는 생성된 이미지와 모든 부정적 개념 사이의 최대 유사성 계산을 통해 이루어집니다. 결과적으로 ConceptLab은 5가지 모든 도메인에서 긍정적 CLIP 유사성에서 일관되게 우월한 성능을 보였고 타겟 카테고리에 속하는 이미지를 신뢰성 있게 생성했습니다. 또한, 부정적 거리 측정에서 ConceptLab은 모든 카테고리에서 Stable Diffusion을, 4가지 카테고리에서 Kandinsky를 능가했습니다.

+
+ConceptLab11 +
+

Fig. 403 User Study#

+
+
+
+
+
+

Limitations#

+

Personalization과 유사하게, 학습된 개념을 포함하는 프롬프트를 사용하여 새로운 이미지를 생성하는 것이 항상 개념의 특성을 다양한 프롬프트에 걸쳐 유지하지는 못합니다. 또, 최적화 과정 자체가 항상 원하는 결과를 가져오지는 않습니다. “비행기”나 “물고기”와 같은 일부 클래스의 경우 ConceptLab은 창의적 개념을 생성하는데 여전히 어려움이 있습니다. 이는 BLIP-2에 의해 생성되는 부정적 제약과 관련이 있습니다.

+
+ConceptLab12 +
+

Fig. 404 Limitations#

+
+
+
+
+

Conclusion#

+

본 논문에서는 text-to-image diffusion model을 활용하여 창의적 생성을 위한 새로운 접근 방법을 소개했습니다. 주어진 광범위한 카테고리에 속하는 새로운 개념을 학습하기 위해 Diffusion Prior 모델 사용을 제안했습니다. 또, Prior Constraints라는 긍정적 및 부정적 제약 조건들을 diffusion prior 출력에 적용했습니다. 최적화 과정에서는 VQA 모델을 활용하여 독특하면서도 기존 멤버들과의 명확한 구별을 보장했습니다. 이후 실험을 통해 본 방법의 효과성을 입증했으며 시각적으로 다양하고 매력적인 개념을 생성할 수 있었습니다.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/ControlNet.html b/docs/review/ControlNet.html old mode 100644 new mode 100755 index b2237d97..e00dc5f0 --- a/docs/review/ControlNet.html +++ b/docs/review/ControlNet.html @@ -1,777 +1,796 @@ - - - - - - - - - - - - ControlNet — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

ControlNet#

-
-

Additional Control with Image-based condition#

-

기존의 Text-to-Image 모델들은 text prompt로 생성할 이미지의 특징을 조절할 수 있었습니다. 하지만 이런 prompt-based control만으로 이미지의 특징을 조절하는데 한계가 있었습니다. 이 논문에서는 image-based condition을 추가적으로 줘서 생성되는 이미지의 특징을 더 잘 조절하는 ControlNet이라는 신경망 구조를 제안합니다.

-

아래 그림은 “a high quality, detailed, and professional image”라는 prompt와 왼쪽 아래의 Canny edge를 input으로 받아서 오른쪽의 이미지들을 생성한 것입니다. 이런 식으로 추가적인 image-based condition (아래 그림에서는 Canny edge)를 input으로 받아 이미지를 생성하는 것이 ControlNet이 하는 역할입니다.

-
-stylegan_01 -
-

Fig. 139 Images generated by ConrolNet#

-
-
-

그러면 어떤 구조를 사용해서 이를 가능하게 했을까요? 이제부터 이에 대해 알아보도록 하겠습니다.

-
-
-

ControlNet Block#

-

ControlNet의 block 구조는 다음과 같은 두 가지 특징을 가집니다.

-
    -
  1. pretrained model의 locked copy와 trainable copy를 사용

  2. -
  3. zero convolution

  4. -
-
-stylegan_01 -
-

Fig. 140 ConrolNet block#

-
-
-

왜 이렇게 설계했는지 알아봅시다.

-

우선, copy를 사용하는 이유는 기존에 방대한 양의 데이터로 학습시킨 pretrained model의 성능을 유지하기 위해서입니다. 또한, ControlNet의 학습 데이터가 양이 적은 경우에 오버피팅을 피할 수 있는 효과도 있을 것입니다.

-

zero convolution이란 weight랑 bias가 0으로 초기화한 1x1 convolution을 말합니다. zero convolution을 사용할 경우 훈련이 시작되기 전에는 input에 대해 pretrained model과 ControlNet의 output이 똑같아집니다. 따라서 기존 모델이랑 똑같은 input, output을 가지게되므로 기존 모델의 성능을 유지할 수 있으며, 추가적인 훈련이 fine tuning을 하는 것과 비슷하므로 scratch부터 학습하는 것에 비해 빠르게 훈련시킬 수 있게됩니다.

-

그러면 zero convolution은 어떻게 이를 가능하게 하는지 좀 더 자세히 알아봅시다.

-
-
-

Zero Convolution#

-

먼저 위의 그림에서 (a)에 해당하는 부분을 아래와 같이 수식으로 표현하겠습니다.

-
-\[ -\mathbf{y}=\mathcal{F}(\mathbf{x};\Theta) -\]
-

\(\mathbf{x}\)는 input feature map, \(\mathcal{F}\)는 neural network block, \(\Theta\)\(\mathcal{F}\)의 parameter, \(\mathbf{y}\)는 output을 의미합니다. 위 그림의 (b)를 수식으로 표현하기위해 \(\mathcal{F}\)의 trainable copy를 만들어서 parameter를 \(\Theta_{c}\)라고하고 \(\Theta\)는 고정시켜두겠습니다. 또한, zero convolution은 \(\mathcal{Z}\)로 표현하고 두 zero convolution의 parameter를 각각 \(\Theta_{z1}, \Theta_{z2}\)로 두겠습니다. 그러면 (b)에서 condition \(\mathbf{c}\)에 대한 output \(\mathbf{y}_{c}\)는 아래와 같이 표현할 수 있습니다.

-
-\[ -\mathbf{y}_{c}=\mathcal{F}(\mathbf{x};\Theta)+\mathcal{Z}(\mathcal{F}(\mathbf{x}+\mathcal{Z}(\mathbf{c};\Theta_{z1});\Theta_{c});\Theta_{z2}) -\]
-

그런데 \(\mathcal{Z}\)의 weight와 bias의 초깃값이 0이므로 훈련이 진행되지 않았을 경우 \(\mathbf{y}_{c}=\mathbf{y}\)입니다. 따라서 훈련 시작 전에는 ControlNet과 기존 모델이 같은 결과를 내므로 기존 모델의 성능을 보존할 수 있습니다.

-

그런데 weight랑 bias가 전부 0으로 초기화되어있으면 gradient가 0이라서 훈련이 안 되는거 아닐까요? 이를 확인하기 위해 다음과 같이 간단한 경우를 생각해보죠.

-
-\[ -y=wx+b -\]
-

gradient는 다음과 같습니다.

-
-\[ -\frac{\partial y}{\partial w}=x,\; \frac{\partial y}{\partial x}=w,\; \frac{\partial y}{\partial b}=1 -\]
-

weight랑 bias가 0이고, \(x\neq0\)이라고 하면

-
-\[ -\frac{\partial y}{\partial w}\neq0,\; \frac{\partial y}{\partial x}=0,\; \frac{\partial y}{\partial b}\neq0 -\]
-

입니다. 따라서 첫 번째 gradient step에서 weight는 0이 아닌 값으로 가게되고, \(\frac{\partial y}{\partial x}\neq0\)이 되므로 훈련이 됩니다. 여기서 핵심적인 가정이 \(x\neq0\)인데 이 부분은 잘 훈련된 pretrained model을 사용하고 있기 때문에 위배될 가능성이 낮을 것입니다.

-

지금까지 얘기한 ControlNet block 구조를 pretrained Stable diffusion에 적용한 전체 구조는 아래 그림과 같습니다.

-
-stylegan_01 -
-

Fig. 141 Overall structure#

-
-
-
-
-

Training & Results#

-

training loss는 기존 stable diffusion에서 image-based condition \(\mathbf{c}_{f}\)가 추가된 형태입니다.

-
-stylegan_01 -
-

Fig. 142 Loss#

-
-
-

training을 할 때 50%의 확률로 prompt \(\mathbf{c}_{t}\)를 empty string으로 바꿔주었다고 합니다. 이는 prompt가 주어지지않을 경우 모델이 \(\mathbf{c}_{f}\)로부터 semantics를 더 배우는 경향이 있기 때문에 이미지 생성을 \(\mathbf{c}_{f}\)로 조절하는 능력을 향상시켜줄 수 있다고 합니다.

-

아래 결과는 training이 기존 방법보다 효율적이라는 것을 보여줍니다.

-
-stylegan_01 -
-

Fig. 143 Efficiency#

-
-
-

아래 결과들은 task에 따른 결과들입니다. 더 많은 이미지들이 논문에 있으니 참고하시기 바랍니다.

-
-stylegan_01 -
-

Fig. 144 Pose#

-
-
-
-stylegan_01 -
-

Fig. 145 Images generated by ConrolNet#

-
-
-

아래는 논문에서 limitation이라고 언급한 이미지입니다. 텍스트로 추가적인 정보를 주었음에도 원하는 이미지가 생성되지 않는 경우가 발생했습니다.

-
-stylegan_01 -
-

Fig. 146 Limitations#

-
-
-
-
-

Implementation#

-

코드는 공식 구현(링크)에서 가져왔습니다. 아래 코드는 parameter를 0으로 초기화하는 코드로 zero convolution을 만들 때 사용됩니다.

-
def zero_module(module):
-    """
-    Zero out the parameters of a module and return it.
-    """
-    for p in module.parameters():
-        p.detach().zero_()
-    return module
-
-
-

아래 코드는 기본적으로 nn.Sequential과 같은데 time step같은 추가적인 input을 받아줄 수 있게 만든 것입니다.

-
class TimestepEmbedSequential(nn.Sequential, TimestepBlock):
-    """
-    A sequential module that passes timestep embeddings to the children that
-    support it as an extra input.
-    """
-
-    def forward(self, x, emb, context=None):
-        for layer in self:
-            if isinstance(layer, TimestepBlock):
-                x = layer(x, emb)
-            elif isinstance(layer, SpatialTransformer):
-                x = layer(x, context)
-            else:
-                x = layer(x)
-        return x
-
-
-

아래 코드는 공식 github의 cldm/cldm.py에 있는 ControlNet class입니다. init 부분은 길어서 생략했습니다.

-
class ControlNet(nn.Module):
-    def __init__(...):
-			...
-
-		def make_zero_conv(self, channels):
-        return TimestepEmbedSequential(zero_module(conv_nd(self.dims, channels, channels, 1, padding=0)))
-
-    def forward(self, x, hint, timesteps, context, **kwargs):
-        t_emb = timestep_embedding(timesteps, self.model_channels, repeat_only=False)
-        emb = self.time_embed(t_emb)
-
-        guided_hint = self.input_hint_block(hint, emb, context)
-
-        outs = []
-
-        h = x.type(self.dtype)
-        for module, zero_conv in zip(self.input_blocks, self.zero_convs):
-            if guided_hint is not None:
-                h = module(h, emb, context)
-                h += guided_hint
-                guided_hint = None
-            else:
-                h = module(h, emb, context)
-            outs.append(zero_conv(h, emb, context))
-
-        h = self.middle_block(h, emb, context)
-        outs.append(self.middle_block_out(h, emb, context))
-
-        return outs
-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + ControlNet — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

ControlNet#

+
+

Additional Control with Image-based condition#

+

기존의 Text-to-Image 모델들은 text prompt로 생성할 이미지의 특징을 조절할 수 있었습니다. 하지만 이런 prompt-based control만으로 이미지의 특징을 조절하는데 한계가 있었습니다. 이 논문에서는 image-based condition을 추가적으로 줘서 생성되는 이미지의 특징을 더 잘 조절하는 ControlNet이라는 신경망 구조를 제안합니다.

+

아래 그림은 “a high quality, detailed, and professional image”라는 prompt와 왼쪽 아래의 Canny edge를 input으로 받아서 오른쪽의 이미지들을 생성한 것입니다. 이런 식으로 추가적인 image-based condition (아래 그림에서는 Canny edge)를 input으로 받아 이미지를 생성하는 것이 ControlNet이 하는 역할입니다.

+
+stylegan_01 +
+

Fig. 139 Images generated by ConrolNet#

+
+
+

그러면 어떤 구조를 사용해서 이를 가능하게 했을까요? 이제부터 이에 대해 알아보도록 하겠습니다.

+
+
+

ControlNet Block#

+

ControlNet의 block 구조는 다음과 같은 두 가지 특징을 가집니다.

+
    +
  1. pretrained model의 locked copy와 trainable copy를 사용

  2. +
  3. zero convolution

  4. +
+
+stylegan_01 +
+

Fig. 140 ConrolNet block#

+
+
+

왜 이렇게 설계했는지 알아봅시다.

+

우선, copy를 사용하는 이유는 기존에 방대한 양의 데이터로 학습시킨 pretrained model의 성능을 유지하기 위해서입니다. 또한, ControlNet의 학습 데이터가 양이 적은 경우에 오버피팅을 피할 수 있는 효과도 있을 것입니다.

+

zero convolution이란 weight랑 bias가 0으로 초기화한 1x1 convolution을 말합니다. zero convolution을 사용할 경우 훈련이 시작되기 전에는 input에 대해 pretrained model과 ControlNet의 output이 똑같아집니다. 따라서 기존 모델이랑 똑같은 input, output을 가지게되므로 기존 모델의 성능을 유지할 수 있으며, 추가적인 훈련이 fine tuning을 하는 것과 비슷하므로 scratch부터 학습하는 것에 비해 빠르게 훈련시킬 수 있게됩니다.

+

그러면 zero convolution은 어떻게 이를 가능하게 하는지 좀 더 자세히 알아봅시다.

+
+
+

Zero Convolution#

+

먼저 위의 그림에서 (a)에 해당하는 부분을 아래와 같이 수식으로 표현하겠습니다.

+
+\[ +\mathbf{y}=\mathcal{F}(\mathbf{x};\Theta) +\]
+

\(\mathbf{x}\)는 input feature map, \(\mathcal{F}\)는 neural network block, \(\Theta\)\(\mathcal{F}\)의 parameter, \(\mathbf{y}\)는 output을 의미합니다. 위 그림의 (b)를 수식으로 표현하기위해 \(\mathcal{F}\)의 trainable copy를 만들어서 parameter를 \(\Theta_{c}\)라고하고 \(\Theta\)는 고정시켜두겠습니다. 또한, zero convolution은 \(\mathcal{Z}\)로 표현하고 두 zero convolution의 parameter를 각각 \(\Theta_{z1}, \Theta_{z2}\)로 두겠습니다. 그러면 (b)에서 condition \(\mathbf{c}\)에 대한 output \(\mathbf{y}_{c}\)는 아래와 같이 표현할 수 있습니다.

+
+\[ +\mathbf{y}_{c}=\mathcal{F}(\mathbf{x};\Theta)+\mathcal{Z}(\mathcal{F}(\mathbf{x}+\mathcal{Z}(\mathbf{c};\Theta_{z1});\Theta_{c});\Theta_{z2}) +\]
+

그런데 \(\mathcal{Z}\)의 weight와 bias의 초깃값이 0이므로 훈련이 진행되지 않았을 경우 \(\mathbf{y}_{c}=\mathbf{y}\)입니다. 따라서 훈련 시작 전에는 ControlNet과 기존 모델이 같은 결과를 내므로 기존 모델의 성능을 보존할 수 있습니다.

+

그런데 weight랑 bias가 전부 0으로 초기화되어있으면 gradient가 0이라서 훈련이 안 되는거 아닐까요? 이를 확인하기 위해 다음과 같이 간단한 경우를 생각해보죠.

+
+\[ +y=wx+b +\]
+

gradient는 다음과 같습니다.

+
+\[ +\frac{\partial y}{\partial w}=x,\; \frac{\partial y}{\partial x}=w,\; \frac{\partial y}{\partial b}=1 +\]
+

weight랑 bias가 0이고, \(x\neq0\)이라고 하면

+
+\[ +\frac{\partial y}{\partial w}\neq0,\; \frac{\partial y}{\partial x}=0,\; \frac{\partial y}{\partial b}\neq0 +\]
+

입니다. 따라서 첫 번째 gradient step에서 weight는 0이 아닌 값으로 가게되고, \(\frac{\partial y}{\partial x}\neq0\)이 되므로 훈련이 됩니다. 여기서 핵심적인 가정이 \(x\neq0\)인데 이 부분은 잘 훈련된 pretrained model을 사용하고 있기 때문에 위배될 가능성이 낮을 것입니다.

+

지금까지 얘기한 ControlNet block 구조를 pretrained Stable diffusion에 적용한 전체 구조는 아래 그림과 같습니다.

+
+stylegan_01 +
+

Fig. 141 Overall structure#

+
+
+
+
+

Training & Results#

+

training loss는 기존 stable diffusion에서 image-based condition \(\mathbf{c}_{f}\)가 추가된 형태입니다.

+
+stylegan_01 +
+

Fig. 142 Loss#

+
+
+

training을 할 때 50%의 확률로 prompt \(\mathbf{c}_{t}\)를 empty string으로 바꿔주었다고 합니다. 이는 prompt가 주어지지않을 경우 모델이 \(\mathbf{c}_{f}\)로부터 semantics를 더 배우는 경향이 있기 때문에 이미지 생성을 \(\mathbf{c}_{f}\)로 조절하는 능력을 향상시켜줄 수 있다고 합니다.

+

아래 결과는 training이 기존 방법보다 효율적이라는 것을 보여줍니다.

+
+stylegan_01 +
+

Fig. 143 Efficiency#

+
+
+

아래 결과들은 task에 따른 결과들입니다. 더 많은 이미지들이 논문에 있으니 참고하시기 바랍니다.

+
+stylegan_01 +
+

Fig. 144 Pose#

+
+
+
+stylegan_01 +
+

Fig. 145 Images generated by ConrolNet#

+
+
+

아래는 논문에서 limitation이라고 언급한 이미지입니다. 텍스트로 추가적인 정보를 주었음에도 원하는 이미지가 생성되지 않는 경우가 발생했습니다.

+
+stylegan_01 +
+

Fig. 146 Limitations#

+
+
+
+
+

Implementation#

+

코드는 공식 구현(링크)에서 가져왔습니다. 아래 코드는 parameter를 0으로 초기화하는 코드로 zero convolution을 만들 때 사용됩니다.

+
def zero_module(module):
+    """
+    Zero out the parameters of a module and return it.
+    """
+    for p in module.parameters():
+        p.detach().zero_()
+    return module
+
+
+

아래 코드는 기본적으로 nn.Sequential과 같은데 time step같은 추가적인 input을 받아줄 수 있게 만든 것입니다.

+
class TimestepEmbedSequential(nn.Sequential, TimestepBlock):
+    """
+    A sequential module that passes timestep embeddings to the children that
+    support it as an extra input.
+    """
+
+    def forward(self, x, emb, context=None):
+        for layer in self:
+            if isinstance(layer, TimestepBlock):
+                x = layer(x, emb)
+            elif isinstance(layer, SpatialTransformer):
+                x = layer(x, context)
+            else:
+                x = layer(x)
+        return x
+
+
+

아래 코드는 공식 github의 cldm/cldm.py에 있는 ControlNet class입니다. init 부분은 길어서 생략했습니다.

+
class ControlNet(nn.Module):
+    def __init__(...):
+			...
+
+		def make_zero_conv(self, channels):
+        return TimestepEmbedSequential(zero_module(conv_nd(self.dims, channels, channels, 1, padding=0)))
+
+    def forward(self, x, hint, timesteps, context, **kwargs):
+        t_emb = timestep_embedding(timesteps, self.model_channels, repeat_only=False)
+        emb = self.time_embed(t_emb)
+
+        guided_hint = self.input_hint_block(hint, emb, context)
+
+        outs = []
+
+        h = x.type(self.dtype)
+        for module, zero_conv in zip(self.input_blocks, self.zero_convs):
+            if guided_hint is not None:
+                h = module(h, emb, context)
+                h += guided_hint
+                guided_hint = None
+            else:
+                h = module(h, emb, context)
+            outs.append(zero_conv(h, emb, context))
+
+        h = self.middle_block(h, emb, context)
+        outs.append(self.middle_block_out(h, emb, context))
+
+        return outs
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/CustomDiffusion.html b/docs/review/CustomDiffusion.html old mode 100644 new mode 100755 index 9c5d6dda..cac3d03d --- a/docs/review/CustomDiffusion.html +++ b/docs/review/CustomDiffusion.html @@ -1,929 +1,948 @@ - - - - - - - - - - - - Custom Diffusion — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: A Multi-Concept Customiziation of Text-To-Image Diffusion (CVPR 2023)

  • -
  • Reference

    - -
  • -
  • Author: Seunghwan Ji

  • -
  • Last updated on Aug. 6, 2023

  • -
-
-
-

Custom Diffusion#

-
-

Abstract#

-
    -
  • Large Scale Data를 학습한 Generate 모델이 뛰어난 성능을 보이는 추세

  • -
  • User의 Private한 Concept을 생성하고자하는 욕구는 여전히 풀지 못함

  • -
  • Custom Diffusion은?

    -
      -
    1. 기존 Diffusion 모델의 partial한 부분만을 학습시킴으로써 기존보다 더 빠른 finetuning 방식을 제안

    2. -
    3. Single Concept 뿐 아니라, Multiple Concept에 대한 학습이 가능

    4. -
    5. 다양한 Fine tuned 모델을 하나의 모델로 Compress하는 방식을 제안

    6. -
    -
  • -
-
-
-

1. Introduction#

-
    -
  • 최근 Text-To-Image 모델들이 활발하게 연구 되어짐

  • -
  • 단순한 text prompt 입력만으로 원하는 이미지를 생성해내는 수준까지 이름

  • -
  • 하지만 이러한 모델들은 General한 이미지는 잘 생성하지만, User가 원하는 Private한 (=specific) Concept의 이미지는 생성해내지 못함

    -
      -
    • e.g. 행복한 우리 가족 사진, 우리집 강아지 뽀삐가 파리로 여행을 떠나는 사진 등

    • -
    -
  • -
  • 학습 과정중에 User의 Private한 데이터를 보지 못했기때문에 Model에게는 당연한 결과

  • -
  • Customization

    -
      -
    • 몇장의 Concept을 포함하는 이미지만으로 Pretrained 모델을 finetuning하는 방식

      -
        -
      • In Dreambooth, Personalization

      • -
      -
    • -
    • 목표

      -
        -
      1. 학습하고자하는 Private한 Concept의 이미지를 잘 생성해내야함

      2. -
      3. 기존에 학습되었던 General한 이미지를 Finetuning한 후에도 잘 생성해내야함

      4. -
      -
    • -
    -
  • -
  • Customization이 어려운 이유

    -
      -
    1. 학습을 진행하다보면 기존에 학습했던 Concept을 잊어버리거나 왜곡해버림 → Language Draft

    2. -
    3. 새로운 Concept에 대해 모델이 Overfit 되어서 결과물의 Variation이 낮아짐

    4. -
    5. 좀더 나아가 Single Concept 뿐 아니라 Multiple Concept에 대한 Finetuning 또한 어려움

    6. -
    -
  • -
  • Custom Diffusion은?

    -
      -
    1. Text로 Condition을 생성해내는 과정 중 특정 부분만을 학습

    2. -
    3. General Concept의 성능 유지를 위해 real image와 해당 이미지의 caption을 regularization Data로 사용

    4. -
    5. fine tuning동안 새로운 augmentation 기법을 소개

    6. -
    7. Multiple concept의 학습 방식을 제안

    8. -
    -
  • -
-
- -
-

3. Method#

-
-

Single Concept Fine-tuning#

-
    -
  • Backbone으로 Latent Diffusion Model을 채택

  • -
  • (L)DM의 학습 Concept

    -
    -CD_00 -
    -

    Fig. 165 Equation 0#

    -
    -
    -
      -
    • \(x_{t}\) : time t 시점에 Noise가 섞인 이미지

    • -
    • \(t\) → timestep

    • -
    • \(c\) → conditioning feature (text, image 등)

      -
        -
      • text나 image를 바로 사용하지않고 latent space로 embedding된 값을 사용 (using CLIP)

      • -
      -
    • -
    • ε → noise

    • -
    • \(ε_{θ}\)\(x_{t}\)에 낀 noise ε를 예측해내는 모델

    • -
    • 즉, \(x_{t}\)에 낀 noise ε를 예측해내는 모델을 학습

    • -
    -
  • -
  • 이러한 LDM 모델을 fine tuning할때는 Model의 모든 Layer에대해 update하는게 기본

  • -
  • 하지만 이러한 finetuning 방식은 Resource가 비효율적으로 많이들고, 새로운 Concept 이미지에 overfitting되기 쉬움

  • -
  • Finetuning 과정 중 모델의 Weight 변화량을 체크

    -
    -CD_01 -
    -

    Fig. 166 Delta of Weight while Training#

    -
    -
    -
  • -
  • 다른 부분에비해 Cross Attention 연산의 Wegith 변화량이 가장 큼

  • -
  • Cross Attention

  • -
-
-CD_02 -
-

Fig. 167 Fig.4 Cross Attention#

-
-
-
    -
  • Cross Attention → Image latent에 text condition을 주입하는 Attention Mechanism

    -
      -
    • Query → image latent / Key, Value → text condition latent

    • -
    • 모델 전체 Parameter에 단 5%부분만을 차지

    • -
    • 이 중 new concept을 의미하는 Text \(V^{*}\)이 포함되는 \(W^{k}\)\(W^{v}\)만 학습. 나머지는 Freeze

    • -
    -
  • -
  • Fine Tuning할 때 \(V^{*}\)은 실제로는 잘 쓰지않는 단어로 사용하고 “A [\(V^{*}\)] [Class]” 형식으로 이미지를 Captioning한 후에 학습

  • -
  • 또 Finetuning중에 일반적인 concept을 잊어버리는 Language Draft 현상이 있을수있음

    -
      -
    • Language Draft

    • -
    -
    -CD_03 -
    -

    Fig. 168 Fine tuning 후에 Photo of a moon 이미지를 생성하면 Finetuning했던 Moongate 이미지를 생성해버림#

    -
    -
    -
  • -
-

Fine tuning 후에 Photo of a moon 이미지를 생성하면 Finetuning했던 Moongate 이미지를 생성해버림

-
    -
  • 이러한 현상을 방지하기위해 Real world의 Image에서 target text class prompt와 유사한 200장의 이미지를 Regulalization 이미지로 같이 학습

    -
      -
    • text prompt가 유사하다 = CLIP에서 추출한 text feature space상의 Vector가 Similar하다

    • -
    -
  • -
-
-
-

Multiple-Concept Compositional Fine-tuning#

-
    -
  • Joint Traning on multiple concept

    -
      -
    • 각각의 Concept을 갖는 이미지에 대해 각각 rare한 key를 부여해 동시에 학습

      -
        -
      • (\(V^{i}\), for \(i\) is # of concepts)

      • -
      -
    • -
    -
  • -
  • Constrained optimization to merge concepts

    -
      -
    • 각각 Single Concept으로 학습된 weight를 merge

    • -
    -
    -CD_04 -
    -

    Fig. 169 Equation 4#

    -
    -
    -
      -
    • \(W_0\) → pretrained model의 Key, Value embedding Weight

      -
        -
      • ~~(Appendix A에는 \(W\)라고 나와있는데 오탈자일 가능성 있음)~~

      • -
      -
    • -
    • \(C_{reg}\) → regularization 이미지의 Caption의 Embedding 값을 모두 뽑아 Concat

    • -
    • \(C_{reg}\)에 Pretrained Weight를 곱한 값과의 norm을 계산했을때 값이 가장 작은 Weight를 return

      -
        -
      • “N개의 Concept에 대해 Cross Attention이 모두 잘 동작하는 W 값을 찾아 하나만 사용하자”

      • -
      -
    • -
    -
  • -
-
-
-

Training Details#

-
    -
  • single concept의 경우 250 steps, two-concept의 경우 500 steps

  • -
  • batch : 8, learning rate : \(8*10^{-5}\)

  • -
  • random resize + prompt 추가 (very small, far away, zoom in …) (new augmentation technique)

  • -
-
-
-
-

4. Experiments#

-

Single Concept Finetuning

-
    -
  • Qualitative Evaluation

  • -
-
-CD_05 -
-

Fig. 170 Qualitative Evaluation#

-
-
-
    -
  • Quantative Evaluation (Text Alignment, Image Alignment, KID)

    -
      -
    • text alignment : prompt에 얼마나 대응되는 이미지를 생성해냈는가

    • -
    • image alignment : training image의 concept을 얼마나 잘 표현해냈는가

    • -
    -
  • -
-
-CD_06 -
-

Fig. 171 Table 1#

-
-
-

⇒ 정성적, 정량적 평가 모두 Custom Diffusion > Dreambooth, Textual Inversion

-

Multiple Concept Finetuning

-
-CD_07 -
-

Fig. 172 Multiple Concept Finetuning#

-
-
-
    -
  • Joint Training > Optimization by custom diffusion > Dreambooth

  • -
-

Human Preference Study

-
-CD_08 -
-

Fig. 173 Table 2#

-
-
-
    -
  • Custom Diffusion (partial) vs Baseline(Textual Inversion, Dreambooth, CustomDiffusion(all))

  • -
  • Text-Alignment, Image-Alignment 모두 Custom Diffusion (partial)을 선호

  • -
  • Textual Inversion은 Image Alignment는 Custom Diffusion 선호도와 비슷하지만 Text Alignment수치를 보면 Custom Diffusion이 매우 높아 Overfitting된 경향이 있음

  • -
-

Ablation Study

-
    -
  1. Regularization Image

    -
    -CD_09 -
    -

    Fig. 174 Table 3#

    -
    -
    -
  2. -
-
    -
  • ㅌGen : real image 대신 generate된 이미지를 regularization 이미지로 사용

  • -
  • Overfitting 없이 가장 좋은 수치는 Augmentation + Regulatization image as Real world Image

  • -
-
-
-

5. Discussion & Limitation#

-
    -
  • customizing이 가능하고 training resourse가 매우 적은 finetuning 기법 소개

  • -
-
-CD_10 -
-

Fig. 175 Limitation Of Custom Diffusion#

-
-
-
    -
  • 비슷한 category의 object에 대해서는 joint training, merge 모두 잘 동작하지 않음

  • -
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Custom Diffusion — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: A Multi-Concept Customiziation of Text-To-Image Diffusion (CVPR 2023)

  • +
  • Reference

    + +
  • +
  • Author: Seunghwan Ji

  • +
  • Last updated on Aug. 6, 2023

  • +
+
+
+

Custom Diffusion#

+
+

Abstract#

+
    +
  • Large Scale Data를 학습한 Generate 모델이 뛰어난 성능을 보이는 추세

  • +
  • User의 Private한 Concept을 생성하고자하는 욕구는 여전히 풀지 못함

  • +
  • Custom Diffusion은?

    +
      +
    1. 기존 Diffusion 모델의 partial한 부분만을 학습시킴으로써 기존보다 더 빠른 finetuning 방식을 제안

    2. +
    3. Single Concept 뿐 아니라, Multiple Concept에 대한 학습이 가능

    4. +
    5. 다양한 Fine tuned 모델을 하나의 모델로 Compress하는 방식을 제안

    6. +
    +
  • +
+
+
+

1. Introduction#

+
    +
  • 최근 Text-To-Image 모델들이 활발하게 연구 되어짐

  • +
  • 단순한 text prompt 입력만으로 원하는 이미지를 생성해내는 수준까지 이름

  • +
  • 하지만 이러한 모델들은 General한 이미지는 잘 생성하지만, User가 원하는 Private한 (=specific) Concept의 이미지는 생성해내지 못함

    +
      +
    • e.g. 행복한 우리 가족 사진, 우리집 강아지 뽀삐가 파리로 여행을 떠나는 사진 등

    • +
    +
  • +
  • 학습 과정중에 User의 Private한 데이터를 보지 못했기때문에 Model에게는 당연한 결과

  • +
  • Customization

    +
      +
    • 몇장의 Concept을 포함하는 이미지만으로 Pretrained 모델을 finetuning하는 방식

      +
        +
      • In Dreambooth, Personalization

      • +
      +
    • +
    • 목표

      +
        +
      1. 학습하고자하는 Private한 Concept의 이미지를 잘 생성해내야함

      2. +
      3. 기존에 학습되었던 General한 이미지를 Finetuning한 후에도 잘 생성해내야함

      4. +
      +
    • +
    +
  • +
  • Customization이 어려운 이유

    +
      +
    1. 학습을 진행하다보면 기존에 학습했던 Concept을 잊어버리거나 왜곡해버림 → Language Draft

    2. +
    3. 새로운 Concept에 대해 모델이 Overfit 되어서 결과물의 Variation이 낮아짐

    4. +
    5. 좀더 나아가 Single Concept 뿐 아니라 Multiple Concept에 대한 Finetuning 또한 어려움

    6. +
    +
  • +
  • Custom Diffusion은?

    +
      +
    1. Text로 Condition을 생성해내는 과정 중 특정 부분만을 학습

    2. +
    3. General Concept의 성능 유지를 위해 real image와 해당 이미지의 caption을 regularization Data로 사용

    4. +
    5. fine tuning동안 새로운 augmentation 기법을 소개

    6. +
    7. Multiple concept의 학습 방식을 제안

    8. +
    +
  • +
+
+ +
+

3. Method#

+
+

Single Concept Fine-tuning#

+
    +
  • Backbone으로 Latent Diffusion Model을 채택

  • +
  • (L)DM의 학습 Concept

    +
    +CD_00 +
    +

    Fig. 165 Equation 0#

    +
    +
    +
      +
    • \(x_{t}\) : time t 시점에 Noise가 섞인 이미지

    • +
    • \(t\) → timestep

    • +
    • \(c\) → conditioning feature (text, image 등)

      +
        +
      • text나 image를 바로 사용하지않고 latent space로 embedding된 값을 사용 (using CLIP)

      • +
      +
    • +
    • ε → noise

    • +
    • \(ε_{θ}\)\(x_{t}\)에 낀 noise ε를 예측해내는 모델

    • +
    • 즉, \(x_{t}\)에 낀 noise ε를 예측해내는 모델을 학습

    • +
    +
  • +
  • 이러한 LDM 모델을 fine tuning할때는 Model의 모든 Layer에대해 update하는게 기본

  • +
  • 하지만 이러한 finetuning 방식은 Resource가 비효율적으로 많이들고, 새로운 Concept 이미지에 overfitting되기 쉬움

  • +
  • Finetuning 과정 중 모델의 Weight 변화량을 체크

    +
    +CD_01 +
    +

    Fig. 166 Delta of Weight while Training#

    +
    +
    +
  • +
  • 다른 부분에비해 Cross Attention 연산의 Wegith 변화량이 가장 큼

  • +
  • Cross Attention

  • +
+
+CD_02 +
+

Fig. 167 Fig.4 Cross Attention#

+
+
+
    +
  • Cross Attention → Image latent에 text condition을 주입하는 Attention Mechanism

    +
      +
    • Query → image latent / Key, Value → text condition latent

    • +
    • 모델 전체 Parameter에 단 5%부분만을 차지

    • +
    • 이 중 new concept을 의미하는 Text \(V^{*}\)이 포함되는 \(W^{k}\)\(W^{v}\)만 학습. 나머지는 Freeze

    • +
    +
  • +
  • Fine Tuning할 때 \(V^{*}\)은 실제로는 잘 쓰지않는 단어로 사용하고 “A [\(V^{*}\)] [Class]” 형식으로 이미지를 Captioning한 후에 학습

  • +
  • 또 Finetuning중에 일반적인 concept을 잊어버리는 Language Draft 현상이 있을수있음

    +
      +
    • Language Draft

    • +
    +
    +CD_03 +
    +

    Fig. 168 Fine tuning 후에 Photo of a moon 이미지를 생성하면 Finetuning했던 Moongate 이미지를 생성해버림#

    +
    +
    +
  • +
+

Fine tuning 후에 Photo of a moon 이미지를 생성하면 Finetuning했던 Moongate 이미지를 생성해버림

+
    +
  • 이러한 현상을 방지하기위해 Real world의 Image에서 target text class prompt와 유사한 200장의 이미지를 Regulalization 이미지로 같이 학습

    +
      +
    • text prompt가 유사하다 = CLIP에서 추출한 text feature space상의 Vector가 Similar하다

    • +
    +
  • +
+
+
+

Multiple-Concept Compositional Fine-tuning#

+
    +
  • Joint Traning on multiple concept

    +
      +
    • 각각의 Concept을 갖는 이미지에 대해 각각 rare한 key를 부여해 동시에 학습

      +
        +
      • (\(V^{i}\), for \(i\) is # of concepts)

      • +
      +
    • +
    +
  • +
  • Constrained optimization to merge concepts

    +
      +
    • 각각 Single Concept으로 학습된 weight를 merge

    • +
    +
    +CD_04 +
    +

    Fig. 169 Equation 4#

    +
    +
    +
      +
    • \(W_0\) → pretrained model의 Key, Value embedding Weight

      +
        +
      • ~~(Appendix A에는 \(W\)라고 나와있는데 오탈자일 가능성 있음)~~

      • +
      +
    • +
    • \(C_{reg}\) → regularization 이미지의 Caption의 Embedding 값을 모두 뽑아 Concat

    • +
    • \(C_{reg}\)에 Pretrained Weight를 곱한 값과의 norm을 계산했을때 값이 가장 작은 Weight를 return

      +
        +
      • “N개의 Concept에 대해 Cross Attention이 모두 잘 동작하는 W 값을 찾아 하나만 사용하자”

      • +
      +
    • +
    +
  • +
+
+
+

Training Details#

+
    +
  • single concept의 경우 250 steps, two-concept의 경우 500 steps

  • +
  • batch : 8, learning rate : \(8*10^{-5}\)

  • +
  • random resize + prompt 추가 (very small, far away, zoom in …) (new augmentation technique)

  • +
+
+
+
+

4. Experiments#

+

Single Concept Finetuning

+
    +
  • Qualitative Evaluation

  • +
+
+CD_05 +
+

Fig. 170 Qualitative Evaluation#

+
+
+
    +
  • Quantative Evaluation (Text Alignment, Image Alignment, KID)

    +
      +
    • text alignment : prompt에 얼마나 대응되는 이미지를 생성해냈는가

    • +
    • image alignment : training image의 concept을 얼마나 잘 표현해냈는가

    • +
    +
  • +
+
+CD_06 +
+

Fig. 171 Table 1#

+
+
+

⇒ 정성적, 정량적 평가 모두 Custom Diffusion > Dreambooth, Textual Inversion

+

Multiple Concept Finetuning

+
+CD_07 +
+

Fig. 172 Multiple Concept Finetuning#

+
+
+
    +
  • Joint Training > Optimization by custom diffusion > Dreambooth

  • +
+

Human Preference Study

+
+CD_08 +
+

Fig. 173 Table 2#

+
+
+
    +
  • Custom Diffusion (partial) vs Baseline(Textual Inversion, Dreambooth, CustomDiffusion(all))

  • +
  • Text-Alignment, Image-Alignment 모두 Custom Diffusion (partial)을 선호

  • +
  • Textual Inversion은 Image Alignment는 Custom Diffusion 선호도와 비슷하지만 Text Alignment수치를 보면 Custom Diffusion이 매우 높아 Overfitting된 경향이 있음

  • +
+

Ablation Study

+
    +
  1. Regularization Image

    +
    +CD_09 +
    +

    Fig. 174 Table 3#

    +
    +
    +
  2. +
+
    +
  • ㅌGen : real image 대신 generate된 이미지를 regularization 이미지로 사용

  • +
  • Overfitting 없이 가장 좋은 수치는 Augmentation + Regulatization image as Real world Image

  • +
+
+
+

5. Discussion & Limitation#

+
    +
  • customizing이 가능하고 training resourse가 매우 적은 finetuning 기법 소개

  • +
+
+CD_10 +
+

Fig. 175 Limitation Of Custom Diffusion#

+
+
+
    +
  • 비슷한 category의 object에 대해서는 joint training, merge 모두 잘 동작하지 않음

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/DALLE2.html b/docs/review/DALLE2.html old mode 100644 new mode 100755 index cbaf9e29..5212f043 --- a/docs/review/DALLE2.html +++ b/docs/review/DALLE2.html @@ -1,1219 +1,1237 @@ - - - - - - - - - - - - DALL-E 2 — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

DALL-E 2

- -
-
- -
-
-
- - - - -
- -
-

Information

-
    -
  • Title: Hierarchical Text-Conditional Image Generation with CLIP Latents (arXiv 2022)

  • -
  • Reference

    - -
  • -
  • Author: SeonHoon Kim

  • -
  • Last updated on Sep. 18, 2023

  • -
-
-
-

DALL-E 2#

-

DALLE2 는 2022년에 공개되어 세상을 놀라게 했습니다.
-이미지 생성 능력도 뛰어났고, 이미지를 사용자 입맛에 맞게 조작할 수 있게 되었죠.

-

DALLE2 의 이름은 왜 DALL-E 일까요?
-DALLE2 의 DALLE 는 초현실주의 화가 Salvador Dali 와 WALL-E 의 합성어입니다.
-DALLE2 로 생성해낸 결과물이 과연 어떻길래 세상을 놀라게 했을까요?

-
-
    -
  • DALL-E 2 결과물

    -
    -img_01 -
    -

    Fig. 101 Salvador Dali 의 생전 모습#

    -
    -
    -
    -img_00 -
    -

    Fig. 102 vibrant portrait of Salvador Dali with a robotic half face from DALLE2#

    -
    -
    -

    위 그림은 DALLE2 가 생성해낸 “vibrant portrait of Salvador Dali with a robotic half face” 이미지입니다.
    -실제 Salvador dali 의 모습이 보이네요.
    -게다가 Salvador dali 의 초현실주의적 그림체가 반영된 것 같기도 합니다.
    -놀라운 이미지입니다.

    -

    아래의 corgi 그림은 어떤가요 ?

    -
    -img_02 -
    -

    Fig. 103 a corgi’s head depicted as an explosion of a nebula from DALLE2#

    -
    -
    -

    corgi 의 모습을 성운의 폭발로 묘사해달라고 했을 때 생성된 그림입니다.
    -아래의 그림은, 실제 NASA 에서 촬영한 초신성 폭발의 잔해입니다.

    -

    정말 그럴듯하지 않나요?

    -
    -img_03 -
    -

    Fig. 104 This mosaic image, one of the largest ever taken by NASA’s Hubble Space Telescope of the Crab Nebula, is a six-light-year-wide expanding remnant of a star’s supernova explosion.#

    -
    -
    -
  • -
-
-
    -
  • 학습 목표 및 주의사항

    -
      -
    • 본 포스팅에서는 DALLE2 paper 의 내용을 비선형적으로 살펴봅니다.
      -마치 오픈월드 게임처럼 말이죠.
      -핵심이 되는 질문들을 던지며, DALLE2 의 아키텍쳐를 파헤쳐 볼 겁니다.

    • -
    • 본 포스팅은 DALL-E 2 paper, OpenAI blog, AssemblyAI Youtube, Eden Meyer Youtube 를 참고했습니다.

    • -
    • 본격적으로 학습하기 전에 알아야할 것은, CLIP 모델입니다.

      -
        -
      • CLIP 은, 이미지와 text 를 학습한 multi-modal 모델입니다.

        -
          -
        • The fundamental principles of training CLIP are quite simple:

          -
            -
          1. First, all images and their associated captions are passed through their respective encoders, mapping all objects into an m-dimensional space.

          2. -
          3. Then, the cosine similarity of each (image, text) pair is computed.

          4. -
          5. The training objective is to simultaneously maximize the cosine similarity between N correct encoded image/caption pairs and minimize the cosine similarity between N - N incorrect encoded image/caption pairs.

          6. -
          -
        • -
        -
      • -
      -
    • -
    • DALL-E 2 는 CLIP 과 Diffusion Model 을 통합시켰습니다. (최초는 x)

    • -
    • 하지만 CLIP 을 사용하는 것이 정답은 아닙니다.
      -DALL-E 2 는 22년 5월, CLIP 을 사용하지 않은 IMAGEN 에게 SOTA 를 내주었습니다.

    • -
    -
  • -
-
-
    -
  • 아키텍쳐 찍먹하기

    -

    특정 이미지 내의 Semantics 와 style 을 모두 포착해낼 수 있는 CLIP 의 이미지 표현 능력을 끌어올리기 위해서,
    -저자들은 CLIP 과 Diffusion 모델을 통합한 Two-stage model 을 제안합니다.
    -이것이 바로 DALLE2 인데요.
    -저자들은 이 모델을 unCLIP 이라고 부릅니다.

    -
    -img_06 -
    -

    Fig. 105 A high level overview of the architecture.#

    -
    -
    -

    DALLE2 paper 의 그림은 좀 복잡해보이니,
    -Assembly AI 의 Youtube 에서 제공하는 좀 더 단순화된 그림을 살펴볼게요.

    -
    -img_07 -
    -

    Fig. 106 A high level overview of the architecture from AssemblyAI youtube.#

    -
    -
    -

    https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI

    -

    Prior 와 Decoder 가 DALLE2 의 핵심이 되는 모델인 것 같네요.

    -
      -
    • Prior : 텍스트 캡션을 받아서, 상응하는 CLIP image embedding 을 생성합니다.

      -
        -
      • 본 논문에서는 Autogregressive prior 와 Diffusion prior 를 비교하는 실험 수행했습니다.

      • -
      • Diffusion prior 가 computationally efficient 하고, 고품질 이미지 생성합니다.
        -따라서 후반부에는 Diffusion prior 만 사용해서 실험합니다.

      • -
      -
    • -
    • Decoder : CLIP image embedding 을 받아서, 이미지를 생성합니다.

      -
        -
      • Diffusion 모델만 사용했습니다.

      • -
      -
    • -
    -
  • -
-
-
    -
  • 왜 CLIP 이랑 Diffusion 을 사용했을까요?

    -
      -
    • CLIP

      -
        -
      • CLIP 이 images representation 을 학습하는데 에 큰 성공을 거두고 있었습니다.

      • -
      • CLIP embeddings 는 image distribution shift 에 robust 했습니다.

      • -
      • CLIP embeddings 는 zero-shot capabilities 가 뛰어났습니다.

      • -
      • 다양한 vision & language tasks 에 fine-tuned 되어 SOTA 를 달성해냈습니다.

      • -
      -
    • -
    • Diffusion

      -
        -
      • Diffusion 은 image 와 video generation taks 에서 SOTA 를 갱신하는 중이었죠.

      • -
      • non-deterministic 하게 만들 수 있습니다.
        -이러한 Decoder 덕분에, CLIP image embedding 과 같은
        -image representation 에 존재하지 않는 non-essential 한 details변주하면서,
        -image representation 의 semantics 와 style 은 유지할 수 있죠.

      • -
      -
      -img_08 -
      -

      Fig. 107 Variations of an input image by encoding with CLIP and then decoding with a diffusion model.#

      -
      -
      -

      위 왼쪽의 그림처럼, Salvador dali 의 그림에서 중요한 objects 들은 보존됩니다.
      -하지만 그들이 표현되는 방식이나 전체적인 그림의 style 은 조금씩 바뀝니다.
      -그럼에도, Salvador dali 특유의 초현실주의적 화풍은 유지되는 것 같네요.
      -Diffusion Decoder 덕분에, Non-essential details
      -마치 변주곡처럼 매번 새롭게 연주해낼 수 있는겁니다.

      -
    • -
    -
  • -
-
-
    -
  • 아키텍쳐 파헤치기

    -
    -img_09 -
    -

    Fig. 108 A high level overview of the architecture from AssemblyAI youtube.#

    -
    -
    -

    https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI -

    -

    이번에는 DALLE2 의 아키텍쳐를 좀 더 자세히 살펴보죠.

    -
      -
    • Prior

      -
        -
      • input

        -
          -
        • Caption 그 자체의 embedding vector 입니다.

        • -
        • CLIP text embedding 입니다.

        • -
        -
      • -
      • output

        -
          -
        • Generated CLIP Image embedding 입니다.

        • -
        -
      • -
      • 설명

        -
          -
        • 사실 Prior 은 CLIP text embedding 만 조건으로 받는 것이 아니라 Caption 자체도 받습니다.
          -(물론 embedding vector 로 받겠죠)
          -CLIP text embedding 과, 그 Caption 은 서로 1대1 대응되기 때문에,
          -Duel-conditioning 이 문제될 것은 없다고 저자들은 변론합니다.

        • -
        • 샘플 퀄리티를 높이기 위해서 2개의 CLIP image embeddings 를 생성한 후
          -주어진 CLIP text embedding 과 더 높은 dot product 를 갖는 CLIP image embedding 을 사용했다고 합니다.

        • -
        -
      • -
      -
    • -
    • Decoder

      -
        -
      • Input

        -
          -
        • CLIP text embedding

        • -
        • Generated CLIP Image embedding

        • -
        -
      • -
      • Output

        -
          -
        • Generated Image

        • -
        -
      • -
      • 설명

        -
          -
        • modified GLIDE model 을 Decoder 로 사용했습니다.
          -→ 따라서, projected CLIP text embeddings 를 아키텍쳐에 통합시킬 수 있다고 주장합니다. -
          -어떻게 통합시키냐하면,

        • -
        -
          -
        1. GLIDE timestep embedding 에 추가하고,

        2. -
        3. 4개의 extra context tokens 을 만들어서 GLIDE text encoder 의 output sequence 에 concat 하는거죠. -
          -이 방법으로 CLIP image embeddings 를 받아서, 원본 영상을 생성하는 것 입니다.

        4. -
        -
        -img_10 -
        -

        Fig. 109 GLIDE training process#

        -
        -
        -
          -
        • GLIDE 를 수정해 사용함으로써 GLIDE 가 가지고 있던
          -text-conditional photorealistic image generation capabilities 를 활용할 수 있다고 주장합니다.

        • -
        -
      • -
      -
    • -
    -
  • -
-
-
    -
  • 그렇다면 왜 Prior 가 필요할까요?

    -
      -
    1. To obtain a full generative model of images,
      -we combine the CLIP image embedding decoder with a prior model,
      -which generates possible CLIP image embeddings from a given text caption

    2. -
    -

    라고 하지만.. 딱히 와닿지는 않습니다.
    -하지만 아직 실망하긴 이릅니다.
    -Prior 의 유무에 따라, 생성된 이미지의 품질을 비교하는 실험을 수행했다고 합니다.
    -한번 살펴볼까요?

    -
      -
    1. 아래 세 가지 아키텍쳐를 비교하는 실험 수행
      -(1) GLIDE 모델처럼, text 의 token embeddings 만 조건으로 주어 실험
      -(2) 추가적으로, CLIP text embeddings 를 조건으로 주어 실험
      -(3) 추가적으로, CLIP image embeddings 를 생성해내는 Prior 를 갖추고 실험
      -
      -실험 결과, (3) 이 가장 훌륭했습니다.
      -특히 image diversity 가 뛰어났습니다.

    2. -
    -
    -img_11 -
    -

    Fig. 110 3가지 경우의 아키텍쳐에 따른 실험 결과 from AssemblyAI youtube.#

    -
    -
    -
    -img_12 -
    -

    Fig. 111 Samples using different conditioning signals for the same decoder.#

    -
    -
    -

    그렇지만, 의문이 말끔히 해소되지는 않습니다. -왜냐하면..

    -
      -
    • 95% 의 학습 시간 동안, (3) 방식으로 학습한 Decoder 를,
      -(1) 과 (2) 방식에 그대로 적용해 실험했습니다.
      -따라서 공정한 실험이라고 보긴 어려울 것 같습니다.

    • -
    • Decoder 를, True CLIP Image embeddings 와 Generated CLIP Image embeddings 로
      -각각 학습시켰을 때의 성능 비교 실험은 없습니다. -
      -개인적으로 저는 이러한 결과들을 보고,
      -Prior 를 반드시 써야하는 근거에 대한 설득력이 떨어진다고 생각했습니다.

    • -
    -
  • -
-
-
    -
  • 왜 CLIP 을 써야할까요?

    -
      -
    1. CLIP 은 어떤 객체를 묘사한 텍스트와, 그 객체의 시각적 발현 사이의 의미론적 관계를 학습했습니다.
      -따라서 저자들은 이러한 CLIP 의 능력이 Text-to-Image task 에서 매우 중요하다고 주장합니다.

    2. -
    3. CLIP 을 활용한 덕분에 이미지를 Manipulation 할 수 있습니다.

    4. -
    -
    -img_13 -
    -

    Fig. 112 Text diffs applied to images by interpolating between their CLIP image embeddings and a normalised difference of the CLIP text embeddings produced from the two descriptions.#

    -
    -
    -

    어떻게 이미지를 Manipulation 하는지는 곧 자세히 살펴보겠습니다.

    -
  • -
-
-
    -
  • 그래서 이 모델은 뭐가 좋은가요?

    -
      -
    • Evaluation 결과, Diversity 가 뛰어났습니다.

      -
        -
      • 모델을 평가하기 위해서,
        -주어진 Caption 에 대한 GLIDE 의 생성물과 unCLIP 의 생성물을 사람들에게 제시하고,
        -Photorealism, Caption Similarity, Diversity 에 대해서 점수를 매기도록 했습니다.

      • -
      -
      -img_14 -
      -

      Fig. 113 Samples when increasing guidance scale for both unCLIP and GLIDE.#

      -
      -
      -
      -img_15 -
      -

      Fig. 114 Comparison of unCLIP and GLIDE for different evaluations.#

      -
      -
      -
      -img_16 -
      -

      Fig. 115 FID versus guidance scale for unCLIP and GLIDE.#

      -
      -
      -

      결론은 다음과 같습니다.

      -
        -
      1. GLIDE 에 비해서 Photorealism, Caption Similarity, 은 Comparable 했습니다.
        -(안 좋다.)

      2. -
      3. 하지만, Diversity 는 훨씬 뛰어났습니다.

      4. -
      -
    • -
    -
    -
      -
    • Image Manipulations 가 가능합니다.

      -
        -
      • Bipartite Representation

        -
          -
        • unCLIP 구조 덕분에,
          -주어진 이미지 x 를 (z_i, x_T) 와 같은 bipartite latent representation 로 인코딩 가능합니다.

        • -
        • 이 latent space 를 활용해서, Image manipulation 을 수행할 수 있습니다.

        • -
        • x_T 는 DDIM inversion 을 z_i 가 condition 된 x 에 적용해 얻으며,
          -Decoder 가 x 를 복원하는데 필요한 잔여 정보들을 지닙니다.

        • -
        -
      • -
      -
      -
        -
      1. Variations

        -
        -img_17 -
        -

        Fig. 116 Variations of an input image by encoding with CLIP and then decoding with a diffusion model.#

        -
        -
        -
          -
        • Non-essential details 를 변주하기 위해서,
          -bipartite representation 에 DDIM with η > 0 for sampling decoder 를 적용합니다.

        • -
        • η = 0 일 때, decoder 는 deterministic 해지고 x 자체를 복원해냅니다.

        • -
        • η 가 커질수록, sampling steps 에는 stochasticity 가 생기고,
          -원본 이미지 x 근처에서 perceptually “centereed” 된 variations 를 만들어낼 것입니다.

        • -
        • η 를 키우면, 우리는 CLIP image embedding 에 어떤 정보가 존재하고 어떤 정보가 유실되었는지 탐색 가능합니다.
          -→ 즉, CLIP latent space 를 탐색해낼 수 있는거죠 !

        • -
        -
      2. -
      -
      -
        -
      1. Interpolations

        -
        -img_18 -
        -

        Fig. 117 Variations between two images by interpolating their CLIP image embedding and then decoding with a diffusion model.#

        -
        -
        -
          -
        • 이런 것도 됩니다.
          -input image 두 장의 CLIP image embeddings 를 interpolation 해서 Decoder 에 준다면,
          -interpolated image 를 생성할 수 있습니다.

        • -
        -
      2. -
      -
      -
        -
      1. Text Diffs

        -
        -img_19 -
        -

        Fig. 118 Text diffs applied to images by interpolating between their CLIP image embeddings and a normalised difference of the CLIP text embeddings produced from the two descriptions.#

        -
        -
        -
          -
        • 어떤 이미지와 그 캡션이 주어져있을 때,
          -그 이미지를 우리가 원하는 target text prompt 에 맞게 조작할 수도 있습니다.

        • -
        • Method

          -
            -
          • z_t0 = current CLIP text embedding 이고,

          • -
          • z_t = target CLIP text embedding 이라면,

          • -
          -
          -img_19_2 -
          -

          Fig. 119 text diff method#

          -
          -
          -
        • -
        • 주어진 이미지의 CLIP image embdding z_i
          -바로 이 text diff vector 와 interpolate 해서 Decoding 하면 이미지가 조작됩니다.

        • -
        -
      2. -
      -
    • -
    -
    -
      -
    • typographic attaks 에 대해서, Robust 합니다.

      -
        -
      • typographic attacks : 이미지 내 사물 위에, 글씨가 쓰여 있는 경우입니다.

      • -
      • Multimodal 로 학습한 CLIP 은 텍스트에 있는 정보를 더 많이 활용해
        -사물을 판단하는 경향이 있습니다.

        -
          -
        1. unCLIP 의 Decoder 모델에 “iPod” 텍스트 종이가 붙은 사과를 보고 분류를 수행해보았습니다.

        2. -
        3. 역시, “Granny Smith” 의 예측 확률을 거의 0 에 가깝다고 판단했습니다.

        4. -
        5. 그럼에도 불구하고, 사과의 사진으로 recover 해냅니다.

        6. -
        -
        -img_20 -
        -

        Fig. 120 Variations of images featuring typographic attacks#

        -
        -
        -

        이처럼 DALLE2 는 typographic attacks 에 더욱 robust 합니다.

        -
      • -
      -
    • -
    -
  • -
-
-
    -
  • 이 모델, 단점은 없나요?

    -
    -
      -
    1. 객체(cubes)와 그들의 속성(colors) 을 매칭시키는 능력이 떨어집니다.

    2. -
    -
    -img_21 -
    -

    Fig. 121 Samples from unCLIP and GLIDE for the prompt “a red cube on top of a blue cube”.#

    -
    -
    -

    위 그림처럼, 파란 큐브 위에 빨간 큐브를 그려달라고 했을 때,
    -DALLE2 는 아래의 큐브와 위의 큐브에 각각 어떤 색상 (attributes) 를 부여해야할지 헷갈려합니다.

    -
    -
      -
    1. 텍스트를 일관성있게 생성하는 능력이 떨어집니다

    2. -
    -
    -img_22 -
    -

    Fig. 122 Samples from unCLIP for the prompt, “A sign that says deep learning.”#

    -
    -
    -

    물론 이것은 DALLE2 만의 문제는 아닙니다.
    -많은 text-to-image models 가 어려워하는 문제입니다.

    -
    -
      -
    1. 복잡한 상황에서 디테일을 묘사하는 능력이 떨어집니다

    2. -
    -
    -img_23 -
    -

    Fig. 123 unCLIP samples show low levels of detail for some complex scenes.#

    -
    -
    -

    복잡한 네온 사인들의 디테일들이 좀 떨어지는 것을 확인하실 수 있습니다.

    -
  • -
-
-
    -
  • Method - Training

    -
      -
    • 본 논문의 Method 에서는, unCLIP 모델의 아키텍쳐에 대한 수학적 justify 를 하고 있습니다.

    • -
    • Training 데이터셋의 이미지를 x 라 합시다.

    • -
    • 그에 상응하는 text captions 을 y 라 합시다.

    • -
    • 각각에 대한 embeddings 인 Z_i, Z_t 를 기존의 CLIP 으로 생성합니다.

      -
        -
      • image x —CLIP Image encoder—> Z_i image embeddings

      • -
      • text caption y —CLIP text encoder—> Z_t text embeddings

      • -
      -
    • -
    -
    -
      -
    • 저자의 주장

      -
        -
      • unCLIP 으로, text caption y 로부터 image x 를 샘플링할 수 있다고 합니다.

        -
        -img_24 -
        -

        Fig. 124 P(x|y) equation.#

        -
        -
        -
      • -
      • The first equality holds because z_i is a deterministic function of x.

      • -
      • The second equality holds because of the chain rule.

      • -
      -
    • -
    -
    -
      -
    • 포스팅을 위한 부가 설명

      -
        -
      • z_t 도 y 의 deterministic function 이므로, 다음과 같이 쓸 수 있죠.

        -
        -\[ - P(x|y) = P(x, z_i|y, z_t) = P(x|z_i, y, z_t)P(z_i|y, z_t) - \]
        -
      • -
      • 즉 위 공식을 풀어서 해설해보면 다음과 같습니다.
        -Prior 를 사용해 Z_t 로부터 Z_i 를 샘플링하고,
        -Decoder 를 사용해 x 를 샘플링함으로써
        -True conditional distribution 인 P(x|y) 샘플링이 가능해지는 것입니다.

      • -
      -
    • -
    -
  • -
-
-
    -
  • DALL-E 2 Bias

    -
    -

    개인적으로 DALLe2 와 같은 모델에 Bias 는 없는지 궁금해서 추가적으로 공부해봤습니다.
    -DALLE2 에 Bias 가 있는지,
    -Bias 가 있다면 해소하기 위해 어떤 노력을 하고있는지,
    -Bias 는 대체 어떻게 정량적으로 평가할 수 있는지 조사해봤습니다.

    -

    결과부터 말씀드리면, DALLE2 처럼, 웹크롤링 데이터를 학습한 모델은 Bias 가 존재한다고 합니다.
    -이런 Bias 를 해소하기 위해서 OpenAI 는 어떤 노력을 하고있는지부터 살펴볼까요?

    -

    openai/dalle-2-preview

    -
      -
    • 현재 OpenAI 가 DALL-E 2 의 Safety 를 위해 하고 있는 노력

      -
        -
      1. 학습 데이터에서 violent, hate, or adult images 를 제거함으로써
        -이러한 이미지들에 DALL-E 2 가 노출되는 시간을 최소화했다고 합니다.

      2. -
      3. Safety policies 를 위반한 text prompts 혹은 생성된 images 를 자정하는 시스템을 보유하고 있다고 합니다.

      4. -
      5. 신뢰할 수 있는 전문가들과 DALL-E 2 에 대한 사전 검토를 진행했다고 합니다.

      6. -
      -
    • -
    -
    -
      -
    • DALL-EVAL : 이미지 생성형 AI 의 Bias 를 평가하는 방법 소개

      -

      DALLE 와 같은 Text-to-Image 생성형 모델을 정량적으로 평가하는 기법이 있습니다.
      -바로 DALL-EVAL 입니다.

      -

      https://arxiv.org/pdf/2202.04053.pdf

      -

      j-min/DallEval

      -
        -
      • Contribution

        -
          -
        • Text to Image Generation models 의 시각적 추론 능력 3가지를 평가하기 위한 데이터셋 제공합니다.

        • -
        • 최근의 모델들이 object recognition skill 은 상대적으로 뛰어나지만,
          -object counting 및 spaial relation 이해 능력은 떨어짐을 발견했습니다.

        • -
        • Text to Image Generation models 에 존재하는
          -gender 및 skin tone biases 를 측정하는 evaluation metrics 와 그 분석 결과를 제시한 최초의 논문 입니다.

          -
            -
          • web 에서 image-text pairs 를 학습한 현재 T2I 생성 모델들은
            -특정한 gender/skin tone biases 를 학습했음을 보여주었습니다.

          • -
          -
        • -
        -
        -img_26 -
        -

        Fig. 125 Overview of DALL-EVAL evaluation process.#

        -
        -
        -
      • -
      • Social Bias Evaluation 측정 방법 (Sec. 4.2.1 참고)

        -
        -img_27 -
        -

        Fig. 126 Overview of DALL-EVAL’s social bias evaluation process.#

        -
        -
        -

        DALL-EVAL 의 자세한 social bias evaluation process 는 다음과 같습니다.

        -
          -
        1. 우선 Diagnostic prompts 로 이미지들을 생성합니다.

          -
            -
          1. ex) “a person who works as a nurse”

          2. -
          3. 총 252개의 Diagnostic prompts 제공

          4. -
          -
        2. -
        3. Gender, Skin tone, Attributes 를 생성된 이미지로부터 탐지합니다.

          -
            -
          1. using automated detection models and verify the reliability of detection models with human evaluation

          2. -
          3. Gender

            -
              -
            1. BLIP-2 라는 모델에 생성된 영상을 주면서 영상 내 사람의 성별을 맞추게 합니다.
              -BLIP-2 의 답변을 기반으로 Gender Bias 측정합니다.

            2. -
            -
          4. -
          5. Skin tone

            -
              -
            1. 신경망으로 facial landmark 를 추출하고, illumination 을 측정합니다.

            2. -
            -
          6. -
          7. Attributes

            -
              -
            1. BLIP-2 라는 모델에 생성된 영상을 주면서 영상 내 사람의 복장을 맞추게 합니다.
              -BLIP-2 의 답변을 기반으로 Attributes Bias 측정합니다.

            2. -
            -
          8. -
          -
        4. -
        5. 탐지된 Gender, Skin tone, Attributes 가
          -unbiased uniform distribution 으로부터 얼마나 skewed 되어있는지 측정합니다.

        6. -
        -
      • -
      -
      -
        -
      • 실험 결과

        -
        -img_28 -
        -

        Fig. 127 Gender, skin tone, and attribute detection results with automated and expert human evaluation.#

        -
        -
        -
        -img_29 -
        -

        Fig. 128 Per-profession examples and average gender bias or average skin tone bias of images.#

        -
        -
        -
        -img_30 -
        -

        Fig. 129 Comparison of overall gender and skin tone bias of each model.#

        -
        -
        -
      • -
      -

      위 실험 결과와 같이, DALL-EVAL 은 Text-to-Image models 를 정량적으로 평가하는데에 성공했습니다.
      -Satble Diffusion 처럼 웹크롤링을 활용해 데이터를 학습한 모델은 Bias 가 존재했습니다.
      -이처럼 생성형 AI 의 Bias 를 측정하기 위한 다양한 노력이 지속되고 있습니다.
      -미래에는 생성형 AI 가 더 안전하게 활용될 수 있기를 기대합니다.

      -
    • -
    -
  • -
-
- - - - -
- - - - - - -
- - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + DALL-E 2 — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

DALL-E 2

+ +
+
+ +
+
+
+ + + + +
+ +
+

Information

+
    +
  • Title: Hierarchical Text-Conditional Image Generation with CLIP Latents (arXiv 2022)

  • +
  • Reference

    + +
  • +
  • Author: SeonHoon Kim

  • +
  • Last updated on Sep. 18, 2023

  • +
+
+
+

DALL-E 2#

+

DALLE2 는 2022년에 공개되어 세상을 놀라게 했습니다.
+이미지 생성 능력도 뛰어났고, 이미지를 사용자 입맛에 맞게 조작할 수 있게 되었죠.

+

DALLE2 의 이름은 왜 DALL-E 일까요?
+DALLE2 의 DALLE 는 초현실주의 화가 Salvador Dali 와 WALL-E 의 합성어입니다.
+DALLE2 로 생성해낸 결과물이 과연 어떻길래 세상을 놀라게 했을까요?

+
+
    +
  • DALL-E 2 결과물

    +
    +img_01 +
    +

    Fig. 101 Salvador Dali 의 생전 모습#

    +
    +
    +
    +img_00 +
    +

    Fig. 102 vibrant portrait of Salvador Dali with a robotic half face from DALLE2#

    +
    +
    +

    위 그림은 DALLE2 가 생성해낸 “vibrant portrait of Salvador Dali with a robotic half face” 이미지입니다.
    +실제 Salvador dali 의 모습이 보이네요.
    +게다가 Salvador dali 의 초현실주의적 그림체가 반영된 것 같기도 합니다.
    +놀라운 이미지입니다.

    +

    아래의 corgi 그림은 어떤가요 ?

    +
    +img_02 +
    +

    Fig. 103 a corgi’s head depicted as an explosion of a nebula from DALLE2#

    +
    +
    +

    corgi 의 모습을 성운의 폭발로 묘사해달라고 했을 때 생성된 그림입니다.
    +아래의 그림은, 실제 NASA 에서 촬영한 초신성 폭발의 잔해입니다.

    +

    정말 그럴듯하지 않나요?

    +
    +img_03 +
    +

    Fig. 104 This mosaic image, one of the largest ever taken by NASA’s Hubble Space Telescope of the Crab Nebula, is a six-light-year-wide expanding remnant of a star’s supernova explosion.#

    +
    +
    +
  • +
+
+
    +
  • 학습 목표 및 주의사항

    +
      +
    • 본 포스팅에서는 DALLE2 paper 의 내용을 비선형적으로 살펴봅니다.
      +마치 오픈월드 게임처럼 말이죠.
      +핵심이 되는 질문들을 던지며, DALLE2 의 아키텍쳐를 파헤쳐 볼 겁니다.

    • +
    • 본 포스팅은 DALL-E 2 paper, OpenAI blog, AssemblyAI Youtube, Eden Meyer Youtube 를 참고했습니다.

    • +
    • 본격적으로 학습하기 전에 알아야할 것은, CLIP 모델입니다.

      +
        +
      • CLIP 은, 이미지와 text 를 학습한 multi-modal 모델입니다.

        +
          +
        • The fundamental principles of training CLIP are quite simple:

          +
            +
          1. First, all images and their associated captions are passed through their respective encoders, mapping all objects into an m-dimensional space.

          2. +
          3. Then, the cosine similarity of each (image, text) pair is computed.

          4. +
          5. The training objective is to simultaneously maximize the cosine similarity between N correct encoded image/caption pairs and minimize the cosine similarity between N - N incorrect encoded image/caption pairs.

          6. +
          +
        • +
        +
      • +
      +
    • +
    • DALL-E 2 는 CLIP 과 Diffusion Model 을 통합시켰습니다. (최초는 x)

    • +
    • 하지만 CLIP 을 사용하는 것이 정답은 아닙니다.
      +DALL-E 2 는 22년 5월, CLIP 을 사용하지 않은 IMAGEN 에게 SOTA 를 내주었습니다.

    • +
    +
  • +
+
+
    +
  • 아키텍쳐 찍먹하기

    +

    특정 이미지 내의 Semantics 와 style 을 모두 포착해낼 수 있는 CLIP 의 이미지 표현 능력을 끌어올리기 위해서,
    +저자들은 CLIP 과 Diffusion 모델을 통합한 Two-stage model 을 제안합니다.
    +이것이 바로 DALLE2 인데요.
    +저자들은 이 모델을 unCLIP 이라고 부릅니다.

    +
    +img_06 +
    +

    Fig. 105 A high level overview of the architecture.#

    +
    +
    +

    DALLE2 paper 의 그림은 좀 복잡해보이니,
    +Assembly AI 의 Youtube 에서 제공하는 좀 더 단순화된 그림을 살펴볼게요.

    +
    +img_07 +
    +

    Fig. 106 A high level overview of the architecture from AssemblyAI youtube.#

    +
    +
    +

    https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI

    +

    Prior 와 Decoder 가 DALLE2 의 핵심이 되는 모델인 것 같네요.

    +
      +
    • Prior : 텍스트 캡션을 받아서, 상응하는 CLIP image embedding 을 생성합니다.

      +
        +
      • 본 논문에서는 Autogregressive prior 와 Diffusion prior 를 비교하는 실험 수행했습니다.

      • +
      • Diffusion prior 가 computationally efficient 하고, 고품질 이미지 생성합니다.
        +따라서 후반부에는 Diffusion prior 만 사용해서 실험합니다.

      • +
      +
    • +
    • Decoder : CLIP image embedding 을 받아서, 이미지를 생성합니다.

      +
        +
      • Diffusion 모델만 사용했습니다.

      • +
      +
    • +
    +
  • +
+
+
    +
  • 왜 CLIP 이랑 Diffusion 을 사용했을까요?

    +
      +
    • CLIP

      +
        +
      • CLIP 이 images representation 을 학습하는데 에 큰 성공을 거두고 있었습니다.

      • +
      • CLIP embeddings 는 image distribution shift 에 robust 했습니다.

      • +
      • CLIP embeddings 는 zero-shot capabilities 가 뛰어났습니다.

      • +
      • 다양한 vision & language tasks 에 fine-tuned 되어 SOTA 를 달성해냈습니다.

      • +
      +
    • +
    • Diffusion

      +
        +
      • Diffusion 은 image 와 video generation taks 에서 SOTA 를 갱신하는 중이었죠.

      • +
      • non-deterministic 하게 만들 수 있습니다.
        +이러한 Decoder 덕분에, CLIP image embedding 과 같은
        +image representation 에 존재하지 않는 non-essential 한 details변주하면서,
        +image representation 의 semantics 와 style 은 유지할 수 있죠.

      • +
      +
      +img_08 +
      +

      Fig. 107 Variations of an input image by encoding with CLIP and then decoding with a diffusion model.#

      +
      +
      +

      위 왼쪽의 그림처럼, Salvador dali 의 그림에서 중요한 objects 들은 보존됩니다.
      +하지만 그들이 표현되는 방식이나 전체적인 그림의 style 은 조금씩 바뀝니다.
      +그럼에도, Salvador dali 특유의 초현실주의적 화풍은 유지되는 것 같네요.
      +Diffusion Decoder 덕분에, Non-essential details
      +마치 변주곡처럼 매번 새롭게 연주해낼 수 있는겁니다.

      +
    • +
    +
  • +
+
+
    +
  • 아키텍쳐 파헤치기

    +
    +img_09 +
    +

    Fig. 108 A high level overview of the architecture from AssemblyAI youtube.#

    +
    +
    +

    https://www.youtube.com/watch?v=F1X4fHzF4mQ&t=360s&ab_channel=AssemblyAI +

    +

    이번에는 DALLE2 의 아키텍쳐를 좀 더 자세히 살펴보죠.

    +
      +
    • Prior

      +
        +
      • input

        +
          +
        • Caption 그 자체의 embedding vector 입니다.

        • +
        • CLIP text embedding 입니다.

        • +
        +
      • +
      • output

        +
          +
        • Generated CLIP Image embedding 입니다.

        • +
        +
      • +
      • 설명

        +
          +
        • 사실 Prior 은 CLIP text embedding 만 조건으로 받는 것이 아니라 Caption 자체도 받습니다.
          +(물론 embedding vector 로 받겠죠)
          +CLIP text embedding 과, 그 Caption 은 서로 1대1 대응되기 때문에,
          +Duel-conditioning 이 문제될 것은 없다고 저자들은 변론합니다.

        • +
        • 샘플 퀄리티를 높이기 위해서 2개의 CLIP image embeddings 를 생성한 후
          +주어진 CLIP text embedding 과 더 높은 dot product 를 갖는 CLIP image embedding 을 사용했다고 합니다.

        • +
        +
      • +
      +
    • +
    • Decoder

      +
        +
      • Input

        +
          +
        • CLIP text embedding

        • +
        • Generated CLIP Image embedding

        • +
        +
      • +
      • Output

        +
          +
        • Generated Image

        • +
        +
      • +
      • 설명

        +
          +
        • modified GLIDE model 을 Decoder 로 사용했습니다.
          +→ 따라서, projected CLIP text embeddings 를 아키텍쳐에 통합시킬 수 있다고 주장합니다. +
          +어떻게 통합시키냐하면,

        • +
        +
          +
        1. GLIDE timestep embedding 에 추가하고,

        2. +
        3. 4개의 extra context tokens 을 만들어서 GLIDE text encoder 의 output sequence 에 concat 하는거죠. +
          +이 방법으로 CLIP image embeddings 를 받아서, 원본 영상을 생성하는 것 입니다.

        4. +
        +
        +img_10 +
        +

        Fig. 109 GLIDE training process#

        +
        +
        +
          +
        • GLIDE 를 수정해 사용함으로써 GLIDE 가 가지고 있던
          +text-conditional photorealistic image generation capabilities 를 활용할 수 있다고 주장합니다.

        • +
        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • 그렇다면 왜 Prior 가 필요할까요?

    +
      +
    1. To obtain a full generative model of images,
      +we combine the CLIP image embedding decoder with a prior model,
      +which generates possible CLIP image embeddings from a given text caption

    2. +
    +

    라고 하지만.. 딱히 와닿지는 않습니다.
    +하지만 아직 실망하긴 이릅니다.
    +Prior 의 유무에 따라, 생성된 이미지의 품질을 비교하는 실험을 수행했다고 합니다.
    +한번 살펴볼까요?

    +
      +
    1. 아래 세 가지 아키텍쳐를 비교하는 실험 수행
      +(1) GLIDE 모델처럼, text 의 token embeddings 만 조건으로 주어 실험
      +(2) 추가적으로, CLIP text embeddings 를 조건으로 주어 실험
      +(3) 추가적으로, CLIP image embeddings 를 생성해내는 Prior 를 갖추고 실험
      +
      +실험 결과, (3) 이 가장 훌륭했습니다.
      +특히 image diversity 가 뛰어났습니다.

    2. +
    +
    +img_11 +
    +

    Fig. 110 3가지 경우의 아키텍쳐에 따른 실험 결과 from AssemblyAI youtube.#

    +
    +
    +
    +img_12 +
    +

    Fig. 111 Samples using different conditioning signals for the same decoder.#

    +
    +
    +

    그렇지만, 의문이 말끔히 해소되지는 않습니다. +왜냐하면..

    +
      +
    • 95% 의 학습 시간 동안, (3) 방식으로 학습한 Decoder 를,
      +(1) 과 (2) 방식에 그대로 적용해 실험했습니다.
      +따라서 공정한 실험이라고 보긴 어려울 것 같습니다.

    • +
    • Decoder 를, True CLIP Image embeddings 와 Generated CLIP Image embeddings 로
      +각각 학습시켰을 때의 성능 비교 실험은 없습니다. +
      +개인적으로 저는 이러한 결과들을 보고,
      +Prior 를 반드시 써야하는 근거에 대한 설득력이 떨어진다고 생각했습니다.

    • +
    +
  • +
+
+
    +
  • 왜 CLIP 을 써야할까요?

    +
      +
    1. CLIP 은 어떤 객체를 묘사한 텍스트와, 그 객체의 시각적 발현 사이의 의미론적 관계를 학습했습니다.
      +따라서 저자들은 이러한 CLIP 의 능력이 Text-to-Image task 에서 매우 중요하다고 주장합니다.

    2. +
    3. CLIP 을 활용한 덕분에 이미지를 Manipulation 할 수 있습니다.

    4. +
    +
    +img_13 +
    +

    Fig. 112 Text diffs applied to images by interpolating between their CLIP image embeddings and a normalised difference of the CLIP text embeddings produced from the two descriptions.#

    +
    +
    +

    어떻게 이미지를 Manipulation 하는지는 곧 자세히 살펴보겠습니다.

    +
  • +
+
+
    +
  • 그래서 이 모델은 뭐가 좋은가요?

    +
      +
    • Evaluation 결과, Diversity 가 뛰어났습니다.

      +
        +
      • 모델을 평가하기 위해서,
        +주어진 Caption 에 대한 GLIDE 의 생성물과 unCLIP 의 생성물을 사람들에게 제시하고,
        +Photorealism, Caption Similarity, Diversity 에 대해서 점수를 매기도록 했습니다.

      • +
      +
      +img_14 +
      +

      Fig. 113 Samples when increasing guidance scale for both unCLIP and GLIDE.#

      +
      +
      +
      +img_15 +
      +

      Fig. 114 Comparison of unCLIP and GLIDE for different evaluations.#

      +
      +
      +
      +img_16 +
      +

      Fig. 115 FID versus guidance scale for unCLIP and GLIDE.#

      +
      +
      +

      결론은 다음과 같습니다.

      +
        +
      1. GLIDE 에 비해서 Photorealism, Caption Similarity, 은 Comparable 했습니다.
        +(안 좋다.)

      2. +
      3. 하지만, Diversity 는 훨씬 뛰어났습니다.

      4. +
      +
    • +
    +
    +
      +
    • Image Manipulations 가 가능합니다.

      +
        +
      • Bipartite Representation

        +
          +
        • unCLIP 구조 덕분에,
          +주어진 이미지 x 를 (z_i, x_T) 와 같은 bipartite latent representation 로 인코딩 가능합니다.

        • +
        • 이 latent space 를 활용해서, Image manipulation 을 수행할 수 있습니다.

        • +
        • x_T 는 DDIM inversion 을 z_i 가 condition 된 x 에 적용해 얻으며,
          +Decoder 가 x 를 복원하는데 필요한 잔여 정보들을 지닙니다.

        • +
        +
      • +
      +
      +
        +
      1. Variations

        +
        +img_17 +
        +

        Fig. 116 Variations of an input image by encoding with CLIP and then decoding with a diffusion model.#

        +
        +
        +
          +
        • Non-essential details 를 변주하기 위해서,
          +bipartite representation 에 DDIM with η > 0 for sampling decoder 를 적용합니다.

        • +
        • η = 0 일 때, decoder 는 deterministic 해지고 x 자체를 복원해냅니다.

        • +
        • η 가 커질수록, sampling steps 에는 stochasticity 가 생기고,
          +원본 이미지 x 근처에서 perceptually “centereed” 된 variations 를 만들어낼 것입니다.

        • +
        • η 를 키우면, 우리는 CLIP image embedding 에 어떤 정보가 존재하고 어떤 정보가 유실되었는지 탐색 가능합니다.
          +→ 즉, CLIP latent space 를 탐색해낼 수 있는거죠 !

        • +
        +
      2. +
      +
      +
        +
      1. Interpolations

        +
        +img_18 +
        +

        Fig. 117 Variations between two images by interpolating their CLIP image embedding and then decoding with a diffusion model.#

        +
        +
        +
          +
        • 이런 것도 됩니다.
          +input image 두 장의 CLIP image embeddings 를 interpolation 해서 Decoder 에 준다면,
          +interpolated image 를 생성할 수 있습니다.

        • +
        +
      2. +
      +
      +
        +
      1. Text Diffs

        +
        +img_19 +
        +

        Fig. 118 Text diffs applied to images by interpolating between their CLIP image embeddings and a normalised difference of the CLIP text embeddings produced from the two descriptions.#

        +
        +
        +
          +
        • 어떤 이미지와 그 캡션이 주어져있을 때,
          +그 이미지를 우리가 원하는 target text prompt 에 맞게 조작할 수도 있습니다.

        • +
        • Method

          +
            +
          • z_t0 = current CLIP text embedding 이고,

          • +
          • z_t = target CLIP text embedding 이라면,

          • +
          +
          +img_19_2 +
          +

          Fig. 119 text diff method#

          +
          +
          +
        • +
        • 주어진 이미지의 CLIP image embdding z_i
          +바로 이 text diff vector 와 interpolate 해서 Decoding 하면 이미지가 조작됩니다.

        • +
        +
      2. +
      +
    • +
    +
    +
      +
    • typographic attaks 에 대해서, Robust 합니다.

      +
        +
      • typographic attacks : 이미지 내 사물 위에, 글씨가 쓰여 있는 경우입니다.

      • +
      • Multimodal 로 학습한 CLIP 은 텍스트에 있는 정보를 더 많이 활용해
        +사물을 판단하는 경향이 있습니다.

        +
          +
        1. unCLIP 의 Decoder 모델에 “iPod” 텍스트 종이가 붙은 사과를 보고 분류를 수행해보았습니다.

        2. +
        3. 역시, “Granny Smith” 의 예측 확률을 거의 0 에 가깝다고 판단했습니다.

        4. +
        5. 그럼에도 불구하고, 사과의 사진으로 recover 해냅니다.

        6. +
        +
        +img_20 +
        +

        Fig. 120 Variations of images featuring typographic attacks#

        +
        +
        +

        이처럼 DALLE2 는 typographic attacks 에 더욱 robust 합니다.

        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • 이 모델, 단점은 없나요?

    +
    +
      +
    1. 객체(cubes)와 그들의 속성(colors) 을 매칭시키는 능력이 떨어집니다.

    2. +
    +
    +img_21 +
    +

    Fig. 121 Samples from unCLIP and GLIDE for the prompt “a red cube on top of a blue cube”.#

    +
    +
    +

    위 그림처럼, 파란 큐브 위에 빨간 큐브를 그려달라고 했을 때,
    +DALLE2 는 아래의 큐브와 위의 큐브에 각각 어떤 색상 (attributes) 를 부여해야할지 헷갈려합니다.

    +
    +
      +
    1. 텍스트를 일관성있게 생성하는 능력이 떨어집니다

    2. +
    +
    +img_22 +
    +

    Fig. 122 Samples from unCLIP for the prompt, “A sign that says deep learning.”#

    +
    +
    +

    물론 이것은 DALLE2 만의 문제는 아닙니다.
    +많은 text-to-image models 가 어려워하는 문제입니다.

    +
    +
      +
    1. 복잡한 상황에서 디테일을 묘사하는 능력이 떨어집니다

    2. +
    +
    +img_23 +
    +

    Fig. 123 unCLIP samples show low levels of detail for some complex scenes.#

    +
    +
    +

    복잡한 네온 사인들의 디테일들이 좀 떨어지는 것을 확인하실 수 있습니다.

    +
  • +
+
+
    +
  • Method - Training

    +
      +
    • 본 논문의 Method 에서는, unCLIP 모델의 아키텍쳐에 대한 수학적 justify 를 하고 있습니다.

    • +
    • Training 데이터셋의 이미지를 x 라 합시다.

    • +
    • 그에 상응하는 text captions 을 y 라 합시다.

    • +
    • 각각에 대한 embeddings 인 Z_i, Z_t 를 기존의 CLIP 으로 생성합니다.

      +
        +
      • image x —CLIP Image encoder—> Z_i image embeddings

      • +
      • text caption y —CLIP text encoder—> Z_t text embeddings

      • +
      +
    • +
    +
    +
      +
    • 저자의 주장

      +
        +
      • unCLIP 으로, text caption y 로부터 image x 를 샘플링할 수 있다고 합니다.

        +
        +img_24 +
        +

        Fig. 124 P(x|y) equation.#

        +
        +
        +
      • +
      • The first equality holds because z_i is a deterministic function of x.

      • +
      • The second equality holds because of the chain rule.

      • +
      +
    • +
    +
    +
      +
    • 포스팅을 위한 부가 설명

      +
        +
      • z_t 도 y 의 deterministic function 이므로, 다음과 같이 쓸 수 있죠.

        +
        +\[ + P(x|y) = P(x, z_i|y, z_t) = P(x|z_i, y, z_t)P(z_i|y, z_t) + \]
        +
      • +
      • 즉 위 공식을 풀어서 해설해보면 다음과 같습니다.
        +Prior 를 사용해 Z_t 로부터 Z_i 를 샘플링하고,
        +Decoder 를 사용해 x 를 샘플링함으로써
        +True conditional distribution 인 P(x|y) 샘플링이 가능해지는 것입니다.

      • +
      +
    • +
    +
  • +
+
+
    +
  • DALL-E 2 Bias

    +
    +

    개인적으로 DALLe2 와 같은 모델에 Bias 는 없는지 궁금해서 추가적으로 공부해봤습니다.
    +DALLE2 에 Bias 가 있는지,
    +Bias 가 있다면 해소하기 위해 어떤 노력을 하고있는지,
    +Bias 는 대체 어떻게 정량적으로 평가할 수 있는지 조사해봤습니다.

    +

    결과부터 말씀드리면, DALLE2 처럼, 웹크롤링 데이터를 학습한 모델은 Bias 가 존재한다고 합니다.
    +이런 Bias 를 해소하기 위해서 OpenAI 는 어떤 노력을 하고있는지부터 살펴볼까요?

    +

    openai/dalle-2-preview

    +
      +
    • 현재 OpenAI 가 DALL-E 2 의 Safety 를 위해 하고 있는 노력

      +
        +
      1. 학습 데이터에서 violent, hate, or adult images 를 제거함으로써
        +이러한 이미지들에 DALL-E 2 가 노출되는 시간을 최소화했다고 합니다.

      2. +
      3. Safety policies 를 위반한 text prompts 혹은 생성된 images 를 자정하는 시스템을 보유하고 있다고 합니다.

      4. +
      5. 신뢰할 수 있는 전문가들과 DALL-E 2 에 대한 사전 검토를 진행했다고 합니다.

      6. +
      +
    • +
    +
    +
      +
    • DALL-EVAL : 이미지 생성형 AI 의 Bias 를 평가하는 방법 소개

      +

      DALLE 와 같은 Text-to-Image 생성형 모델을 정량적으로 평가하는 기법이 있습니다.
      +바로 DALL-EVAL 입니다.

      +

      https://arxiv.org/pdf/2202.04053.pdf

      +

      j-min/DallEval

      +
        +
      • Contribution

        +
          +
        • Text to Image Generation models 의 시각적 추론 능력 3가지를 평가하기 위한 데이터셋 제공합니다.

        • +
        • 최근의 모델들이 object recognition skill 은 상대적으로 뛰어나지만,
          +object counting 및 spaial relation 이해 능력은 떨어짐을 발견했습니다.

        • +
        • Text to Image Generation models 에 존재하는
          +gender 및 skin tone biases 를 측정하는 evaluation metrics 와 그 분석 결과를 제시한 최초의 논문 입니다.

          +
            +
          • web 에서 image-text pairs 를 학습한 현재 T2I 생성 모델들은
            +특정한 gender/skin tone biases 를 학습했음을 보여주었습니다.

          • +
          +
        • +
        +
        +img_26 +
        +

        Fig. 125 Overview of DALL-EVAL evaluation process.#

        +
        +
        +
      • +
      • Social Bias Evaluation 측정 방법 (Sec. 4.2.1 참고)

        +
        +img_27 +
        +

        Fig. 126 Overview of DALL-EVAL’s social bias evaluation process.#

        +
        +
        +

        DALL-EVAL 의 자세한 social bias evaluation process 는 다음과 같습니다.

        +
          +
        1. 우선 Diagnostic prompts 로 이미지들을 생성합니다.

          +
            +
          1. ex) “a person who works as a nurse”

          2. +
          3. 총 252개의 Diagnostic prompts 제공

          4. +
          +
        2. +
        3. Gender, Skin tone, Attributes 를 생성된 이미지로부터 탐지합니다.

          +
            +
          1. using automated detection models and verify the reliability of detection models with human evaluation

          2. +
          3. Gender

            +
              +
            1. BLIP-2 라는 모델에 생성된 영상을 주면서 영상 내 사람의 성별을 맞추게 합니다.
              +BLIP-2 의 답변을 기반으로 Gender Bias 측정합니다.

            2. +
            +
          4. +
          5. Skin tone

            +
              +
            1. 신경망으로 facial landmark 를 추출하고, illumination 을 측정합니다.

            2. +
            +
          6. +
          7. Attributes

            +
              +
            1. BLIP-2 라는 모델에 생성된 영상을 주면서 영상 내 사람의 복장을 맞추게 합니다.
              +BLIP-2 의 답변을 기반으로 Attributes Bias 측정합니다.

            2. +
            +
          8. +
          +
        4. +
        5. 탐지된 Gender, Skin tone, Attributes 가
          +unbiased uniform distribution 으로부터 얼마나 skewed 되어있는지 측정합니다.

        6. +
        +
      • +
      +
      +
        +
      • 실험 결과

        +
        +img_28 +
        +

        Fig. 127 Gender, skin tone, and attribute detection results with automated and expert human evaluation.#

        +
        +
        +
        +img_29 +
        +

        Fig. 128 Per-profession examples and average gender bias or average skin tone bias of images.#

        +
        +
        +
        +img_30 +
        +

        Fig. 129 Comparison of overall gender and skin tone bias of each model.#

        +
        +
        +
      • +
      +

      위 실험 결과와 같이, DALL-EVAL 은 Text-to-Image models 를 정량적으로 평가하는데에 성공했습니다.
      +Satble Diffusion 처럼 웹크롤링을 활용해 데이터를 학습한 모델은 Bias 가 존재했습니다.
      +이처럼 생성형 AI 의 Bias 를 측정하기 위한 다양한 노력이 지속되고 있습니다.
      +미래에는 생성형 AI 가 더 안전하게 활용될 수 있기를 기대합니다.

      +
    • +
    +
  • +
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/DDIM.html b/docs/review/DDIM.html old mode 100644 new mode 100755 index 6b5881b0..3244305e --- a/docs/review/DDIM.html +++ b/docs/review/DDIM.html @@ -1,963 +1,983 @@ - - - - - - - - - - - - DDIM — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

DDIM#

-
-

Abstract#

-
    -
  • DDPM의 단점인 Markov Process를 Non markovian process로 정의함으로서 Time efficient, deterministic한 Sampling이 가능한 모델을 제안

    -
      -
    • Deterministic vs Stochastic

    • -
    -
  • -
-
-
-

1. Introduction#

-
    -
  • 생성 분야에서 GAN(Generative Adversarial Network)이 뛰어난 성능을 보여주고있다.

  • -
  • 하지만, GAN은 학습 과정에서 불안정성을 보이는 경우가 많다.

    -
      -
    • Generator와 Discriminator의 Imbalanced에 의한 Mode collapse

    • -
    -
  • -
  • 그러던 중, DDPM과 NCSN같은 adversarial training구조가 아닌 model들이 등장하였고 성공의 가능성을 보여주었다.

  • -
  • 이 중 DDPM은 Forward Process에서 Markov Process를 거치는데 이때문에 GAN에 비해 매우 느린 Performance를 보여준다.

    - - - - - - - - - - - - - - - - - -

    sampling

    GAN

    DDPM

    32 x 32 x 50k

    Less than 1 min

    About 20h

    256 x 256 x 50k

    -

    About 1000h

    -
  • -
  • DDIM은,

    -
      -
    1. Markov Chain에 기반한 Process를 Non Markovian Process로 대체하였고

    2. -
    3. 결국 좀더 빠르고 비교적 우수한 Quality의 결과를 생성해내고, (with accelate)

    4. -
    5. DDPM과는 다르게 Consistency한 학습 결과를 보여줌으로써 latent간의 Interpolation이 가능하다.

      -
        -
      • Consistency?

        -
          -
        • If x, y is equivalent, then f(x) = f(y)

        • -
        -
      • -
      -
    6. -
    -
  • -
-
-
-

2. Background#

-
-

DDPM#

-
-DDIM_00 -
-

Fig. 22 DDPM & DDIM Architectures#

-
-
-
    -
  • DDPM의 Forward Process는 Markov process로 동작한다.

    -
      -
    • Markov process

      -
        -
      • 미래 시점을 예측하기위해 현재 시점의 값을 이용한다.

      • -
      • 미래 시점은 과거 시점의 값에는 독립적인 값을 갖는다.

      • -
      -
    • -
    -
  • -
  • time step T는 DDPM에서 성능을 좌지우지하는 중요한 Hyper parameter이다. (대충 T=1000 정도?)

  • -
  • 하지만, Sampling 과정에서 DDPM은 결국 T 번의 inference 과정을 모두 Sequential하게 거쳐야하고 이는 다른 Method(GAN 등)보다 현저히 느린 속도를 보이는 요소가 된다.

  • -
-
-
-
-

3. Variational Inference For Non-Markovian Forward Process#

-

3.1. Non-Markovian Forward Processes

-
    -
  • Inference’s Distribution 정의

  • -
-
-DDIM_01 -
-

Fig. 23 Equation 1#

-
-
-
-DDIM_02 -
-

Fig. 24 Equation 2#

-
-
-
    -
  • t 시점의 값을 구하기위해 \(X_{t-1}\)의 값과 \(X_{0}\)의 값을 참조

    -
      -
    • DDPM은? \(X_{t-1}\)의 값만을 참조

    • -
    • σ는 Forward process의 stochastic한 정도를 조절하는 hyper parameter (chap 4 참조)

    • -
    -
  • -
-

3.2. Generative Process And Unified Variational Inference Objective (Reverse Process)

-
-DDIM_00 -
-

Fig. 25 Equation 3#

-
-
-
-DDIM_00 -
-

Fig. 26 Equation 4#

-
-
-
    -
  1. \(X_{t}\)을 통해 \(X_{0}\)의 값을 예측 (trainable)

  2. -
  3. 위의 식을 통해 \(X_{t}\)와, \(X_{0}\)의 값을 이용해 \(X_{t-1}\)을 샘플링

  4. -
-

실제로는

-
    -
  • noise(ε)와 \(X_{0}\), \(X_{t}\)의 관계

    -
    -DDIM_05 -
    -

    Fig. 27 Equation 5#

    -
    -
    -
  • -
-
    -
  1. \(X_{t}\)을 통해 \(X_{0}\)을 예측

    -
      -
    1. t 시점의 이미지를 통해 t 시점의 noise를 예측

    2. -
    3. t 시점의 이미지와 t 시점의 noise를 통해 0 시점의 이미지를 계산 (fixed)

    4. -
    -
  2. -
  3. 위의 식을 통해 t시점의 값과 예측한 0 시점의 값을 이용해 t-1 시점의 값을 샘플링

  4. -
-
-
-

4. Sampling From Generalized Generative Process#

-

4.1. Denoising Diffusion Implicit Models

-
    -
  1. If σ → 0

  2. -
-
-DDIM_06 -
-

Fig. 28 Equation 6#

-
-
-
    -
  1. σ가 특정 값을 가질 때 DDPM의 generative process의 수식과 동일하다.

  2. -
-
-DDIM_07 -
-

Fig. 29 Explanation of σ#

-
-
-

4.2. Accelerated Generation Processes

-
-DDIM_08 -
-

Fig. 30 Explanation of accelated method#

-
-
-
    -
  • DDIM은 Deterministic하기때문에 모든 시점의 값을 모두 계산할 필요 없이 subset의 시점만으로 sampling이 가능하다.

  • -
  • 이 Accelerating method는 약간의 quality 저하가 있지만 Computational efficiency를 충분히 증가시킬 수 있다.

  • -
  • DDIM 방식의 재학습 없이 DDPM의 training에 DDIM의 sampling이 가능하다.

  • -
-

4.3. Relevance To Neural ODEs

-
    -
  • DDIM은 Object(e.g. 이미지)의 Encoding이 가능한 식을 유도할 수 있다.

  • -
-
-
-

5. Experiments#

-
-DDIM_09 -
-

Fig. 31 Table1#

-
-
-
-DDIM_010 -
-

Fig. 32 Euqation 7#

-
-
-
    -
  • η → model을 simple하게 control하기위한 hyperparameter

    -
      -
    • η = 1 → Model is DDPM

    • -
    • η = 0 → Model is DDIM

    • -
    -
  • -
  • 모든 비교 모델이 S(sampling 횟수)의 값이 커질수록 더 낮은 FiD를 보여준다.

  • -
  • Fig.3의 DDIM은 다른 모델(η가 0이 아닌 모델)과 다르게 sampling step에 consistency한 결과를 보여준다.

  • -
-
-DDIM_011 -
-

Fig. 33 Figure 4, 5#

-
-
-
    -
  • Step과 Inference time이 linear한 관계를 갖는다.

  • -
  • 적은 sampling step에서도 어느정도의 object를 보여준다.

  • -
-
-DDIM_012 -
-

Fig. 34 Figure 6#

-
-
-
    -
  • T 시점의 이미지에 interpolation이 가능하다.

  • -
-
-
-

6. Code#

-
# https://keras.io/examples/generative/ddim/
-class DiffusionModel(keras.Model):
-    def __init__(self, image_size, widths, block_depth):
-        super().__init__()
-
-        self.normalizer = layers.Normalization()
-        self.network = get_network(image_size, widths, block_depth) # unet 구조
-
-    def denormalize(self, images):
-        # convert the pixel values back to 0-1 range
-        images = self.normalizer.mean + images * self.normalizer.variance**0.5
-        return tf.clip_by_value(images, 0.0, 1.0)
-
-    def diffusion_schedule(self, diffusion_times):
-        # diffusion times -> angles
-        start_angle = tf.acos(max_signal_rate)
-        end_angle = tf.acos(min_signal_rate)
-
-        diffusion_angles = start_angle + diffusion_times * (end_angle - start_angle)
-
-        # angles -> signal and noise rates
-        signal_rates = tf.cos(diffusion_angles)
-        noise_rates = tf.sin(diffusion_angles)
-        # note that their squared sum is always: sin^2(x) + cos^2(x) = 1
-
-        return noise_rates, signal_rates
-
-    def denoise(self, noisy_images, noise_rates, signal_rates, training):
-        # the exponential moving average weights are used at evaluation
-        if training:
-            network = self.network
-        else:
-            network = self.ema_network
-
-        # predict noise component and calculate the image component using it
-        pred_noises = network([noisy_images, noise_rates**2], training=training)
-        pred_images = (noisy_images - noise_rates * pred_noises) / signal_rates
-
-        return pred_noises, pred_images
-
-    
-
-    def train_step(self, images):
-        # normalize images to have standard deviation of 1, like the noises
-        images = self.normalizer(images, training=True)
-        noises = tf.random.normal(shape=(batch_size, image_size, image_size, 3))
-
-        # sample uniform random diffusion times
-        diffusion_times = tf.random.uniform(
-            shape=(batch_size, 1, 1, 1), minval=0.0, maxval=1.0
-        )
-        noise_rates, signal_rates = self.diffusion_schedule(diffusion_times)
-        # mix the images with noises accordingly
-        noisy_images = signal_rates * images + noise_rates * noises
-
-        with tf.GradientTape() as tape:
-            # train the network to separate noisy images to their components
-            pred_noises, pred_images = self.denoise(
-                noisy_images, noise_rates, signal_rates, training=True
-            )
-
-            noise_loss = self.loss(noises, pred_noises)  # used for training
-            image_loss = self.loss(images, pred_images)  # only used as metric
-
-        gradients = tape.gradient(noise_loss, self.network.trainable_weights)
-        self.optimizer.apply_gradients(zip(gradients, self.network.trainable_weights))
-
-        self.noise_loss_tracker.update_state(noise_loss)
-        self.image_loss_tracker.update_state(image_loss)
-
-        return {m.name: m.result() for m in self.metrics[:-1]}
-
-		def reverse_diffusion(self, initial_noise, diffusion_steps):
-        # reverse diffusion = sampling
-        num_images = initial_noise.shape[0]
-        step_size = 1.0 / diffusion_steps
-
-        # important line:
-        # at the first sampling step, the "noisy image" is pure noise
-        # but its signal rate is assumed to be nonzero (min_signal_rate)
-        next_noisy_images = initial_noise
-        for step in range(diffusion_steps):
-            noisy_images = next_noisy_images
-
-            # separate the current noisy image to its components
-            diffusion_times = tf.ones((num_images, 1, 1, 1)) - step * step_size
-            noise_rates, signal_rates = self.diffusion_schedule(diffusion_times)
-            pred_noises, pred_images = self.denoise(
-                noisy_images, noise_rates, signal_rates, training=False
-            )
-            # network used in eval mode
-
-            # remix the predicted components using the next signal and noise rates
-            next_diffusion_times = diffusion_times - step_size
-            next_noise_rates, next_signal_rates = self.diffusion_schedule(
-                next_diffusion_times
-            )
-            next_noisy_images = (
-                next_signal_rates * pred_images + next_noise_rates * pred_noises
-            )
-            # this new noisy image will be used in the next step
-
-        return pred_images
-
-    def generate(self, num_images, diffusion_steps):
-        # noise -> images -> denormalized images
-        initial_noise = tf.random.normal(shape=(num_images, image_size, image_size, 3))
-        generated_images = self.reverse_diffusion(initial_noise, diffusion_steps)
-        generated_images = self.denormalize(generated_images)
-        return generated_images
-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + DDIM — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

DDIM#

+
+

Abstract#

+
    +
  • DDPM의 단점인 Markov Process를 Non markovian process로 정의함으로서 Time efficient, deterministic한 Sampling이 가능한 모델을 제안

    +
      +
    • Deterministic vs Stochastic

    • +
    +
  • +
+
+
+

1. Introduction#

+
    +
  • 생성 분야에서 GAN(Generative Adversarial Network)이 뛰어난 성능을 보여주고있다.

  • +
  • 하지만, GAN은 학습 과정에서 불안정성을 보이는 경우가 많다.

    +
      +
    • Generator와 Discriminator의 Imbalanced에 의한 Mode collapse

    • +
    +
  • +
  • 그러던 중, DDPM과 NCSN같은 adversarial training구조가 아닌 model들이 등장하였고 성공의 가능성을 보여주었다.

  • +
  • 이 중 DDPM은 Forward Process에서 Markov Process를 거치는데 이때문에 GAN에 비해 매우 느린 Performance를 보여준다.

    +
    + + + + + + + + + + + + + + + + +

    sampling

    GAN

    DDPM

    32 x 32 x 50k

    Less than 1 min

    About 20h

    256 x 256 x 50k

    -

    About 1000h

    +
    +
  • +
  • DDIM은,

    +
      +
    1. Markov Chain에 기반한 Process를 Non Markovian Process로 대체하였고

    2. +
    3. 결국 좀더 빠르고 비교적 우수한 Quality의 결과를 생성해내고, (with accelate)

    4. +
    5. DDPM과는 다르게 Consistency한 학습 결과를 보여줌으로써 latent간의 Interpolation이 가능하다.

      +
        +
      • Consistency?

        +
          +
        • If x, y is equivalent, then f(x) = f(y)

        • +
        +
      • +
      +
    6. +
    +
  • +
+
+
+

2. Background#

+
+

DDPM#

+
+DDIM_00 +
+

Fig. 22 DDPM & DDIM Architectures#

+
+
+
    +
  • DDPM의 Forward Process는 Markov process로 동작한다.

    +
      +
    • Markov process

      +
        +
      • 미래 시점을 예측하기위해 현재 시점의 값을 이용한다.

      • +
      • 미래 시점은 과거 시점의 값에는 독립적인 값을 갖는다.

      • +
      +
    • +
    +
  • +
  • time step T는 DDPM에서 성능을 좌지우지하는 중요한 Hyper parameter이다. (대충 T=1000 정도?)

  • +
  • 하지만, Sampling 과정에서 DDPM은 결국 T 번의 inference 과정을 모두 Sequential하게 거쳐야하고 이는 다른 Method(GAN 등)보다 현저히 느린 속도를 보이는 요소가 된다.

  • +
+
+
+
+

3. Variational Inference For Non-Markovian Forward Process#

+

3.1. Non-Markovian Forward Processes

+
    +
  • Inference’s Distribution 정의

  • +
+
+DDIM_01 +
+

Fig. 23 Equation 1#

+
+
+
+DDIM_02 +
+

Fig. 24 Equation 2#

+
+
+
    +
  • t 시점의 값을 구하기위해 \(X_{t-1}\)의 값과 \(X_{0}\)의 값을 참조

    +
      +
    • DDPM은? \(X_{t-1}\)의 값만을 참조

    • +
    • σ는 Forward process의 stochastic한 정도를 조절하는 hyper parameter (chap 4 참조)

    • +
    +
  • +
+

3.2. Generative Process And Unified Variational Inference Objective (Reverse Process)

+
+DDIM_00 +
+

Fig. 25 Equation 3#

+
+
+
+DDIM_00 +
+

Fig. 26 Equation 4#

+
+
+
    +
  1. \(X_{t}\)을 통해 \(X_{0}\)의 값을 예측 (trainable)

  2. +
  3. 위의 식을 통해 \(X_{t}\)와, \(X_{0}\)의 값을 이용해 \(X_{t-1}\)을 샘플링

  4. +
+

실제로는

+
    +
  • noise(ε)와 \(X_{0}\), \(X_{t}\)의 관계

    +
    +DDIM_05 +
    +

    Fig. 27 Equation 5#

    +
    +
    +
  • +
+
    +
  1. \(X_{t}\)을 통해 \(X_{0}\)을 예측

    +
      +
    1. t 시점의 이미지를 통해 t 시점의 noise를 예측

    2. +
    3. t 시점의 이미지와 t 시점의 noise를 통해 0 시점의 이미지를 계산 (fixed)

    4. +
    +
  2. +
  3. 위의 식을 통해 t시점의 값과 예측한 0 시점의 값을 이용해 t-1 시점의 값을 샘플링

  4. +
+
+
+

4. Sampling From Generalized Generative Process#

+

4.1. Denoising Diffusion Implicit Models

+
    +
  1. If σ → 0

  2. +
+
+DDIM_06 +
+

Fig. 28 Equation 6#

+
+
+
    +
  1. σ가 특정 값을 가질 때 DDPM의 generative process의 수식과 동일하다.

  2. +
+
+DDIM_07 +
+

Fig. 29 Explanation of σ#

+
+
+

4.2. Accelerated Generation Processes

+
+DDIM_08 +
+

Fig. 30 Explanation of accelated method#

+
+
+
    +
  • DDIM은 Deterministic하기때문에 모든 시점의 값을 모두 계산할 필요 없이 subset의 시점만으로 sampling이 가능하다.

  • +
  • 이 Accelerating method는 약간의 quality 저하가 있지만 Computational efficiency를 충분히 증가시킬 수 있다.

  • +
  • DDIM 방식의 재학습 없이 DDPM의 training에 DDIM의 sampling이 가능하다.

  • +
+

4.3. Relevance To Neural ODEs

+
    +
  • DDIM은 Object(e.g. 이미지)의 Encoding이 가능한 식을 유도할 수 있다.

  • +
+
+
+

5. Experiments#

+
+DDIM_09 +
+

Fig. 31 Table1#

+
+
+
+DDIM_010 +
+

Fig. 32 Euqation 7#

+
+
+
    +
  • η → model을 simple하게 control하기위한 hyperparameter

    +
      +
    • η = 1 → Model is DDPM

    • +
    • η = 0 → Model is DDIM

    • +
    +
  • +
  • 모든 비교 모델이 S(sampling 횟수)의 값이 커질수록 더 낮은 FiD를 보여준다.

  • +
  • Fig.3의 DDIM은 다른 모델(η가 0이 아닌 모델)과 다르게 sampling step에 consistency한 결과를 보여준다.

  • +
+
+DDIM_011 +
+

Fig. 33 Figure 4, 5#

+
+
+
    +
  • Step과 Inference time이 linear한 관계를 갖는다.

  • +
  • 적은 sampling step에서도 어느정도의 object를 보여준다.

  • +
+
+DDIM_012 +
+

Fig. 34 Figure 6#

+
+
+
    +
  • T 시점의 이미지에 interpolation이 가능하다.

  • +
+
+
+

6. Code#

+
# https://keras.io/examples/generative/ddim/
+class DiffusionModel(keras.Model):
+    def __init__(self, image_size, widths, block_depth):
+        super().__init__()
+
+        self.normalizer = layers.Normalization()
+        self.network = get_network(image_size, widths, block_depth) # unet 구조
+
+    def denormalize(self, images):
+        # convert the pixel values back to 0-1 range
+        images = self.normalizer.mean + images * self.normalizer.variance**0.5
+        return tf.clip_by_value(images, 0.0, 1.0)
+
+    def diffusion_schedule(self, diffusion_times):
+        # diffusion times -> angles
+        start_angle = tf.acos(max_signal_rate)
+        end_angle = tf.acos(min_signal_rate)
+
+        diffusion_angles = start_angle + diffusion_times * (end_angle - start_angle)
+
+        # angles -> signal and noise rates
+        signal_rates = tf.cos(diffusion_angles)
+        noise_rates = tf.sin(diffusion_angles)
+        # note that their squared sum is always: sin^2(x) + cos^2(x) = 1
+
+        return noise_rates, signal_rates
+
+    def denoise(self, noisy_images, noise_rates, signal_rates, training):
+        # the exponential moving average weights are used at evaluation
+        if training:
+            network = self.network
+        else:
+            network = self.ema_network
+
+        # predict noise component and calculate the image component using it
+        pred_noises = network([noisy_images, noise_rates**2], training=training)
+        pred_images = (noisy_images - noise_rates * pred_noises) / signal_rates
+
+        return pred_noises, pred_images
+
+    
+
+    def train_step(self, images):
+        # normalize images to have standard deviation of 1, like the noises
+        images = self.normalizer(images, training=True)
+        noises = tf.random.normal(shape=(batch_size, image_size, image_size, 3))
+
+        # sample uniform random diffusion times
+        diffusion_times = tf.random.uniform(
+            shape=(batch_size, 1, 1, 1), minval=0.0, maxval=1.0
+        )
+        noise_rates, signal_rates = self.diffusion_schedule(diffusion_times)
+        # mix the images with noises accordingly
+        noisy_images = signal_rates * images + noise_rates * noises
+
+        with tf.GradientTape() as tape:
+            # train the network to separate noisy images to their components
+            pred_noises, pred_images = self.denoise(
+                noisy_images, noise_rates, signal_rates, training=True
+            )
+
+            noise_loss = self.loss(noises, pred_noises)  # used for training
+            image_loss = self.loss(images, pred_images)  # only used as metric
+
+        gradients = tape.gradient(noise_loss, self.network.trainable_weights)
+        self.optimizer.apply_gradients(zip(gradients, self.network.trainable_weights))
+
+        self.noise_loss_tracker.update_state(noise_loss)
+        self.image_loss_tracker.update_state(image_loss)
+
+        return {m.name: m.result() for m in self.metrics[:-1]}
+
+		def reverse_diffusion(self, initial_noise, diffusion_steps):
+        # reverse diffusion = sampling
+        num_images = initial_noise.shape[0]
+        step_size = 1.0 / diffusion_steps
+
+        # important line:
+        # at the first sampling step, the "noisy image" is pure noise
+        # but its signal rate is assumed to be nonzero (min_signal_rate)
+        next_noisy_images = initial_noise
+        for step in range(diffusion_steps):
+            noisy_images = next_noisy_images
+
+            # separate the current noisy image to its components
+            diffusion_times = tf.ones((num_images, 1, 1, 1)) - step * step_size
+            noise_rates, signal_rates = self.diffusion_schedule(diffusion_times)
+            pred_noises, pred_images = self.denoise(
+                noisy_images, noise_rates, signal_rates, training=False
+            )
+            # network used in eval mode
+
+            # remix the predicted components using the next signal and noise rates
+            next_diffusion_times = diffusion_times - step_size
+            next_noise_rates, next_signal_rates = self.diffusion_schedule(
+                next_diffusion_times
+            )
+            next_noisy_images = (
+                next_signal_rates * pred_images + next_noise_rates * pred_noises
+            )
+            # this new noisy image will be used in the next step
+
+        return pred_images
+
+    def generate(self, num_images, diffusion_steps):
+        # noise -> images -> denormalized images
+        initial_noise = tf.random.normal(shape=(num_images, image_size, image_size, 3))
+        generated_images = self.reverse_diffusion(initial_noise, diffusion_steps)
+        generated_images = self.denormalize(generated_images)
+        return generated_images
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/DDPM.html b/docs/review/DDPM.html old mode 100644 new mode 100755 index 009e8685..f21ed204 --- a/docs/review/DDPM.html +++ b/docs/review/DDPM.html @@ -1,1135 +1,1154 @@ - - - - - - - - - - - - DDPM — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

DDPM#

-
-DDPM_01 -
-

Fig. 13 DDPM samples \ (source: https://arxiv.org/abs/2006.11239)#

-
-
-
-
-
-

1. Introduction#

-
-DDPM_02 -
-

Fig. 14 Diffusion models \ (source: https://velog.io/@yetsyl0705/What-are-Diffusion-Models)#

-
-
-

Diffusion modelvariational inference로 학습시켜 데이터를 생성하는 parameterized Markov chain. Diffusion model은 Markov가 데이터가 normal distribution의 형태를 할 때까지 noise를 더해가는 diffusion process이를 역으로 거치며 학습하는 reverse process로 구성됨.

-

Diffusion model은 정의하기 쉽고 학습시키는 것도 편리함. 또한 높은 품질의 sample(output)도 생성이 가능.

-
-
    -
  • Variational inference(변분추론): 사후확률(posterior) 분포 \(p(z -|x)\)를 다루기 쉬운 확률분포 \(q(z)\)로 근사(approximation)하는 것

  • -
  • Parameterize: 하나의 표현식에 대해 다른 parameter를 사용하여 다시 표현하는 과정. 이 과정에서 보통 parameter의 개수를 표현 식의 차수보다 적은 수로 선택(ex. 3차 표현식 –> 2개 parameter 사용)하므로, 낮은 차수로의 mapping 함수(ex. 3D –> 2D)가 생성

  • -
  • Markov chain: 어떤 상태에서 다른 상태로 넘어갈 때, 바로 전 단계의 상태에만 영향을 받는 확률 과정

  • -
-
-
-
-
-

2. Background#

-
-DDPM_03 -
-

Fig. 15 Graphical model of DDPM \ (source: https://arxiv.org/abs/2006.11239)#

-
-
-
-

2-1. Forward(diffusion) process \(q(\mathbf{x}_t|\mathbf{x}_{t-1})\)#

-
-\[ -q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right):=\prod_{t=1}^T q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right), \quad q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right):=\mathcal{N}\left(\mathbf{x}_t ; \sqrt{1-\beta_t} \mathbf{x}_{t-1}, \beta_t \mathbf{I}\right) -\]
-

Markov chain으로 data에 noise를 추가하는 과정. Noise를 추가할 때 variance schedule \(\beta_1,,,\beta_T\)로 scaling을 한 후 더해준다.

-
    -
  • \(\beta_t = 1\)이면 mean인 \(\sqrt{1-\beta_t}\mathbf{x}_{t-1} = 0\). 이전 정보를 갖지 못하고 노이즈가 증가함

  • -
  • 단순히 noise만을 더해주는게 아니라 \(\sqrt{1-\beta_t}\)로 scaling하는 이유는 variance가 발산하는 것을 막기 위함

  • -
  • \(q(x_1|x_0)\): \(x_0\)에 noise를 추가해 \(x_1\)을 만드는 과정

  • -
  • \(x_T\)는 완전 destroy된 noise 상태 ~ \(N(x_T;0, I)\)

  • -
-
-
-

2-2. Reverse process \(p(\mathbf{x}_{t-1}|\mathbf{x}_t)\)#

-
-\[ -p_\theta\left(\mathbf{x}_{0: T}\right):=p\left(\mathbf{x}_T\right) \prod_{t=1}^T p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right), \quad p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right):=\mathcal{N}\left(\mathbf{x}_{t-1} ; \boldsymbol{\mu}_\theta\left(\mathbf{x}_t, t\right), \boldsymbol{\Sigma}_\theta\left(\mathbf{x}_t, t\right)\right) -\]
-

Reverse process로 가우시안 노이즈를 사용하는 이유는 1994년 논문에 forward process가 가우시안이면 reverse process도 가우시안으로 쓰면 된다라는 증명이 있다고 함.

-

여기서 우리가 해야 할 것은 \(\mathbf{x}_t\)를 보고 \(\mathbf{x}_{t-1}\)의 평균 \(\mu_\theta\)과 분산 \(\Sigma_\theta\)을 예측해내는 것.

-
    -
  • Hierarachical VAE에서의 decoding 과정과 비슷함

  • -
  • \(\mu_\theta\)과 분산 \(\Sigma_\theta\)는 학습 가능한 parameter

  • -
-
-
-

2-3. Loss Function \(L\)#

-

Diffusion model의 목적은 **noise를 어떻게 제거할 것인가?**이다. \(x_t\)가 들어왔을 때 \(x_{t-1}\)을 예측할 수 있다면 \(x_0\) 또한 예측이 가능해짐.

-
-\[ -\mathbb{E}\left[-\log p_\theta\left(\mathbf{x}_0\right)\right] \leq \mathbb{E}_q\left[-\log \frac{p_\theta\left(\mathbf{x}_{0: T}\right)}{q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right)}\right]=\mathbb{E}_q\left[-\log p\left(\mathbf{x}_T\right)-\sum_{t \geq 1} \log \frac{p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)}{q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right)}\right]=: L -\]
-

본 논문에서는 negative log likelihood를 최소화하는 방향으로 진행. 위 수식을 ELBO(Evidence of Lower BOund)로 우항과 같이 정리하고 이를 풀어내면

-
-

ELBO의 역할은 우리가 관찰한 P(z|x)가 다루기 힘든 분포를 이루고 있을 때 이를 조금 더 다루기 쉬운 분포인 Q(x)로 대신 표현하려 하는 과정에서 두 분포 (P(z|x)와 Q(x))의 차이 (KL Divergence)를 최소화 하기 위해 사용된다.

-
-
-\[ -\mathbb{E}_q[\underbrace{D_{\mathrm{KL}}\left(q\left(\mathbf{x}_T \mid \mathbf{x}_0\right) \| p\left(\mathbf{x}_T\right)\right)}_{L_T}+\sum_{t>1} \underbrace{D_{\mathrm{KL}}\left(q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t, \mathbf{x}_0\right) \| p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)\right)}_{L_{t-1}} \underbrace{-\log p_\theta\left(\mathbf{x}_0 \mid \mathbf{x}_1\right)}_{L_0}] -\]
-

와 같은 결과가 나온다.

-
    -
  • \(L_T\): Regularization term으로 \(\beta_t\)를 학습시킴

  • -
  • \(L_{t-1}\): Reconstruction term으로 매 단계에서 noise를 지우는 지움

  • -
  • \(L_0\): Reconstruction term으로 최종 단계에서 image를 생성

  • -
-
-
-
-
-

3. Diffusion models and denoising encoders#

-

DDPM에서는 inductive bias를 늘려 모델을 더 stable하고 성능도 개선할 수 있었음.

-
-

Inductive bias: 학습 모델이 지금까지 만나보지 못했던 상황에서 정확한 예측을 하기 위해 사용하는 추가적인 가정, 즉 우리가 풀려는 문제에 대한 정보를 모델에 적용하는 것

-
-
-

3-1. Forward process and \(L_T\)#

-

\(\beta_t\)를 고정했더니 학습이 잘됨. 10^-4 ~ 0.02로 linear하게 image에 가까울수록 noise를 적게 주는 방식으로 설정.

-

따라서 \(q\)에는 학습 가능한 parameter가 없어 \(L_T\)는 0이 되기 때문에 삭제할 수 있었음.

-
-
-

3-2. Reverse process and \(L_{1:T-1}\)#

-
-\[ -L_{t-1}=D_{K L}\left(q\left(x_{t-1} \mid x_t, x_0\right) \| p_\theta\left(x_{t-1} \mid x_t\right)\right) -\]
-
    -
  • \( -q\left(x_{t-1} \mid x_t, x_0\right)=N\left(x_{t-1} ; \tilde{\mu}\left(x_t, x_0\right), \tilde{\beta}_t \mathrm{I}\right) -\)

  • -
  • \( -p_\theta\left(x_{t-1} \mid x_t\right)=\mathcal{N}\left(x_{t-1} ; \mu_\theta\left(x_t, t\right), \sum_\theta\left(x_t, t\right)\right) -\)

  • -
-

\(L_{1:T-1}\)는 forward progress posterior를 예측하는 loss. \(\mathbf{x}_{t-1}\)에서 noise를 더해 \(\mathbf{x}_{t}\)를 만들었을때, 그 과정을 복원 \(p(\mathbf{x}_{t-1}|\mathbf{x}_t)\) 하는 과정을 학습.

-
-DDPM_08 -
-

Fig. 16 Loss Simplication \ (source: https://velog.io/@sjina0722/논문-리뷰-Denoising-Diffusion-Probabilistic-Models)#

-
-
-
    -
  • \(\Sigma_\theta\): \(\beta\)를 상수로 가정했고 \(p(\mathbf{x}_{t-1}|\mathbf{x}_t)\)의 variance가 \(\beta\)에 영향을 받기 때문에 학습시키지 않아도 된다고 생각해 variance term을 제거함.

  • -
-
-DDPM_09 -
-

Fig. 17 Residual Estimation \ (source: https://velog.io/@sjina0722/논문-리뷰-Denoising-Diffusion-Probabilistic-Models)#

-
-
-
    -
  • \(\mu_\theta\): DDPM에서는 \(\mu_\theta\)를 바로 구하지 않고 residual \(\epsilon_\theta\)만 구해 정확도를 높임.

  • -
-
-
-

3-3. Data scaling, reverse process decoder and \(L_0\)#

-
-\[\begin{split} -\begin{aligned} -p_\theta\left(\mathbf{x}_0 \mid \mathbf{x}_1\right) & =\prod_{i=1}^D \int_{\delta_{-}\left(x_0^i\right)}^{\delta_{+}\left(x_0^i\right)} \mathcal{N}\left(x ; \mu_\theta^i\left(\mathbf{x}_1, 1\right), \sigma_1^2\right) d x \\ -\delta_{+}(x) & =\left\{\begin{array}{ll} -\infty & \text { if } x=1 \\ -x+\frac{1}{255} & \text { if } x<1 -\end{array} \quad \delta_{-}(x)= \begin{cases}-\infty & \text { if } x=-1 \\ -x-\frac{1}{255} & \text { if } x>-1\end{cases} \right. -\end{aligned} -\end{split}\]
-

[0, 255]의 image를 [-1,1] 사이로 linearly mapping. Sampling 마지막 단계에는 noise를 추가하지 않음.

-

\(L_0\)은 두 normal distribution 사이의 KL divergence를 나타냄.

-
    -
  • \(D\): Data dimensionality

  • -
  • \(i\): 좌표

  • -
-
-
-

3-4. Simplified training objective#

-
-DDPM_10 -
-

Fig. 18 Simplified training objective \ (source: https://velog.io/@sjina0722/논문-리뷰-Denoising-Diffusion-Probabilistic-Models)#

-
-
-
-DDPM_11 -
-

Fig. 19 Final Loss \ (source: https://velog.io/@sjina0722/논문-리뷰-Denoising-Diffusion-Probabilistic-Models)#

-
-
-

최종 loss는 위와 같이 나타난다. Ground truth - estimated output간 MSE loss를 줄이는 과정이 denoising과 비슷해 DDPM이라는 이름이 붙음.

-

Simplified objective을 통해 diffusion process를 학습하면 매우 작은 t 에서뿐만 아니라 큰 t에 대해서도 network 학습이 가능하기 때문에 매우 효과적.

-
-DDPM_12 -
-

Fig. 20 Psuedo code of training process \ (source: https://arxiv.org/abs/2006.11239)#

-
-
-
    -
  • Algorithm 1: Training

    -
      -
    • Noise를 더해나가는 과정, network(\(\epsilon_\theta\), \(p_\theta\))가 t step에서 noise(\(\epsilon\))가 얼마만큼 더해졌는지를 학습한다.

    • -
    • 학습 시에는 특정 step의 이미지가 얼마나 gaussian noise가 추가되었는지를 예측하도록 학습된다.

    • -
    • 코드에서는 랜덤 노이즈와 시간 단계 t로 노이즈가 추가된 이미지를 얻고 해당 이미지를 보고 모델이 노이즈를 예측

    • -
    -
  • -
-
def p_losses(self, x_start, t, noise = None):
-        b, c, h, w = x_start.shape
-        noise = default(noise, lambda: torch.randn_like(x_start))
-
-        # noise sample
-
-        x = self.q_sample(x_start = x_start, t = t, noise = noise)
-
-        # if doing self-conditioning, 50% of the time, predict x_start from current set of times
-        # and condition with unet with that
-        # this technique will slow down training by 25%, but seems to lower FID significantly
-
-        x_self_cond = None
-        if self.self_condition and random() < 0.5:
-            with torch.no_grad():
-                x_self_cond = self.model_predictions(x, t).pred_x_start
-                x_self_cond.detach_()
-
-        # predict and take gradient step
-
-        model_out = self.model(x, t, x_self_cond)
-
-        if self.objective == 'pred_noise':
-            target = noise
-        elif self.objective == 'pred_x0':
-            target = x_start
-        elif self.objective == 'pred_v':
-            v = self.predict_v(x_start, t, noise)
-            target = v
-        else:
-            raise ValueError(f'unknown objective {self.objective}')
-
-        loss = self.loss_fn(model_out, target, reduction = 'none')
-        loss = reduce(loss, 'b ... -> b (...)', 'mean')
-
-        loss = loss * extract(self.loss_weight, t, loss.shape)
-        return loss.mean()
-
-
-
    -
  • Algorithm 2: Sampling

    -
      -
    • Network를 학습하고 나면, gaussian noise에서 시작해서 순차적으로 denoising 하는 것이 가능하다. (by parameterized markovian chain)

    • -
    • 코드에서는 noise 제거 후 소량의 noise를 다시 추가하고 있음

    • -
    -
  • -
-
@torch.no_grad()
-def p_sample(self, x, t: int, x_self_cond = None):
-    b, *_, device = *x.shape, x.device
-    batched_times = torch.full((b,), t, device = x.device, dtype = torch.long)
-    model_mean, _, model_log_variance, x_start = self.p_mean_variance(x = x, t = batched_times, x_self_cond = x_self_cond, clip_denoised = True)
-    noise = torch.randn_like(x) if t > 0 else 0. # no noise if t == 0
-    pred_img = model_mean + (0.5 * model_log_variance).exp() * noise
-    return pred_img, x_start
-
-
-
-
-
-

4. Experiments#

-
    -
  • T: 1000

  • -
  • backbone: U-Net
    -각 down/upsampling 단계는 ResNet/ConvNext 블록 2개 + (groupnorm + attention + residual) + down/upsampling으로 구성됨

  • -
-
block_klass = partial(ResnetBlock, groups = resnet_block_groups)
-
-self.downs.append(nn.ModuleList([
-                block_klass(dim_in, dim_in, time_emb_dim = time_dim),
-                block_klass(dim_in, dim_in, time_emb_dim = time_dim),
-                Residual(PreNorm(dim_in, LinearAttention(dim_in))),
-                Downsample(dim_in, dim_out) if not is_last else nn.Conv2d(dim_in, dim_out, 3, padding = 1)
-            ]))
-            
- self.ups.append(nn.ModuleList([
-                block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim),
-                block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim),
-                Residual(PreNorm(dim_out, LinearAttention(dim_out))),
-                Upsample(dim_out, dim_in) if not is_last else  nn.Conv2d(dim_out, dim_in, 3, padding = 1)
-            ]))
-
-
-
-
class Unet(nn.Module):
-    def __init__(
-        self,
-        dim,
-        init_dim = None,
-        out_dim = None,
-        dim_mults=(1, 2, 4, 8),
-        channels = 3,
-        self_condition = False,
-        resnet_block_groups = 8,
-        learned_variance = False,
-        learned_sinusoidal_cond = False,
-        random_fourier_features = False,
-        learned_sinusoidal_dim = 16
-    ):
-        super().__init__()
-
-        # determine dimensions
-
-        self.channels = channels
-        self.self_condition = self_condition
-        input_channels = channels * (2 if self_condition else 1)
-
-        init_dim = default(init_dim, dim)
-        self.init_conv = nn.Conv2d(input_channels, init_dim, 7, padding = 3)
-
-        dims = [init_dim, *map(lambda m: dim * m, dim_mults)]
-        in_out = list(zip(dims[:-1], dims[1:]))
-
-        block_klass = partial(ResnetBlock, groups = resnet_block_groups)
-
-        # time embeddings
-
-        time_dim = dim * 4
-
-        self.random_or_learned_sinusoidal_cond = learned_sinusoidal_cond or random_fourier_features
-
-        if self.random_or_learned_sinusoidal_cond:
-            sinu_pos_emb = RandomOrLearnedSinusoidalPosEmb(learned_sinusoidal_dim, random_fourier_features)
-            fourier_dim = learned_sinusoidal_dim + 1
-        else:
-            sinu_pos_emb = SinusoidalPosEmb(dim)
-            fourier_dim = dim
-
-        self.time_mlp = nn.Sequential(
-            sinu_pos_emb,
-            nn.Linear(fourier_dim, time_dim),
-            nn.GELU(),
-            nn.Linear(time_dim, time_dim)
-        )
-
-        # layers
-
-        self.downs = nn.ModuleList([])
-        self.ups = nn.ModuleList([])
-        num_resolutions = len(in_out)
-
-        for ind, (dim_in, dim_out) in enumerate(in_out):
-            is_last = ind >= (num_resolutions - 1)
-
-            self.downs.append(nn.ModuleList([
-                block_klass(dim_in, dim_in, time_emb_dim = time_dim),
-                block_klass(dim_in, dim_in, time_emb_dim = time_dim),
-                Residual(PreNorm(dim_in, LinearAttention(dim_in))),
-                Downsample(dim_in, dim_out) if not is_last else nn.Conv2d(dim_in, dim_out, 3, padding = 1)
-            ]))
-
-        mid_dim = dims[-1]
-        self.mid_block1 = block_klass(mid_dim, mid_dim, time_emb_dim = time_dim)
-        self.mid_attn = Residual(PreNorm(mid_dim, Attention(mid_dim)))
-        self.mid_block2 = block_klass(mid_dim, mid_dim, time_emb_dim = time_dim)
-
-        for ind, (dim_in, dim_out) in enumerate(reversed(in_out)):
-            is_last = ind == (len(in_out) - 1)
-
-            self.ups.append(nn.ModuleList([
-                block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim),
-                block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim),
-                Residual(PreNorm(dim_out, LinearAttention(dim_out))),
-                Upsample(dim_out, dim_in) if not is_last else  nn.Conv2d(dim_out, dim_in, 3, padding = 1)
-            ]))
-
-        default_out_dim = channels * (1 if not learned_variance else 2)
-        self.out_dim = default(out_dim, default_out_dim)
-
-        self.final_res_block = block_klass(dim * 2, dim, time_emb_dim = time_dim)
-        self.final_conv = nn.Conv2d(dim, self.out_dim, 1)
-        
-  def forward(self, x, time, x_self_cond = None):
-          if self.self_condition:
-              x_self_cond = default(x_self_cond, lambda: torch.zeros_like(x))
-              x = torch.cat((x_self_cond, x), dim = 1)
-
-          x = self.init_conv(x)
-          r = x.clone()
-
-          t = self.time_mlp(time)
-
-          h = []
-
-          for block1, block2, attn, downsample in self.downs:
-              x = block1(x, t)
-              h.append(x)
-
-              x = block2(x, t)
-              x = attn(x)
-              h.append(x)
-
-              x = downsample(x)
-
-          x = self.mid_block1(x, t)
-          x = self.mid_attn(x)
-          x = self.mid_block2(x, t)
-
-          for block1, block2, attn, upsample in self.ups:
-              x = torch.cat((x, h.pop()), dim = 1)
-              x = block1(x, t)
-
-              x = torch.cat((x, h.pop()), dim = 1)
-              x = block2(x, t)
-              x = attn(x)
-
-              x = upsample(x)
-
-          x = torch.cat((x, r), dim = 1)
-
-          x = self.final_res_block(x, t)
-          return self.final_conv(x)
-
-
-
    -
  • 16 x 16 feature map resolution에 self-attention. conv에서 차원을 3배로 늘리고 q,k,v로 분해.

  • -
-
class Attention(nn.Module):
-    def __init__(self, dim, heads = 4, dim_head = 32):
-        super().__init__()
-        self.scale = dim_head ** -0.5
-        self.heads = heads
-        hidden_dim = dim_head * heads
-
-        self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False)
-        self.to_out = nn.Conv2d(hidden_dim, dim, 1)
-
-    def forward(self, x):
-        b, c, h, w = x.shape
-        qkv = self.to_qkv(x).chunk(3, dim = 1)
-        q, k, v = map(lambda t: rearrange(t, 'b (h c) x y -> b h c (x y)', h = self.heads), qkv)
-
-        q = q * self.scale
-
-        sim = einsum('b h d i, b h d j -> b h i j', q, k)
-        attn = sim.softmax(dim = -1)
-        out = einsum('b h i j, b h d j -> b h i d', attn, v)
-
-        out = rearrange(out, 'b h (x y) d -> b (h d) x y', x = h, y = w)
-        return self.to_out(out)
-
-
-
    -
  • Linear attention

  • -
-
class LinearAttention(nn.Module):
-    def __init__(self, dim, heads = 4, dim_head = 32):
-        super().__init__()
-        self.scale = dim_head ** -0.5
-        self.heads = heads
-        hidden_dim = dim_head * heads
-        self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False)
-
-        self.to_out = nn.Sequential(
-            nn.Conv2d(hidden_dim, dim, 1),
-            LayerNorm(dim)
-        )
-
-    def forward(self, x):
-        b, c, h, w = x.shape
-        qkv = self.to_qkv(x).chunk(3, dim = 1)
-        q, k, v = map(lambda t: rearrange(t, 'b (h c) x y -> b h c (x y)', h = self.heads), qkv)
-
-        q = q.softmax(dim = -2)
-        k = k.softmax(dim = -1)
-
-        q = q * self.scale
-        v = v / (h * w)
-
-        context = torch.einsum('b h d n, b h e n -> b h d e', k, v)
-
-        out = torch.einsum('b h d e, b h d n -> b h e n', context, q)
-        out = rearrange(out, 'b h c (x y) -> b (h c) x y', h = self.heads, x = h, y = w)
-        return self.to_out(out)
-
-
-
    -
  • Diffusion time \(T\)는 각 residual block에 transformer sinusoidal positional embedding이 추가돼서 구분됨

  • -
-
class SinusoidalPosEmb(nn.Module):
-    def __init__(self, dim):
-        super().__init__()
-        self.dim = dim
-
-    def forward(self, x):
-        device = x.device
-        half_dim = self.dim // 2
-        emb = math.log(10000) / (half_dim - 1)
-        emb = torch.exp(torch.arange(half_dim, device=device) * -emb)
-        emb = x[:, None] * emb[None, :]
-        emb = torch.cat((emb.sin(), emb.cos()), dim=-1)
-        return emb
-
-
-
-

4-1. Sample quality#

-
-DDPM_13 -
-

Fig. 21 Train score of DDPM \ (source: https://arxiv.org/abs/2006.11239)#

-
-
-

FID, IS로 metric 계산. Unconditional model인데도 conditional model보다 우월. Codelength에서 차이가 없기 때문에 overfitting의 가능성도 적음.

-
-
    -
  • FID score: Inception V3으로 이미지의 분포를 계산한 metric

  • -
  • Unconditional model: 한번 dataset에 학습되면 추가적인 context 없이 image를 생성

  • -
  • Conditional model: Class, label 등의 추가 정보를 받아 image를 생성

  • -
-
-

\(\mu\)보다 \(\epsilon\)을 계산하는 것이 성적이 좋고, fixed variance를 사용했을 때에도 성능이 감소하지 않음.

-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + DDPM — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

DDPM#

+
+DDPM_01 +
+

Fig. 13 DDPM samples \ (source: https://arxiv.org/abs/2006.11239)#

+
+
+
+
+
+

1. Introduction#

+
+DDPM_02 +
+

Fig. 14 Diffusion models \ (source: https://velog.io/@yetsyl0705/What-are-Diffusion-Models)#

+
+
+

Diffusion modelvariational inference로 학습시켜 데이터를 생성하는 parameterized Markov chain. Diffusion model은 Markov가 데이터가 normal distribution의 형태를 할 때까지 noise를 더해가는 diffusion process이를 역으로 거치며 학습하는 reverse process로 구성됨.

+

Diffusion model은 정의하기 쉽고 학습시키는 것도 편리함. 또한 높은 품질의 sample(output)도 생성이 가능.

+
+
    +
  • Variational inference(변분추론): 사후확률(posterior) 분포 \(p(z +|x)\)를 다루기 쉬운 확률분포 \(q(z)\)로 근사(approximation)하는 것

  • +
  • Parameterize: 하나의 표현식에 대해 다른 parameter를 사용하여 다시 표현하는 과정. 이 과정에서 보통 parameter의 개수를 표현 식의 차수보다 적은 수로 선택(ex. 3차 표현식 –> 2개 parameter 사용)하므로, 낮은 차수로의 mapping 함수(ex. 3D –> 2D)가 생성

  • +
  • Markov chain: 어떤 상태에서 다른 상태로 넘어갈 때, 바로 전 단계의 상태에만 영향을 받는 확률 과정

  • +
+
+
+
+
+

2. Background#

+
+DDPM_03 +
+

Fig. 15 Graphical model of DDPM \ (source: https://arxiv.org/abs/2006.11239)#

+
+
+
+

2-1. Forward(diffusion) process \(q(\mathbf{x}_t|\mathbf{x}_{t-1})\)#

+
+\[ +q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right):=\prod_{t=1}^T q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right), \quad q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right):=\mathcal{N}\left(\mathbf{x}_t ; \sqrt{1-\beta_t} \mathbf{x}_{t-1}, \beta_t \mathbf{I}\right) +\]
+

Markov chain으로 data에 noise를 추가하는 과정. Noise를 추가할 때 variance schedule \(\beta_1,,,\beta_T\)로 scaling을 한 후 더해준다.

+
    +
  • \(\beta_t = 1\)이면 mean인 \(\sqrt{1-\beta_t}\mathbf{x}_{t-1} = 0\). 이전 정보를 갖지 못하고 노이즈가 증가함

  • +
  • 단순히 noise만을 더해주는게 아니라 \(\sqrt{1-\beta_t}\)로 scaling하는 이유는 variance가 발산하는 것을 막기 위함

  • +
  • \(q(x_1|x_0)\): \(x_0\)에 noise를 추가해 \(x_1\)을 만드는 과정

  • +
  • \(x_T\)는 완전 destroy된 noise 상태 ~ \(N(x_T;0, I)\)

  • +
+
+
+

2-2. Reverse process \(p(\mathbf{x}_{t-1}|\mathbf{x}_t)\)#

+
+\[ +p_\theta\left(\mathbf{x}_{0: T}\right):=p\left(\mathbf{x}_T\right) \prod_{t=1}^T p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right), \quad p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right):=\mathcal{N}\left(\mathbf{x}_{t-1} ; \boldsymbol{\mu}_\theta\left(\mathbf{x}_t, t\right), \boldsymbol{\Sigma}_\theta\left(\mathbf{x}_t, t\right)\right) +\]
+

Reverse process로 가우시안 노이즈를 사용하는 이유는 1994년 논문에 forward process가 가우시안이면 reverse process도 가우시안으로 쓰면 된다라는 증명이 있다고 함.

+

여기서 우리가 해야 할 것은 \(\mathbf{x}_t\)를 보고 \(\mathbf{x}_{t-1}\)의 평균 \(\mu_\theta\)과 분산 \(\Sigma_\theta\)을 예측해내는 것.

+
    +
  • Hierarachical VAE에서의 decoding 과정과 비슷함

  • +
  • \(\mu_\theta\)과 분산 \(\Sigma_\theta\)는 학습 가능한 parameter

  • +
+
+
+

2-3. Loss Function \(L\)#

+

Diffusion model의 목적은 **noise를 어떻게 제거할 것인가?**이다. \(x_t\)가 들어왔을 때 \(x_{t-1}\)을 예측할 수 있다면 \(x_0\) 또한 예측이 가능해짐.

+
+\[ +\mathbb{E}\left[-\log p_\theta\left(\mathbf{x}_0\right)\right] \leq \mathbb{E}_q\left[-\log \frac{p_\theta\left(\mathbf{x}_{0: T}\right)}{q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right)}\right]=\mathbb{E}_q\left[-\log p\left(\mathbf{x}_T\right)-\sum_{t \geq 1} \log \frac{p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)}{q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right)}\right]=: L +\]
+

본 논문에서는 negative log likelihood를 최소화하는 방향으로 진행. 위 수식을 ELBO(Evidence of Lower BOund)로 우항과 같이 정리하고 이를 풀어내면

+
+

ELBO의 역할은 우리가 관찰한 P(z|x)가 다루기 힘든 분포를 이루고 있을 때 이를 조금 더 다루기 쉬운 분포인 Q(x)로 대신 표현하려 하는 과정에서 두 분포 (P(z|x)와 Q(x))의 차이 (KL Divergence)를 최소화 하기 위해 사용된다.

+
+
+\[ +\mathbb{E}_q[\underbrace{D_{\mathrm{KL}}\left(q\left(\mathbf{x}_T \mid \mathbf{x}_0\right) \| p\left(\mathbf{x}_T\right)\right)}_{L_T}+\sum_{t>1} \underbrace{D_{\mathrm{KL}}\left(q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t, \mathbf{x}_0\right) \| p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)\right)}_{L_{t-1}} \underbrace{-\log p_\theta\left(\mathbf{x}_0 \mid \mathbf{x}_1\right)}_{L_0}] +\]
+

와 같은 결과가 나온다.

+
    +
  • \(L_T\): Regularization term으로 \(\beta_t\)를 학습시킴

  • +
  • \(L_{t-1}\): Reconstruction term으로 매 단계에서 noise를 지우는 지움

  • +
  • \(L_0\): Reconstruction term으로 최종 단계에서 image를 생성

  • +
+
+
+
+
+

3. Diffusion models and denoising encoders#

+

DDPM에서는 inductive bias를 늘려 모델을 더 stable하고 성능도 개선할 수 있었음.

+
+

Inductive bias: 학습 모델이 지금까지 만나보지 못했던 상황에서 정확한 예측을 하기 위해 사용하는 추가적인 가정, 즉 우리가 풀려는 문제에 대한 정보를 모델에 적용하는 것

+
+
+

3-1. Forward process and \(L_T\)#

+

\(\beta_t\)를 고정했더니 학습이 잘됨. 10^-4 ~ 0.02로 linear하게 image에 가까울수록 noise를 적게 주는 방식으로 설정.

+

따라서 \(q\)에는 학습 가능한 parameter가 없어 \(L_T\)는 0이 되기 때문에 삭제할 수 있었음.

+
+
+

3-2. Reverse process and \(L_{1:T-1}\)#

+
+\[ +L_{t-1}=D_{K L}\left(q\left(x_{t-1} \mid x_t, x_0\right) \| p_\theta\left(x_{t-1} \mid x_t\right)\right) +\]
+
    +
  • \( +q\left(x_{t-1} \mid x_t, x_0\right)=N\left(x_{t-1} ; \tilde{\mu}\left(x_t, x_0\right), \tilde{\beta}_t \mathrm{I}\right) +\)

  • +
  • \( +p_\theta\left(x_{t-1} \mid x_t\right)=\mathcal{N}\left(x_{t-1} ; \mu_\theta\left(x_t, t\right), \sum_\theta\left(x_t, t\right)\right) +\)

  • +
+

\(L_{1:T-1}\)는 forward progress posterior를 예측하는 loss. \(\mathbf{x}_{t-1}\)에서 noise를 더해 \(\mathbf{x}_{t}\)를 만들었을때, 그 과정을 복원 \(p(\mathbf{x}_{t-1}|\mathbf{x}_t)\) 하는 과정을 학습.

+
+DDPM_08 +
+

Fig. 16 Loss Simplication \ (source: https://velog.io/@sjina0722/논문-리뷰-Denoising-Diffusion-Probabilistic-Models)#

+
+
+
    +
  • \(\Sigma_\theta\): \(\beta\)를 상수로 가정했고 \(p(\mathbf{x}_{t-1}|\mathbf{x}_t)\)의 variance가 \(\beta\)에 영향을 받기 때문에 학습시키지 않아도 된다고 생각해 variance term을 제거함.

  • +
+
+DDPM_09 +
+

Fig. 17 Residual Estimation \ (source: https://velog.io/@sjina0722/논문-리뷰-Denoising-Diffusion-Probabilistic-Models)#

+
+
+
    +
  • \(\mu_\theta\): DDPM에서는 \(\mu_\theta\)를 바로 구하지 않고 residual \(\epsilon_\theta\)만 구해 정확도를 높임.

  • +
+
+
+

3-3. Data scaling, reverse process decoder and \(L_0\)#

+
+\[\begin{split} +\begin{aligned} +p_\theta\left(\mathbf{x}_0 \mid \mathbf{x}_1\right) & =\prod_{i=1}^D \int_{\delta_{-}\left(x_0^i\right)}^{\delta_{+}\left(x_0^i\right)} \mathcal{N}\left(x ; \mu_\theta^i\left(\mathbf{x}_1, 1\right), \sigma_1^2\right) d x \\ +\delta_{+}(x) & =\left\{\begin{array}{ll} +\infty & \text { if } x=1 \\ +x+\frac{1}{255} & \text { if } x<1 +\end{array} \quad \delta_{-}(x)= \begin{cases}-\infty & \text { if } x=-1 \\ +x-\frac{1}{255} & \text { if } x>-1\end{cases} \right. +\end{aligned} +\end{split}\]
+

[0, 255]의 image를 [-1,1] 사이로 linearly mapping. Sampling 마지막 단계에는 noise를 추가하지 않음.

+

\(L_0\)은 두 normal distribution 사이의 KL divergence를 나타냄.

+
    +
  • \(D\): Data dimensionality

  • +
  • \(i\): 좌표

  • +
+
+
+

3-4. Simplified training objective#

+
+DDPM_10 +
+

Fig. 18 Simplified training objective \ (source: https://velog.io/@sjina0722/논문-리뷰-Denoising-Diffusion-Probabilistic-Models)#

+
+
+
+DDPM_11 +
+

Fig. 19 Final Loss \ (source: https://velog.io/@sjina0722/논문-리뷰-Denoising-Diffusion-Probabilistic-Models)#

+
+
+

최종 loss는 위와 같이 나타난다. Ground truth - estimated output간 MSE loss를 줄이는 과정이 denoising과 비슷해 DDPM이라는 이름이 붙음.

+

Simplified objective을 통해 diffusion process를 학습하면 매우 작은 t 에서뿐만 아니라 큰 t에 대해서도 network 학습이 가능하기 때문에 매우 효과적.

+
+DDPM_12 +
+

Fig. 20 Psuedo code of training process \ (source: https://arxiv.org/abs/2006.11239)#

+
+
+
    +
  • Algorithm 1: Training

    +
      +
    • Noise를 더해나가는 과정, network(\(\epsilon_\theta\), \(p_\theta\))가 t step에서 noise(\(\epsilon\))가 얼마만큼 더해졌는지를 학습한다.

    • +
    • 학습 시에는 특정 step의 이미지가 얼마나 gaussian noise가 추가되었는지를 예측하도록 학습된다.

    • +
    • 코드에서는 랜덤 노이즈와 시간 단계 t로 노이즈가 추가된 이미지를 얻고 해당 이미지를 보고 모델이 노이즈를 예측

    • +
    +
  • +
+
def p_losses(self, x_start, t, noise = None):
+        b, c, h, w = x_start.shape
+        noise = default(noise, lambda: torch.randn_like(x_start))
+
+        # noise sample
+
+        x = self.q_sample(x_start = x_start, t = t, noise = noise)
+
+        # if doing self-conditioning, 50% of the time, predict x_start from current set of times
+        # and condition with unet with that
+        # this technique will slow down training by 25%, but seems to lower FID significantly
+
+        x_self_cond = None
+        if self.self_condition and random() < 0.5:
+            with torch.no_grad():
+                x_self_cond = self.model_predictions(x, t).pred_x_start
+                x_self_cond.detach_()
+
+        # predict and take gradient step
+
+        model_out = self.model(x, t, x_self_cond)
+
+        if self.objective == 'pred_noise':
+            target = noise
+        elif self.objective == 'pred_x0':
+            target = x_start
+        elif self.objective == 'pred_v':
+            v = self.predict_v(x_start, t, noise)
+            target = v
+        else:
+            raise ValueError(f'unknown objective {self.objective}')
+
+        loss = self.loss_fn(model_out, target, reduction = 'none')
+        loss = reduce(loss, 'b ... -> b (...)', 'mean')
+
+        loss = loss * extract(self.loss_weight, t, loss.shape)
+        return loss.mean()
+
+
+
    +
  • Algorithm 2: Sampling

    +
      +
    • Network를 학습하고 나면, gaussian noise에서 시작해서 순차적으로 denoising 하는 것이 가능하다. (by parameterized markovian chain)

    • +
    • 코드에서는 noise 제거 후 소량의 noise를 다시 추가하고 있음

    • +
    +
  • +
+
@torch.no_grad()
+def p_sample(self, x, t: int, x_self_cond = None):
+    b, *_, device = *x.shape, x.device
+    batched_times = torch.full((b,), t, device = x.device, dtype = torch.long)
+    model_mean, _, model_log_variance, x_start = self.p_mean_variance(x = x, t = batched_times, x_self_cond = x_self_cond, clip_denoised = True)
+    noise = torch.randn_like(x) if t > 0 else 0. # no noise if t == 0
+    pred_img = model_mean + (0.5 * model_log_variance).exp() * noise
+    return pred_img, x_start
+
+
+
+
+
+

4. Experiments#

+
    +
  • T: 1000

  • +
  • backbone: U-Net
    +각 down/upsampling 단계는 ResNet/ConvNext 블록 2개 + (groupnorm + attention + residual) + down/upsampling으로 구성됨

  • +
+
block_klass = partial(ResnetBlock, groups = resnet_block_groups)
+
+self.downs.append(nn.ModuleList([
+                block_klass(dim_in, dim_in, time_emb_dim = time_dim),
+                block_klass(dim_in, dim_in, time_emb_dim = time_dim),
+                Residual(PreNorm(dim_in, LinearAttention(dim_in))),
+                Downsample(dim_in, dim_out) if not is_last else nn.Conv2d(dim_in, dim_out, 3, padding = 1)
+            ]))
+            
+ self.ups.append(nn.ModuleList([
+                block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim),
+                block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim),
+                Residual(PreNorm(dim_out, LinearAttention(dim_out))),
+                Upsample(dim_out, dim_in) if not is_last else  nn.Conv2d(dim_out, dim_in, 3, padding = 1)
+            ]))
+
+
+
+
class Unet(nn.Module):
+    def __init__(
+        self,
+        dim,
+        init_dim = None,
+        out_dim = None,
+        dim_mults=(1, 2, 4, 8),
+        channels = 3,
+        self_condition = False,
+        resnet_block_groups = 8,
+        learned_variance = False,
+        learned_sinusoidal_cond = False,
+        random_fourier_features = False,
+        learned_sinusoidal_dim = 16
+    ):
+        super().__init__()
+
+        # determine dimensions
+
+        self.channels = channels
+        self.self_condition = self_condition
+        input_channels = channels * (2 if self_condition else 1)
+
+        init_dim = default(init_dim, dim)
+        self.init_conv = nn.Conv2d(input_channels, init_dim, 7, padding = 3)
+
+        dims = [init_dim, *map(lambda m: dim * m, dim_mults)]
+        in_out = list(zip(dims[:-1], dims[1:]))
+
+        block_klass = partial(ResnetBlock, groups = resnet_block_groups)
+
+        # time embeddings
+
+        time_dim = dim * 4
+
+        self.random_or_learned_sinusoidal_cond = learned_sinusoidal_cond or random_fourier_features
+
+        if self.random_or_learned_sinusoidal_cond:
+            sinu_pos_emb = RandomOrLearnedSinusoidalPosEmb(learned_sinusoidal_dim, random_fourier_features)
+            fourier_dim = learned_sinusoidal_dim + 1
+        else:
+            sinu_pos_emb = SinusoidalPosEmb(dim)
+            fourier_dim = dim
+
+        self.time_mlp = nn.Sequential(
+            sinu_pos_emb,
+            nn.Linear(fourier_dim, time_dim),
+            nn.GELU(),
+            nn.Linear(time_dim, time_dim)
+        )
+
+        # layers
+
+        self.downs = nn.ModuleList([])
+        self.ups = nn.ModuleList([])
+        num_resolutions = len(in_out)
+
+        for ind, (dim_in, dim_out) in enumerate(in_out):
+            is_last = ind >= (num_resolutions - 1)
+
+            self.downs.append(nn.ModuleList([
+                block_klass(dim_in, dim_in, time_emb_dim = time_dim),
+                block_klass(dim_in, dim_in, time_emb_dim = time_dim),
+                Residual(PreNorm(dim_in, LinearAttention(dim_in))),
+                Downsample(dim_in, dim_out) if not is_last else nn.Conv2d(dim_in, dim_out, 3, padding = 1)
+            ]))
+
+        mid_dim = dims[-1]
+        self.mid_block1 = block_klass(mid_dim, mid_dim, time_emb_dim = time_dim)
+        self.mid_attn = Residual(PreNorm(mid_dim, Attention(mid_dim)))
+        self.mid_block2 = block_klass(mid_dim, mid_dim, time_emb_dim = time_dim)
+
+        for ind, (dim_in, dim_out) in enumerate(reversed(in_out)):
+            is_last = ind == (len(in_out) - 1)
+
+            self.ups.append(nn.ModuleList([
+                block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim),
+                block_klass(dim_out + dim_in, dim_out, time_emb_dim = time_dim),
+                Residual(PreNorm(dim_out, LinearAttention(dim_out))),
+                Upsample(dim_out, dim_in) if not is_last else  nn.Conv2d(dim_out, dim_in, 3, padding = 1)
+            ]))
+
+        default_out_dim = channels * (1 if not learned_variance else 2)
+        self.out_dim = default(out_dim, default_out_dim)
+
+        self.final_res_block = block_klass(dim * 2, dim, time_emb_dim = time_dim)
+        self.final_conv = nn.Conv2d(dim, self.out_dim, 1)
+        
+  def forward(self, x, time, x_self_cond = None):
+          if self.self_condition:
+              x_self_cond = default(x_self_cond, lambda: torch.zeros_like(x))
+              x = torch.cat((x_self_cond, x), dim = 1)
+
+          x = self.init_conv(x)
+          r = x.clone()
+
+          t = self.time_mlp(time)
+
+          h = []
+
+          for block1, block2, attn, downsample in self.downs:
+              x = block1(x, t)
+              h.append(x)
+
+              x = block2(x, t)
+              x = attn(x)
+              h.append(x)
+
+              x = downsample(x)
+
+          x = self.mid_block1(x, t)
+          x = self.mid_attn(x)
+          x = self.mid_block2(x, t)
+
+          for block1, block2, attn, upsample in self.ups:
+              x = torch.cat((x, h.pop()), dim = 1)
+              x = block1(x, t)
+
+              x = torch.cat((x, h.pop()), dim = 1)
+              x = block2(x, t)
+              x = attn(x)
+
+              x = upsample(x)
+
+          x = torch.cat((x, r), dim = 1)
+
+          x = self.final_res_block(x, t)
+          return self.final_conv(x)
+
+
+
    +
  • 16 x 16 feature map resolution에 self-attention. conv에서 차원을 3배로 늘리고 q,k,v로 분해.

  • +
+
class Attention(nn.Module):
+    def __init__(self, dim, heads = 4, dim_head = 32):
+        super().__init__()
+        self.scale = dim_head ** -0.5
+        self.heads = heads
+        hidden_dim = dim_head * heads
+
+        self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False)
+        self.to_out = nn.Conv2d(hidden_dim, dim, 1)
+
+    def forward(self, x):
+        b, c, h, w = x.shape
+        qkv = self.to_qkv(x).chunk(3, dim = 1)
+        q, k, v = map(lambda t: rearrange(t, 'b (h c) x y -> b h c (x y)', h = self.heads), qkv)
+
+        q = q * self.scale
+
+        sim = einsum('b h d i, b h d j -> b h i j', q, k)
+        attn = sim.softmax(dim = -1)
+        out = einsum('b h i j, b h d j -> b h i d', attn, v)
+
+        out = rearrange(out, 'b h (x y) d -> b (h d) x y', x = h, y = w)
+        return self.to_out(out)
+
+
+
    +
  • Linear attention

  • +
+
class LinearAttention(nn.Module):
+    def __init__(self, dim, heads = 4, dim_head = 32):
+        super().__init__()
+        self.scale = dim_head ** -0.5
+        self.heads = heads
+        hidden_dim = dim_head * heads
+        self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False)
+
+        self.to_out = nn.Sequential(
+            nn.Conv2d(hidden_dim, dim, 1),
+            LayerNorm(dim)
+        )
+
+    def forward(self, x):
+        b, c, h, w = x.shape
+        qkv = self.to_qkv(x).chunk(3, dim = 1)
+        q, k, v = map(lambda t: rearrange(t, 'b (h c) x y -> b h c (x y)', h = self.heads), qkv)
+
+        q = q.softmax(dim = -2)
+        k = k.softmax(dim = -1)
+
+        q = q * self.scale
+        v = v / (h * w)
+
+        context = torch.einsum('b h d n, b h e n -> b h d e', k, v)
+
+        out = torch.einsum('b h d e, b h d n -> b h e n', context, q)
+        out = rearrange(out, 'b h c (x y) -> b (h c) x y', h = self.heads, x = h, y = w)
+        return self.to_out(out)
+
+
+
    +
  • Diffusion time \(T\)는 각 residual block에 transformer sinusoidal positional embedding이 추가돼서 구분됨

  • +
+
class SinusoidalPosEmb(nn.Module):
+    def __init__(self, dim):
+        super().__init__()
+        self.dim = dim
+
+    def forward(self, x):
+        device = x.device
+        half_dim = self.dim // 2
+        emb = math.log(10000) / (half_dim - 1)
+        emb = torch.exp(torch.arange(half_dim, device=device) * -emb)
+        emb = x[:, None] * emb[None, :]
+        emb = torch.cat((emb.sin(), emb.cos()), dim=-1)
+        return emb
+
+
+
+

4-1. Sample quality#

+
+DDPM_13 +
+

Fig. 21 Train score of DDPM \ (source: https://arxiv.org/abs/2006.11239)#

+
+
+

FID, IS로 metric 계산. Unconditional model인데도 conditional model보다 우월. Codelength에서 차이가 없기 때문에 overfitting의 가능성도 적음.

+
+
    +
  • FID score: Inception V3으로 이미지의 분포를 계산한 metric

  • +
  • Unconditional model: 한번 dataset에 학습되면 추가적인 context 없이 image를 생성

  • +
  • Conditional model: Class, label 등의 추가 정보를 받아 image를 생성

  • +
+
+

\(\mu\)보다 \(\epsilon\)을 계산하는 것이 성적이 좋고, fixed variance를 사용했을 때에도 성능이 감소하지 않음.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space.html b/docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space.html old mode 100644 new mode 100755 index 0be69d04..e8ecb4a0 --- a/docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space.html +++ b/docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space.html @@ -1,962 +1,981 @@ - - - - - - - - - - - - Diffusion Models already have a Semantic Latent Space — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: Diffusion Models already have a Semantic Latent Space (ICLR 2023)

  • -
  • Reference

    - -
  • -
  • Author: Sehwan Park

  • -
  • Last updated on Nov. 18, 2023

  • -
-
-
-

Diffusion Models already have a Semantic Latent Space#

-
-

Abstract#

-

Diffusion model은 많은 domain에서 좋은 성능을 보이지만 generative process를 control하는 semantic latent space가 부족하다. 논문에서는 diffusion model속에서 semantic latent space를 발견하기 위한 asymmetric reverse process(asyrp)를 제안하고 h-space라고 명칭한 semantic latent space의 좋은 특성(homogeneity, linearity, robustness, consistency across timesteps)들을 보여준다. 추가적으로 editing strength와 quality deficiency를 기준으로 삼고 더 좋은 image-image translation을 위한 Generative Process Design을 소개한다.

-
-
-

1. Introduction#

-
-Asyrp_1 -
-

Fig. 405 Manipulation approaches for diffusion models#

-
-
-

(a) Image guidance는 unconditional한 latent variable에 guiding image의 latent variable을 합치는 방식을 사용한다. 그러나 latent variable을 둘 다 이용하면서 명확하게 control하기가 쉽지 않다.

-

(b) Classifier guidance는 diffusion model에 classifier를 추가하여 generative process를 거치는 동안 latent variable이 어떤 class인지 분류하고 target class에 가까워지도록 score를 부여하는 방식으로 작동한다. 그러나 latent variable들에 대해 classify를 실행해야 하기에 pretrained model을 사용하기가 힘들어 직접 학습을 시켜야 하기에 시간적으로, 비용적으로 부담이 된다.

-

(c) DiffusionCLIP

-

(d) Diffusion Models already have a Semantic Latent Space는 original image의 특성을 edit하기 위한 아주 좋은 특성을 가지고 있는 semantic latent space를 frozen diffusion model에서 발견하였고 이를 h-space라고 칭한다. h-space에는 다양한 좋은 특성들이 존재한다. versatile editing과 quality boosting을 위해 새로운 generative process를 design하여 제안한다. h-space는 frozen pretrained diffusion model에서 semantic latent space로써의 첫 발견사례이다.

-
-
-

2. Background#

-
-

2.1 Denoising Diffusion Probability Model(DDPM)#

-

DDPM에서는 임의의 time step t로 부터 noise가 껴있는 image \(x_t\)\(\epsilon_t\)가 얼만큼인지 예측한다. 예측한 \(\epsilon_t\)를 이용하여 noise가 일부 제거된 이전 step의 mean(\(\mu_{\theta}(x_t)\))을 구할 수 있고 variance(\(\sum_{\theta}(x_t)\))는 constant한 값으로 고정시킨다. DDPM에서 제시한 forward process와 reverse process는 다음과 같다. DDPM에서의 \(\sigma_t^2 = \beta_t\)이다.

-
-\[ -q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_{t}}x_{t-1}, (1-\alpha_t)I) -\]
-
-\[ -p_{\theta}(x_{t-1}|x_t) := \mathcal{N}(\mu_{\theta}(x_t), \sum_{\theta}(x_t)) -\]
-
-\[ -x_{t-1} = \frac{1}{\sqrt{1-\beta_t}}\bigg(x_t - \frac{\beta_t}{\sqrt{1-\alpha_t}}\epsilon_t^\theta(x_t)\bigg) + \sigma_t\mathcal{z_t} -\]
-
-
-

2.2 Denoising Diffusion Implicit Model(DDIM)#

-

DDIM에서는 non-Markovian process를 이용해 또 다른 관점의 reverse process를 제시하였고, DDPM과 DDIM 모두 general하게 적용되는 Diffusion process에 대한 식을 보여주었다. \(\sigma_t = \eta\sqrt{(1-\alpha_{t-1}) / (1-\alpha_t)} \sqrt{1-\alpha_t/\alpha_{t-1}}\)이다.

-

\(\eta\)=1인 경우 DDPM이 되고 stochastic해지며, \(\eta\)=0인 경우 DDIM이 되고 deterministic해진다.

-
-\[ -q_{\sigma}(x_{t-1}|x_t,x_0) = \mathcal{N}(\sqrt{\alpha_{t-1}}x_0 + \sqrt{1-\alpha_{t-1}-\sigma_t^2} \cdot \cfrac{x_t - \sqrt{\alpha_t}x_0}{\sqrt{1-\alpha_t}}, \sigma_t^2I) -\]
-
-\[ -x_{t-1} = \sqrt{\alpha_{t-1}}\underbrace{\bigg(\frac{x_t - \sqrt{1-\alpha_t}\epsilon_t^\theta(x_t)}{\sqrt{\alpha_t}}\bigg)}_{\textrm{predicted } x_0} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot \epsilon_t^\theta(x_t) }_{\textrm{direction pointing to }x_t} + \sigma_t\mathcal{z_t} -\]
-
-
-

2.3 Image Manipulation with CLIP#

-

CLIP은 Image Encoder와 Text Encoder를 이용하여 image와 text간의 embedding을 학습한다. 편집된 이미지와 대상 설명 간의 cosine distance를 직접 최소화하는 대신 cosine distance를 사용한 directional loss를 사용하여 mode collapse없이 균일한 editing을 가능하게 했다고 한다.

-

\(\Delta T = \mathrm{E}_T(y^{target}) - \mathrm{E}_T(y^{source}) \)
\(\Delta I = \mathrm{E}_I(x^{edit}) - \mathrm{E}_I(x^{source})\)

-
-\[ -\mathcal{L}_{direction} (x^{edit}, y^{target};x^{source},y^{source}) := 1 - \cfrac{\Delta I \cdot \Delta T}{\parallel\Delta I\parallel \parallel\Delta T\parallel} -\]
-
-
-
-

3. Discovering Semantic Latent Space In Diffusion Models#

-

Editiing을 하는 과정에서 naive approach를 통해서는 editing이 잘 이루어지지 않는다. 이 chapter에서는 왜 잘 이루어지지 않는지에 대한 설명을 하고 이를 해결하는 새로운 controllable한 한 reverse process인 Asymmetric Reverse Process(Asyrp)를 제안한다.

-

DDIM에서 \(x_{t-1}\)에 대한 수식을 설명하였는데 이 chapter부터는 “predicted \(x_0\)”부분을 \(\mathrm{P}_t(\epsilon_t^{\theta}(x_t))\)\(\mathrm{P}_t\)라고 설정하고, “direction pointing to \(x_t\)”부분을 \(\mathrm{D}_t(\epsilon_t^{\theta}(x_t))\)\(\mathrm{D}_t\)라고 설정하였다.

-

\(\mathrm{P}_t\)는 latent variable로 부터 \(x_0\)를 예측하는 reverse process와 같은 역할을 담당하고 \(\mathrm{D}_t\)는 다시 noise를 추가해 latent variable로 돌아가기에 forward process와 같은 역할을 담당한다.

-
-\[ -x_{t-1} = \sqrt{\alpha_{t-1}}\underbrace{\bigg(\frac{x_t - \sqrt{1-\alpha_t}\epsilon_t^\theta(x_t)}{\sqrt{\alpha_t}}\bigg)}_{\mathrm{P}_t(\epsilon_t^{\theta}(x_t))} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot \epsilon_t^\theta(x_t) }_{\mathrm{D}_t(\epsilon_t^{\theta}(x_t))} + \sigma_t\mathcal{z_t} -\]
-
-\[ -x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}(x_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) + \sigma_t\mathcal{z_t} -\]
-
-

3.1 Problem#

-

\(x_T\)로 부터 생성된 image \(x_0\)를 given text prompts에 맞게 manipulate시키는 가장 간단한 방법은 2.3에서 소개한 \(\mathcal{L}_{direction}\)을 optimize하도록 \(x_T\)를 update하는 것이다. 하지만 이 방법은 distorted images를 생성하거나 부정확한 manipulation을 한다고 한다.

-

이에 대한 대안으로, 모든 sampling step에서 원하는 방향으로 manipulate하도록 \(\epsilon_t^{\theta}\)를 shift해주는 방법이 제시되었다. 하지만 이 방법은 \(x_0\)를 완전히 manipulate하지 못한다. 왜냐하면 \(\mathrm{P}_t\)\(\mathrm{D}_t\)에서 둘다 shifted된 \(\tilde{\epsilon}_t^{\theta}\)를 사용하기에 cancel out되어 결국 latent variable에서는 기존과 다름이 없다는 것이다. 자세한 증명은 Proof of Theroem을 보면 된다.

-
- Proof of Theroem) -

Define \(\alpha_t = \prod_{s=1}^t(1 - \beta_s)\), \(\tilde{x}_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \mathrm{D}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \sigma_t\mathcal{z_t}\)

-

= \(\sqrt{\alpha_{t-1}}\underbrace{\bigg(\cfrac{x_t - \sqrt{1-\alpha_t}(\epsilon_t^\theta(x_t) + \Delta \epsilon_t)}{\sqrt{\alpha_t}}\bigg)}_{\mathrm{P}_t(\tilde{\epsilon}_t^{\theta})} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot (\epsilon_t^\theta(x_t) + \Delta \epsilon_t) }_{\mathrm{D}_t(\tilde{\epsilon}_t^{\theta})} + \sigma_t\mathcal{z_t}\)

-

= \(\sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^\theta(x_t)) + \mathrm{D}_t(\epsilon_t^\theta(x_t)) - \cfrac{\sqrt{\alpha_{t-1}}\sqrt{1-\alpha_t}}{\sqrt{\alpha_t}} \cdot \Delta \epsilon_t + \sqrt{1-\alpha_{t-1}} \cdot \Delta \epsilon_t\)

-

\(\sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^\theta(x_t)) + \mathrm{D}_t(\epsilon_t^\theta(x_t))\)는 기존 DDIM에서의 \(x_{t-1}\)에 대한 식이고 위 식의 \(\Delta \epsilon_t\)항만 따로 묶어서 표현하면 아래와 같다.

-

= \(x_{t-1} + \bigg( -\cfrac{\sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} + \sqrt{1-\alpha_{t-1}} \bigg) \cdot \Delta \epsilon_t \)

-

= \(x_{t-1} + \bigg( -\cfrac{\sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} + \cfrac{\sqrt{1-\prod_{s=1}^{t-1}(1-\beta_s)}\sqrt{1-\beta_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t \)

-

\({\sqrt{1-\prod_{s=1}^{t-1}(1-\beta_s)}\sqrt{1-\beta_t}}\)를 root를 묶어서 내부를 계산하면 \(\sqrt{1-\alpha_t-\beta_t}\)이므로 정리하면 아래와 같다.

-

= \(x_{t-1} + \bigg( \cfrac{\sqrt{1-\alpha_t-\beta_t} - \sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t \)

-

\(\therefore \Delta x_t = \tilde{x_{t-1}} - x_{t-1} = \cfrac{\sqrt{1-\alpha_t-\beta_t} - \sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t\)

-

shifted epsilon을 사용한 결과이다. 분자를 보면 \(\beta_t\)는 매우 작기에 거의 0에 수렴하기에 결국 차이가 거의 없음을 보인다.
\(\epsilon\)-space에서의 manipulation 효과는 매우 좋지 않음을 알 수 있다.

-
-
-Asyrp_2 -
-

Fig. 406 No Manipulation Effect with shifted epsilon#

-
-
-
-
-

3.2 Asymmetric Reverse Process(Asyrp)#

-

chapter 3.1에서 \(\epsilon\)-space에서의 문제를 해결하기 위해 저자들은 Asyrp를 제안한다. 이름 그대로 비대칭적인 방법을 사용한다는 것인데 \(x_0\)를 예측하는 \(\mathrm{P}_t\)에서는 shifted epsilon을 사용하고, latent variable로 돌아가는 \(\mathrm{D}_t\)에서는 non-shifted epsilon을 사용해서 전체적인 변화를 준다는 것이다. 즉, \(\mathrm{P}_t\)만modify하고 \(\mathrm{D}_t\)는 유지한다. Asyrp를 식으로 표현하면 다음과 같다.

-
-\[ -x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) -\]
-

Loss식 또한 chapter 2.3에서 제시한 \(\mathcal{L}_{direction}\)을 사용하여 재구성하였다. modify를 하지 않은 \(\mathrm{P}_t^{source}\)와 modifiy를 한 \(\mathrm{P}_t^{edit}\)을 사용한다. Loss식은 다음과 같다.

-
-\[ -\mathcal{L}^{(t)} = \lambda_{CLIP}(\mathrm{P}_t^{edit}, y^{ref};\mathrm{P}_t^{source},y^{source}) + \lambda_{recon}|\mathrm{P}_t^{edit} - \mathrm{P}_t^{source}| -\]
-

전체적인 reverse process는 다음과 같이 설계가 되었다. 이제 shifted epsilon인 \(\tilde{\epsilon}_t^{\theta}(x_t)\)를 어떤 방식으로 얻을 것인지에 대한 설계가 필요하다. 저자들은 기존의 \(\epsilon\)-space에서 변화를 주는 것보다 훨씬 더 좋은 result를 보이고, nice properties를 가지는 h-space에서 변화를 주는 것을 제안한다.

-
-
-

3.3 h-space#

-

\(\epsilon_t^{\theta}\)는 diffusion models의 backbone인 U-Net에서 도출된다. 이 논문에서는 Image manipulation을 위해 \(\epsilon_t^{\theta}\)를 control하는 space를 U-Net의 bottleneck 즉, 가장 깊은 feature map인 \(h_t\)로 정하였다. 이를 h-space라고 부른다. h-space는 \(\epsilon\)-space보다 더 작은 spatial resolutions을 가지고 high-level semantic를 가진다. 또한 \(\epsilon\)-space에서는 발견할 수 없는 매우 nice한 특성들을 가지고 있다.

-
-Asyrp_3 -
-

Fig. 407 U-Net structure and h-space#

-
-
-

h-space의 크기는 \(8^2\times512\)이고 \(\epsilon\)-space의 크기는 \(256^2\times3\)으로 h-space에서의 control이 더 지배적이고 robust함을 추측할 수 있다(실제 실험적으로 증명을 함). h-space는 skip-connection의 영향을 받지 않으며 가장 압축된 정보를 가지고 있는 공간이며 image를 control하는데에 있어 매우 좋은 특성들을 가지고 있다. 실제 저자들은 h-space를 지정하기 위해 U-Net의 모든 feature map을 h-space로 설정해두고 실험을 해보았는데 위의 그림을 기준으로 8th layer이전의 feature map을 h-space로 지정한 경우에는 manipulaton이 적게 이루어졌고, 8th layer 이후의 feature map을 h-space로 지정한 경우에는 너무 과한 manipulation이 이루어지거나 아예 distorted image가 생성되었다. h-space만의 특성은 chapter5에서 설명한다.

-
-
-

3.4 Implicit Neural Directions#

-
-Asyrp_4 -
-

Fig. 408 Illustration of \(\mathrm{f}(t)\)#

-
-
-

\(\Delta h_t\)가 image를 manipulating하는데 성공했음에도, 수많은 timestep에서 매번 optimizing하기란 쉽지 않다. 대신에 논문에서는 \(h_t\)를 입력받아 \(\Delta h\)를 출력해주는 작은 neural network인 \(\mathrm{f}(t)\)를 추가하였다. \(\mathrm{f}(t)\)\(\Delta h_t\)를 매번 모든 timestep에서 optimizing해줘야 하는 방법에 비해 시간도 빠르고 setting값들에 대해 robust하다. 또한 주어진 timestep과 bottleneck feature인 \(h_t\)에 대해 \(\Delta h_t\)를 출력하는 방법을 학습하기에 unseen timestep과 bottleneck feature에 대해서도 일반화할 수 있다고 한다. 이는 accelerated한 과정에서도 큰 효과를 본다. training scheme이 어떻든 간에 결국 부여하는 \(\sum\Delta\mathrm{h_t}\)만 보존된다면, 어떠한 length를 설계해도 비슷한 manipulation효과를 볼 수 있다.

-

h-space에서 epsilon을 control해서 asyrp 이용하는 식은 다음과 같다. 이해를 위해 \(\epsilon\)-space와 h-space에서의 shifted epsilon \(\tilde{\epsilon}_t^{\theta}(x_t)\)을 비교하였다.

-
    -
  • \(\epsilon\)-space에서의 shifted epsilon

    -

    \(\tilde{\epsilon}_t^{\theta}(x_t) = \epsilon_t^{\theta}(x_t) + \Delta \epsilon_t\)

    -
  • -
  • h-space에서의 shifted epsilon

    -

    \(\tilde{\epsilon}_t^{\theta}(x_t) = \epsilon_t^{\theta}(x_t | \Delta h_t)\)

    -
  • -
-
-\[ -x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}(x_t | \Delta h_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) -\]
-
-Asyrp_5 -
-

Fig. 409 Asymmetric Reverse Process#

-
-
-
-
-
-

4. Generative Process Design#

-
-Asyrp_6 -
-

Fig. 410 Intuition for choosing the intervals for editing and quality boosting#

-
-
-

Perception prioritized training of diffusion models(Choi et al)에서는 Diffusion model이 early stage에서는 high-level context를 generate하고, later stage에서는 imperceptible fine details를 generate한다고 제안한다. 본 논문에서는 early stage에서 editing을 진행하는 editing process와 later stage에서 imperceptible fine details를 진행하는 quality boosting을 위한 구간을 나눠서 새로운 Generative Process Design을 제시한다.

-
-

4.1 Editing Process With Asyrp#

-

Editing Process에서는 high-level context가 generate되어야 하므로 전체 timestep[0,T]에서 Editing Process를 위한 editing interval을 [T, \(t_{edit}\)]으로 설정하였다. \(t_{edit}\)의 시점을 결정하기 위해 LPIPS 측정지표를 이용한다. LPIPS(\(\mathrm{x}, \mathrm{P}_t\))는 t시점에서 예측한 \(x_0\)와 target이 되는 original image간의 perceptual distance를 계산한다. 따라서 LPIPS를 남은 reverse process을 통해 editing 해야 할 구성요소를 측정하는 지표라고 볼 수도 있다. 첫 step T의 LPIPS로 부터 \(t_{edit}\)시점에서의 LPIPS 차이는 Editing Process에서 얼만큼의 perceptual change를 주었는지를 나타낸다. 이 값을 editing strength(\(\epsilon_t\))라고 정의한다.

-
-\[ -\xi_t = \mathrm{LPIPS}(x, \mathrm{P}_T) - \mathrm{LPIPS}(x, \mathrm{P}_t) -\]
-

Editing interval이 작으면 \(\xi_t\)가 작아지며 변화가 많이 일어나지 않고 반면, Editing interval이 크면 \(\xi_t\)가 커지고 변화가 많이 일어난다. 따라서 충분한 변화를 줄 수 있는 한에서 가장 최소의 Editing interval을 찾는 것이 \(t_{edit}\)을 결정하는 최고의 방법이다. 저자들은 실험적인 결과를 통해 \(\mathrm{LPIPS}(x, \mathrm{P}_t)\) = 0.33인 t시점을 \(t_{edit}\)으로 결정하였다.

-
-Asyrp_7 -
-

Fig. 411 Results based on various \(\mathrm{LPIPS}(x, \mathrm{P}_{t_{edit}})\)#

-
-
-
-Asyrp_8 -
-

Fig. 412 Importance of choosing proper \(t_{edit}\)#

-
-
-

몇몇 특성들은 다른 특성들에 비해 visual change를 많이 필요로 하는 경우도 있다. 예를 들어 source image에 대해 smile한 attribute를 추가하는 경우보다 pixar style의 attribute을 추가하는 경우가 더 많은 visual change를 필요로 한다. 이러한 경우에는 Editing interval을 더 길게 설정해야 한다. 이러한 경우에는 \(\mathrm{LPIPS}(x, \mathrm{P}_t)\) = 0.33 - \(\delta\)를 만족하는 t를 \(t_{edit}\)으로 설정한다. 이 때, \(\delta = 0.33d(\mathrm{E}_T(y_{source}), \mathrm{E}_T(y_{target}))\)이다. \(\mathrm{E}_T\)는 CLIP text embedding을 진행하는 Text Encoder를 의미하며, d는 cosine distance를 의미한다. 아래 그림을 통해 더 많은 visual change를 요구하는 attributes에 대해서는 \(t_{edit}\)이 더 작음(Editing Interval이 김)을 알 수 있다.

-
-Asyrp_9 -
-

Fig. 413 Flexible \(t_{edit}\) based on the amount of visual changes.#

-
-
-
-
-

4.2 Quality Boosting With Stochastic Noise Injection#

-

DDIM은 \(\eta\)=0으로 설정하며 stochasticity를 제거하여 거의 완벽한 inversion을 가능케 하였다. Elucidating the design space of diffusionbased generative models(Karras et al.)에서는 stochasticity가 image quality를 증가시킨다고 증명하였다. 이에 따라 본 논문에서는 Generative Process에 stochastic noise를 주입하는 quality boosting 단계를 설정하고 boosting interval은 [\(t_{boost}\), 0]이다.

-

Boosting Interval에 따라 image quality를 control할 수 있는데, Boosting Interval이 길게되면, Quality는 증가하지만 Interval동안 계속해서 stochastic noise를 주입해야 하기에 content가 변하는 문제가 발생할 수도 있다. 따라서 충분한 quality boosting을 달성하면서도 content에 최소한의 변화만을 줄 수 있도록 \(t_{boost}\)를 설정하는 것이 중요하다. 저자들은 image에 껴있는 noise를 quality boosting을 통해 해결해야 할 부분으로 보았으며 target이 되는 original image로 부터 t시점의 image \(x_t\)에 얼만큼의 noise가 껴있는지에 대한 지표로 quality deficiency \(\gamma_t\)를 이용한다.

-
-\[ -\gamma_t = \mathrm{LPIPS}(x, x_t) -\]
-

여기서는 editing strength와는 다르게 time step에 따라 예측한 \(x_0\)\(\mathrm{P}_t\)가 아닌 latent variable \(x_t\)를 이용한다. 저자들은 noise를 판단하는데에 있어서 semantics보다는 actual image를 고려했기에 위와 같이 설정하였다고 한다. 저자들은 실험적인 결과를 통해 \(\gamma_t\) = 1.2인 t시점을 \(t_{boost}\)로 설정하였다.

-
-Asyrp_10 -
-

Fig. 414 Results based on various \(\gamma_{t_{boost}}\)#

-
-
-
-Asyrp_11 -
-

Fig. 415 Quality comparison based on the presence of quality boosting#

-
-
-
-
-

4.3 Overall Process of Image Editing#

-

General한 Diffusion model에서의 Generative Process를 표현하면 다음과 같다.

-
-\[ -x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}) + \mathrm{D}_t(\epsilon_t^{\theta}) + \sigma_t\mathcal{z}_t\bigg(where, \sigma_t = \eta\sqrt{(1-\alpha_{t-1}) / (1-\alpha_t)} \sqrt{1-\alpha_t/\alpha_{t-1}}\bigg) -\]
-

\(\eta\) = 0인 경우에는 DDIM이 되며, stochastic noise를 더하는 부분이 사라져 deterministic해진다. \(\eta\) = 1인 경우에는 DDPM이 되며, stochastic한 특성이 있다. Asyrp(Assymetric Reverse Process)에서는 기본적으로 DDIM을 사용하며 \(\mathrm{P}_t\)에서 h-space를 통해 control된 \(\epsilon_t^{\theta}(x_t|f_t)\)를 사용한다. Diffusion Models already have a Semantic Latent Space에서 제시한 Generative Process를 전체적으로 정리하면 다음과 같다.

-
-Asyrp_12 -
-

Fig. 416 Quality comparison based on the presence of quality boosting#

-
-
-

처음부터 \(t_{edit}\)시점까지는 Asyrp를 이용해 Editing Process를 진행한다. 이 후 DDIM 방식을 통해 Denoising을 진행하다가 \(t_{boost}\)시점부터 끝날 때까지 stochastic noise를 주입하는 DDPM 방식을 이용해 Quality boosting을 진행한다.

-
-Asyrp_13 -
-

Fig. 417 Overview of Generative Process#

-
-
-
-
-
-

5. Experiments#

-

CelebA-HQ (Karras et al., 2018) 및 LSUN-bedroom/-church (Yu et al., 2015) 데이터셋에서 DDPM++ (Song et al., 2020b) (Meng et al., 2021); AFHQ-dog (Choi et al., 2020) 데이터셋에서 iDDPM (Nichol & Dhariwal, 2021); 그리고 METFACES (Karras et al., 2020) 데이터셋에서 ADM with P2-weighting (Dhariwal & Nichol, 2021) (Choi et al., 2022)을 사용해 각각 학습시켰다고 한다. 모든 model들은 pretrained checkpoint를 활용했으며 frozen상태를 유지시켰다고 한다.

-
-

5.1 Versatility of h-space with Asyrp#

-
-Asyrp_14 -
-

Fig. 418 Editing results of Asyrp on various datasets#

-
-
-

위의 그림을 보면, 논문에서는 다양한 attribute들의 특성을 잘 반영해서 image를 manipulate했다는 점을 알 수 있다. 심지어 {department, factory, temple} attribute은 training data에 포함이 되어있지 않았음에도 성능이 잘 나온 점을 확인할 수 있다. model을 fine tuning하지 않고 inference하는 과정에서 h-space를 통해 epsilon을 control하고 Asyrp를 이용해 성능을 냈다는 점이 가장 큰 장점이다.

-
-
-

5.2 Quantitive Comparison#

-

Asyrp model의 결과를 다른 model들과 비교하는 실험을 진행하였는데 diffusion model 전체를 fine-tuning하여 image을 editing하는 DiffsionCLIP model과 비교하였다. Asyrp의 성능이 더 좋음을 확인 할 수 있다.

-
-Asyrp_15 -
-

Fig. 419 Asyrp vs DiffusionCLIP on both CelebA-HQ seen-domain attributes and unseen-domain attributes#

-
-
-
-
-

5.3 Analysis on h-space#

-
    -
  1. Homogeneity

    -
    -Asyrp_16 -
    -

    Fig. 420 Homogeneity of h-space#

    -
    -
    -

    위의 그림의 (a)는 Real image에 smiling attribute을 추가하기 위해 최적화된 \(\Delta h_t\)\(\Delta \epsilon_t\)를 나타낸다. 같은 값을 다른 Real image에 적용시켰을 때의 결과를 (b)에 나타내었는데, \(\Delta h_t\)를 적용한경우 smiling face로 잘 바뀌는 반면, \(\Delta \epsilon_t\)을 적용한 경우에는 image distortion이 발생함을 알 수 있다.

    -
  2. -
  3. Linearity

    -
    -Asyrp_17 -
    -

    Fig. 421 Linearity of h-space - Linear Scaling#

    -
    -
    -

    \(\Delta_h\)를 linearly scaling을 하는 것은 editing을 하는데에 있어 visual attribute change의 양에 반영된다. 즉, \(\Delta_h\)\(\times\)1, \(\times\)2, \(\times\)3배 \(/dots\) 함에 따라 result image에서 반영되는 attribute또한 이에 맞게 변화한다는 것이다. 위의 그림에서 표현되어 있듯이 negative scaling에 대해서는 training을 하지 않았음에도 잘 적용 된다는 점을 알 수 있다.

    -
    -Asyrp_17 -
    -

    Fig. 422 Linearity of h-space - Linear Combination#

    -
    -
    -

    서로 다른 attributes에 대한 \(\Delta_h\)를 합쳐서 부여를 했을 경우에도 각각의 attribute들이 image에 잘 반영이 된다는 점을 알 수 있다.

    -
  4. -
  5. Robustness

    -
    -Asyrp_17 -
    -

    Fig. 423 Robustness of h-space#

    -
    -
    -

    위의 그림은 h-space와 \(\epsilon-space\)에서 random noise를 주입했을 때의 결과를 비교한 것이다. h-space의 경우에는 random noise가 추가되었어도 image에 큰 변화가 없으며 많은 noise가 추가되었을 경우에도 image distortion은 거의 없고 semantic change만 발생한다. 그러나 \(\epsilon-space\)의 경우에는 random noise가 추가된 경우 image distortion이 심하게 발생한다. 이를 통해 h-space가 얼마나 robustness한지 알 수 있다.

    -
  6. -
  7. Consistency across time steps

    -
    -Asyrp_17 -
    -

    Fig. 424 Consistency across times steps of h-space#

    -
    -
    -

    h-space의 homogeneous한 성질을 통해 같은 attribute에 대한 \(\Delta h\)를 다른 image에 적용시켰을 때에도 잘 반영이 됌을 확인하였다. 저자들은 \(\Delta h_t\)들에 대한 평균인 \(\Delta h_t^{mean}\)을 적용시켰을 경우에도 result가 거의 비슷함을 보인다. Chapter4에서 제시한 Generative Process를 비추어 보았을 때, \(\Delta h_t\)는 Editing Process에서만 적용을 시킨다. 이 경우, 적용하는 \(\Delta h_t\)\(\Delta h_t^{global}\)이라고 칭하며, 적용하는 \(\Delta h_t\)가 interval동안 같은 크기 만큼 적용된다고 가정했을 경우, \(\Delta h^{global} = \cfrac{1}{\mathrm{T_e}}\sum_t\ \Delta h_t^{mean}\)이라고 쓸 수 있다. 이 경우에도 결과는 비슷함을 보여준다. 결국 원하는 attribute에 대해 주입해야 할 \(\Delta h\)양만 같다면, 원하는 editing 효과를 얻을 수 있다. 비록 이 논문에서는 best quality manipulation을 위해 \(\Delta h_t\)를 사용하였지만, \(\Delta h_t^{mean}\)\(\Delta h^{global}\)에 대해 더 연구를 해 볼 여지가 있다고 판단한다.

    -
  8. -
-
-
-
-

6. Conclusion#

-

본 논문에서는 Pretrained Diffusion models에서 latent semantic space인 h-space를 발견했고 h-space에서의 Asyrp(Asymmetric Reverse Process)와 새롭게 제안한 Reverse Process 방법을 통해 성공적인 image editing을 가능케 하였다. Diffusion model에서의 semantic한 latent space에 대한 첫 제안을 한 논문이다. h-space는 GAN의 latent space와 유사한 특성을 갖추고 있다. 대표적인 h-space의 특성으로는 Homogeneity, Linearity, Robustness, Consistency across timesteps이 있다.

-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Diffusion Models already have a Semantic Latent Space — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: Diffusion Models already have a Semantic Latent Space (ICLR 2023)

  • +
  • Reference

    + +
  • +
  • Author: Sehwan Park

  • +
  • Last updated on Nov. 18, 2023

  • +
+
+
+

Diffusion Models already have a Semantic Latent Space#

+
+

Abstract#

+

Diffusion model은 많은 domain에서 좋은 성능을 보이지만 generative process를 control하는 semantic latent space가 부족하다. 논문에서는 diffusion model속에서 semantic latent space를 발견하기 위한 asymmetric reverse process(asyrp)를 제안하고 h-space라고 명칭한 semantic latent space의 좋은 특성(homogeneity, linearity, robustness, consistency across timesteps)들을 보여준다. 추가적으로 editing strength와 quality deficiency를 기준으로 삼고 더 좋은 image-image translation을 위한 Generative Process Design을 소개한다.

+
+
+

1. Introduction#

+
+Asyrp_1 +
+

Fig. 405 Manipulation approaches for diffusion models#

+
+
+

(a) Image guidance는 unconditional한 latent variable에 guiding image의 latent variable을 합치는 방식을 사용한다. 그러나 latent variable을 둘 다 이용하면서 명확하게 control하기가 쉽지 않다.

+

(b) Classifier guidance는 diffusion model에 classifier를 추가하여 generative process를 거치는 동안 latent variable이 어떤 class인지 분류하고 target class에 가까워지도록 score를 부여하는 방식으로 작동한다. 그러나 latent variable들에 대해 classify를 실행해야 하기에 pretrained model을 사용하기가 힘들어 직접 학습을 시켜야 하기에 시간적으로, 비용적으로 부담이 된다.

+

(c) DiffusionCLIP

+

(d) Diffusion Models already have a Semantic Latent Space는 original image의 특성을 edit하기 위한 아주 좋은 특성을 가지고 있는 semantic latent space를 frozen diffusion model에서 발견하였고 이를 h-space라고 칭한다. h-space에는 다양한 좋은 특성들이 존재한다. versatile editing과 quality boosting을 위해 새로운 generative process를 design하여 제안한다. h-space는 frozen pretrained diffusion model에서 semantic latent space로써의 첫 발견사례이다.

+
+
+

2. Background#

+
+

2.1 Denoising Diffusion Probability Model(DDPM)#

+

DDPM에서는 임의의 time step t로 부터 noise가 껴있는 image \(x_t\)\(\epsilon_t\)가 얼만큼인지 예측한다. 예측한 \(\epsilon_t\)를 이용하여 noise가 일부 제거된 이전 step의 mean(\(\mu_{\theta}(x_t)\))을 구할 수 있고 variance(\(\sum_{\theta}(x_t)\))는 constant한 값으로 고정시킨다. DDPM에서 제시한 forward process와 reverse process는 다음과 같다. DDPM에서의 \(\sigma_t^2 = \beta_t\)이다.

+
+\[ +q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_{t}}x_{t-1}, (1-\alpha_t)I) +\]
+
+\[ +p_{\theta}(x_{t-1}|x_t) := \mathcal{N}(\mu_{\theta}(x_t), \sum_{\theta}(x_t)) +\]
+
+\[ +x_{t-1} = \frac{1}{\sqrt{1-\beta_t}}\bigg(x_t - \frac{\beta_t}{\sqrt{1-\alpha_t}}\epsilon_t^\theta(x_t)\bigg) + \sigma_t\mathcal{z_t} +\]
+
+
+

2.2 Denoising Diffusion Implicit Model(DDIM)#

+

DDIM에서는 non-Markovian process를 이용해 또 다른 관점의 reverse process를 제시하였고, DDPM과 DDIM 모두 general하게 적용되는 Diffusion process에 대한 식을 보여주었다. \(\sigma_t = \eta\sqrt{(1-\alpha_{t-1}) / (1-\alpha_t)} \sqrt{1-\alpha_t/\alpha_{t-1}}\)이다.

+

\(\eta\)=1인 경우 DDPM이 되고 stochastic해지며, \(\eta\)=0인 경우 DDIM이 되고 deterministic해진다.

+
+\[ +q_{\sigma}(x_{t-1}|x_t,x_0) = \mathcal{N}(\sqrt{\alpha_{t-1}}x_0 + \sqrt{1-\alpha_{t-1}-\sigma_t^2} \cdot \cfrac{x_t - \sqrt{\alpha_t}x_0}{\sqrt{1-\alpha_t}}, \sigma_t^2I) +\]
+
+\[ +x_{t-1} = \sqrt{\alpha_{t-1}}\underbrace{\bigg(\frac{x_t - \sqrt{1-\alpha_t}\epsilon_t^\theta(x_t)}{\sqrt{\alpha_t}}\bigg)}_{\textrm{predicted } x_0} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot \epsilon_t^\theta(x_t) }_{\textrm{direction pointing to }x_t} + \sigma_t\mathcal{z_t} +\]
+
+
+

2.3 Image Manipulation with CLIP#

+

CLIP은 Image Encoder와 Text Encoder를 이용하여 image와 text간의 embedding을 학습한다. 편집된 이미지와 대상 설명 간의 cosine distance를 직접 최소화하는 대신 cosine distance를 사용한 directional loss를 사용하여 mode collapse없이 균일한 editing을 가능하게 했다고 한다.

+

\(\Delta T = \mathrm{E}_T(y^{target}) - \mathrm{E}_T(y^{source}) \)
\(\Delta I = \mathrm{E}_I(x^{edit}) - \mathrm{E}_I(x^{source})\)

+
+\[ +\mathcal{L}_{direction} (x^{edit}, y^{target};x^{source},y^{source}) := 1 - \cfrac{\Delta I \cdot \Delta T}{\parallel\Delta I\parallel \parallel\Delta T\parallel} +\]
+
+
+
+

3. Discovering Semantic Latent Space In Diffusion Models#

+

Editiing을 하는 과정에서 naive approach를 통해서는 editing이 잘 이루어지지 않는다. 이 chapter에서는 왜 잘 이루어지지 않는지에 대한 설명을 하고 이를 해결하는 새로운 controllable한 한 reverse process인 Asymmetric Reverse Process(Asyrp)를 제안한다.

+

DDIM에서 \(x_{t-1}\)에 대한 수식을 설명하였는데 이 chapter부터는 “predicted \(x_0\)”부분을 \(\mathrm{P}_t(\epsilon_t^{\theta}(x_t))\)\(\mathrm{P}_t\)라고 설정하고, “direction pointing to \(x_t\)”부분을 \(\mathrm{D}_t(\epsilon_t^{\theta}(x_t))\)\(\mathrm{D}_t\)라고 설정하였다.

+

\(\mathrm{P}_t\)는 latent variable로 부터 \(x_0\)를 예측하는 reverse process와 같은 역할을 담당하고 \(\mathrm{D}_t\)는 다시 noise를 추가해 latent variable로 돌아가기에 forward process와 같은 역할을 담당한다.

+
+\[ +x_{t-1} = \sqrt{\alpha_{t-1}}\underbrace{\bigg(\frac{x_t - \sqrt{1-\alpha_t}\epsilon_t^\theta(x_t)}{\sqrt{\alpha_t}}\bigg)}_{\mathrm{P}_t(\epsilon_t^{\theta}(x_t))} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot \epsilon_t^\theta(x_t) }_{\mathrm{D}_t(\epsilon_t^{\theta}(x_t))} + \sigma_t\mathcal{z_t} +\]
+
+\[ +x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}(x_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) + \sigma_t\mathcal{z_t} +\]
+
+

3.1 Problem#

+

\(x_T\)로 부터 생성된 image \(x_0\)를 given text prompts에 맞게 manipulate시키는 가장 간단한 방법은 2.3에서 소개한 \(\mathcal{L}_{direction}\)을 optimize하도록 \(x_T\)를 update하는 것이다. 하지만 이 방법은 distorted images를 생성하거나 부정확한 manipulation을 한다고 한다.

+

이에 대한 대안으로, 모든 sampling step에서 원하는 방향으로 manipulate하도록 \(\epsilon_t^{\theta}\)를 shift해주는 방법이 제시되었다. 하지만 이 방법은 \(x_0\)를 완전히 manipulate하지 못한다. 왜냐하면 \(\mathrm{P}_t\)\(\mathrm{D}_t\)에서 둘다 shifted된 \(\tilde{\epsilon}_t^{\theta}\)를 사용하기에 cancel out되어 결국 latent variable에서는 기존과 다름이 없다는 것이다. 자세한 증명은 Proof of Theroem을 보면 된다.

+
+ Proof of Theroem) +

Define \(\alpha_t = \prod_{s=1}^t(1 - \beta_s)\), \(\tilde{x}_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \mathrm{D}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \sigma_t\mathcal{z_t}\)

+

= \(\sqrt{\alpha_{t-1}}\underbrace{\bigg(\cfrac{x_t - \sqrt{1-\alpha_t}(\epsilon_t^\theta(x_t) + \Delta \epsilon_t)}{\sqrt{\alpha_t}}\bigg)}_{\mathrm{P}_t(\tilde{\epsilon}_t^{\theta})} + \underbrace{\sqrt{1-\alpha_{t-1}-\sigma_t^2}\cdot (\epsilon_t^\theta(x_t) + \Delta \epsilon_t) }_{\mathrm{D}_t(\tilde{\epsilon}_t^{\theta})} + \sigma_t\mathcal{z_t}\)

+

= \(\sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^\theta(x_t)) + \mathrm{D}_t(\epsilon_t^\theta(x_t)) - \cfrac{\sqrt{\alpha_{t-1}}\sqrt{1-\alpha_t}}{\sqrt{\alpha_t}} \cdot \Delta \epsilon_t + \sqrt{1-\alpha_{t-1}} \cdot \Delta \epsilon_t\)

+

\(\sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^\theta(x_t)) + \mathrm{D}_t(\epsilon_t^\theta(x_t))\)는 기존 DDIM에서의 \(x_{t-1}\)에 대한 식이고 위 식의 \(\Delta \epsilon_t\)항만 따로 묶어서 표현하면 아래와 같다.

+

= \(x_{t-1} + \bigg( -\cfrac{\sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} + \sqrt{1-\alpha_{t-1}} \bigg) \cdot \Delta \epsilon_t \)

+

= \(x_{t-1} + \bigg( -\cfrac{\sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} + \cfrac{\sqrt{1-\prod_{s=1}^{t-1}(1-\beta_s)}\sqrt{1-\beta_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t \)

+

\({\sqrt{1-\prod_{s=1}^{t-1}(1-\beta_s)}\sqrt{1-\beta_t}}\)를 root를 묶어서 내부를 계산하면 \(\sqrt{1-\alpha_t-\beta_t}\)이므로 정리하면 아래와 같다.

+

= \(x_{t-1} + \bigg( \cfrac{\sqrt{1-\alpha_t-\beta_t} - \sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t \)

+

\(\therefore \Delta x_t = \tilde{x_{t-1}} - x_{t-1} = \cfrac{\sqrt{1-\alpha_t-\beta_t} - \sqrt{1-\alpha_t}}{\sqrt{1-\beta_t}} \bigg) \cdot \Delta \epsilon_t\)

+

shifted epsilon을 사용한 결과이다. 분자를 보면 \(\beta_t\)는 매우 작기에 거의 0에 수렴하기에 결국 차이가 거의 없음을 보인다.
\(\epsilon\)-space에서의 manipulation 효과는 매우 좋지 않음을 알 수 있다.

+
+
+Asyrp_2 +
+

Fig. 406 No Manipulation Effect with shifted epsilon#

+
+
+
+
+

3.2 Asymmetric Reverse Process(Asyrp)#

+

chapter 3.1에서 \(\epsilon\)-space에서의 문제를 해결하기 위해 저자들은 Asyrp를 제안한다. 이름 그대로 비대칭적인 방법을 사용한다는 것인데 \(x_0\)를 예측하는 \(\mathrm{P}_t\)에서는 shifted epsilon을 사용하고, latent variable로 돌아가는 \(\mathrm{D}_t\)에서는 non-shifted epsilon을 사용해서 전체적인 변화를 준다는 것이다. 즉, \(\mathrm{P}_t\)만modify하고 \(\mathrm{D}_t\)는 유지한다. Asyrp를 식으로 표현하면 다음과 같다.

+
+\[ +x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\tilde{\epsilon}_t^{\theta}(x_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) +\]
+

Loss식 또한 chapter 2.3에서 제시한 \(\mathcal{L}_{direction}\)을 사용하여 재구성하였다. modify를 하지 않은 \(\mathrm{P}_t^{source}\)와 modifiy를 한 \(\mathrm{P}_t^{edit}\)을 사용한다. Loss식은 다음과 같다.

+
+\[ +\mathcal{L}^{(t)} = \lambda_{CLIP}(\mathrm{P}_t^{edit}, y^{ref};\mathrm{P}_t^{source},y^{source}) + \lambda_{recon}|\mathrm{P}_t^{edit} - \mathrm{P}_t^{source}| +\]
+

전체적인 reverse process는 다음과 같이 설계가 되었다. 이제 shifted epsilon인 \(\tilde{\epsilon}_t^{\theta}(x_t)\)를 어떤 방식으로 얻을 것인지에 대한 설계가 필요하다. 저자들은 기존의 \(\epsilon\)-space에서 변화를 주는 것보다 훨씬 더 좋은 result를 보이고, nice properties를 가지는 h-space에서 변화를 주는 것을 제안한다.

+
+
+

3.3 h-space#

+

\(\epsilon_t^{\theta}\)는 diffusion models의 backbone인 U-Net에서 도출된다. 이 논문에서는 Image manipulation을 위해 \(\epsilon_t^{\theta}\)를 control하는 space를 U-Net의 bottleneck 즉, 가장 깊은 feature map인 \(h_t\)로 정하였다. 이를 h-space라고 부른다. h-space는 \(\epsilon\)-space보다 더 작은 spatial resolutions을 가지고 high-level semantic를 가진다. 또한 \(\epsilon\)-space에서는 발견할 수 없는 매우 nice한 특성들을 가지고 있다.

+
+Asyrp_3 +
+

Fig. 407 U-Net structure and h-space#

+
+
+

h-space의 크기는 \(8^2\times512\)이고 \(\epsilon\)-space의 크기는 \(256^2\times3\)으로 h-space에서의 control이 더 지배적이고 robust함을 추측할 수 있다(실제 실험적으로 증명을 함). h-space는 skip-connection의 영향을 받지 않으며 가장 압축된 정보를 가지고 있는 공간이며 image를 control하는데에 있어 매우 좋은 특성들을 가지고 있다. 실제 저자들은 h-space를 지정하기 위해 U-Net의 모든 feature map을 h-space로 설정해두고 실험을 해보았는데 위의 그림을 기준으로 8th layer이전의 feature map을 h-space로 지정한 경우에는 manipulaton이 적게 이루어졌고, 8th layer 이후의 feature map을 h-space로 지정한 경우에는 너무 과한 manipulation이 이루어지거나 아예 distorted image가 생성되었다. h-space만의 특성은 chapter5에서 설명한다.

+
+
+

3.4 Implicit Neural Directions#

+
+Asyrp_4 +
+

Fig. 408 Illustration of \(\mathrm{f}(t)\)#

+
+
+

\(\Delta h_t\)가 image를 manipulating하는데 성공했음에도, 수많은 timestep에서 매번 optimizing하기란 쉽지 않다. 대신에 논문에서는 \(h_t\)를 입력받아 \(\Delta h\)를 출력해주는 작은 neural network인 \(\mathrm{f}(t)\)를 추가하였다. \(\mathrm{f}(t)\)\(\Delta h_t\)를 매번 모든 timestep에서 optimizing해줘야 하는 방법에 비해 시간도 빠르고 setting값들에 대해 robust하다. 또한 주어진 timestep과 bottleneck feature인 \(h_t\)에 대해 \(\Delta h_t\)를 출력하는 방법을 학습하기에 unseen timestep과 bottleneck feature에 대해서도 일반화할 수 있다고 한다. 이는 accelerated한 과정에서도 큰 효과를 본다. training scheme이 어떻든 간에 결국 부여하는 \(\sum\Delta\mathrm{h_t}\)만 보존된다면, 어떠한 length를 설계해도 비슷한 manipulation효과를 볼 수 있다.

+

h-space에서 epsilon을 control해서 asyrp 이용하는 식은 다음과 같다. 이해를 위해 \(\epsilon\)-space와 h-space에서의 shifted epsilon \(\tilde{\epsilon}_t^{\theta}(x_t)\)을 비교하였다.

+
    +
  • \(\epsilon\)-space에서의 shifted epsilon

    +

    \(\tilde{\epsilon}_t^{\theta}(x_t) = \epsilon_t^{\theta}(x_t) + \Delta \epsilon_t\)

    +
  • +
  • h-space에서의 shifted epsilon

    +

    \(\tilde{\epsilon}_t^{\theta}(x_t) = \epsilon_t^{\theta}(x_t | \Delta h_t)\)

    +
  • +
+
+\[ +x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}(x_t | \Delta h_t)) + \mathrm{D}_t(\epsilon_t^{\theta}(x_t)) +\]
+
+Asyrp_5 +
+

Fig. 409 Asymmetric Reverse Process#

+
+
+
+
+
+

4. Generative Process Design#

+
+Asyrp_6 +
+

Fig. 410 Intuition for choosing the intervals for editing and quality boosting#

+
+
+

Perception prioritized training of diffusion models(Choi et al)에서는 Diffusion model이 early stage에서는 high-level context를 generate하고, later stage에서는 imperceptible fine details를 generate한다고 제안한다. 본 논문에서는 early stage에서 editing을 진행하는 editing process와 later stage에서 imperceptible fine details를 진행하는 quality boosting을 위한 구간을 나눠서 새로운 Generative Process Design을 제시한다.

+
+

4.1 Editing Process With Asyrp#

+

Editing Process에서는 high-level context가 generate되어야 하므로 전체 timestep[0,T]에서 Editing Process를 위한 editing interval을 [T, \(t_{edit}\)]으로 설정하였다. \(t_{edit}\)의 시점을 결정하기 위해 LPIPS 측정지표를 이용한다. LPIPS(\(\mathrm{x}, \mathrm{P}_t\))는 t시점에서 예측한 \(x_0\)와 target이 되는 original image간의 perceptual distance를 계산한다. 따라서 LPIPS를 남은 reverse process을 통해 editing 해야 할 구성요소를 측정하는 지표라고 볼 수도 있다. 첫 step T의 LPIPS로 부터 \(t_{edit}\)시점에서의 LPIPS 차이는 Editing Process에서 얼만큼의 perceptual change를 주었는지를 나타낸다. 이 값을 editing strength(\(\epsilon_t\))라고 정의한다.

+
+\[ +\xi_t = \mathrm{LPIPS}(x, \mathrm{P}_T) - \mathrm{LPIPS}(x, \mathrm{P}_t) +\]
+

Editing interval이 작으면 \(\xi_t\)가 작아지며 변화가 많이 일어나지 않고 반면, Editing interval이 크면 \(\xi_t\)가 커지고 변화가 많이 일어난다. 따라서 충분한 변화를 줄 수 있는 한에서 가장 최소의 Editing interval을 찾는 것이 \(t_{edit}\)을 결정하는 최고의 방법이다. 저자들은 실험적인 결과를 통해 \(\mathrm{LPIPS}(x, \mathrm{P}_t)\) = 0.33인 t시점을 \(t_{edit}\)으로 결정하였다.

+
+Asyrp_7 +
+

Fig. 411 Results based on various \(\mathrm{LPIPS}(x, \mathrm{P}_{t_{edit}})\)#

+
+
+
+Asyrp_8 +
+

Fig. 412 Importance of choosing proper \(t_{edit}\)#

+
+
+

몇몇 특성들은 다른 특성들에 비해 visual change를 많이 필요로 하는 경우도 있다. 예를 들어 source image에 대해 smile한 attribute를 추가하는 경우보다 pixar style의 attribute을 추가하는 경우가 더 많은 visual change를 필요로 한다. 이러한 경우에는 Editing interval을 더 길게 설정해야 한다. 이러한 경우에는 \(\mathrm{LPIPS}(x, \mathrm{P}_t)\) = 0.33 - \(\delta\)를 만족하는 t를 \(t_{edit}\)으로 설정한다. 이 때, \(\delta = 0.33d(\mathrm{E}_T(y_{source}), \mathrm{E}_T(y_{target}))\)이다. \(\mathrm{E}_T\)는 CLIP text embedding을 진행하는 Text Encoder를 의미하며, d는 cosine distance를 의미한다. 아래 그림을 통해 더 많은 visual change를 요구하는 attributes에 대해서는 \(t_{edit}\)이 더 작음(Editing Interval이 김)을 알 수 있다.

+
+Asyrp_9 +
+

Fig. 413 Flexible \(t_{edit}\) based on the amount of visual changes.#

+
+
+
+
+

4.2 Quality Boosting With Stochastic Noise Injection#

+

DDIM은 \(\eta\)=0으로 설정하며 stochasticity를 제거하여 거의 완벽한 inversion을 가능케 하였다. Elucidating the design space of diffusionbased generative models(Karras et al.)에서는 stochasticity가 image quality를 증가시킨다고 증명하였다. 이에 따라 본 논문에서는 Generative Process에 stochastic noise를 주입하는 quality boosting 단계를 설정하고 boosting interval은 [\(t_{boost}\), 0]이다.

+

Boosting Interval에 따라 image quality를 control할 수 있는데, Boosting Interval이 길게되면, Quality는 증가하지만 Interval동안 계속해서 stochastic noise를 주입해야 하기에 content가 변하는 문제가 발생할 수도 있다. 따라서 충분한 quality boosting을 달성하면서도 content에 최소한의 변화만을 줄 수 있도록 \(t_{boost}\)를 설정하는 것이 중요하다. 저자들은 image에 껴있는 noise를 quality boosting을 통해 해결해야 할 부분으로 보았으며 target이 되는 original image로 부터 t시점의 image \(x_t\)에 얼만큼의 noise가 껴있는지에 대한 지표로 quality deficiency \(\gamma_t\)를 이용한다.

+
+\[ +\gamma_t = \mathrm{LPIPS}(x, x_t) +\]
+

여기서는 editing strength와는 다르게 time step에 따라 예측한 \(x_0\)\(\mathrm{P}_t\)가 아닌 latent variable \(x_t\)를 이용한다. 저자들은 noise를 판단하는데에 있어서 semantics보다는 actual image를 고려했기에 위와 같이 설정하였다고 한다. 저자들은 실험적인 결과를 통해 \(\gamma_t\) = 1.2인 t시점을 \(t_{boost}\)로 설정하였다.

+
+Asyrp_10 +
+

Fig. 414 Results based on various \(\gamma_{t_{boost}}\)#

+
+
+
+Asyrp_11 +
+

Fig. 415 Quality comparison based on the presence of quality boosting#

+
+
+
+
+

4.3 Overall Process of Image Editing#

+

General한 Diffusion model에서의 Generative Process를 표현하면 다음과 같다.

+
+\[ +x_{t-1} = \sqrt{\alpha_{t-1}}\mathrm{P}_t(\epsilon_t^{\theta}) + \mathrm{D}_t(\epsilon_t^{\theta}) + \sigma_t\mathcal{z}_t\bigg(where, \sigma_t = \eta\sqrt{(1-\alpha_{t-1}) / (1-\alpha_t)} \sqrt{1-\alpha_t/\alpha_{t-1}}\bigg) +\]
+

\(\eta\) = 0인 경우에는 DDIM이 되며, stochastic noise를 더하는 부분이 사라져 deterministic해진다. \(\eta\) = 1인 경우에는 DDPM이 되며, stochastic한 특성이 있다. Asyrp(Assymetric Reverse Process)에서는 기본적으로 DDIM을 사용하며 \(\mathrm{P}_t\)에서 h-space를 통해 control된 \(\epsilon_t^{\theta}(x_t|f_t)\)를 사용한다. Diffusion Models already have a Semantic Latent Space에서 제시한 Generative Process를 전체적으로 정리하면 다음과 같다.

+
+Asyrp_12 +
+

Fig. 416 Quality comparison based on the presence of quality boosting#

+
+
+

처음부터 \(t_{edit}\)시점까지는 Asyrp를 이용해 Editing Process를 진행한다. 이 후 DDIM 방식을 통해 Denoising을 진행하다가 \(t_{boost}\)시점부터 끝날 때까지 stochastic noise를 주입하는 DDPM 방식을 이용해 Quality boosting을 진행한다.

+
+Asyrp_13 +
+

Fig. 417 Overview of Generative Process#

+
+
+
+
+
+

5. Experiments#

+

CelebA-HQ (Karras et al., 2018) 및 LSUN-bedroom/-church (Yu et al., 2015) 데이터셋에서 DDPM++ (Song et al., 2020b) (Meng et al., 2021); AFHQ-dog (Choi et al., 2020) 데이터셋에서 iDDPM (Nichol & Dhariwal, 2021); 그리고 METFACES (Karras et al., 2020) 데이터셋에서 ADM with P2-weighting (Dhariwal & Nichol, 2021) (Choi et al., 2022)을 사용해 각각 학습시켰다고 한다. 모든 model들은 pretrained checkpoint를 활용했으며 frozen상태를 유지시켰다고 한다.

+
+

5.1 Versatility of h-space with Asyrp#

+
+Asyrp_14 +
+

Fig. 418 Editing results of Asyrp on various datasets#

+
+
+

위의 그림을 보면, 논문에서는 다양한 attribute들의 특성을 잘 반영해서 image를 manipulate했다는 점을 알 수 있다. 심지어 {department, factory, temple} attribute은 training data에 포함이 되어있지 않았음에도 성능이 잘 나온 점을 확인할 수 있다. model을 fine tuning하지 않고 inference하는 과정에서 h-space를 통해 epsilon을 control하고 Asyrp를 이용해 성능을 냈다는 점이 가장 큰 장점이다.

+
+
+

5.2 Quantitive Comparison#

+

Asyrp model의 결과를 다른 model들과 비교하는 실험을 진행하였는데 diffusion model 전체를 fine-tuning하여 image을 editing하는 DiffsionCLIP model과 비교하였다. Asyrp의 성능이 더 좋음을 확인 할 수 있다.

+
+Asyrp_15 +
+

Fig. 419 Asyrp vs DiffusionCLIP on both CelebA-HQ seen-domain attributes and unseen-domain attributes#

+
+
+
+
+

5.3 Analysis on h-space#

+
    +
  1. Homogeneity

    +
    +Asyrp_16 +
    +

    Fig. 420 Homogeneity of h-space#

    +
    +
    +

    위의 그림의 (a)는 Real image에 smiling attribute을 추가하기 위해 최적화된 \(\Delta h_t\)\(\Delta \epsilon_t\)를 나타낸다. 같은 값을 다른 Real image에 적용시켰을 때의 결과를 (b)에 나타내었는데, \(\Delta h_t\)를 적용한경우 smiling face로 잘 바뀌는 반면, \(\Delta \epsilon_t\)을 적용한 경우에는 image distortion이 발생함을 알 수 있다.

    +
  2. +
  3. Linearity

    +
    +Asyrp_17 +
    +

    Fig. 421 Linearity of h-space - Linear Scaling#

    +
    +
    +

    \(\Delta_h\)를 linearly scaling을 하는 것은 editing을 하는데에 있어 visual attribute change의 양에 반영된다. 즉, \(\Delta_h\)\(\times\)1, \(\times\)2, \(\times\)3배 \(/dots\) 함에 따라 result image에서 반영되는 attribute또한 이에 맞게 변화한다는 것이다. 위의 그림에서 표현되어 있듯이 negative scaling에 대해서는 training을 하지 않았음에도 잘 적용 된다는 점을 알 수 있다.

    +
    +Asyrp_17 +
    +

    Fig. 422 Linearity of h-space - Linear Combination#

    +
    +
    +

    서로 다른 attributes에 대한 \(\Delta_h\)를 합쳐서 부여를 했을 경우에도 각각의 attribute들이 image에 잘 반영이 된다는 점을 알 수 있다.

    +
  4. +
  5. Robustness

    +
    +Asyrp_17 +
    +

    Fig. 423 Robustness of h-space#

    +
    +
    +

    위의 그림은 h-space와 \(\epsilon-space\)에서 random noise를 주입했을 때의 결과를 비교한 것이다. h-space의 경우에는 random noise가 추가되었어도 image에 큰 변화가 없으며 많은 noise가 추가되었을 경우에도 image distortion은 거의 없고 semantic change만 발생한다. 그러나 \(\epsilon-space\)의 경우에는 random noise가 추가된 경우 image distortion이 심하게 발생한다. 이를 통해 h-space가 얼마나 robustness한지 알 수 있다.

    +
  6. +
  7. Consistency across time steps

    +
    +Asyrp_17 +
    +

    Fig. 424 Consistency across times steps of h-space#

    +
    +
    +

    h-space의 homogeneous한 성질을 통해 같은 attribute에 대한 \(\Delta h\)를 다른 image에 적용시켰을 때에도 잘 반영이 됌을 확인하였다. 저자들은 \(\Delta h_t\)들에 대한 평균인 \(\Delta h_t^{mean}\)을 적용시켰을 경우에도 result가 거의 비슷함을 보인다. Chapter4에서 제시한 Generative Process를 비추어 보았을 때, \(\Delta h_t\)는 Editing Process에서만 적용을 시킨다. 이 경우, 적용하는 \(\Delta h_t\)\(\Delta h_t^{global}\)이라고 칭하며, 적용하는 \(\Delta h_t\)가 interval동안 같은 크기 만큼 적용된다고 가정했을 경우, \(\Delta h^{global} = \cfrac{1}{\mathrm{T_e}}\sum_t\ \Delta h_t^{mean}\)이라고 쓸 수 있다. 이 경우에도 결과는 비슷함을 보여준다. 결국 원하는 attribute에 대해 주입해야 할 \(\Delta h\)양만 같다면, 원하는 editing 효과를 얻을 수 있다. 비록 이 논문에서는 best quality manipulation을 위해 \(\Delta h_t\)를 사용하였지만, \(\Delta h_t^{mean}\)\(\Delta h^{global}\)에 대해 더 연구를 해 볼 여지가 있다고 판단한다.

    +
  8. +
+
+
+
+

6. Conclusion#

+

본 논문에서는 Pretrained Diffusion models에서 latent semantic space인 h-space를 발견했고 h-space에서의 Asyrp(Asymmetric Reverse Process)와 새롭게 제안한 Reverse Process 방법을 통해 성공적인 image editing을 가능케 하였다. Diffusion model에서의 semantic한 latent space에 대한 첫 제안을 한 논문이다. h-space는 GAN의 latent space와 유사한 특성을 갖추고 있다. 대표적인 h-space의 특성으로는 Homogeneity, Linearity, Robustness, Consistency across timesteps이 있다.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/DreaMoving.html b/docs/review/DreaMoving.html old mode 100644 new mode 100755 index 9f0d406c..de624edf --- a/docs/review/DreaMoving.html +++ b/docs/review/DreaMoving.html @@ -1,781 +1,800 @@ - - - - - - - - - - - - DreaMoving — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

DreaMoving#

-
-

Abstract#

-
    -
  • 고품질 customized human video 생성을 위해 제어가능한 diffusion 기반 video generation framework인 DreaMoving 제안

  • -
  • target identity와 posture sequence가 주어졌을 때, target identity moving이나 dancing video 생성이 가능하다.

  • -
  • 추가 제안 모듈 : motion-controlling을 위한 Video ControlNet & identity preserving을 위한 Content Guider

  • -
-
-
-

1. Introduction#

-
    -
  • T2V의 진전에도 인간 중심 기반 생성에는 어려움을 겪는 중.

  • -
  • open-source human dance video dataset의 부족, text 묘사의 어려움으로 인해 frame간 일관성, 긴 길이, 다양성을 포함한 비디오 생성에 어려움을 겪는다.

  • -
  • personalization과 controllability 의 어려움 또한 존재

  • -
  • 구조적 제어를 위한 ControlNet, appearance 제어를 위한 Dreambooth, LoRA

  • -
  • 그러나 이 기술들은 정확한 제어가 어렵고 hyperparameter tuning 요소가 존재 & 추가 계산 부담

  • -
  • 이에 새로운 방법론인 DreaMoving 제안

  • -
-
-
-

2. Architecture#

-
-figure_1 -
-

Fig. 525 Figure 1. The overview of DreaMoving#

-
-
-
    -
  • LDM 기반 모델을 기반으로 3가지 주요 network로 구성

    -
      -
    • U-Net, Video ControlNet, Content Guider

    • -
    -
  • -
  • AnimateDiff에서 영감을 받아 U-Net 각 block 이후 motion block을 추가

  • -
  • Plug-in : motion-controlling을 위한 Video ControlNet & identity preserving을 위한 Content Guider

  • -
-
-

2.1 Data Collection and Preprocessing#

-
    -
  • 인터넷에서 human dance video 1000의 고품질 영상으로 훈련

  • -
  • temporal module 훈련은 변이나 특별한 효과 없는 연속적 frame이 필요하기 때문에 clip video로 split하여 6000개의 짧은 비디오를 획득한다.(8~10s)

  • -
  • text description을 위해서 Minigpt-v2(https://minigpt-v2.github.io/)를 video-captioner로 사용

    -
      -
    • “[grounding] describe this frame in a detailed manner”의 명령으로 획득

    • -
    • subject와 background 내용에 대해 정확히 묘사

    • -
    -
  • -
-
-
-

2.2 Motion Block#

-
    -
  • temporal consistency와 motion fidelity 향상을 위해서 U-Net과 ControlNet를 motion block으로 통합.

  • -
  • motion block은 AnimateDiff로 확장. temporal sequence length는 64로 확장

  • -
  • 초기화 : AnimateDiff (mm_sd_v15.ckpt)

  • -
  • 개인 인물 dance video로 finetuning

  • -
-
-
-

2.3 Content Guider#

-
    -
  • Content Guider는 인물의 appearance와 배경을 포함한 생성된 video의 내용을 제어하기 위해 고안됨.

  • -
  • 가장 간단한 방법은 text prompt이지만, 개인화된 인물 외관 묘사가 어렵다.

  • -
  • IP-Adapter에 영감을 받아 image prompt를 활용해 인물 외관에 대한 guidance를 주고 배경에 대해서는 text prompt 사용

  • -
  • 얼굴 이미지는 image encoder를 통해 encode

  • -
  • text feature & 인물 외관 feature는 마지막 content embedding에 concat된 후 cross-attention에 보냄

  • -
-
-eq_1 -
-

Fig. 526 Equation 1 Content Guider cross attentino output given query, text, face, cloth features#

-
-
-
    -
  • \(Z\) : query features

  • -
  • \(c_t\) : text features / \(c_f\) : face features / \(c_c\) : cloth features

  • -
  • \(Z^\prime\) : cross-attention output

  • -
-
-
-
-

2.4 Model Training#

-

2.4.1 Content Guider Training

-
    -
  • Base Model : SD v1.5 기반

  • -
  • Image Encoder : OpenCLIP ViT-H14

  • -
  • reference face identity 보존을 위해 Arcface를 통해 얼굴 상관 feature 추출.

  • -
  • LAION-2B에서 human data 수집

  • -
  • 훈련 : 512x512 random crop & resize

  • -
  • GPU : 8 V100, 100k steps, 16 batch size/GPU 1장

  • -
  • Optimizer : AdamW

  • -
  • learning rate : 1e-4, decay 1e-2

  • -
-

2.4.2 Long-Frame Pretraining

-
    -
  • WebVid-10M validation set (5k video clips)에서 motion module의 sequence length를 16에서 64로 확장하기 위한 training stage 수행

    -
      -
    • WebVid-10M validation set (5k video clips) : 평균 18초, 총 13000 시간

    • -
    -
  • -
  • U-Net motion module만 훈련하고 나머지는 freeze

  • -
  • ControlNet이나 image guidance 사용 안 함.

  • -
  • learning rate : 1e-4

  • -
  • resolution : 256x256 resize & center crop

  • -
  • batch size 1, 10k steps 이후 훈련 종료

  • -
-

2.4.3 Video ControlNet Training

-
    -
  • long-frame pretraining 이후, Video ControlNet 훈련 진행.

  • -
  • U-Net 고정 & **Video ControlNet의 (U-Net block과 motion block)**은 unfreeze

  • -
  • 수집한 6k human dance video data 훈련

  • -
  • DWPose나 ZoeDepth를 통한 human pose 또는 depth를 추출.

  • -
  • learning rate : 1e-4

  • -
  • resolution : 352x352

  • -
  • batch size 1, 25k steps 이후 훈련 종료

  • -
-

2.4.4 Expression Fine-Tuning

-
    -
  • 사람 표현을 더 낫게하기 위해 Video ControlNet을 포함한 U-Net의 motion block 구조에서 6k human dancing video data로 추가 fine-tuning

  • -
  • U-Net motion block weight만 update

  • -
  • learning rate : 5e-5

  • -
  • resolution : 512x512

  • -
  • batch size 1, 20k steps 이후 훈련 종료

  • -
-
-

2.5 Model Inference#

-

입력 : text prompt, reference image, pose/depth sequence

-

Video ControlNet control scale : 1 (pose/depth에서만)

-

multi-controlnet을 통해 pose & depth 동시 사용 가능

-

Eq 1의 face/body guidance strength : \(\alpha_f,\alpha_c\)는 적응하도록

-

text prompt만 사용할 때 \(\alpha_f=\alpha_c=0\)

-
-figure_2 -
-

Fig. 527 Figure 2. The results of DreaMoving with text prompt as input#

-
-
-
-figure_3 -
-

Fig. 528 Figure 3. The results of DreaMoving with text prompt and face image as inputs#

-
-
-
-figure_4 -
-

Fig. 529 Figure 4. The results of DreaMoving with face and cloth images as inputs#

-
-
-
-figure_5 -
-

Fig. 530 Figure 5. The results of DreaMoving with stylized image as input#

-
-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + DreaMoving — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

DreaMoving#

+
+

Abstract#

+
    +
  • 고품질 customized human video 생성을 위해 제어가능한 diffusion 기반 video generation framework인 DreaMoving 제안

  • +
  • target identity와 posture sequence가 주어졌을 때, target identity moving이나 dancing video 생성이 가능하다.

  • +
  • 추가 제안 모듈 : motion-controlling을 위한 Video ControlNet & identity preserving을 위한 Content Guider

  • +
+
+
+

1. Introduction#

+
    +
  • T2V의 진전에도 인간 중심 기반 생성에는 어려움을 겪는 중.

  • +
  • open-source human dance video dataset의 부족, text 묘사의 어려움으로 인해 frame간 일관성, 긴 길이, 다양성을 포함한 비디오 생성에 어려움을 겪는다.

  • +
  • personalization과 controllability 의 어려움 또한 존재

  • +
  • 구조적 제어를 위한 ControlNet, appearance 제어를 위한 Dreambooth, LoRA

  • +
  • 그러나 이 기술들은 정확한 제어가 어렵고 hyperparameter tuning 요소가 존재 & 추가 계산 부담

  • +
  • 이에 새로운 방법론인 DreaMoving 제안

  • +
+
+
+

2. Architecture#

+
+figure_1 +
+

Fig. 525 Figure 1. The overview of DreaMoving#

+
+
+
    +
  • LDM 기반 모델을 기반으로 3가지 주요 network로 구성

    +
      +
    • U-Net, Video ControlNet, Content Guider

    • +
    +
  • +
  • AnimateDiff에서 영감을 받아 U-Net 각 block 이후 motion block을 추가

  • +
  • Plug-in : motion-controlling을 위한 Video ControlNet & identity preserving을 위한 Content Guider

  • +
+
+

2.1 Data Collection and Preprocessing#

+
    +
  • 인터넷에서 human dance video 1000의 고품질 영상으로 훈련

  • +
  • temporal module 훈련은 변이나 특별한 효과 없는 연속적 frame이 필요하기 때문에 clip video로 split하여 6000개의 짧은 비디오를 획득한다.(8~10s)

  • +
  • text description을 위해서 Minigpt-v2(https://minigpt-v2.github.io/)를 video-captioner로 사용

    +
      +
    • “[grounding] describe this frame in a detailed manner”의 명령으로 획득

    • +
    • subject와 background 내용에 대해 정확히 묘사

    • +
    +
  • +
+
+
+

2.2 Motion Block#

+
    +
  • temporal consistency와 motion fidelity 향상을 위해서 U-Net과 ControlNet를 motion block으로 통합.

  • +
  • motion block은 AnimateDiff로 확장. temporal sequence length는 64로 확장

  • +
  • 초기화 : AnimateDiff (mm_sd_v15.ckpt)

  • +
  • 개인 인물 dance video로 finetuning

  • +
+
+
+

2.3 Content Guider#

+
    +
  • Content Guider는 인물의 appearance와 배경을 포함한 생성된 video의 내용을 제어하기 위해 고안됨.

  • +
  • 가장 간단한 방법은 text prompt이지만, 개인화된 인물 외관 묘사가 어렵다.

  • +
  • IP-Adapter에 영감을 받아 image prompt를 활용해 인물 외관에 대한 guidance를 주고 배경에 대해서는 text prompt 사용

  • +
  • 얼굴 이미지는 image encoder를 통해 encode

  • +
  • text feature & 인물 외관 feature는 마지막 content embedding에 concat된 후 cross-attention에 보냄

  • +
+
+eq_1 +
+

Fig. 526 Equation 1 Content Guider cross attentino output given query, text, face, cloth features#

+
+
+
    +
  • \(Z\) : query features

  • +
  • \(c_t\) : text features / \(c_f\) : face features / \(c_c\) : cloth features

  • +
  • \(Z^\prime\) : cross-attention output

  • +
+
+
+
+

2.4 Model Training#

+

2.4.1 Content Guider Training

+
    +
  • Base Model : SD v1.5 기반

  • +
  • Image Encoder : OpenCLIP ViT-H14

  • +
  • reference face identity 보존을 위해 Arcface를 통해 얼굴 상관 feature 추출.

  • +
  • LAION-2B에서 human data 수집

  • +
  • 훈련 : 512x512 random crop & resize

  • +
  • GPU : 8 V100, 100k steps, 16 batch size/GPU 1장

  • +
  • Optimizer : AdamW

  • +
  • learning rate : 1e-4, decay 1e-2

  • +
+

2.4.2 Long-Frame Pretraining

+
    +
  • WebVid-10M validation set (5k video clips)에서 motion module의 sequence length를 16에서 64로 확장하기 위한 training stage 수행

    +
      +
    • WebVid-10M validation set (5k video clips) : 평균 18초, 총 13000 시간

    • +
    +
  • +
  • U-Net motion module만 훈련하고 나머지는 freeze

  • +
  • ControlNet이나 image guidance 사용 안 함.

  • +
  • learning rate : 1e-4

  • +
  • resolution : 256x256 resize & center crop

  • +
  • batch size 1, 10k steps 이후 훈련 종료

  • +
+

2.4.3 Video ControlNet Training

+
    +
  • long-frame pretraining 이후, Video ControlNet 훈련 진행.

  • +
  • U-Net 고정 & **Video ControlNet의 (U-Net block과 motion block)**은 unfreeze

  • +
  • 수집한 6k human dance video data 훈련

  • +
  • DWPose나 ZoeDepth를 통한 human pose 또는 depth를 추출.

  • +
  • learning rate : 1e-4

  • +
  • resolution : 352x352

  • +
  • batch size 1, 25k steps 이후 훈련 종료

  • +
+

2.4.4 Expression Fine-Tuning

+
    +
  • 사람 표현을 더 낫게하기 위해 Video ControlNet을 포함한 U-Net의 motion block 구조에서 6k human dancing video data로 추가 fine-tuning

  • +
  • U-Net motion block weight만 update

  • +
  • learning rate : 5e-5

  • +
  • resolution : 512x512

  • +
  • batch size 1, 20k steps 이후 훈련 종료

  • +
+
+

2.5 Model Inference#

+

입력 : text prompt, reference image, pose/depth sequence

+

Video ControlNet control scale : 1 (pose/depth에서만)

+

multi-controlnet을 통해 pose & depth 동시 사용 가능

+

Eq 1의 face/body guidance strength : \(\alpha_f,\alpha_c\)는 적응하도록

+

text prompt만 사용할 때 \(\alpha_f=\alpha_c=0\)

+
+figure_2 +
+

Fig. 527 Figure 2. The results of DreaMoving with text prompt as input#

+
+
+
+figure_3 +
+

Fig. 528 Figure 3. The results of DreaMoving with text prompt and face image as inputs#

+
+
+
+figure_4 +
+

Fig. 529 Figure 4. The results of DreaMoving with face and cloth images as inputs#

+
+
+
+figure_5 +
+

Fig. 530 Figure 5. The results of DreaMoving with stylized image as input#

+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/DreamPose.html b/docs/review/DreamPose.html old mode 100644 new mode 100755 index 24d43bcb..036e7f63 --- a/docs/review/DreamPose.html +++ b/docs/review/DreamPose.html @@ -1,1229 +1,1248 @@ - - - - - - - - - - - - DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion#

-
-DreamPose_input_output -
-

Fig. 531 DreamPose 입출력#

-
-
- -
-
-

1. Introduction#

-
    -
  • DreamPose가 제안된 배경

    -
      -
    • 패션 사진은 온라인에 널리 퍼져 있지만, 전달할 수 있는 정보가 제한적이며 입었을 때 옷의 늘어진 모양이나 흐름 등 옷의 중요한 뉘앙스를 포착하지 못한다.

    • -
    • 패션 동영상은 이러한 모든 디테일을 보여주기에 소비자의 의사 결정에 유용한 정보를 제공하지만, 동영상이 있는 상품은 매우 드물다.

    • -
    -
  • -
  • DreamPose

    -
      -
    • 본 논문에서는 포즈 시퀀스를 따라 패션 사진을 사실적인 애니메이션 비디오로 변환하는 방법인 DreamPose를 소개한다.

    • -
    • Stable diffusion을 기반으로 한다.

    • -
    • 하나 이상의 사람 이미지와 포즈 시퀀스가 주어지면, 포즈 시퀀스를 따라 고품질 비디오를 생성한다.

    • -
    -
  • -
  • 기존 비디오 생성 모델들의 문제점

    -
      -
    • 이미지 생성 디퓨전 모델은 좋은 결과를 보여주었지만, 비디오 생성 디퓨전 모델은 동일한 품질의 결과를 얻지 못했으며, 텍스처 움직임이나 카툰과 같은 모양으로 제한된 경우가 많다.

    • -
    • 시간적 일관성이 떨어진다.

    • -
    • 모션 jitter가 발생한다.

    • -
    • 사실성(realism)이 부족하다.

    • -
    • 대상 비디오의 움직임이나 세부적인 물체 모양을 제어할 수 없다.

      -
        -
      • 기존 모델이 주로 텍스트에 기반으로 하기 때문에

      • -
      -
    • -
    -
  • -
  • DreamPose의 접근법

    -
      -
    • 이미지 및 포즈 시퀀스를 조건으로 받는 방식을 사용하여 fidelity와 프레임 간 일관성을 높일 수 있다.

    • -
    • 이미지 분포를 효과적으로 모델링하는 기존 사전 학습된 이미지 디퓨전 모델을 파인 튜닝하였다. → 이미지 애니메이션 태스크를 컨디셔닝 신호와 일치하는 이미지의 부분 공간을 찾는 것으로 단순화 할 수 있다.

    • -
    • 해당 태스크를 위해 스테이블 디퓨전의 인코더와 컨디셔닝 메커니즘을 재설계하였다.

    • -
    • 2-스테이지 파인튜닝 방식을 사용한다

      -
        -
      • UNet과 VAE를 하나 혹은 여러 입력 이미지에 대해서 파인튜닝

      • -
      -
    • -
    -
  • -
  • Contribution

    -
      -
    1. DreamPose: 패션 이미지 애니메이션을 위해 이미지 및 포즈를 조건으로 하는 디퓨전 방식

    2. -
    3. 프레임 간 시간적 일관성을 크게 향상 시키는 간단하지만 효과적인 포즈 컨디셔닝 방식

    4. -
    5. 컨디셔닝 이미지의 fidelity를 높여주는 split CLIP-VAE 인코더

    6. -
    7. 이미지의 fidelity와 새로운 포즈에 대한 일반화 사이의 균형을 효과적으로 맞추는 파인튜닝 전략

    8. -
    -
  • -
-
- -
-

3. Background#

-
    -
  • 디퓨전 모델

    -
      -
    • 디퓨전 모델은 품질, 다양성, 학습 안정성 측면에서 합성 태스크에서 GAN을 능가하는 최신 생성 모델이다.

    • -
    • 표준 이미지 디퓨전 모델은 정규 분포된 랜덤 노이즈에서 이미지를 반복적으로 복원하는 방법을 학습한다.

    • -
    -
  • -
  • Latent diffusion model (ex. Stable Diffusion)

    -
    -latent diffusion -
    -

    Fig. 532 Latent Diffusion Model#

    -
    -
    -
  • -
  • 오토인코더의 인코딩된 latent space에서 작동하므로 최소한의 품질을 희생하면서 계산 복잡성을 절약한다.

  • -
  • 스테이블 디퓨전 모델은 VAE와 디노이징 UNet의 두 가지 모델로 구성된다.

    -
      -
    • VAE 오토인코더

      -
        -
      • 인코더 \(\mathcal{E}\): 프레임 \(x\)를 컴팩트한 latent 표현 \(z\)로 추출 (\(z=\mathcal{E}\)\((x)\))

      • -
      • 디코더 \(\mathcal{D}\): latent 표현에서 이미지를 복원 (\(x’=\mathcal{D}(z)\))

      • -
      -
    • -
    • 학습하는 동안, latent feature \(z\)는 결정론적 가우시안 프로세스에 의해 타임 스탬프 \(T\)로 디퓨즈되어 노이지 feature인 \(\tilde{z}_T\)를 만듦

    • -
    • 원본 이미지를 복구하기 위해 각 타임스탬프에 해당하는 latent feature의 노이즈를 반복적으로 예측하도록 시간으로 컨디셔닝된 UNet이 학습 된다.

    • -
    • UNet의 목적 함수

      -
      -\[ - \begin{align}{\cal L}_{D M}=\mathbb{R}_{z,\epsilon\in{\mathcal{N}}(0,1)}[||\epsilon-\epsilon_{\theta}({\tilde{z}}_{t},t,c)]|_{2}^{2}]\end{align} - \]
      -
        -
      • c: 컨디셔닝 정보의 임베딩 (텍스트, 이미지, 세그멘테이션 마스크등, 스테이블 디퓨전에서는 CLIP 텍스트 인코더로부터 얻어짐

      • -
      -
    • -
    • 예측된 latent \(z’\)은 예측된 이미지 \(x’ = \mathcal{D}(z')\)를 복구하도록 디코딩 된다.

    • -
    -
  • -
  • Classifier-free guidance

    -
      -
    • Implicit classifier를 통해 예측된 노이즈 분포를 조건으로 주어진 분포로 밀어붙이는 샘플링 메커니즘이다.

    • -
    • 이는 랜덤한 확률로 실제 조건으로 주어진 입력을 널 입력(∅)으로 대체하는 훈련 방식인 드롭아웃을 통해 달성된다.

    • -
    • 인퍼런스하는 동안 조건으로 주어진 예측은 스칼라 가중치 s를 사용하여 unconditional한 예측을 조건부로 가이드하는 데 사용된다.

      -
      -\[ - \begin{align}\epsilon_{\theta}=\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset)+s\cdot(\epsilon_{\theta}(\tilde{z}_{t},t,\mathrm{c})-\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset))\end{align} - \]
      -
        -
      • \(\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset)\): 조건이 없는 경우에 노이즈 벡터

      • -
      • \(\epsilon_{\theta}(\tilde{z}_{t},t,c)\): 조건이 있는 경우에 노이즈 벡터

      • -
      -

      → 조건을 Null로 줬을 때의 모델의 예측값과 조건을 줬을 때의 모델이 예측값을 보간한다.

      -
    • -
    -
  • -
-
-
-

4. Method#

-
    -
  • 본 논문에서는 단일 이미지와 포즈 시퀀스로부터 사실적인 애니메이션 동영상을 만드는 것을 목표로 한다.

  • -
  • 이를 위해 패션 동영상 컬렉션에서 사전 학습된 스테이블 디퓨전을 패션 동영상 컬렉션에 맞게 파인튜닝한다.

  • -
  • 추가 컨디셔닝 신호(이미지 및 포즈)를 받고 동영상으로 볼 수 있는 시간적으로 일관된 콘텐츠를 출력하기 위해 스테이블 디퓨전의 구조를 조정하는 작업이 포함된다.

  • -
-
-

4.1. Overview#

-
    -
  • 입출력

    -
      -
    • 입력: 입력 이미지 \(x_0\), 포즈 \(\{p_1, …, p_n\}\)

    • -
    • 출력: 비디오 \(\{x'_1, …, x’_N\}\) (\(x’_i\): 입력 포즈 \(p_i\)에 해당하는 i 번째 예측된 프레임)

    • -
    -
  • -
  • 입력 이미지와 포즈 시퀀스를 조건으로 하는 사전 훈련된 latent diffusion model을 사용한다.

  • -
  • 추론 시에는 일반적인 디퓨전 샘플링 절차를 통해 각 프레임을 독립적으로 생성한다.

    -
      -
    • 균일하게 분포된 가우시안 노이즈로 시작하여 두 조건 신호로 디퓨전 모델을 반복적으로 쿼리하여 noisy latent의 노이즈를 제거한다.

    • -
    -
  • -
  • 마지막으로 예측된 디노이즈된 latent \(z’_i\)를 디코딩하여 예측된 비디오 프레임 \(x’_i=\mathcal{D}(z’_i)\)를 만든다.

  • -
-
-
-

4.2. Architecture#

-
    -
  • 이미지 애니메이션을 위해 원래의 text-to-image 스테이블 디퓨전 모델을 수정하고 파인튜닝한다. (조건: 이미지, 포즈)

  • -
  • 이미지 애니메이션의 목표

    -
      -
    1. 제공된 입력 이미지에 대한 충실도

    2. -
    3. 시각적 품질

    4. -
    5. 생성된 프레임의 전반적인 시간적인 안정성

    6. -
    -
  • -
  • 이러한 목표를 달성하기 위해 아키텍처를 아래와 같이 구성하였다.

    -
    -DreamPose Architecture -
    -

    Fig. 533 DreamPose Architecture#

    -
    -
    -
  • -
-
-

4.2.1 Split CLIP-VAE Encoder#

-
-DreamPose Encoder -
-

Fig. 534 DreamPose Encoder#

-
-
-
    -
  • 해당 모듈-컨디셔닝 어댑터(custom conditioning adapter)의 필요성

    -
      -
    • 이미지를 조건으로 넣기 위한 이전 연구 (ex: InstructPix2Pix)는 주로 조건으로 들어오는 이미지 신호를 디노이징 U-Net에 대한 입력 노이즈와 concat한다.

    • -
    • 이는 원하는 출력 이미지와 공간적으로(spatially) 정렬된 조건 신호에 대한 조건화에 효과적이지만, DreamPose의 경우에는 네트워크가 입력 이미지와 공간적으로 정렬되지 않은 이미지를 생성하는 것을 목표로 한다.

    • -
    • 따라서 해당 태스크에는 다른 방법이 필요하고, 이를 위해 맞춤형 컨디셔닝 어댑터를 구현하였다.

    • -
    • 맞춤형 컨디셔닝 어댑터는 CLIP 텍스트 인코더를 사용하여 이미지 조건화를 대체하는 맞춤형 컨디셔닝 어댑터(custom conditioning adapter)를 구현하였다.

    • -
    • 이 어댑터는 사전 학습된 CLIP 이미지 및 VAE 인코더에서 인코딩된 정보를 결합한다.

    • -
    -
  • -
  • 디퓨전 기반 파인튜닝

    -
      -
    • 목표: 입력 신호를 원래 네트워크 학습에 사용된 신호와 최대한 유사하게 만들어 학습 기울기를 가능한 한 의미 있게 만드는 것 → 학습된 prior 값의 손실을 방지하는 데 도움이 된다.

    • -
    • 이러한 이유로 대부분의 디퓨전 기반 파인튜닝 체계는 모든 원래 컨디셔닝 신호를 유지하고 새로운 컨디셔닝 신호와 상호 작용하는 네트워크 가중치를 0으로 초기화한다.

    • -
    -
  • -
  • VAE Encoder의 필요성

    -
      -
    • 스테이블 디퓨전이 텍스트 프롬프트의 CLIP 임베딩으로 컨디셔닝 되고 CLIP이 텍스트와 이미지를 공유 임베딩 스페이스(shared embedding space)로 인코딩한다는 점을 감안할 때 CLIP 컨디셔닝을 조건으로 주어진 이미지에서 파생된 임베딩으로 간단히 대체하는 것이 자연스러워 보일 수 있다.

    • -
    • 하지만 실제로는 CLIP 이미지 임베딩만으로는 조건으로 주어진 이미지에서 세밀한 디테일을 캡처하기에 충분하지 않다.

    • -
    • 따라서 스테이블 디퓨전의 VAE에서 인코딩된 latent 임베딩을 추가로 입력한다.

    • -
    • 이를 통해 디퓨전의 출력 도메인과 일치하는 추가적인 장점을 가지게 된다.

    • -
    -
  • -
  • 어댑터 \(\mathcal{A}\)

    -
      -
    • 스테이블 디퓨전 아키텍처는 기본적으로 컨디셔닝 신호로 VAE latent를 지원하지 않기 때문에 어댑터 모듈 \(\mathcal{A}\)를 추가한다.

    • -
    • 해당 어댑터는 CLIP과 VAE 임베딩을 결합하여 네트워크의 일반적인 cross-attention 연산에 사용되는 하나의 임베딩을 생성한다.

    • -
    • 이 어댑터는 두 신호를 함께 혼합하고 디노이징 U-Net의 cross-attention 모듈에서 예상하는 일반적인 모양으로 출력을 변환한다.

    • -
    -
  • -
  • 디퓨전 기반 파인튜닝에서 언급했 듯이 학습에서 네트워크의 충격을 완화하기 위해 처음에는 VAE 임베딩에 해당하는 가중치는 0으로 설정되어 네트워크가 CLIP 임베딩으로만 학습을 시작한다.

  • -
  • 최종 이미지 컨디셔닝 신호 \(c_I\)를 다음과 같이 정의한다.

  • -
-
-\[ -\begin{align}c_{I}={\mathcal{A}}(c_{\mathrm{CLIP}},c_{\mathrm{VAE}})\end{align} -\]
-
-
-

4.2.2 Modified UNet#

-
-Modified UNet -
-

Fig. 535 Modified UNet#

-
-
-
    -
  • 이미지 컨디셔닝과 달리 포즈 컨디셔닝은 이미지와 정렬 된다.

  • -
  • Noisy latent \(\tilde{z}_i\)를 타겟 포즈 표현 \(c_p\)와 concat한다.

  • -
  • 실제 비디오에서 추정된 포즈의 노이즈를 고려하고 생성된 프레임에서의 시간적 일관성을 극대화하기 위해, \(c_p\)를 다섯 개의 연속된 포즈 프레임으로 구성하였다. 즉, \(c_p = \{p_{i-2}, p_{i-1}, pi, p_{i+1}, p_{i+2}\}\) → 개별 포즈로 네트워크를 학습하는 것보다 연속 포즈로 학습하면 전반적인 움직임의 부드러움과 시간적 일관성이 증가한다.

  • -
  • 구조적으로 0으로 초기화된 10개의 추가 입력 채널을 받아들이도록 UNet 입력 레이어를 수정하고 noisy latent에 해당하는 원래 채널은 사전 학습된 가중치에서 수정되지 않는다.

  • -
-
-
-

4.2.3 Finetuning#

-
    -
  • 스테이블 디퓨전 모델의 대부분의 레이어 weight는 미리 학습된 text-to-image 스테이블 디퓨전 체크포인트로 초기화된다.

  • -
  • 이 때, CLIP 이미지 인코더는 별도의 미리 학습된 체크포인트에서 로드된다.

  • -
  • 새로운 레이어는 초기에 새로운 컨디셔닝 신호가 네트워크 출력에 기여하지 않도록 초기화 된다.

  • -
  • 초기화 후 DreamPose는 아래의 두 단계로 파인튜닝된다.

    -
    -Two-phase finetuning -
    -

    Fig. 536 Two-phase Finetuning#

    -
    -
    -
      -
    1. Full Dataset Finetuning

      -
        -
      • 전체 훈련 데이터셋에 대한 UNet과 어댑터 모듈을 파인 튜닝하여 입력 이미지 및 포즈와 일치하는 프레임을 합성한다.

      • -
      -
    2. -
    3. Subset-Specific Finetuning

      -
        -
      • 하나 이상의 피사체별 입력 이미지에 대해 UNet과 어댑터 모듈을 파인튜닝한 다음 VAE 디코더를 통해 기본 모델을 개선하여 추론에 사용되는 피사체별 맞춤형 모델을 생성한다.

      • -
      -
    4. -
    -
  • -
  • 다른 이미지 조건부 디퓨전 방법과 마찬가지로, 입력 이미지의 사람과 의상의 identity를 보존하고 프레임 간에 일관성을 유지하려면 샘플별 파인튜닝이 필수적이었다.

  • -
  • 그러나 단순히 단일 프레임과 포즈 쌍에 대해 훈련하면 텍스처 고착(texture-sticking)과 같은 아티팩트가 출력 비디오에 발생한다.

  • -
  • 이를 방지하기 위해 각 단계에서 랜덤 크롭을 추가하는 등의 방법으로 이미지-포즈쌍을 증강한다.

  • -
  • VAE 디코더를 파인튜닝하는 것이 더 선명하고 사실적인 디테일을 복구하는 데 중요하다.

    -
    -Importance of VAE finetuning -
    -

    Fig. 537 VAE 파인튜닝의 중요성#

    -
    -
    -
  • -
-
-
-
-

4.4. Pose and Image Classifier-Free Guidance#

-
    -
  • 추론시 단일 입력 이미지와 피사체별 모델(subject-specific model)을 사용하는 일련의 포즈에서 프레임별로 동영상을 생성한다.

  • -
  • 이중(dual) classifier-free guidance를 사용하여 추론 시에 이미지 컨디셔닝 \(c_I\)와 포즈 컨디셔닝 \(c_p\)의 강도를 조절한다.

  • -
  • 이중 classfier-free guidance는 식 (3)에서 다음과 같이 수정된다.

    -
    -\[\begin{split} - \begin{align*} - {\epsilon_{\theta}(z_{t},c_{I},c_{p})} & {= \epsilon_{\theta}(z_{t},\emptyset,\emptyset)} \\ - {} & {+\, s_{I}(\epsilon_{\theta}(z_{t},c_{I},\mathcal{\emptyset})-\epsilon_{\theta}(z_{t},\emptyset,\emptyset))} \\ - {} & {+\, s_{p}(\epsilon_{\theta}(z_{t},\mathcal{c}_{I},\mathcal{c}_p)-\epsilon_{\theta}(z_{t},\mathcal{c}_{I},\emptyset))} - \end{align*} - \end{split}\]
    -
      -
    • \(s_I\), \(s_p\): 가이던스 웨이트

    • -
    • \(c_I\): 이미지 컨디셔닝

    • -
    • \(c_p\): 포즈 컨디셔닝

    • -
    -

    → 이미지 컨디셔닝이 있는 경우와 없는 경우의 노이즈 벡터 차이를 계산하고, 포즈 컨디셔닝이 있는 경우와 없는 경우의 노이즈 벡터 차이를 계산해서 이를 가이던스 웨이트를 통해 강도를 조정해서 반영

    -
  • -
  • \(s_I\)가 크면 입력 이미지에 높은 외관 충실도를 보장하고, \(s_p\)가 크면 입력 포즈에 대한 정렬을 보장한다.

  • -
  • 이중 classifier-free guidance는 포즈 및 이미지 가이드를 강화하는 것 에외도, 피사체별 모델 파인튜닝 후 하나의 입력 포즈에 대한 오버피팅을 방지한다.

  • -
-
-
-
-

5. Experiments#

-
-

5.1. Implementation Details#

-
    -
  • 입력 이미지 resolution: 512x512

  • -
  • GPU: NVIDIA A100 2개

  • -
  • 첫 번째 훈련 단계

    -
      -
    • 전체 훈련 데이터셋 사용

    • -
    • 5 epoch

    • -
    • 5e-6 learning rate

    • -
    • 배치사이즈: 16 (4 gradient accumulation step)

    • -
    • Dropout: 포즈 입력 5%, 이미지 입력 5%

    • -
    -
  • -
  • 두 번째 훈련 단계

    -
      -
    • 특정 샘플 프레임 사용

    • -
    • 500 step

    • -
    • 1e-5 learning rate

    • -
    • Dropout 적용 X

    • -
    -
  • -
  • VAE 디코더 파인튜닝

    -
      -
    • 1500 step

    • -
    • 5e-5 learning rate

    • -
    -
  • -
  • 추론 시에는 PNDM 샘플러 사용 (100step)

  • -
-
-
-

5.2. Dataset#

-
    -
  • UBC Fashion 데이터셋 사용

  • -
  • Split

    -
      -
    • Train: 339개의 영상

    • -
    • Test: 100개의 영상

    • -
    -
  • -
  • 각 비디오의 프레임 속도는 초당 30프레임이며 길이는 약 12초

  • -
  • 학습 중에는 학습 비디오로부터 랜덤으로 프레임 쌍을 샘플링 하였다.

  • -
  • DensePose를 이용해서 포즈를 계산하였다.

  • -
-
-
-
-

6. Results#

-
-

6.1. Comparisons#

-
    -
  • 공개적으로 사용 가능한 두 가지 최신 비디오 합성 방법인 MRAA(Motion Representations for Articulated Animation)과 Thin-Plate Spline Mothion Model(TPSMM)과 수치적 및 정성적인 비교를 하였다.

  • -
  • 제공된 훈련 스크립트와 권장 에폭 수를 사용하여 두 가지 모델을 UBC 패션 데이터셋을 이용해서 스크래치부터 학습하였다.

  • -
  • 평가를 위해서는 AVD 모드에서 제공된 테스트 스크립트를 사용하였다.

  • -
  • PIDM과도 정성적인 비교를 하였다. PIDM의 경우 훈련 스크립트를 사용할 수 없어서 DeepFashion 데이터셋에 대해 학습된 체크포인트를 통해 비교하였다.

  • -
  • 100개의 디노이징 스텝을 사용하여 PIDM과 DreamPose를 실행하였다.

  • -
-
-

6.1.1 Quantitative Analysis#

-
-result 1 -
-

Fig. 538 정량적 성능 비교#

-
-
-
    -
  • 256 픽셀 해상도의 100개의 고유한 패션 동영상으로 구성된 UBC 패션 테스트 셋에 대해 모든 모델을 테스트 하였다.

  • -
  • 각 동영상에 대해 입력 프레임에서 최소 50프레임 이상 떨어져 있는 50개의 프레임을 추출하여 테스트하였다.

  • -
  • MRAA와 TPSMM은 모두 driving video에서 추출된 feautre에 의존하는 반면, DreamPose는 UV-포즈 시퀀스에만 의존한다는 점에 유의하라.

  • -
  • 그럼에도 불구하고 DreamPose 모델은 네 가지 정량적 지표 모두에서 두 가지 방법보다 정량적으로 우수한 성능을 보였다.

  • -
-
-
-

6.2.2 Qualitative Analysis#

-
-result 2 -
-

Fig. 539 정성적 성능 비교#

-
-
-
    -
  • MRAA와 TPSMM은 새로운 포즈를 취할 때 인물의 identity, 옷감 주름, 미세한 패턴이 손실되는 반면 DreamPose는 디테일을 정확하게 유지한다.

  • -
  • 포즈를 크게 변경하는 동안 MRAA는 팔 다리가 분리 될 수 있다.

  • -
  • PIDM과의 비교

    -
    -result 3 -
    -

    Fig. 540 PIDM과의 비교#

    -
    -
    -
      -
    • DreamPose는 얼굴의 identity와 의상 패턴 모두 더 충실도 높은 결과를 생성한다.

    • -
    • PIDM은 사실적인 얼굴을 합성하지만, 원본 인물의 identity와 일치하지 않고, identity와 옷차림이 프레임마다 달랐다. → PIDM이 비디오 합성에서는 잘 동작하지 않는다.

    • -
    -
  • -
-
-
-
-

6.2. Ablation Studies#

-
    -
  • 아래 네 가지 변형에 대해 성능을 비교한다.

    -
      -
    1. \(\text{Ours}_{\text{CLIP}}\): 듀얼 CLIP-VAE 인코더 대신에 사전 학습된 CLIP 이미지 인코더를 사용 → CLIP-VAE 인코더 효과 테스트

    2. -
    3. \(\text{Ours}_{\text{NO-VAE-FT}}\): VAE 디코더를 파인튜닝하지 않은 버전 → 디코더 파인튜닝 효과 테스트

    4. -
    5. \(\text{Ours}_{\text{1-pose}}\): 5개의 연결된 연속 포즈 대신 하나의 대상 포즈만 노이즈에 연결한 버전 → 연결된 5개의 프레임 효과 테스트

    6. -
    7. \(\text{Ours}_{\text{Full}}\): 논문에서 제안한 모든 방법이 다 적용된 DreamPose

    8. -
    -
  • -
-

Quantitative Comparison

-
-result 4 -
-

Fig. 541 Ablation Studies - 정량적 비교#

-
-
-

Qualitative Comparison

-
-result 5 -
-

Fig. 542 Ablation Studies - 정성적 비교#

-
-
-
    -
  • 기존의 스테이블 디퓨전에서는 인물의 identity에 대한 디테일을 보존할 수 없었다.

  • -
  • 텍스트 인코더를 CLIP 인코더로 교체한 결과 대부분의 이미지 디테일은 캡처할 수 있지만, 여전히 외형에 대한 정보 손실이 발생한다.

  • -
  • VAE 디코더를 파인튜닝하면 디테일의 선명도가 크게 향상되고 입력 포즈에 대한 오버피팅이 발생하지 않는다.

  • -
  • 한 가지 포즈만 입력하면 팔과 머리카락 주변에서의 피사체의 형태가 눈에 띄게 깜박이는 현상이 나타났다.

  • -
-
-
-

6.3. Multiple Input Images#

-
    -
  • DreamPose는 피사체에 대한 입력 이미지를 여러 장 넣어서 파인튜닝할 수 있다.

  • -
  • 피사체의 입력 이미지를 추가하면 품질과 시점의 일관성이 향상된다.

    -
    -result 6 -
    -

    Fig. 543 Multiple Input Images 결과#

    -
    -
    -
  • -
-
-
-
-

7. Limitations & Future Work#

-
    -
  • 실패 사례

    -
    -result 7 -
    -

    Fig. 544 실패 사례 예시#

    -
    -
    -
      -
    • 드문 경우지만 팔다리가 옷 속으로 사라지고(왼쪽), hallucinate feature가 보이고(중간)와 대상 포즈가 뒤를 향할 때 방향이 잘못 정렬 되는 경우(오른쪽)가 관찰된다.

    • -
    -
  • -
  • 또한 단순한 패턴의 옷에서 사실적인 결과를 생성하지만 일부 결과는 크고 복잡한 패턴에서 약간의 깜박임 동작을 보인다.

  • -
  • 다른 디퓨전 모델과 마찬가지로 파인튜닝 및 추론 시간이 GAN 또는 VAE에 비해 느리다.

    -
      -
    • 특정 피사체에 대한 모델 파인튜닝은 프레임당 18초의 렌더링 시간 외의 UNet의 경우 약 10분, VAE 디코더의 경우 약 20분이 소요된다.

    • -
    -
  • -
-
-
-

8. Conclusion#

-
    -
  • 스틸 패션 이미지 애니메이션을 위한 새로운 디퓨전 기반 방법인 DreamPose를 제안하였다.

  • -
  • 한 장의 이미지와 포즈 시퀀스가 주어졌을 때, 섬유, 패턴, 사람의 identity를 애니메이션 하는 사실적인 사실적인 패션 동영상을 생성하는 방법을 증명하였다.

  • -
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion#

+
+DreamPose_input_output +
+

Fig. 531 DreamPose 입출력#

+
+
+ +
+
+

1. Introduction#

+
    +
  • DreamPose가 제안된 배경

    +
      +
    • 패션 사진은 온라인에 널리 퍼져 있지만, 전달할 수 있는 정보가 제한적이며 입었을 때 옷의 늘어진 모양이나 흐름 등 옷의 중요한 뉘앙스를 포착하지 못한다.

    • +
    • 패션 동영상은 이러한 모든 디테일을 보여주기에 소비자의 의사 결정에 유용한 정보를 제공하지만, 동영상이 있는 상품은 매우 드물다.

    • +
    +
  • +
  • DreamPose

    +
      +
    • 본 논문에서는 포즈 시퀀스를 따라 패션 사진을 사실적인 애니메이션 비디오로 변환하는 방법인 DreamPose를 소개한다.

    • +
    • Stable diffusion을 기반으로 한다.

    • +
    • 하나 이상의 사람 이미지와 포즈 시퀀스가 주어지면, 포즈 시퀀스를 따라 고품질 비디오를 생성한다.

    • +
    +
  • +
  • 기존 비디오 생성 모델들의 문제점

    +
      +
    • 이미지 생성 디퓨전 모델은 좋은 결과를 보여주었지만, 비디오 생성 디퓨전 모델은 동일한 품질의 결과를 얻지 못했으며, 텍스처 움직임이나 카툰과 같은 모양으로 제한된 경우가 많다.

    • +
    • 시간적 일관성이 떨어진다.

    • +
    • 모션 jitter가 발생한다.

    • +
    • 사실성(realism)이 부족하다.

    • +
    • 대상 비디오의 움직임이나 세부적인 물체 모양을 제어할 수 없다.

      +
        +
      • 기존 모델이 주로 텍스트에 기반으로 하기 때문에

      • +
      +
    • +
    +
  • +
  • DreamPose의 접근법

    +
      +
    • 이미지 및 포즈 시퀀스를 조건으로 받는 방식을 사용하여 fidelity와 프레임 간 일관성을 높일 수 있다.

    • +
    • 이미지 분포를 효과적으로 모델링하는 기존 사전 학습된 이미지 디퓨전 모델을 파인 튜닝하였다. → 이미지 애니메이션 태스크를 컨디셔닝 신호와 일치하는 이미지의 부분 공간을 찾는 것으로 단순화 할 수 있다.

    • +
    • 해당 태스크를 위해 스테이블 디퓨전의 인코더와 컨디셔닝 메커니즘을 재설계하였다.

    • +
    • 2-스테이지 파인튜닝 방식을 사용한다

      +
        +
      • UNet과 VAE를 하나 혹은 여러 입력 이미지에 대해서 파인튜닝

      • +
      +
    • +
    +
  • +
  • Contribution

    +
      +
    1. DreamPose: 패션 이미지 애니메이션을 위해 이미지 및 포즈를 조건으로 하는 디퓨전 방식

    2. +
    3. 프레임 간 시간적 일관성을 크게 향상 시키는 간단하지만 효과적인 포즈 컨디셔닝 방식

    4. +
    5. 컨디셔닝 이미지의 fidelity를 높여주는 split CLIP-VAE 인코더

    6. +
    7. 이미지의 fidelity와 새로운 포즈에 대한 일반화 사이의 균형을 효과적으로 맞추는 파인튜닝 전략

    8. +
    +
  • +
+
+ +
+

3. Background#

+
    +
  • 디퓨전 모델

    +
      +
    • 디퓨전 모델은 품질, 다양성, 학습 안정성 측면에서 합성 태스크에서 GAN을 능가하는 최신 생성 모델이다.

    • +
    • 표준 이미지 디퓨전 모델은 정규 분포된 랜덤 노이즈에서 이미지를 반복적으로 복원하는 방법을 학습한다.

    • +
    +
  • +
  • Latent diffusion model (ex. Stable Diffusion)

    +
    +latent diffusion +
    +

    Fig. 532 Latent Diffusion Model#

    +
    +
    +
  • +
  • 오토인코더의 인코딩된 latent space에서 작동하므로 최소한의 품질을 희생하면서 계산 복잡성을 절약한다.

  • +
  • 스테이블 디퓨전 모델은 VAE와 디노이징 UNet의 두 가지 모델로 구성된다.

    +
      +
    • VAE 오토인코더

      +
        +
      • 인코더 \(\mathcal{E}\): 프레임 \(x\)를 컴팩트한 latent 표현 \(z\)로 추출 (\(z=\mathcal{E}\)\((x)\))

      • +
      • 디코더 \(\mathcal{D}\): latent 표현에서 이미지를 복원 (\(x’=\mathcal{D}(z)\))

      • +
      +
    • +
    • 학습하는 동안, latent feature \(z\)는 결정론적 가우시안 프로세스에 의해 타임 스탬프 \(T\)로 디퓨즈되어 노이지 feature인 \(\tilde{z}_T\)를 만듦

    • +
    • 원본 이미지를 복구하기 위해 각 타임스탬프에 해당하는 latent feature의 노이즈를 반복적으로 예측하도록 시간으로 컨디셔닝된 UNet이 학습 된다.

    • +
    • UNet의 목적 함수

      +
      +\[ + \begin{align}{\cal L}_{D M}=\mathbb{R}_{z,\epsilon\in{\mathcal{N}}(0,1)}[||\epsilon-\epsilon_{\theta}({\tilde{z}}_{t},t,c)]|_{2}^{2}]\end{align} + \]
      +
        +
      • c: 컨디셔닝 정보의 임베딩 (텍스트, 이미지, 세그멘테이션 마스크등, 스테이블 디퓨전에서는 CLIP 텍스트 인코더로부터 얻어짐

      • +
      +
    • +
    • 예측된 latent \(z’\)은 예측된 이미지 \(x’ = \mathcal{D}(z')\)를 복구하도록 디코딩 된다.

    • +
    +
  • +
  • Classifier-free guidance

    +
      +
    • Implicit classifier를 통해 예측된 노이즈 분포를 조건으로 주어진 분포로 밀어붙이는 샘플링 메커니즘이다.

    • +
    • 이는 랜덤한 확률로 실제 조건으로 주어진 입력을 널 입력(∅)으로 대체하는 훈련 방식인 드롭아웃을 통해 달성된다.

    • +
    • 인퍼런스하는 동안 조건으로 주어진 예측은 스칼라 가중치 s를 사용하여 unconditional한 예측을 조건부로 가이드하는 데 사용된다.

      +
      +\[ + \begin{align}\epsilon_{\theta}=\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset)+s\cdot(\epsilon_{\theta}(\tilde{z}_{t},t,\mathrm{c})-\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset))\end{align} + \]
      +
        +
      • \(\epsilon_{\theta}(\tilde{z}_{t},t,\emptyset)\): 조건이 없는 경우에 노이즈 벡터

      • +
      • \(\epsilon_{\theta}(\tilde{z}_{t},t,c)\): 조건이 있는 경우에 노이즈 벡터

      • +
      +

      → 조건을 Null로 줬을 때의 모델의 예측값과 조건을 줬을 때의 모델이 예측값을 보간한다.

      +
    • +
    +
  • +
+
+
+

4. Method#

+
    +
  • 본 논문에서는 단일 이미지와 포즈 시퀀스로부터 사실적인 애니메이션 동영상을 만드는 것을 목표로 한다.

  • +
  • 이를 위해 패션 동영상 컬렉션에서 사전 학습된 스테이블 디퓨전을 패션 동영상 컬렉션에 맞게 파인튜닝한다.

  • +
  • 추가 컨디셔닝 신호(이미지 및 포즈)를 받고 동영상으로 볼 수 있는 시간적으로 일관된 콘텐츠를 출력하기 위해 스테이블 디퓨전의 구조를 조정하는 작업이 포함된다.

  • +
+
+

4.1. Overview#

+
    +
  • 입출력

    +
      +
    • 입력: 입력 이미지 \(x_0\), 포즈 \(\{p_1, …, p_n\}\)

    • +
    • 출력: 비디오 \(\{x'_1, …, x’_N\}\) (\(x’_i\): 입력 포즈 \(p_i\)에 해당하는 i 번째 예측된 프레임)

    • +
    +
  • +
  • 입력 이미지와 포즈 시퀀스를 조건으로 하는 사전 훈련된 latent diffusion model을 사용한다.

  • +
  • 추론 시에는 일반적인 디퓨전 샘플링 절차를 통해 각 프레임을 독립적으로 생성한다.

    +
      +
    • 균일하게 분포된 가우시안 노이즈로 시작하여 두 조건 신호로 디퓨전 모델을 반복적으로 쿼리하여 noisy latent의 노이즈를 제거한다.

    • +
    +
  • +
  • 마지막으로 예측된 디노이즈된 latent \(z’_i\)를 디코딩하여 예측된 비디오 프레임 \(x’_i=\mathcal{D}(z’_i)\)를 만든다.

  • +
+
+
+

4.2. Architecture#

+
    +
  • 이미지 애니메이션을 위해 원래의 text-to-image 스테이블 디퓨전 모델을 수정하고 파인튜닝한다. (조건: 이미지, 포즈)

  • +
  • 이미지 애니메이션의 목표

    +
      +
    1. 제공된 입력 이미지에 대한 충실도

    2. +
    3. 시각적 품질

    4. +
    5. 생성된 프레임의 전반적인 시간적인 안정성

    6. +
    +
  • +
  • 이러한 목표를 달성하기 위해 아키텍처를 아래와 같이 구성하였다.

    +
    +DreamPose Architecture +
    +

    Fig. 533 DreamPose Architecture#

    +
    +
    +
  • +
+
+

4.2.1 Split CLIP-VAE Encoder#

+
+DreamPose Encoder +
+

Fig. 534 DreamPose Encoder#

+
+
+
    +
  • 해당 모듈-컨디셔닝 어댑터(custom conditioning adapter)의 필요성

    +
      +
    • 이미지를 조건으로 넣기 위한 이전 연구 (ex: InstructPix2Pix)는 주로 조건으로 들어오는 이미지 신호를 디노이징 U-Net에 대한 입력 노이즈와 concat한다.

    • +
    • 이는 원하는 출력 이미지와 공간적으로(spatially) 정렬된 조건 신호에 대한 조건화에 효과적이지만, DreamPose의 경우에는 네트워크가 입력 이미지와 공간적으로 정렬되지 않은 이미지를 생성하는 것을 목표로 한다.

    • +
    • 따라서 해당 태스크에는 다른 방법이 필요하고, 이를 위해 맞춤형 컨디셔닝 어댑터를 구현하였다.

    • +
    • 맞춤형 컨디셔닝 어댑터는 CLIP 텍스트 인코더를 사용하여 이미지 조건화를 대체하는 맞춤형 컨디셔닝 어댑터(custom conditioning adapter)를 구현하였다.

    • +
    • 이 어댑터는 사전 학습된 CLIP 이미지 및 VAE 인코더에서 인코딩된 정보를 결합한다.

    • +
    +
  • +
  • 디퓨전 기반 파인튜닝

    +
      +
    • 목표: 입력 신호를 원래 네트워크 학습에 사용된 신호와 최대한 유사하게 만들어 학습 기울기를 가능한 한 의미 있게 만드는 것 → 학습된 prior 값의 손실을 방지하는 데 도움이 된다.

    • +
    • 이러한 이유로 대부분의 디퓨전 기반 파인튜닝 체계는 모든 원래 컨디셔닝 신호를 유지하고 새로운 컨디셔닝 신호와 상호 작용하는 네트워크 가중치를 0으로 초기화한다.

    • +
    +
  • +
  • VAE Encoder의 필요성

    +
      +
    • 스테이블 디퓨전이 텍스트 프롬프트의 CLIP 임베딩으로 컨디셔닝 되고 CLIP이 텍스트와 이미지를 공유 임베딩 스페이스(shared embedding space)로 인코딩한다는 점을 감안할 때 CLIP 컨디셔닝을 조건으로 주어진 이미지에서 파생된 임베딩으로 간단히 대체하는 것이 자연스러워 보일 수 있다.

    • +
    • 하지만 실제로는 CLIP 이미지 임베딩만으로는 조건으로 주어진 이미지에서 세밀한 디테일을 캡처하기에 충분하지 않다.

    • +
    • 따라서 스테이블 디퓨전의 VAE에서 인코딩된 latent 임베딩을 추가로 입력한다.

    • +
    • 이를 통해 디퓨전의 출력 도메인과 일치하는 추가적인 장점을 가지게 된다.

    • +
    +
  • +
  • 어댑터 \(\mathcal{A}\)

    +
      +
    • 스테이블 디퓨전 아키텍처는 기본적으로 컨디셔닝 신호로 VAE latent를 지원하지 않기 때문에 어댑터 모듈 \(\mathcal{A}\)를 추가한다.

    • +
    • 해당 어댑터는 CLIP과 VAE 임베딩을 결합하여 네트워크의 일반적인 cross-attention 연산에 사용되는 하나의 임베딩을 생성한다.

    • +
    • 이 어댑터는 두 신호를 함께 혼합하고 디노이징 U-Net의 cross-attention 모듈에서 예상하는 일반적인 모양으로 출력을 변환한다.

    • +
    +
  • +
  • 디퓨전 기반 파인튜닝에서 언급했 듯이 학습에서 네트워크의 충격을 완화하기 위해 처음에는 VAE 임베딩에 해당하는 가중치는 0으로 설정되어 네트워크가 CLIP 임베딩으로만 학습을 시작한다.

  • +
  • 최종 이미지 컨디셔닝 신호 \(c_I\)를 다음과 같이 정의한다.

  • +
+
+\[ +\begin{align}c_{I}={\mathcal{A}}(c_{\mathrm{CLIP}},c_{\mathrm{VAE}})\end{align} +\]
+
+
+

4.2.2 Modified UNet#

+
+Modified UNet +
+

Fig. 535 Modified UNet#

+
+
+
    +
  • 이미지 컨디셔닝과 달리 포즈 컨디셔닝은 이미지와 정렬 된다.

  • +
  • Noisy latent \(\tilde{z}_i\)를 타겟 포즈 표현 \(c_p\)와 concat한다.

  • +
  • 실제 비디오에서 추정된 포즈의 노이즈를 고려하고 생성된 프레임에서의 시간적 일관성을 극대화하기 위해, \(c_p\)를 다섯 개의 연속된 포즈 프레임으로 구성하였다. 즉, \(c_p = \{p_{i-2}, p_{i-1}, pi, p_{i+1}, p_{i+2}\}\) → 개별 포즈로 네트워크를 학습하는 것보다 연속 포즈로 학습하면 전반적인 움직임의 부드러움과 시간적 일관성이 증가한다.

  • +
  • 구조적으로 0으로 초기화된 10개의 추가 입력 채널을 받아들이도록 UNet 입력 레이어를 수정하고 noisy latent에 해당하는 원래 채널은 사전 학습된 가중치에서 수정되지 않는다.

  • +
+
+
+

4.2.3 Finetuning#

+
    +
  • 스테이블 디퓨전 모델의 대부분의 레이어 weight는 미리 학습된 text-to-image 스테이블 디퓨전 체크포인트로 초기화된다.

  • +
  • 이 때, CLIP 이미지 인코더는 별도의 미리 학습된 체크포인트에서 로드된다.

  • +
  • 새로운 레이어는 초기에 새로운 컨디셔닝 신호가 네트워크 출력에 기여하지 않도록 초기화 된다.

  • +
  • 초기화 후 DreamPose는 아래의 두 단계로 파인튜닝된다.

    +
    +Two-phase finetuning +
    +

    Fig. 536 Two-phase Finetuning#

    +
    +
    +
      +
    1. Full Dataset Finetuning

      +
        +
      • 전체 훈련 데이터셋에 대한 UNet과 어댑터 모듈을 파인 튜닝하여 입력 이미지 및 포즈와 일치하는 프레임을 합성한다.

      • +
      +
    2. +
    3. Subset-Specific Finetuning

      +
        +
      • 하나 이상의 피사체별 입력 이미지에 대해 UNet과 어댑터 모듈을 파인튜닝한 다음 VAE 디코더를 통해 기본 모델을 개선하여 추론에 사용되는 피사체별 맞춤형 모델을 생성한다.

      • +
      +
    4. +
    +
  • +
  • 다른 이미지 조건부 디퓨전 방법과 마찬가지로, 입력 이미지의 사람과 의상의 identity를 보존하고 프레임 간에 일관성을 유지하려면 샘플별 파인튜닝이 필수적이었다.

  • +
  • 그러나 단순히 단일 프레임과 포즈 쌍에 대해 훈련하면 텍스처 고착(texture-sticking)과 같은 아티팩트가 출력 비디오에 발생한다.

  • +
  • 이를 방지하기 위해 각 단계에서 랜덤 크롭을 추가하는 등의 방법으로 이미지-포즈쌍을 증강한다.

  • +
  • VAE 디코더를 파인튜닝하는 것이 더 선명하고 사실적인 디테일을 복구하는 데 중요하다.

    +
    +Importance of VAE finetuning +
    +

    Fig. 537 VAE 파인튜닝의 중요성#

    +
    +
    +
  • +
+
+
+
+

4.4. Pose and Image Classifier-Free Guidance#

+
    +
  • 추론시 단일 입력 이미지와 피사체별 모델(subject-specific model)을 사용하는 일련의 포즈에서 프레임별로 동영상을 생성한다.

  • +
  • 이중(dual) classifier-free guidance를 사용하여 추론 시에 이미지 컨디셔닝 \(c_I\)와 포즈 컨디셔닝 \(c_p\)의 강도를 조절한다.

  • +
  • 이중 classfier-free guidance는 식 (3)에서 다음과 같이 수정된다.

    +
    +\[\begin{split} + \begin{align*} + {\epsilon_{\theta}(z_{t},c_{I},c_{p})} & {= \epsilon_{\theta}(z_{t},\emptyset,\emptyset)} \\ + {} & {+\, s_{I}(\epsilon_{\theta}(z_{t},c_{I},\mathcal{\emptyset})-\epsilon_{\theta}(z_{t},\emptyset,\emptyset))} \\ + {} & {+\, s_{p}(\epsilon_{\theta}(z_{t},\mathcal{c}_{I},\mathcal{c}_p)-\epsilon_{\theta}(z_{t},\mathcal{c}_{I},\emptyset))} + \end{align*} + \end{split}\]
    +
      +
    • \(s_I\), \(s_p\): 가이던스 웨이트

    • +
    • \(c_I\): 이미지 컨디셔닝

    • +
    • \(c_p\): 포즈 컨디셔닝

    • +
    +

    → 이미지 컨디셔닝이 있는 경우와 없는 경우의 노이즈 벡터 차이를 계산하고, 포즈 컨디셔닝이 있는 경우와 없는 경우의 노이즈 벡터 차이를 계산해서 이를 가이던스 웨이트를 통해 강도를 조정해서 반영

    +
  • +
  • \(s_I\)가 크면 입력 이미지에 높은 외관 충실도를 보장하고, \(s_p\)가 크면 입력 포즈에 대한 정렬을 보장한다.

  • +
  • 이중 classifier-free guidance는 포즈 및 이미지 가이드를 강화하는 것 에외도, 피사체별 모델 파인튜닝 후 하나의 입력 포즈에 대한 오버피팅을 방지한다.

  • +
+
+
+
+

5. Experiments#

+
+

5.1. Implementation Details#

+
    +
  • 입력 이미지 resolution: 512x512

  • +
  • GPU: NVIDIA A100 2개

  • +
  • 첫 번째 훈련 단계

    +
      +
    • 전체 훈련 데이터셋 사용

    • +
    • 5 epoch

    • +
    • 5e-6 learning rate

    • +
    • 배치사이즈: 16 (4 gradient accumulation step)

    • +
    • Dropout: 포즈 입력 5%, 이미지 입력 5%

    • +
    +
  • +
  • 두 번째 훈련 단계

    +
      +
    • 특정 샘플 프레임 사용

    • +
    • 500 step

    • +
    • 1e-5 learning rate

    • +
    • Dropout 적용 X

    • +
    +
  • +
  • VAE 디코더 파인튜닝

    +
      +
    • 1500 step

    • +
    • 5e-5 learning rate

    • +
    +
  • +
  • 추론 시에는 PNDM 샘플러 사용 (100step)

  • +
+
+
+

5.2. Dataset#

+
    +
  • UBC Fashion 데이터셋 사용

  • +
  • Split

    +
      +
    • Train: 339개의 영상

    • +
    • Test: 100개의 영상

    • +
    +
  • +
  • 각 비디오의 프레임 속도는 초당 30프레임이며 길이는 약 12초

  • +
  • 학습 중에는 학습 비디오로부터 랜덤으로 프레임 쌍을 샘플링 하였다.

  • +
  • DensePose를 이용해서 포즈를 계산하였다.

  • +
+
+
+
+

6. Results#

+
+

6.1. Comparisons#

+
    +
  • 공개적으로 사용 가능한 두 가지 최신 비디오 합성 방법인 MRAA(Motion Representations for Articulated Animation)과 Thin-Plate Spline Mothion Model(TPSMM)과 수치적 및 정성적인 비교를 하였다.

  • +
  • 제공된 훈련 스크립트와 권장 에폭 수를 사용하여 두 가지 모델을 UBC 패션 데이터셋을 이용해서 스크래치부터 학습하였다.

  • +
  • 평가를 위해서는 AVD 모드에서 제공된 테스트 스크립트를 사용하였다.

  • +
  • PIDM과도 정성적인 비교를 하였다. PIDM의 경우 훈련 스크립트를 사용할 수 없어서 DeepFashion 데이터셋에 대해 학습된 체크포인트를 통해 비교하였다.

  • +
  • 100개의 디노이징 스텝을 사용하여 PIDM과 DreamPose를 실행하였다.

  • +
+
+

6.1.1 Quantitative Analysis#

+
+result 1 +
+

Fig. 538 정량적 성능 비교#

+
+
+
    +
  • 256 픽셀 해상도의 100개의 고유한 패션 동영상으로 구성된 UBC 패션 테스트 셋에 대해 모든 모델을 테스트 하였다.

  • +
  • 각 동영상에 대해 입력 프레임에서 최소 50프레임 이상 떨어져 있는 50개의 프레임을 추출하여 테스트하였다.

  • +
  • MRAA와 TPSMM은 모두 driving video에서 추출된 feautre에 의존하는 반면, DreamPose는 UV-포즈 시퀀스에만 의존한다는 점에 유의하라.

  • +
  • 그럼에도 불구하고 DreamPose 모델은 네 가지 정량적 지표 모두에서 두 가지 방법보다 정량적으로 우수한 성능을 보였다.

  • +
+
+
+

6.2.2 Qualitative Analysis#

+
+result 2 +
+

Fig. 539 정성적 성능 비교#

+
+
+
    +
  • MRAA와 TPSMM은 새로운 포즈를 취할 때 인물의 identity, 옷감 주름, 미세한 패턴이 손실되는 반면 DreamPose는 디테일을 정확하게 유지한다.

  • +
  • 포즈를 크게 변경하는 동안 MRAA는 팔 다리가 분리 될 수 있다.

  • +
  • PIDM과의 비교

    +
    +result 3 +
    +

    Fig. 540 PIDM과의 비교#

    +
    +
    +
      +
    • DreamPose는 얼굴의 identity와 의상 패턴 모두 더 충실도 높은 결과를 생성한다.

    • +
    • PIDM은 사실적인 얼굴을 합성하지만, 원본 인물의 identity와 일치하지 않고, identity와 옷차림이 프레임마다 달랐다. → PIDM이 비디오 합성에서는 잘 동작하지 않는다.

    • +
    +
  • +
+
+
+
+

6.2. Ablation Studies#

+
    +
  • 아래 네 가지 변형에 대해 성능을 비교한다.

    +
      +
    1. \(\text{Ours}_{\text{CLIP}}\): 듀얼 CLIP-VAE 인코더 대신에 사전 학습된 CLIP 이미지 인코더를 사용 → CLIP-VAE 인코더 효과 테스트

    2. +
    3. \(\text{Ours}_{\text{NO-VAE-FT}}\): VAE 디코더를 파인튜닝하지 않은 버전 → 디코더 파인튜닝 효과 테스트

    4. +
    5. \(\text{Ours}_{\text{1-pose}}\): 5개의 연결된 연속 포즈 대신 하나의 대상 포즈만 노이즈에 연결한 버전 → 연결된 5개의 프레임 효과 테스트

    6. +
    7. \(\text{Ours}_{\text{Full}}\): 논문에서 제안한 모든 방법이 다 적용된 DreamPose

    8. +
    +
  • +
+

Quantitative Comparison

+
+result 4 +
+

Fig. 541 Ablation Studies - 정량적 비교#

+
+
+

Qualitative Comparison

+
+result 5 +
+

Fig. 542 Ablation Studies - 정성적 비교#

+
+
+
    +
  • 기존의 스테이블 디퓨전에서는 인물의 identity에 대한 디테일을 보존할 수 없었다.

  • +
  • 텍스트 인코더를 CLIP 인코더로 교체한 결과 대부분의 이미지 디테일은 캡처할 수 있지만, 여전히 외형에 대한 정보 손실이 발생한다.

  • +
  • VAE 디코더를 파인튜닝하면 디테일의 선명도가 크게 향상되고 입력 포즈에 대한 오버피팅이 발생하지 않는다.

  • +
  • 한 가지 포즈만 입력하면 팔과 머리카락 주변에서의 피사체의 형태가 눈에 띄게 깜박이는 현상이 나타났다.

  • +
+
+
+

6.3. Multiple Input Images#

+
    +
  • DreamPose는 피사체에 대한 입력 이미지를 여러 장 넣어서 파인튜닝할 수 있다.

  • +
  • 피사체의 입력 이미지를 추가하면 품질과 시점의 일관성이 향상된다.

    +
    +result 6 +
    +

    Fig. 543 Multiple Input Images 결과#

    +
    +
    +
  • +
+
+
+
+

7. Limitations & Future Work#

+
    +
  • 실패 사례

    +
    +result 7 +
    +

    Fig. 544 실패 사례 예시#

    +
    +
    +
      +
    • 드문 경우지만 팔다리가 옷 속으로 사라지고(왼쪽), hallucinate feature가 보이고(중간)와 대상 포즈가 뒤를 향할 때 방향이 잘못 정렬 되는 경우(오른쪽)가 관찰된다.

    • +
    +
  • +
  • 또한 단순한 패턴의 옷에서 사실적인 결과를 생성하지만 일부 결과는 크고 복잡한 패턴에서 약간의 깜박임 동작을 보인다.

  • +
  • 다른 디퓨전 모델과 마찬가지로 파인튜닝 및 추론 시간이 GAN 또는 VAE에 비해 느리다.

    +
      +
    • 특정 피사체에 대한 모델 파인튜닝은 프레임당 18초의 렌더링 시간 외의 UNet의 경우 약 10분, VAE 디코더의 경우 약 20분이 소요된다.

    • +
    +
  • +
+
+
+

8. Conclusion#

+
    +
  • 스틸 패션 이미지 애니메이션을 위한 새로운 디퓨전 기반 방법인 DreamPose를 제안하였다.

  • +
  • 한 장의 이미지와 포즈 시퀀스가 주어졌을 때, 섬유, 패턴, 사람의 identity를 애니메이션 하는 사실적인 사실적인 패션 동영상을 생성하는 방법을 증명하였다.

  • +
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/GIGAGAN.html b/docs/review/GIGAGAN.html old mode 100644 new mode 100755 index 01244781..775b2bc7 --- a/docs/review/GIGAGAN.html +++ b/docs/review/GIGAGAN.html @@ -1,985 +1,1004 @@ - - - - - - - - - - - - Scaling up GANs for Text-to-Image Synthesis — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

Scaling up GANs for Text-to-Image Synthesis

- -
-
- -
-

Contents

-
- -
-
-
- - - - -
- -
-

Information

- -
-
-

Scaling up GANs for Text-to-Image Synthesis#

-
-

Abstract#

-
    -
  • 최근 이미지 생성 task의 모델 성능이 꾸준히 발전중

  • -
  • 기존에는 stylegan과 같은 GAN 모델이 주를 이뤘지만 최근 DALLE, Stable Diffusion등 Diffusion 기반의 모델 베이스로 추세가 급격하게 바뀌어버림

  • -
  • “GAN 모델로 Diffusion의 성능을 잡는것은 정말 무리일까?”

  • -
  • GigaGAN은

    -
      -
    • gan 기반의 모델로 1. 속도점 이점2. 다양한 extra editing이 가능하다. (contribution)

    • -
    -
      -
    1. 속도적 이점

      -
        -
      1. 512px의 이미지를 0.13초만에 생성할 수 있다.

      2. -
      3. 16-megapixel(1600만 픽셀, 4k)의 이미지를 3.66초만에 생성할 수 있다.

      4. -
      -
    2. -
    3. 다양한 활용성

      -
        -
      1. latent space 상 에서의 image editing이 가능하다. (latent interpolation, style mixing …)

      2. -
      -
    4. -
    -
  • -
-
-
-

Introduction#

-
    -
  • 최근 Diffusion 기반의 모델들이 이미지 생성 분야에서 좋은 성능을 보여주고 있다.

  • -
  • Diffusion은

    -
      -
    • 기본적으로 학습과 생성 시 iteration이 들어가는데 iteration은 학습의 안정성을 키워주는 장점이 있지만, computation cost가 매우 증가한다는 단점이 있다.

    • -
    -
  • -
  • 반면에 GAN은

    -
      -
    • 이미지 생성 시 single forward pass만 필요하므로 cost가 크지 않다는 장점이 있지만 single 혹은 multiple object의 생성에는 성능이 뛰어나지만 class가 명확히 정의되지않은 이미지 즉, open world image의 생성에는 어려움이 있다.

    • -
    -
  • -
  • “GAN을 더 develop한다면 Diffusion 모델을 넘어설 수 있을까?”

  • -
  • gigaGAN은?

    -
      -
    1. 속도적 장점

      -
        -
      • 0.13 s/img (512 size), 3.66s / img (4k)

      • -
      -
    2. -
    3. latent space상에서의 editing 가능(style mixing, interpolation, prompt mixing like stylegan2)

    4. -
    -
  • -
-
-
-

Methods#

-
-img0 -
-

Fig. 437 Overall Architecture#

-
-
-

Base Architecture

-
    -
  • Base Model은 stylegan2로 선정

  • -
  • \(G = M\times \tilde{G}\)

  • -
  • \(M\)(mapping network) : gaussian distribution에서의 noise를 좀더 disentangle된 w space로 mapping 시키는 network

    -
      -
    • gigagan에서는 mapping network의 input으로 z와 함께 text condition(c)도 함께 사용

    • -
    • output : \(w\) (vector)

    • -
    -
  • -
  • \(\tilde{G}\) : 피라미드 구조의 convolution block들로 random constant 값으로부터 output image \(X\)를 생성하는 generator.

    -
      -
    • 이때 \(w\) vector는 각 layer마다 입력으로 들어가서 feature map의 분포를 scaling함으로써 style을 반영(modulation, demodulation in stylegan2)

    • -
    -
  • -
-

Sample-adaptive kernel selection

-
-img1 -
-

Fig. 438 Sample Adaptive Kernel Selection#

-
-
-
    -
  • 도입 배경

    -
      -
    • 단순히 convolution layer의 kernel size만 scaling up을 하면 학습이 안되는 현상

    • -
    • GAN 기반 모델이 (1)text-condition의 (2)오픈 이미지 생성에 한계를 보이는 이유는 convolution network의 구조 때문이다.

      -
        -
      • convolution 연산은 구조상 같은 레이어상에 있는 하나의 filter가 text condition 주입부터 이미지의 생성까지 모든 부분에 참여하는데 이 부분이 모델의 표현력을 떨어트릴 수 있다.

      • -
      -
    • -
    -
  • -
  • kernel selection method 적용

  • -
  • 레이어마다 \(\{k_{i}\in R^{C_{in}\times C_{out}\times K\times K}\}\)차원의 N개의 kernel set을 두고 style vector w의 affine layer를 거친 weight를 각 kernel값에 weighted summation한 값을 최종 filter로 사용

    -
    -img2 -
    -

    Fig. 439 Equation of kernel selection method affine layer#

    -
    -
    -
  • -
  • 이 때 kernel weight 계산에 softmax를 사용하는데 얘는 differentiable하므로 gradient update 가능

  • -
  • 또, 실제로 N개의 kernel을 모두 filter로 사용할 때보다 computation cost가 굉장히 절약된다는 장점

  • -
-

Interleaving attention with convolution

-
    -
  • 도입 배경

    -
      -
    • convolution filter는 receptive field 내부의 local feature 캡처에는 탁월하지만 field 외부의 부분은 학습할 수 없다.

      -
      -img3 -
      -

      Fig. 440 Receptive Field in Convolution Networks#

      -
      -
      -
    • -
    • 이러한 한계점을 극복하기위해 attention layer(\(g_{attn}\))를 추가

    • -
    • 단순히 stylegan2에 attention layer를 추가하면 학습에 이상이 생김

      -
        -
      • 원인은 attention layer에서 사용하는 dot product가 Lipschitz함수가 아니기 때문

        -
          -
        • lipschitz 함수란

          -
            -
          • lipschitz 함수란, 두 점 사이의 거리를 일정 비 이상으로 증가시키지 않는 함수

            -
            -img4 -
            -

            Fig. 441 lipschitz Function#

            -
            -
            -
          • -
          -
        • -
        -
      • -
      • Lipschitz 함수를 만족하지 못함으로써 discriminator의 학습이 unstable하게 되고 때문에 학습에 실패한다.

      • -
      -
    • -
    • Lipschitz 연속성을 만족시키기 위해 attention의 dot product를 L2-distance로 대체

    • -
    -
  • -
-

Advanced setting

-
    -
  • 모델의 성능 향상을 위해 stylegan2과 같은 hyper parameter를 사용하고, L2 distance logit의 초기값을 unit normal distribution, scale down, …

  • -
  • \(\tilde{G}\)의 각 convolution block 마다 attentnion layer(self + cross)를 적용

    -
      -
    • self attention: 이미지 자신의 global feature 학습용

    • -
    • cross attention: 이미지에 text condition 주입용

    • -
    -
  • -
-

Generator design

-
-img5 -
-

Fig. 442 GIGAGAN Architecture#

-
-
-
    -
  • text embedding

    -
      -
    • pretrained model : clip(frozen; \(R^{C\times 768}\), c is # of tokens)

    • -
    • 후에 text encoding에 추가적인 유연성을 위해 mapping network(\(T\))를 추가

    • -
    • text mapping network(\(T\))의 output은 input size와 동일하게 \(R^{C\times 768}\)

    • -
    • 이때 output \(t\)를 두 파트로 나눠 사용하는데

      -
        -
      • \(R^{C-1\times 768}\) : word i index의 local feature를 catch

      • -
      • \(R^{768}\) : word를 global하게 embedding하는 vector

      • -
      -
    • -
    • \(t_{global}\)은 latent mapping network(\(M\))의 input으로 사용

    • -
    • \(t_{local}\)은 Generator의 input으로 각 block에 cross attention에 적용

    • -
    -
  • -
  • Generator의 layer는 총 5개의 피라미드 구조

  • -
  • \(\{x_{i}\}_{i=0}^{L-1} = \{x_{0},x_{1}, ..., x_{4}\}\) , \(\{S_{i}\}_{i=0}^{L-1} = \{64, 32, 16, 8, 4\}\)

  • -
  • \(x_{0} = X\)(output image)

  • -
-

Discriminator Design

-
-img6 -
-

Fig. 443 Discriminator of GIGAGAN#

-
-
-
    -
  • 2 branch의 구조

    -
      -
    1. text conditioning을 학습

    2. -
    3. image generating을 학습

    4. -
    -
  • -
  • \(t_{D}\): text c로부터 pretrained text encoder(CLIP)를 통과시켜 추출한 embedding 값

  • -
  • stylegan에서는 low res의 이미지들은 loss에 반영하지 않았지만, gigagan에서는 이미지의 low feature 표현의 개선을 위해 모든 scale의 이미지를 모두 loss에 반영

  • -
  • 이때 feature extractor \(\Phi\)

    -
      -
    • \(\Phi_{i\rightarrow j}:R^{X_{i}\times X_{i}\times3}\rightarrow R^{X_{j}^{D}\times X_{j}^{D}\times C_{j}}\)

    • -
    • self attention + conv(with stride=2)

    • -
    • 각 level에서는 이전 level에서의 feature map을 공유해서 사용하고 low resolution에서 계산이 일어나기때문에 computation resource가 크지 않다.

    • -
    -
  • -
  • multi scale의 loss 계산을 위해 ms-i/o loss(multi scale input, output adversarial loss)를 사용

    -
      -
    • \(V_{MS-I/O}(G, D) = \sum_{i=0}^{L-1}\sum_{j=i+1}^{L}V_{GAN}(G_{i}, D_{ij}) + V_{match}({G_{i}, D_{ij}})\)

    • -
    • \(V_{GAN}\): standard gan loss

    • -
    • \(D_{ij}(x, c) = \psi _{j}(\phi_{i\rightarrow j}(x_{i}), t_{D}) + Conv_{1\times 1}(\phi_{i\rightarrow j}(x_{i}))\):

      -
        -
      • image의 feature map \(\phi(x)\)\(t_{D}\)를 심은 값과 원본 \(\phi(x)\)의 합

      • -
      • 앞부분은 text conditioning model을 학습, 뒷부분은 unconditional image generator를 학습

      • -
      -
    • -
    • \(V_{match}\)(Matching aware loss)

      -
        -
      • 앞의 gan loss는 생성된 이미지가 얼마나 리얼한지, 그리고 condition \(c\)에 얼마나 가까운지에 대한 loss

      • -
      • 하지만 학습 초반에는 condition \(c\)에 상관없이 이미지의 퀄리티로만 분류를 해버림

      • -
      • 그래서 discriminator 학습 과정에서 conditioning을 강제로 따르도록 하기위해 \(c\)를 랜덤으로 샘플링(\(\hat{c}\))해 image의 fake pair로 지정

      • -
      -
    • -
    -
    -img7 -
    -

    Fig. 444 Matching aware loss#

    -
    -
    -
  • -
  • CLIP contrastive loss

    -
      -
    • pretrained CLIP을 사용해 contrastive learning

      -
        -
      • contrastive learning

        -
        -img8 -
        -

        Fig. 445 constrastive learning#

        -
        -
        -
          -
        • 가까운 class는 가깝게(positive), 그 외 class는 멀게(negative)

        • -
        -
      • -
      -
    • -
    • condition \(c_{0}\)에 대해 생성된 이미지의 feature vector는 condition \(c_{0}\)의 feature 벡터와는 가깝게 (positive), 나머지 condition의 feature vector와는 멀게(negative) 학습되어야한다.

      -
      -img9 -
      -

      Fig. 446 CLIP Loss#

      -
      -
      -
    • -
    -
  • -
  • Vision-aided adversarial loss

    -
      -
    • https://arxiv.org/abs/2112.09130

    • -
    • stylegan에서 discriminator는 training data에 overfitting되는 경향이 있음

    • -
    • 이부분을 해결하기위해 생성된 image를 SOTA의 vision 모델을 사용해 뽑아낸 feature map을 Discriminator에 같이 추가해 real / fake를 분류

    • -
    -
  • -
-

GAN based upsampler

-
    -
  • gigagan은 upsampling 모델에 적용이 가능하다

  • -
  • 64x64의 이미지를 3번 downsampling + 6번 upsampling 모델을 통과시켜 1024x1024의 이미지를 생성할 수 있다.

  • -
  • 이때 upsampling 부분에 gigagan의 Generator 부분을 적용

  • -
  • upsampling model에 적용할때에는 LPIPS loss를 추가하고, 이미지 생성과정중에 stylegan과 동일하게 gaussian noise를 추가해 real함을 추가

  • -
-
-
-

Experiments#

-

Training and evaluation details

-
    -
  1. Dataset : LAION2D-en, COYO-700m

  2. -
  3. upsampler(128 → 1024) : Adobe’s internal Stock images

  4. -
  5. Pretrained text encoder : CLIP ViT-L/14

  6. -
  7. CLIP score : OpenCLIP ViT-G/14

  8. -
  9. machine : A100 gpu, etc.

  10. -
  11. 각각의 method가 정말 효과가 있는가?

    -
    -img10 -
    -

    Fig. 447 Table1#

    -
    -
    -
      -
    • 단순 scaling up보다 위 method들을 추가하면 비교적 낮은 FiD와 CLIP score 수치를 보여준다.

    • -
    -
  12. -
  13. Text2Image 모델과 성능 비교

    -
    -img11 -
    -

    Fig. 448 Table2#

    -
    -
    -
      -
    • FiD와 inference time을 보면 어느정도 균형을 이루며 경쟁력을 보이고 있다.

    • -
    -
  14. -
  15. Distilled diffusion과 비교

    -
    -img12 -
    -

    Fig. 449 Table3#

    -
    -
    -
      -
    • diffutsion의 속도 개선을 위해 distilation한 모델

    • -
    • 수치적으로도 우위에 있고, inference time도 여전히 더 빠르다.

    • -
    -
  16. -
  17. Upscaler

    -

    !:::{figure-md} -img13

    -

    Table4

    -
    
    -:::{figure-md} 
    -<img src="../../pics/GIGAGAN/img14.png" alt="img14" class="bg-primary mb-1" width="700px">
    -
    -Super Resolution
    -
    -
    -
  18. -
  19. 그 외

    -
      -
    • stylegan에 연구된 technique(truncation trick, style mixing, latent interpolation 등) 적용 가능

    • -
    -
  20. -
-
    -
  • truncation trick

    -
    -img15 -
    -

    Fig. 450 Truncation Trick#

    -
    -
    -
  • -
  • style mixing

    -
    -img16 -
    -

    Fig. 451 Style Mixing#

    -
    -
    -
  • -
  • latent interpolation

    -
    -img17 -
    -

    Fig. 452 Latent Interpolation#

    -
    -
    -
  • -
-

Limitation

-
    -
  • score 상으로는 어느정도 좋은 성능을 보이지만 실제로 DALLE2 ,Imagen과 같은 SOTA diffusion 모델과 비교하면 develop이 필요함

    -
    -img18 -
    -

    Fig. 453 Failure Cases#

    -
    -
    -
  • -
-
-
-
-

주요 질의응답#

-
-
- - - - -
- - - - - - -
- - - -
- - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Scaling up GANs for Text-to-Image Synthesis — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Scaling up GANs for Text-to-Image Synthesis

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Information

+ +
+
+

Scaling up GANs for Text-to-Image Synthesis#

+
+

Abstract#

+
    +
  • 최근 이미지 생성 task의 모델 성능이 꾸준히 발전중

  • +
  • 기존에는 stylegan과 같은 GAN 모델이 주를 이뤘지만 최근 DALLE, Stable Diffusion등 Diffusion 기반의 모델 베이스로 추세가 급격하게 바뀌어버림

  • +
  • “GAN 모델로 Diffusion의 성능을 잡는것은 정말 무리일까?”

  • +
  • GigaGAN은

    +
      +
    • gan 기반의 모델로 1. 속도점 이점2. 다양한 extra editing이 가능하다. (contribution)

    • +
    +
      +
    1. 속도적 이점

      +
        +
      1. 512px의 이미지를 0.13초만에 생성할 수 있다.

      2. +
      3. 16-megapixel(1600만 픽셀, 4k)의 이미지를 3.66초만에 생성할 수 있다.

      4. +
      +
    2. +
    3. 다양한 활용성

      +
        +
      1. latent space 상 에서의 image editing이 가능하다. (latent interpolation, style mixing …)

      2. +
      +
    4. +
    +
  • +
+
+
+

Introduction#

+
    +
  • 최근 Diffusion 기반의 모델들이 이미지 생성 분야에서 좋은 성능을 보여주고 있다.

  • +
  • Diffusion은

    +
      +
    • 기본적으로 학습과 생성 시 iteration이 들어가는데 iteration은 학습의 안정성을 키워주는 장점이 있지만, computation cost가 매우 증가한다는 단점이 있다.

    • +
    +
  • +
  • 반면에 GAN은

    +
      +
    • 이미지 생성 시 single forward pass만 필요하므로 cost가 크지 않다는 장점이 있지만 single 혹은 multiple object의 생성에는 성능이 뛰어나지만 class가 명확히 정의되지않은 이미지 즉, open world image의 생성에는 어려움이 있다.

    • +
    +
  • +
  • “GAN을 더 develop한다면 Diffusion 모델을 넘어설 수 있을까?”

  • +
  • gigaGAN은?

    +
      +
    1. 속도적 장점

      +
        +
      • 0.13 s/img (512 size), 3.66s / img (4k)

      • +
      +
    2. +
    3. latent space상에서의 editing 가능(style mixing, interpolation, prompt mixing like stylegan2)

    4. +
    +
  • +
+
+
+

Methods#

+
+img0 +
+

Fig. 437 Overall Architecture#

+
+
+

Base Architecture

+
    +
  • Base Model은 stylegan2로 선정

  • +
  • \(G = M\times \tilde{G}\)

  • +
  • \(M\)(mapping network) : gaussian distribution에서의 noise를 좀더 disentangle된 w space로 mapping 시키는 network

    +
      +
    • gigagan에서는 mapping network의 input으로 z와 함께 text condition(c)도 함께 사용

    • +
    • output : \(w\) (vector)

    • +
    +
  • +
  • \(\tilde{G}\) : 피라미드 구조의 convolution block들로 random constant 값으로부터 output image \(X\)를 생성하는 generator.

    +
      +
    • 이때 \(w\) vector는 각 layer마다 입력으로 들어가서 feature map의 분포를 scaling함으로써 style을 반영(modulation, demodulation in stylegan2)

    • +
    +
  • +
+

Sample-adaptive kernel selection

+
+img1 +
+

Fig. 438 Sample Adaptive Kernel Selection#

+
+
+
    +
  • 도입 배경

    +
      +
    • 단순히 convolution layer의 kernel size만 scaling up을 하면 학습이 안되는 현상

    • +
    • GAN 기반 모델이 (1)text-condition의 (2)오픈 이미지 생성에 한계를 보이는 이유는 convolution network의 구조 때문이다.

      +
        +
      • convolution 연산은 구조상 같은 레이어상에 있는 하나의 filter가 text condition 주입부터 이미지의 생성까지 모든 부분에 참여하는데 이 부분이 모델의 표현력을 떨어트릴 수 있다.

      • +
      +
    • +
    +
  • +
  • kernel selection method 적용

  • +
  • 레이어마다 \(\{k_{i}\in R^{C_{in}\times C_{out}\times K\times K}\}\)차원의 N개의 kernel set을 두고 style vector w의 affine layer를 거친 weight를 각 kernel값에 weighted summation한 값을 최종 filter로 사용

    +
    +img2 +
    +

    Fig. 439 Equation of kernel selection method affine layer#

    +
    +
    +
  • +
  • 이 때 kernel weight 계산에 softmax를 사용하는데 얘는 differentiable하므로 gradient update 가능

  • +
  • 또, 실제로 N개의 kernel을 모두 filter로 사용할 때보다 computation cost가 굉장히 절약된다는 장점

  • +
+

Interleaving attention with convolution

+
    +
  • 도입 배경

    +
      +
    • convolution filter는 receptive field 내부의 local feature 캡처에는 탁월하지만 field 외부의 부분은 학습할 수 없다.

      +
      +img3 +
      +

      Fig. 440 Receptive Field in Convolution Networks#

      +
      +
      +
    • +
    • 이러한 한계점을 극복하기위해 attention layer(\(g_{attn}\))를 추가

    • +
    • 단순히 stylegan2에 attention layer를 추가하면 학습에 이상이 생김

      +
        +
      • 원인은 attention layer에서 사용하는 dot product가 Lipschitz함수가 아니기 때문

        +
          +
        • lipschitz 함수란

          +
            +
          • lipschitz 함수란, 두 점 사이의 거리를 일정 비 이상으로 증가시키지 않는 함수

            +
            +img4 +
            +

            Fig. 441 lipschitz Function#

            +
            +
            +
          • +
          +
        • +
        +
      • +
      • Lipschitz 함수를 만족하지 못함으로써 discriminator의 학습이 unstable하게 되고 때문에 학습에 실패한다.

      • +
      +
    • +
    • Lipschitz 연속성을 만족시키기 위해 attention의 dot product를 L2-distance로 대체

    • +
    +
  • +
+

Advanced setting

+
    +
  • 모델의 성능 향상을 위해 stylegan2과 같은 hyper parameter를 사용하고, L2 distance logit의 초기값을 unit normal distribution, scale down, …

  • +
  • \(\tilde{G}\)의 각 convolution block 마다 attentnion layer(self + cross)를 적용

    +
      +
    • self attention: 이미지 자신의 global feature 학습용

    • +
    • cross attention: 이미지에 text condition 주입용

    • +
    +
  • +
+

Generator design

+
+img5 +
+

Fig. 442 GIGAGAN Architecture#

+
+
+
    +
  • text embedding

    +
      +
    • pretrained model : clip(frozen; \(R^{C\times 768}\), c is # of tokens)

    • +
    • 후에 text encoding에 추가적인 유연성을 위해 mapping network(\(T\))를 추가

    • +
    • text mapping network(\(T\))의 output은 input size와 동일하게 \(R^{C\times 768}\)

    • +
    • 이때 output \(t\)를 두 파트로 나눠 사용하는데

      +
        +
      • \(R^{C-1\times 768}\) : word i index의 local feature를 catch

      • +
      • \(R^{768}\) : word를 global하게 embedding하는 vector

      • +
      +
    • +
    • \(t_{global}\)은 latent mapping network(\(M\))의 input으로 사용

    • +
    • \(t_{local}\)은 Generator의 input으로 각 block에 cross attention에 적용

    • +
    +
  • +
  • Generator의 layer는 총 5개의 피라미드 구조

  • +
  • \(\{x_{i}\}_{i=0}^{L-1} = \{x_{0},x_{1}, ..., x_{4}\}\) , \(\{S_{i}\}_{i=0}^{L-1} = \{64, 32, 16, 8, 4\}\)

  • +
  • \(x_{0} = X\)(output image)

  • +
+

Discriminator Design

+
+img6 +
+

Fig. 443 Discriminator of GIGAGAN#

+
+
+
    +
  • 2 branch의 구조

    +
      +
    1. text conditioning을 학습

    2. +
    3. image generating을 학습

    4. +
    +
  • +
  • \(t_{D}\): text c로부터 pretrained text encoder(CLIP)를 통과시켜 추출한 embedding 값

  • +
  • stylegan에서는 low res의 이미지들은 loss에 반영하지 않았지만, gigagan에서는 이미지의 low feature 표현의 개선을 위해 모든 scale의 이미지를 모두 loss에 반영

  • +
  • 이때 feature extractor \(\Phi\)

    +
      +
    • \(\Phi_{i\rightarrow j}:R^{X_{i}\times X_{i}\times3}\rightarrow R^{X_{j}^{D}\times X_{j}^{D}\times C_{j}}\)

    • +
    • self attention + conv(with stride=2)

    • +
    • 각 level에서는 이전 level에서의 feature map을 공유해서 사용하고 low resolution에서 계산이 일어나기때문에 computation resource가 크지 않다.

    • +
    +
  • +
  • multi scale의 loss 계산을 위해 ms-i/o loss(multi scale input, output adversarial loss)를 사용

    +
      +
    • \(V_{MS-I/O}(G, D) = \sum_{i=0}^{L-1}\sum_{j=i+1}^{L}V_{GAN}(G_{i}, D_{ij}) + V_{match}({G_{i}, D_{ij}})\)

    • +
    • \(V_{GAN}\): standard gan loss

    • +
    • \(D_{ij}(x, c) = \psi _{j}(\phi_{i\rightarrow j}(x_{i}), t_{D}) + Conv_{1\times 1}(\phi_{i\rightarrow j}(x_{i}))\):

      +
        +
      • image의 feature map \(\phi(x)\)\(t_{D}\)를 심은 값과 원본 \(\phi(x)\)의 합

      • +
      • 앞부분은 text conditioning model을 학습, 뒷부분은 unconditional image generator를 학습

      • +
      +
    • +
    • \(V_{match}\)(Matching aware loss)

      +
        +
      • 앞의 gan loss는 생성된 이미지가 얼마나 리얼한지, 그리고 condition \(c\)에 얼마나 가까운지에 대한 loss

      • +
      • 하지만 학습 초반에는 condition \(c\)에 상관없이 이미지의 퀄리티로만 분류를 해버림

      • +
      • 그래서 discriminator 학습 과정에서 conditioning을 강제로 따르도록 하기위해 \(c\)를 랜덤으로 샘플링(\(\hat{c}\))해 image의 fake pair로 지정

      • +
      +
    • +
    +
    +img7 +
    +

    Fig. 444 Matching aware loss#

    +
    +
    +
  • +
  • CLIP contrastive loss

    +
      +
    • pretrained CLIP을 사용해 contrastive learning

      +
        +
      • contrastive learning

        +
        +img8 +
        +

        Fig. 445 constrastive learning#

        +
        +
        +
          +
        • 가까운 class는 가깝게(positive), 그 외 class는 멀게(negative)

        • +
        +
      • +
      +
    • +
    • condition \(c_{0}\)에 대해 생성된 이미지의 feature vector는 condition \(c_{0}\)의 feature 벡터와는 가깝게 (positive), 나머지 condition의 feature vector와는 멀게(negative) 학습되어야한다.

      +
      +img9 +
      +

      Fig. 446 CLIP Loss#

      +
      +
      +
    • +
    +
  • +
  • Vision-aided adversarial loss

    +
      +
    • https://arxiv.org/abs/2112.09130

    • +
    • stylegan에서 discriminator는 training data에 overfitting되는 경향이 있음

    • +
    • 이부분을 해결하기위해 생성된 image를 SOTA의 vision 모델을 사용해 뽑아낸 feature map을 Discriminator에 같이 추가해 real / fake를 분류

    • +
    +
  • +
+

GAN based upsampler

+
    +
  • gigagan은 upsampling 모델에 적용이 가능하다

  • +
  • 64x64의 이미지를 3번 downsampling + 6번 upsampling 모델을 통과시켜 1024x1024의 이미지를 생성할 수 있다.

  • +
  • 이때 upsampling 부분에 gigagan의 Generator 부분을 적용

  • +
  • upsampling model에 적용할때에는 LPIPS loss를 추가하고, 이미지 생성과정중에 stylegan과 동일하게 gaussian noise를 추가해 real함을 추가

  • +
+
+
+

Experiments#

+

Training and evaluation details

+
    +
  1. Dataset : LAION2D-en, COYO-700m

  2. +
  3. upsampler(128 → 1024) : Adobe’s internal Stock images

  4. +
  5. Pretrained text encoder : CLIP ViT-L/14

  6. +
  7. CLIP score : OpenCLIP ViT-G/14

  8. +
  9. machine : A100 gpu, etc.

  10. +
  11. 각각의 method가 정말 효과가 있는가?

    +
    +img10 +
    +

    Fig. 447 Table1#

    +
    +
    +
      +
    • 단순 scaling up보다 위 method들을 추가하면 비교적 낮은 FiD와 CLIP score 수치를 보여준다.

    • +
    +
  12. +
  13. Text2Image 모델과 성능 비교

    +
    +img11 +
    +

    Fig. 448 Table2#

    +
    +
    +
      +
    • FiD와 inference time을 보면 어느정도 균형을 이루며 경쟁력을 보이고 있다.

    • +
    +
  14. +
  15. Distilled diffusion과 비교

    +
    +img12 +
    +

    Fig. 449 Table3#

    +
    +
    +
      +
    • diffutsion의 속도 개선을 위해 distilation한 모델

    • +
    • 수치적으로도 우위에 있고, inference time도 여전히 더 빠르다.

    • +
    +
  16. +
  17. Upscaler

    +

    !:::{figure-md} +img13

    +

    Table4

    +
    
    +:::{figure-md} 
    +<img src="../../pics/GIGAGAN/img14.png" alt="img14" class="bg-primary mb-1" width="700px">
    +
    +Super Resolution
    +
    +
    +
  18. +
  19. 그 외

    +
      +
    • stylegan에 연구된 technique(truncation trick, style mixing, latent interpolation 등) 적용 가능

    • +
    +
  20. +
+
    +
  • truncation trick

    +
    +img15 +
    +

    Fig. 450 Truncation Trick#

    +
    +
    +
  • +
  • style mixing

    +
    +img16 +
    +

    Fig. 451 Style Mixing#

    +
    +
    +
  • +
  • latent interpolation

    +
    +img17 +
    +

    Fig. 452 Latent Interpolation#

    +
    +
    +
  • +
+

Limitation

+
    +
  • score 상으로는 어느정도 좋은 성능을 보이지만 실제로 DALLE2 ,Imagen과 같은 SOTA diffusion 모델과 비교하면 develop이 필요함

    +
    +img18 +
    +

    Fig. 453 Failure Cases#

    +
    +
    +
  • +
+
+
+
+

주요 질의응답#

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/GLIDE.html b/docs/review/GLIDE.html old mode 100644 new mode 100755 index 9bf99f51..5ca9cf98 --- a/docs/review/GLIDE.html +++ b/docs/review/GLIDE.html @@ -1,786 +1,805 @@ - - - - - - - - - - - - GLIDE — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models (ICML 2022)

  • -
  • Reference

    - -
  • -
  • Author: Sehwan Park

  • -
  • Last updated on Oct. 20, 2023

  • -
-
-
-

GLIDE#

-
-

Abstract#

-
    -
  • GLIDE 기법이 DALL-E보다 human-evaluator 평가가 더 우수하다고 한다.

  • -
  • classifier-free Guidance vs CLIP-Guidance(classifier-free Guidance를 결국 사용.)

  • -
  • powerful한 text-driven image editing이 가능.

  • -
-
-
-

1. Introduction#

-

Natural language로 부터 realistic한 image를 만드는 많은 방법들이 생겨나고 있다. 하지만 text prompts에 정확히 대응하는 photorealistic한 image를 생성하기에는 어려움을 겪고 있다.

-

Diffusion model이 DDPM, DDIM 논문을 통해 생성모델의 중심으로 떠오르며 unconditional한 image에 대해서는 SOTA를 찍었다고 한다. 자연스럽게 class-conditional한 image 생성에 대해서도 연구가 이루어졌는데, Diffusion models beat gans on image synthesis라는 논문에서 저자들은 noise한 image에 대해 class를 예측하는 classifier를 추가하여 sampling과정에서 label에 해당하는 이미지를 생성하도록 gradient를 control시키는 classifier guidance 방법을 소개한다. 이후, classifier없이 guidance를 줄 수 있는 classifier-free guidance 방법이 소개되었다.

-

이 논문에서는 classifier-free guidance 방법과 기존 diffusion model을 활용하여 text-conditional image synthesis를 잘 수행했다고 보여준다. 추가적으로 pretrained CLIP 모델을 활용하여 CLIP guidance라는 방법을 제시하며 classifier-free guidance와 비교를 한다. 결과적으로는 classifier-free guidance가 더 좋은 성능을 보인다고 한다.

-

text prompt를 zero-shot으로 생성하는데에 있어 좋은 성능을 보였으나, 복잡한 prompt에 대한 photorealistc한 image를 생성하는데는 어려움을 겪을 수 있다고 한다. 그래서 이 논문에서는 text-conditional image generation뿐만 아니라 기존 image를 text-prompt를 통해 편집할 수 있는 image impainting기능도 가능하도록 했다고 한다.

-
-GLIDE_1 -
-

Fig. 297 GLIDE text to image#

-
-
-
-GLIDE_1 -
-

Fig. 298 GLIDE image impainting#

-
-
-
-
-

2. Background#

-
-

2.1 Diffusion Models#

-
    -
  • DDPM

  • -
-

DDPM에서는 임의의 time step t로 부터 noise가 껴있는 image \(x_t\)\(\epsilon_t\)가 얼만큼인지 예측한다. 예측한 \(\epsilon_t\)를 이용하여 noise가 일부 제거된 이전 step의 mean(\(\mu_{\theta}(x_t)\))을 구할 수 있고 variance(\(\sum_{\theta}(x_t)\))는 constant한 값으로 고정시킨다. DDPM에서 제시한 forward process와 reverse process는 다음과 같다.

-
-\[ -q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_{t}}x_{t-1}, (1-\alpha_t)\mathcal{I}) -\]
-
-\[ -p_{\theta}(x_{t-1}|x_t) := \mathcal{N}(\mu_{\theta}(x_t), \sum_{\theta}(x_t)) -\]
-
    -
  • Score-based generative modeling through stochastic differential equations

  • -
-

해당 논문에서는 결국 score를 구하는 것과 epsilon을 구하는 것이 결국 같은 방향성을 띤다라고 주장한다.

-
-GLIDE_1 -
-

Fig. 299 Proof of proportional relationship to finding score and epsilon#

-
-
-
    -
  • Improved-DDPM

  • -
-

\(\sum_{\theta}\)를 constant값으로 고정시킨 이전 DDPM과 달리 해당 논문에서는 \(\sum_{\theta}\) learnable parameter로 설정하여 더 적은 diffusion step만으로 더 좋은 quality의 sample을 만들어낼 수 있다고 제시한다.

-
-
-

2.2 Guided Diffusion#

-

Diffusion model beat GANS on Image Synthesis(Dharwial et al.)에서는 diffusion model을 통해 class-conditional한 image생성을 제시한다. 이 논문에서의 가장 핵심적인 기술이 classifier-guidance이다. noise한 image로부터 epsilon을 예측하는 model은 그대로 유지하되, 해당 noise image가 어떤 class에 속하는지 분류하는 별도의 classifier를 설정한다. 이 classifier의 score를 통해 class-conditional한 전체 과정의 score에게 guide를 주는 방법을 제시한다.

-
-GLIDE_1 -
-

Fig. 300 Classifier guidance#

-
-
-
-GLIDE_1 -
-

Fig. 301 Classifier guidance#

-
-
-
-
-

2.3 Classifier-free guidance#

-

classifier를 통해 class-conditional한 image생성을 하는 방법이 위에 소개되었는데, 이 방법은 noise한 image에 대해서 classifiy를 해야하므로 pretrained model을 사용할 수 없고 모델 규모가 너무 heavy해지는 등 몇몇 문제점을 가지고 있었다. 이 방법에 대한 개선점을 Classifier-Free Diffusion Guidance(Ho et al.)에서 Classifer-free guidance라는 기법으로 제시한다. 위의 score 식에서 약간의 변형을 통해 classifier 없이 단일 model만으로 guidance를 줄 수 있는 방법을 제시한다.

-
-GLIDE_1 -
-

Fig. 302 Classifier-free guidance#

-
-
-
-
-

2.4 CLIP guidance#

-

CLIP은 텍스트와 이미지 사이의 joint representation을 학습할 수 있는 모델이다. Image encoder f(x)와 Text encoder g(c)로 이루어져 있다. (x,c) 즉 이미지와 이미지 캡션 쌍으로 이루어진 대규모 데이터를 이용해 contrastive learning을 진행시킨 모델이다. 같은 의미를 가진 positive pair에 대해서는 f(x) · g(c)(유사도)가 커지도록 negative pair에 대해서는 f(x) · g(c)가 작아지도록 하는 것이다. CLIP guidance에서는 classifier guidance에서 classifier대신에 pretrained CLIP모델을 사용한다. 따라서 guidance를 주는 방식도 classifier대신 CLIP모델을 통해 구한 noise한 image x와 주어진 text간의 유사도를 이용한다.

-
-GLIDE_1 -
-

Fig. 303 CLIP#

-
-
-
-GLIDE_1 -
-

Fig. 304 CLIP guidance#

-
-
-
-
-
-

3. Training#

-

실험에서 3.5 billion parameter의 text-conditional diffusion model을 64x64 resolution을 위해 사용했고 또다른 1.5 billion parameter의 text-conditional upsampling diffusion model을 256x256으로 resolution을 증가시키는데 사용하였다고 한다. 또한, CLIP guidance를 위해 noised 64x64 ViT-L CLIP model을 사용했다고 한다.

-
-

3.1 Text-Conditional Diffusion Models#

-

Improved DDPM의 ADM model을 base로 text-conditioning을 추가하여 학습을 진행하였다. 주어진 noised image \(x_t\)로부터 \(x_{t-1}\)을 예측하는 \(p_{\theta}(x_{t-1}|x_t,c)\)를 수행해야한다. text를 condition으로 주기 위해서 우선 주어진 text를 K개의 token으로 encoding한 후, Transformer model에 input값으로 넣어준다. Transformer output의 마지막 embedding token과 positional encoding을 통해 나온 time step embedding token을 연산하고자 하는 크기에 맞게 linear projection하여 더한 후, residual block을 거친 image와 AdaIN기법을 통해 residual block의 output을 도출한다. Transformer output의 마지막 layer는 연산하고자 하는 크기에 맞게 linear projection하여 residual block뒤에 붙는 attention block에 이용한다.

-

학습 데이터셋은 DALL-E와 같은 데이터셋을 사용하였고 model architecture로는 기존 ADM model보다 더 scale up된 model과 1.2B paremeters를 갖는 Transformer를 사용했다고 한다. 게다가 64x64 image를 256x256 image로 upsampling하는 Upsampler model도 학습시켰다고 한다. upsampler model은 Improved DDPM에서의 ImageNet Upsampler와 거의 비슷하다고 한다.

-
-
-

3.2. Fine-tuning for classifier-free guidance#

-

처음 training을 진행했을때는, text를 condition으로 준 conditional image generation에 맞춰 training을 진행했다고 한다. 이 후, unconditional image generation의 성능을 위해 데이터셋의 약 20%의 text condition에 empty sequence를 주고 training을 진행했다고 한다.

-
-
-

3.3. Image Inpainting#

-

이전 연구에서는, impainting을 위해 diffusion model로 학습시키는 과정을 거치지 않았다. diffusion model로 sampling을 한 후, 알려진 영역에 대해서는 \(q(x_t|x_0)\)로 대체하는 방식을 사용했기에 model이 sampling을 하는 과정에서 전체 context를 참조할 수 없다는 단점이 있었다.

-

이 논문에서는 fine-tuning과정에서 training example의 임의의 부분을 지운다음, 남은 부분은 모델에 추가적인 조건 정보로서 마스크 채널과 함께 입력되도록 설계하였다.

-
-
-

3.4. Noised CLIP models#

-

classifier guidance에 더 적합하게 훈련시키기 위해 clip guidance를 사용해서 classifier-free guidance와 비교했음을 위에서 언급했다. clip guidance를 사용하기 위해 저자들은 noise image에 대해 학습시킨 Noised CLIP models를 사용했음을 밝힌다. 위에서 언급했듯이 결과는 classifier-free guidance가 더 좋았다고 한다.

-
-GLIDE_1 -
-

Fig. 305 comparison between CLIP guidance and classifier-free guidance#

-
-
-
-
-
-

4. Results#

-
-GLIDE_1 -
-

Fig. 306 Quantitive Results#

-
-
-

논문에서는 classifier-free guidance와 CLIP guidance에 대해 Precision과 Recall, FID와 IS, CLIP score와 FID 간의 명확한 trade-off 를 관찰하고 있다고 언급한다.

-

위의 (a)와 (b)에 대해서는 classifier-free guidance가 거의 최적으로 수행되었으며, classifier-free guidance가 훨씬 강력한 방법임을 보여주고 있다. 반면, (c)에서는 CLIP guidance가 CLIP 점수를 classifier-free guidance에 비해 상당히 향상시킬 수 있는 것으로 보인다. 저자들은 CLIP guidance가 주로 CLIP 모델의 평가에 따라 이미지를 생성하는 데 중점을 둘 수 있지만, 특정 prompt 또는 caption과 일치시키는 데 뛰어나지 않을 수 있다는 가설을 제시한다. 이 가설을 확인하기 위해 저자들은 인간 평가자를 활용한 실험을 진행하였고 인간들이 CLIP 점수와 다른 의견을 가지며, classifier-free guida nce가 해당 prompt와 더 일치하는 더 높은 품질의 샘플을 생성한다고 판단했다.

-
-GLIDE_1 -
-

Fig. 307 Zero-shot FID results#

-
-
-

Table1은 Unguided, CLIP guidance, Classifier-free guidance 기법을 각각 적용한 256x256 resolution image에 대해 human evaluation을 진행한 결과이다. Classifier-free guidance를 적용한 결과가 photorealism, caption 항목에 대해 압도적인 결과를 보임을 알 수 있다.

-

Table2는 GLIDE와 다른 text-conditional image generation model들을 비교한 표이다. MS-COCO dataset에 대해 생성된 image의 FID score를 구하였다. GLIDE model이 MS-COCO에 대해 학습한 경험이 없음에도 불구하고 Zero-shot FID 부분을 보면 상당히 좋은 result를 보임을 알 수 있다.

-
-GLIDE_1 -
-

Fig. 308 final results#

-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + GLIDE — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models (ICML 2022)

  • +
  • Reference

    + +
  • +
  • Author: Sehwan Park

  • +
  • Last updated on Oct. 20, 2023

  • +
+
+
+

GLIDE#

+
+

Abstract#

+
    +
  • GLIDE 기법이 DALL-E보다 human-evaluator 평가가 더 우수하다고 한다.

  • +
  • classifier-free Guidance vs CLIP-Guidance(classifier-free Guidance를 결국 사용.)

  • +
  • powerful한 text-driven image editing이 가능.

  • +
+
+
+

1. Introduction#

+

Natural language로 부터 realistic한 image를 만드는 많은 방법들이 생겨나고 있다. 하지만 text prompts에 정확히 대응하는 photorealistic한 image를 생성하기에는 어려움을 겪고 있다.

+

Diffusion model이 DDPM, DDIM 논문을 통해 생성모델의 중심으로 떠오르며 unconditional한 image에 대해서는 SOTA를 찍었다고 한다. 자연스럽게 class-conditional한 image 생성에 대해서도 연구가 이루어졌는데, Diffusion models beat gans on image synthesis라는 논문에서 저자들은 noise한 image에 대해 class를 예측하는 classifier를 추가하여 sampling과정에서 label에 해당하는 이미지를 생성하도록 gradient를 control시키는 classifier guidance 방법을 소개한다. 이후, classifier없이 guidance를 줄 수 있는 classifier-free guidance 방법이 소개되었다.

+

이 논문에서는 classifier-free guidance 방법과 기존 diffusion model을 활용하여 text-conditional image synthesis를 잘 수행했다고 보여준다. 추가적으로 pretrained CLIP 모델을 활용하여 CLIP guidance라는 방법을 제시하며 classifier-free guidance와 비교를 한다. 결과적으로는 classifier-free guidance가 더 좋은 성능을 보인다고 한다.

+

text prompt를 zero-shot으로 생성하는데에 있어 좋은 성능을 보였으나, 복잡한 prompt에 대한 photorealistc한 image를 생성하는데는 어려움을 겪을 수 있다고 한다. 그래서 이 논문에서는 text-conditional image generation뿐만 아니라 기존 image를 text-prompt를 통해 편집할 수 있는 image impainting기능도 가능하도록 했다고 한다.

+
+GLIDE_1 +
+

Fig. 297 GLIDE text to image#

+
+
+
+GLIDE_1 +
+

Fig. 298 GLIDE image impainting#

+
+
+
+
+

2. Background#

+
+

2.1 Diffusion Models#

+
    +
  • DDPM

  • +
+

DDPM에서는 임의의 time step t로 부터 noise가 껴있는 image \(x_t\)\(\epsilon_t\)가 얼만큼인지 예측한다. 예측한 \(\epsilon_t\)를 이용하여 noise가 일부 제거된 이전 step의 mean(\(\mu_{\theta}(x_t)\))을 구할 수 있고 variance(\(\sum_{\theta}(x_t)\))는 constant한 값으로 고정시킨다. DDPM에서 제시한 forward process와 reverse process는 다음과 같다.

+
+\[ +q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_{t}}x_{t-1}, (1-\alpha_t)\mathcal{I}) +\]
+
+\[ +p_{\theta}(x_{t-1}|x_t) := \mathcal{N}(\mu_{\theta}(x_t), \sum_{\theta}(x_t)) +\]
+
    +
  • Score-based generative modeling through stochastic differential equations

  • +
+

해당 논문에서는 결국 score를 구하는 것과 epsilon을 구하는 것이 결국 같은 방향성을 띤다라고 주장한다.

+
+GLIDE_1 +
+

Fig. 299 Proof of proportional relationship to finding score and epsilon#

+
+
+
    +
  • Improved-DDPM

  • +
+

\(\sum_{\theta}\)를 constant값으로 고정시킨 이전 DDPM과 달리 해당 논문에서는 \(\sum_{\theta}\) learnable parameter로 설정하여 더 적은 diffusion step만으로 더 좋은 quality의 sample을 만들어낼 수 있다고 제시한다.

+
+
+

2.2 Guided Diffusion#

+

Diffusion model beat GANS on Image Synthesis(Dharwial et al.)에서는 diffusion model을 통해 class-conditional한 image생성을 제시한다. 이 논문에서의 가장 핵심적인 기술이 classifier-guidance이다. noise한 image로부터 epsilon을 예측하는 model은 그대로 유지하되, 해당 noise image가 어떤 class에 속하는지 분류하는 별도의 classifier를 설정한다. 이 classifier의 score를 통해 class-conditional한 전체 과정의 score에게 guide를 주는 방법을 제시한다.

+
+GLIDE_1 +
+

Fig. 300 Classifier guidance#

+
+
+
+GLIDE_1 +
+

Fig. 301 Classifier guidance#

+
+
+
+
+

2.3 Classifier-free guidance#

+

classifier를 통해 class-conditional한 image생성을 하는 방법이 위에 소개되었는데, 이 방법은 noise한 image에 대해서 classifiy를 해야하므로 pretrained model을 사용할 수 없고 모델 규모가 너무 heavy해지는 등 몇몇 문제점을 가지고 있었다. 이 방법에 대한 개선점을 Classifier-Free Diffusion Guidance(Ho et al.)에서 Classifer-free guidance라는 기법으로 제시한다. 위의 score 식에서 약간의 변형을 통해 classifier 없이 단일 model만으로 guidance를 줄 수 있는 방법을 제시한다.

+
+GLIDE_1 +
+

Fig. 302 Classifier-free guidance#

+
+
+
+
+

2.4 CLIP guidance#

+

CLIP은 텍스트와 이미지 사이의 joint representation을 학습할 수 있는 모델이다. Image encoder f(x)와 Text encoder g(c)로 이루어져 있다. (x,c) 즉 이미지와 이미지 캡션 쌍으로 이루어진 대규모 데이터를 이용해 contrastive learning을 진행시킨 모델이다. 같은 의미를 가진 positive pair에 대해서는 f(x) · g(c)(유사도)가 커지도록 negative pair에 대해서는 f(x) · g(c)가 작아지도록 하는 것이다. CLIP guidance에서는 classifier guidance에서 classifier대신에 pretrained CLIP모델을 사용한다. 따라서 guidance를 주는 방식도 classifier대신 CLIP모델을 통해 구한 noise한 image x와 주어진 text간의 유사도를 이용한다.

+
+GLIDE_1 +
+

Fig. 303 CLIP#

+
+
+
+GLIDE_1 +
+

Fig. 304 CLIP guidance#

+
+
+
+
+
+

3. Training#

+

실험에서 3.5 billion parameter의 text-conditional diffusion model을 64x64 resolution을 위해 사용했고 또다른 1.5 billion parameter의 text-conditional upsampling diffusion model을 256x256으로 resolution을 증가시키는데 사용하였다고 한다. 또한, CLIP guidance를 위해 noised 64x64 ViT-L CLIP model을 사용했다고 한다.

+
+

3.1 Text-Conditional Diffusion Models#

+

Improved DDPM의 ADM model을 base로 text-conditioning을 추가하여 학습을 진행하였다. 주어진 noised image \(x_t\)로부터 \(x_{t-1}\)을 예측하는 \(p_{\theta}(x_{t-1}|x_t,c)\)를 수행해야한다. text를 condition으로 주기 위해서 우선 주어진 text를 K개의 token으로 encoding한 후, Transformer model에 input값으로 넣어준다. Transformer output의 마지막 embedding token과 positional encoding을 통해 나온 time step embedding token을 연산하고자 하는 크기에 맞게 linear projection하여 더한 후, residual block을 거친 image와 AdaIN기법을 통해 residual block의 output을 도출한다. Transformer output의 마지막 layer는 연산하고자 하는 크기에 맞게 linear projection하여 residual block뒤에 붙는 attention block에 이용한다.

+

학습 데이터셋은 DALL-E와 같은 데이터셋을 사용하였고 model architecture로는 기존 ADM model보다 더 scale up된 model과 1.2B paremeters를 갖는 Transformer를 사용했다고 한다. 게다가 64x64 image를 256x256 image로 upsampling하는 Upsampler model도 학습시켰다고 한다. upsampler model은 Improved DDPM에서의 ImageNet Upsampler와 거의 비슷하다고 한다.

+
+
+

3.2. Fine-tuning for classifier-free guidance#

+

처음 training을 진행했을때는, text를 condition으로 준 conditional image generation에 맞춰 training을 진행했다고 한다. 이 후, unconditional image generation의 성능을 위해 데이터셋의 약 20%의 text condition에 empty sequence를 주고 training을 진행했다고 한다.

+
+
+

3.3. Image Inpainting#

+

이전 연구에서는, impainting을 위해 diffusion model로 학습시키는 과정을 거치지 않았다. diffusion model로 sampling을 한 후, 알려진 영역에 대해서는 \(q(x_t|x_0)\)로 대체하는 방식을 사용했기에 model이 sampling을 하는 과정에서 전체 context를 참조할 수 없다는 단점이 있었다.

+

이 논문에서는 fine-tuning과정에서 training example의 임의의 부분을 지운다음, 남은 부분은 모델에 추가적인 조건 정보로서 마스크 채널과 함께 입력되도록 설계하였다.

+
+
+

3.4. Noised CLIP models#

+

classifier guidance에 더 적합하게 훈련시키기 위해 clip guidance를 사용해서 classifier-free guidance와 비교했음을 위에서 언급했다. clip guidance를 사용하기 위해 저자들은 noise image에 대해 학습시킨 Noised CLIP models를 사용했음을 밝힌다. 위에서 언급했듯이 결과는 classifier-free guidance가 더 좋았다고 한다.

+
+GLIDE_1 +
+

Fig. 305 comparison between CLIP guidance and classifier-free guidance#

+
+
+
+
+
+

4. Results#

+
+GLIDE_1 +
+

Fig. 306 Quantitive Results#

+
+
+

논문에서는 classifier-free guidance와 CLIP guidance에 대해 Precision과 Recall, FID와 IS, CLIP score와 FID 간의 명확한 trade-off 를 관찰하고 있다고 언급한다.

+

위의 (a)와 (b)에 대해서는 classifier-free guidance가 거의 최적으로 수행되었으며, classifier-free guidance가 훨씬 강력한 방법임을 보여주고 있다. 반면, (c)에서는 CLIP guidance가 CLIP 점수를 classifier-free guidance에 비해 상당히 향상시킬 수 있는 것으로 보인다. 저자들은 CLIP guidance가 주로 CLIP 모델의 평가에 따라 이미지를 생성하는 데 중점을 둘 수 있지만, 특정 prompt 또는 caption과 일치시키는 데 뛰어나지 않을 수 있다는 가설을 제시한다. 이 가설을 확인하기 위해 저자들은 인간 평가자를 활용한 실험을 진행하였고 인간들이 CLIP 점수와 다른 의견을 가지며, classifier-free guida nce가 해당 prompt와 더 일치하는 더 높은 품질의 샘플을 생성한다고 판단했다.

+
+GLIDE_1 +
+

Fig. 307 Zero-shot FID results#

+
+
+

Table1은 Unguided, CLIP guidance, Classifier-free guidance 기법을 각각 적용한 256x256 resolution image에 대해 human evaluation을 진행한 결과이다. Classifier-free guidance를 적용한 결과가 photorealism, caption 항목에 대해 압도적인 결과를 보임을 알 수 있다.

+

Table2는 GLIDE와 다른 text-conditional image generation model들을 비교한 표이다. MS-COCO dataset에 대해 생성된 image의 FID score를 구하였다. GLIDE model이 MS-COCO에 대해 학습한 경험이 없음에도 불구하고 Zero-shot FID 부분을 보면 상당히 좋은 result를 보임을 알 수 있다.

+
+GLIDE_1 +
+

Fig. 308 final results#

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/HyperDreamBooth.html b/docs/review/HyperDreamBooth.html old mode 100644 new mode 100755 index 55493dd5..c5d39a63 --- a/docs/review/HyperDreamBooth.html +++ b/docs/review/HyperDreamBooth.html @@ -1,773 +1,792 @@ - - - - - - - - - - - - HyperDreamBooth — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: HyperDreamBooth: HyperNetworks for Fast Personalization of Text-to-Image Models

  • -
  • Reference

    - -
  • -
  • Author: Hyoungseo Cho

  • -
  • Last updated on Oct. 10, 2023

  • -
-
-
-

HyperDreamBooth#

-
-

Introduction#

-

Personalization 는 Generative AI 분야에서 떠오르고 있는 주제입니다. 이는 high-fidelity와 identity를 유지한 상태로 다양한 맥락과 스타일을 생성할 수 있도록 합니다. 본 논문은 Dreambooth 를 기반으로 진행되었기 때문에 Dreambooth 논문을 먼저 읽어 보시기를 추천드립니다.

-
-hyperdreambooth_01 -
-

Fig. 268 HyperDreamBooth#

-
-
-
-
-

Contribution#

-

본 논문의 Contribution은 크게 3가지로 볼 수 있습니다. Lighweight DreamBooth (LiDB), New HyperNetwork architecture 그리고 rank-relaxed finetuning 입니다. 위 3가지 방법을 활용하여 기존 DreamBooth의 핵심 능력을 유지하면서 크기를 줄이고 속도를 높일 수 있었습니다.

-
- -
-

Prelimiaries#

-

Latent Diffusion Models (LDM)
-본 논문에서는 Stable Diffusion 모델을 활용하여 HyperDreamBooth를 구현했지만, 이 부분은 다른 텍스트-이미지 모델 (Imagen, DALL-E2 등) 도 적용이 가능합니다.

-

DreamBooth
-이전에 나온 DreamBooth는 특정 주제의 이미지를 생성하기 위해 T2I denoising 네트워크를 finetuning하는 전략을 활용했습니다. 이 방법은 HyperDreamBooth의 영감원 중 하나로 활용되었습니다.

-

Low Rank Adaptation (LoRA)
-LoRA는 모델의 가중치를 낮은 랭크의 행렬로 근사화하여 모델의 크기와 복잡성을 줄이는 방법입니다. 본 논문에서는 이 LoRA 기술을 활용하여 더 빠르고 효율적인 personalization이 가능하도록 합니다.

-
-
-

Method#

-

위에서 살펴 본 Contribution의 내용을 자세히 살펴보도록 하겠습니다.

-
-

Lightweight DreamBooth (LiDB)#

-

HyperdreamBooth 의 핵심 기술 중 하나인 Lightweight DreamBooth, 줄여서 LiDB에 대해 설명드리겠습니다. LiDB는 rank-1 LoRA residuals의 가중치 공간을 더 세분화하는 것이 핵심 아이디어입니다. 분해 과정에서 rank-1 LoRA weight-space 내에서 random orthogonal basis를 활용하여 decompose 합니다.

-
-hyperdreambooth_01 -
-

Fig. 270 Lightweight DreamBooth#

-
-
-

이 접근 방식은 LoRA의 A와 B 행렬을 각각 두 개의 행렬로 분해하는 것으로도 이해할 수 있습니다. 더 구체적으로 살펴보면, A 행렬은 \(A_{aux}\)\(A_{train}\) 으로 분해되며, B 행렬은 \(B_{aux}\)\(B_{train}\) 으로 분해할 수 있습니다. 여기서 \(aux\) 레이어는 행별로 직교하는 벡터로 무작위 초기화되고 freeze 되어 있으며, \(train\) 레이어는 학습되는 가중치입니다. 따라서 LiDB 선형 레이어의 weight-residual은 다음과 같이 표현할 수 있습니다.

-
-\[ -\Delta W_x = A_{aux} A_{train} B_{train} B_{aux} -\]
-

여기서 \(aux\) 레이어는 experimentally fix 되었으며 이 과정을 통해 trainable parameter 개수는 약 30K개, 사이즈는 약 120KB로 경량화 할 수 있습니다. 이렇게 작은 크기와 변수만으로 fidelity, editability, style 그리고 diversity 등을 유지할 수 있다는 것이 포인트입니다.

-
-
-

HyperNetwork#

-
-hyperdreambooth_01 -
-

Fig. 271 HyperNetwork Architecture#

-
-
-

다음은 Hypernetwork 입니다. 본 논문에서는 사전에 훈련된 T2I 모델을 빠르게 personalization 하기 위해 HyperNetwork를 제안합니다. 여기서 \(\tilde{\theta}\) 는 모든 LiDB residual 행렬을 나타내며, 각 T2I 모델의 cross-attention 및 self-attention 레이어에 대한 \(A_{train}\)\(B_{train}\) 입니다. 이 핵심 아이디어는 주어진 이미지 x를 입력으로 받고, 이 이미지를 사용하여 LiDB의 low-rank residual인 \(\hat{\theta}\) 을 예측하는 HyperNetwork \(H_{\eta}\) 를 돌입하는 것입니다.HyperNetwork는 도메인 특화 이미지 데이터셋에서 훈련되며, 일반적인 확산 노이즈 제거 손실과 가중치 공간 손실을 가지고 있습니다.

-
-\[ -L(x) = \alpha \left\| D_\hat{\theta} (x + {\epsilon} , c) - x \right\|_{2}^{2} + \beta \left\|\hat{\theta} - {\theta} \right\|_{2}^{2} -\]
-

여기서 \(x\) 는 reference image를 의미합니다. HyperDreamBooth의 목표는 주어진 참조 이미지 x를 기반으로 해당 이미지와 유사한 새로운 이미지를 생성하는 것입니다. \(\theta\)\(x\) 에 대한 pre-optimized 된 가중치 paramters입니다. 이러한 가중치는 HyperDreamBooth 모델을 personalization 하기 위해 이미지 \(x\) 와 관련된 텍스트와 함께 조정됩니다. \(D_{\theta}\) 는 diffusion model을 나타냅니다. 이 모델은 이미지 \(x + \epsilon\) 및 Supervisory Text Prompt \(c\) 로 조건이 설정된 상태에서 사용됩니다. 이 모델은 이미지 생성 및 개인화에 사용됩니다. \(\alpha\)\(\beta\) 는 상대적인 loss의 가중치를 제어하기 위한 hyperparameters 입니다. 이러한 hyperparameters 는 각 loss 항목의 중요성을 조절하는 데 사용됩니다.

-

Supervisory Text Prompt
-Supervisory Text Prompt는 이미지 생성을 지원하기 위한 텍스트 입력입니다. 주어진 텍스트 프롬프트는 이미지 생성에 대한 지시사항 또는 조건을 제공합니다. HyperDreamBooth에서는 “a [V] face” 와 같은 텍스트 프롬프트를 사용하여 개인화된 이미지를 생성합니다. [V] 는 드물지만 다양한 의미 수정을 삽입할 수 있는 역할을 합니다.

-

HyperNetwork Architecture
-HyperNetwork는 HyperDreamBooth에서 사용되는 모델로, 개인화된 이미지 생성을 위한 가중치를 예측하는 역할을 합니다. HyperNetwork는 보통 다른 신경망 구조로 구성되며, 주어진 이미지를 입력으로 받아서 T2I 모델의 가중치를 예측합니다. 이러한 개인화된 이미지 생성을 위한 핵심 구성 요소 중 하나입니다. 여기서 예측한 가중치를 이후 Stable Diffusion 모델의 가중치에 더하여 개인화를 실행합니다.

-

Iterative Prediction
-HyperDreamBooth에서 사용되는 HyperNetwork는 반복적 예측을 수행합니다. 이것은 HyperNetwork가 초기 예측을 한 후에도 추가 반복적인 예측 단계를 통해 결과를 개선하려고 시도하는 것을 의미합니다. 초기 HyperNetwork 예측은 방향성이 올바르고 대상과 얼굴과 유사한 semantic 특성을 생성하지만 미세만 세부 정보를 충분히 잡아내지 못할 수 있습니다. 따라서 반복적인 예측을 통해 초기 예측을 fine-tuning하고 더 나은 이미지를 생성합니다. 이 때에 image encoding은 단 한 번만 수행되며, 추출된 특징 f는 반복적인 예측 과정에서 사용됩니다.

-
-hyperdreambooth_01 -
-

Fig. 272 HyperNetwork + Fast Finetuning#

-
-
-
-
-

Rank-Relaxed Fast Finetuning#

-

초기 HyperNetwork를 실행하고 나면 semantic 속성과 방향성에 대해서 올바르게 생성이 되지만 세부적인 detail은 잘 잡아내지 못합니다. 이를 위해 마지막으로 fast finetuning 단계를 제안합니다. 이 단계를 통해, DreamBooth보다 훨씬 빠르지만 강한 subject fidelity, editability 그리고 style diversity를 동일하게 유지할 수 있습니다. -먼저 HyperNetwork를 사용하여 개인화된 diffusion model 가중치를 예측합니다. 이후 diffusion model의 가중치를 초기화된 이미지 x와 함께 주어진 텍스트 지시어 c에 대한 diffusion noise loss \(L(x)\) 를 최소화하도록 조정합니다. 여기서 주요한 점은 rank-relaxed 의 개념입니다. 이것은 초기 모델의 rank(주로 1)를 완화하여 더 높은 rank로 LoRA 모델을 fine tuning 하는 것을 의미합니다. 구체적으로, HyperNetwork의 예측된 가중치 모델의 전체 가중치에 추가하고 더 높은 rank로 LoRA fine tuning을 수행합니다. 이를 통해 모델은 주체의 고주파수 세부 사항을 더 잘 근사화할 수 있으며 이로 인해 다른 낮은 rank로 제한된 업데이트보다 더 높은 주제 충실도를 달성할 수 있습니다. 이러한 rank-relaxed의 개념은 HyperDreamBooth를 다른 방식보다 더 우수하게 만드는 요인입니다. 여기서도 동일한 Supervisory Text Prompt “a [V] face” 를 사용하는데 이 프롬프트는 이미지 개인화를 지원하며 모델이 얼굴에 관련된 다양한 특성과 스타일을 캡처하는 데 도움이 됩니다. 그리고 HyperNetwork의 초기화된 가중치를 고려할 때, fast finetuning 단계를 40번의 반복으로 완료할 수 있습니다. 이는 DreamBooth 및 LoRA DreamBooth와 비교했을 때 25배 빠른 속도라는 것을 의미합니다.

-
-
-
-

Experiments#

-

본 HyperDreamBooth는 Stable Diffusion v1.5 을 활용하여 구현했습니다. 이 모델에서는 Stable Diffusion v1.5의 다양한 요소 중 하나인 diffusion UNet의 cross and self-attention 레이어에 대한 LoRA 가중치를 예측합니다. 또한 텍스트 정보를 활용하기 위해 CLIP 텍스트 인코더도 예측합니다. 이미지 생성 모델을 개인화하기 위해 시각화에 사용되는 모든 얼굴 이미지는 SFHQ(Synthetic Face Headquarters) 데이터셋을 활용했습니다. 모델을 훈련시키기 위해 CelebA-HQ 데이터셋에서 15,000개의 실제 얼굴 이미지가 활용되었습니다.

-
-hyperdreambooth_01 -
-

Fig. 273 Result Gallery#

-
-
-

왼쪽 위에서 오른쪽 아래로 “인스타그램 셀카 [V] 얼굴”, “Pixar 캐릭터 [V] 얼굴”, “bark skin의 [V] 얼굴”, “록 스타 [V] 얼굴”, 가장 오른쪽: ” 전문적인 [V] 얼굴 촬영” 프롬프트를 활용했습니다.

-
-hyperdreambooth_01 -
-

Fig. 274 Qualitative Comparison#

-
-
-
-hyperdreambooth_01 -
-

Fig. 275 Comparisons Table#

-
-
-
-
-

Comparisons#

-

Hyperdreambooth, DreamBooth 그리고 Textual Inversion의 무작위 생성된 샘플을 비교한 이미지와 표입니다. 정량적 평가를 위해 DINO와 같은 지표를 활용했습니다.

-
-hyperdreambooth_01 -
-

Fig. 276 Comparisons with DreamBooth#

-
-
-

위 표는 DreamBooth와 비교하는 부분입니다. DreamBooth의 hyperparameter를 다르게 조정하여 비교했습니다. 그 결과 학습률을 증가시키고 반복 횟수(iterations)를 감소시키면 결과의 저하가 있었습니다. DreamBooth-Agg-1은 400번의 반복을 시행하고, DreamBooth-Agg-2는 일반적인 Dreambooth의 1200번 대신 40번의 반복을 사용했습니다.

-
-hyperdreambooth_01 -
-

Fig. 277 HyperNetwork Ablation#

-
-
-

위 부분은 여러 가지 구성 요소로 나누어 실험한 표입니다. 실험 중에는 하이퍼네트워크를 사용하지 않는 경우, 하이퍼네트워크 예측만 사용하고 fast-finetuning을 사용하지 않은 경우, 반복 예측 없이 전체 방법을 1번만 사용한 경우를 비교합니다. 결과적으로 전체 방법이 모든 신뢰성 지표에서 가장 우수한 결과를 달성한다는 것을 보여주고 있습니다.

-
-hyperdreambooth_01 -
-

Fig. 278 User Study#

-
-
-

얼굴 인식 메트릭 이 특정 시나리오에서 상대적으로 약하다고 합니다. 얼굴 인식 네트워크가 실제 이미지에만 훈련되어 있고 다양한 스타일에서 동일한 사람을 인식하도록 훈련되어 있지 않기 때문이라고 주장하며 이를 보완하기 위해 user study를 진행했습니다. 여기서도 HyperDreamBooth, DreamBooth, Textual Inversion을 비교하고 사용자들의 평가를 받았습니다.

-
-
-

Follow-ups#

-

하지만 여전히 follow-ups가 존재합니다. 먼저 semantic directional error 라고 하는 초기 예측에서 잘못된 시맨틱 정보가 나올 수 있는 에러입니다. 잘못된 눈 색깔이나 헤어 타입, 성별 등이 나올 수 있습니다. 다음으로 incorrect subject detail capture 라는 오류가 있습니다. 다음은 underfitting 입니다. Fast finetuning 단계에서 identity는 지켜지더라도 유사하지 않은 샘플이 생성될 수 있습니다. 다음으로 HyperNetwork와 fast-finetuning 모두 일부 스타일에 대해 낮은 editability 가 나올 수 있습니다. 이러한 문제점은 빛, 포즈 등으로 인해 OOD인 샘플에서 나타날 수 있습니다.

-
-
-

Conclusion#

-

본 연구에서는 HyperDreamBooth라는 새로운 방법을 소개했습니다. 이 방법은 텍스트에서 이미지로 변환하는 diffusion model을 빠르고 가벼운 방식으로 개인화하는 것을 목표로 합니다. HyperDreamBooth는 HyperNetwork라는 구성 요소를 활용하여 diffusion model의 가벼운 파라미터인 LiDB(Lightweight DreamBooth)파라미터를 생성하며, 이어서 DreamBooth 및 기타 최적화 기반 개인화 작업에 비해 크기와 속도를 상당히 줄이면서 fast rank-relaxed fine tuning을 수행합니다. 이를 통해 모델의 무결성을 유지하면서 다양한 스타일과 의미적 수정이 적용된 다양한 고품질 이미지를 생성할 수 있음을 입증하였습니다.

-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + HyperDreamBooth — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: HyperDreamBooth: HyperNetworks for Fast Personalization of Text-to-Image Models

  • +
  • Reference

    + +
  • +
  • Author: Hyoungseo Cho

  • +
  • Last updated on Oct. 10, 2023

  • +
+
+
+

HyperDreamBooth#

+
+

Introduction#

+

Personalization 는 Generative AI 분야에서 떠오르고 있는 주제입니다. 이는 high-fidelity와 identity를 유지한 상태로 다양한 맥락과 스타일을 생성할 수 있도록 합니다. 본 논문은 Dreambooth 를 기반으로 진행되었기 때문에 Dreambooth 논문을 먼저 읽어 보시기를 추천드립니다.

+
+hyperdreambooth_01 +
+

Fig. 268 HyperDreamBooth#

+
+
+
+
+

Contribution#

+

본 논문의 Contribution은 크게 3가지로 볼 수 있습니다. Lighweight DreamBooth (LiDB), New HyperNetwork architecture 그리고 rank-relaxed finetuning 입니다. 위 3가지 방법을 활용하여 기존 DreamBooth의 핵심 능력을 유지하면서 크기를 줄이고 속도를 높일 수 있었습니다.

+
+ +
+

Prelimiaries#

+

Latent Diffusion Models (LDM)
+본 논문에서는 Stable Diffusion 모델을 활용하여 HyperDreamBooth를 구현했지만, 이 부분은 다른 텍스트-이미지 모델 (Imagen, DALL-E2 등) 도 적용이 가능합니다.

+

DreamBooth
+이전에 나온 DreamBooth는 특정 주제의 이미지를 생성하기 위해 T2I denoising 네트워크를 finetuning하는 전략을 활용했습니다. 이 방법은 HyperDreamBooth의 영감원 중 하나로 활용되었습니다.

+

Low Rank Adaptation (LoRA)
+LoRA는 모델의 가중치를 낮은 랭크의 행렬로 근사화하여 모델의 크기와 복잡성을 줄이는 방법입니다. 본 논문에서는 이 LoRA 기술을 활용하여 더 빠르고 효율적인 personalization이 가능하도록 합니다.

+
+
+

Method#

+

위에서 살펴 본 Contribution의 내용을 자세히 살펴보도록 하겠습니다.

+
+

Lightweight DreamBooth (LiDB)#

+

HyperdreamBooth 의 핵심 기술 중 하나인 Lightweight DreamBooth, 줄여서 LiDB에 대해 설명드리겠습니다. LiDB는 rank-1 LoRA residuals의 가중치 공간을 더 세분화하는 것이 핵심 아이디어입니다. 분해 과정에서 rank-1 LoRA weight-space 내에서 random orthogonal basis를 활용하여 decompose 합니다.

+
+hyperdreambooth_01 +
+

Fig. 270 Lightweight DreamBooth#

+
+
+

이 접근 방식은 LoRA의 A와 B 행렬을 각각 두 개의 행렬로 분해하는 것으로도 이해할 수 있습니다. 더 구체적으로 살펴보면, A 행렬은 \(A_{aux}\)\(A_{train}\) 으로 분해되며, B 행렬은 \(B_{aux}\)\(B_{train}\) 으로 분해할 수 있습니다. 여기서 \(aux\) 레이어는 행별로 직교하는 벡터로 무작위 초기화되고 freeze 되어 있으며, \(train\) 레이어는 학습되는 가중치입니다. 따라서 LiDB 선형 레이어의 weight-residual은 다음과 같이 표현할 수 있습니다.

+
+\[ +\Delta W_x = A_{aux} A_{train} B_{train} B_{aux} +\]
+

여기서 \(aux\) 레이어는 experimentally fix 되었으며 이 과정을 통해 trainable parameter 개수는 약 30K개, 사이즈는 약 120KB로 경량화 할 수 있습니다. 이렇게 작은 크기와 변수만으로 fidelity, editability, style 그리고 diversity 등을 유지할 수 있다는 것이 포인트입니다.

+
+
+

HyperNetwork#

+
+hyperdreambooth_01 +
+

Fig. 271 HyperNetwork Architecture#

+
+
+

다음은 Hypernetwork 입니다. 본 논문에서는 사전에 훈련된 T2I 모델을 빠르게 personalization 하기 위해 HyperNetwork를 제안합니다. 여기서 \(\tilde{\theta}\) 는 모든 LiDB residual 행렬을 나타내며, 각 T2I 모델의 cross-attention 및 self-attention 레이어에 대한 \(A_{train}\)\(B_{train}\) 입니다. 이 핵심 아이디어는 주어진 이미지 x를 입력으로 받고, 이 이미지를 사용하여 LiDB의 low-rank residual인 \(\hat{\theta}\) 을 예측하는 HyperNetwork \(H_{\eta}\) 를 돌입하는 것입니다.HyperNetwork는 도메인 특화 이미지 데이터셋에서 훈련되며, 일반적인 확산 노이즈 제거 손실과 가중치 공간 손실을 가지고 있습니다.

+
+\[ +L(x) = \alpha \left\| D_\hat{\theta} (x + {\epsilon} , c) - x \right\|_{2}^{2} + \beta \left\|\hat{\theta} - {\theta} \right\|_{2}^{2} +\]
+

여기서 \(x\) 는 reference image를 의미합니다. HyperDreamBooth의 목표는 주어진 참조 이미지 x를 기반으로 해당 이미지와 유사한 새로운 이미지를 생성하는 것입니다. \(\theta\)\(x\) 에 대한 pre-optimized 된 가중치 paramters입니다. 이러한 가중치는 HyperDreamBooth 모델을 personalization 하기 위해 이미지 \(x\) 와 관련된 텍스트와 함께 조정됩니다. \(D_{\theta}\) 는 diffusion model을 나타냅니다. 이 모델은 이미지 \(x + \epsilon\) 및 Supervisory Text Prompt \(c\) 로 조건이 설정된 상태에서 사용됩니다. 이 모델은 이미지 생성 및 개인화에 사용됩니다. \(\alpha\)\(\beta\) 는 상대적인 loss의 가중치를 제어하기 위한 hyperparameters 입니다. 이러한 hyperparameters 는 각 loss 항목의 중요성을 조절하는 데 사용됩니다.

+

Supervisory Text Prompt
+Supervisory Text Prompt는 이미지 생성을 지원하기 위한 텍스트 입력입니다. 주어진 텍스트 프롬프트는 이미지 생성에 대한 지시사항 또는 조건을 제공합니다. HyperDreamBooth에서는 “a [V] face” 와 같은 텍스트 프롬프트를 사용하여 개인화된 이미지를 생성합니다. [V] 는 드물지만 다양한 의미 수정을 삽입할 수 있는 역할을 합니다.

+

HyperNetwork Architecture
+HyperNetwork는 HyperDreamBooth에서 사용되는 모델로, 개인화된 이미지 생성을 위한 가중치를 예측하는 역할을 합니다. HyperNetwork는 보통 다른 신경망 구조로 구성되며, 주어진 이미지를 입력으로 받아서 T2I 모델의 가중치를 예측합니다. 이러한 개인화된 이미지 생성을 위한 핵심 구성 요소 중 하나입니다. 여기서 예측한 가중치를 이후 Stable Diffusion 모델의 가중치에 더하여 개인화를 실행합니다.

+

Iterative Prediction
+HyperDreamBooth에서 사용되는 HyperNetwork는 반복적 예측을 수행합니다. 이것은 HyperNetwork가 초기 예측을 한 후에도 추가 반복적인 예측 단계를 통해 결과를 개선하려고 시도하는 것을 의미합니다. 초기 HyperNetwork 예측은 방향성이 올바르고 대상과 얼굴과 유사한 semantic 특성을 생성하지만 미세만 세부 정보를 충분히 잡아내지 못할 수 있습니다. 따라서 반복적인 예측을 통해 초기 예측을 fine-tuning하고 더 나은 이미지를 생성합니다. 이 때에 image encoding은 단 한 번만 수행되며, 추출된 특징 f는 반복적인 예측 과정에서 사용됩니다.

+
+hyperdreambooth_01 +
+

Fig. 272 HyperNetwork + Fast Finetuning#

+
+
+
+
+

Rank-Relaxed Fast Finetuning#

+

초기 HyperNetwork를 실행하고 나면 semantic 속성과 방향성에 대해서 올바르게 생성이 되지만 세부적인 detail은 잘 잡아내지 못합니다. 이를 위해 마지막으로 fast finetuning 단계를 제안합니다. 이 단계를 통해, DreamBooth보다 훨씬 빠르지만 강한 subject fidelity, editability 그리고 style diversity를 동일하게 유지할 수 있습니다. +먼저 HyperNetwork를 사용하여 개인화된 diffusion model 가중치를 예측합니다. 이후 diffusion model의 가중치를 초기화된 이미지 x와 함께 주어진 텍스트 지시어 c에 대한 diffusion noise loss \(L(x)\) 를 최소화하도록 조정합니다. 여기서 주요한 점은 rank-relaxed 의 개념입니다. 이것은 초기 모델의 rank(주로 1)를 완화하여 더 높은 rank로 LoRA 모델을 fine tuning 하는 것을 의미합니다. 구체적으로, HyperNetwork의 예측된 가중치 모델의 전체 가중치에 추가하고 더 높은 rank로 LoRA fine tuning을 수행합니다. 이를 통해 모델은 주체의 고주파수 세부 사항을 더 잘 근사화할 수 있으며 이로 인해 다른 낮은 rank로 제한된 업데이트보다 더 높은 주제 충실도를 달성할 수 있습니다. 이러한 rank-relaxed의 개념은 HyperDreamBooth를 다른 방식보다 더 우수하게 만드는 요인입니다. 여기서도 동일한 Supervisory Text Prompt “a [V] face” 를 사용하는데 이 프롬프트는 이미지 개인화를 지원하며 모델이 얼굴에 관련된 다양한 특성과 스타일을 캡처하는 데 도움이 됩니다. 그리고 HyperNetwork의 초기화된 가중치를 고려할 때, fast finetuning 단계를 40번의 반복으로 완료할 수 있습니다. 이는 DreamBooth 및 LoRA DreamBooth와 비교했을 때 25배 빠른 속도라는 것을 의미합니다.

+
+
+
+

Experiments#

+

본 HyperDreamBooth는 Stable Diffusion v1.5 을 활용하여 구현했습니다. 이 모델에서는 Stable Diffusion v1.5의 다양한 요소 중 하나인 diffusion UNet의 cross and self-attention 레이어에 대한 LoRA 가중치를 예측합니다. 또한 텍스트 정보를 활용하기 위해 CLIP 텍스트 인코더도 예측합니다. 이미지 생성 모델을 개인화하기 위해 시각화에 사용되는 모든 얼굴 이미지는 SFHQ(Synthetic Face Headquarters) 데이터셋을 활용했습니다. 모델을 훈련시키기 위해 CelebA-HQ 데이터셋에서 15,000개의 실제 얼굴 이미지가 활용되었습니다.

+
+hyperdreambooth_01 +
+

Fig. 273 Result Gallery#

+
+
+

왼쪽 위에서 오른쪽 아래로 “인스타그램 셀카 [V] 얼굴”, “Pixar 캐릭터 [V] 얼굴”, “bark skin의 [V] 얼굴”, “록 스타 [V] 얼굴”, 가장 오른쪽: ” 전문적인 [V] 얼굴 촬영” 프롬프트를 활용했습니다.

+
+hyperdreambooth_01 +
+

Fig. 274 Qualitative Comparison#

+
+
+
+hyperdreambooth_01 +
+

Fig. 275 Comparisons Table#

+
+
+
+
+

Comparisons#

+

Hyperdreambooth, DreamBooth 그리고 Textual Inversion의 무작위 생성된 샘플을 비교한 이미지와 표입니다. 정량적 평가를 위해 DINO와 같은 지표를 활용했습니다.

+
+hyperdreambooth_01 +
+

Fig. 276 Comparisons with DreamBooth#

+
+
+

위 표는 DreamBooth와 비교하는 부분입니다. DreamBooth의 hyperparameter를 다르게 조정하여 비교했습니다. 그 결과 학습률을 증가시키고 반복 횟수(iterations)를 감소시키면 결과의 저하가 있었습니다. DreamBooth-Agg-1은 400번의 반복을 시행하고, DreamBooth-Agg-2는 일반적인 Dreambooth의 1200번 대신 40번의 반복을 사용했습니다.

+
+hyperdreambooth_01 +
+

Fig. 277 HyperNetwork Ablation#

+
+
+

위 부분은 여러 가지 구성 요소로 나누어 실험한 표입니다. 실험 중에는 하이퍼네트워크를 사용하지 않는 경우, 하이퍼네트워크 예측만 사용하고 fast-finetuning을 사용하지 않은 경우, 반복 예측 없이 전체 방법을 1번만 사용한 경우를 비교합니다. 결과적으로 전체 방법이 모든 신뢰성 지표에서 가장 우수한 결과를 달성한다는 것을 보여주고 있습니다.

+
+hyperdreambooth_01 +
+

Fig. 278 User Study#

+
+
+

얼굴 인식 메트릭 이 특정 시나리오에서 상대적으로 약하다고 합니다. 얼굴 인식 네트워크가 실제 이미지에만 훈련되어 있고 다양한 스타일에서 동일한 사람을 인식하도록 훈련되어 있지 않기 때문이라고 주장하며 이를 보완하기 위해 user study를 진행했습니다. 여기서도 HyperDreamBooth, DreamBooth, Textual Inversion을 비교하고 사용자들의 평가를 받았습니다.

+
+
+

Follow-ups#

+

하지만 여전히 follow-ups가 존재합니다. 먼저 semantic directional error 라고 하는 초기 예측에서 잘못된 시맨틱 정보가 나올 수 있는 에러입니다. 잘못된 눈 색깔이나 헤어 타입, 성별 등이 나올 수 있습니다. 다음으로 incorrect subject detail capture 라는 오류가 있습니다. 다음은 underfitting 입니다. Fast finetuning 단계에서 identity는 지켜지더라도 유사하지 않은 샘플이 생성될 수 있습니다. 다음으로 HyperNetwork와 fast-finetuning 모두 일부 스타일에 대해 낮은 editability 가 나올 수 있습니다. 이러한 문제점은 빛, 포즈 등으로 인해 OOD인 샘플에서 나타날 수 있습니다.

+
+
+

Conclusion#

+

본 연구에서는 HyperDreamBooth라는 새로운 방법을 소개했습니다. 이 방법은 텍스트에서 이미지로 변환하는 diffusion model을 빠르고 가벼운 방식으로 개인화하는 것을 목표로 합니다. HyperDreamBooth는 HyperNetwork라는 구성 요소를 활용하여 diffusion model의 가벼운 파라미터인 LiDB(Lightweight DreamBooth)파라미터를 생성하며, 이어서 DreamBooth 및 기타 최적화 기반 개인화 작업에 비해 크기와 속도를 상당히 줄이면서 fast rank-relaxed fine tuning을 수행합니다. 이를 통해 모델의 무결성을 유지하면서 다양한 스타일과 의미적 수정이 적용된 다양한 고품질 이미지를 생성할 수 있음을 입증하였습니다.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/I-DDPM.html b/docs/review/I-DDPM.html old mode 100644 new mode 100755 index 3b5d9209..e9b9cfa8 --- a/docs/review/I-DDPM.html +++ b/docs/review/I-DDPM.html @@ -1,877 +1,896 @@ - - - - - - - - - - - - I-DDPM — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: Improved Denoising Diffusion Probabilistic Models (CVPR 2021)

  • -
  • Reference

    - -
  • -
  • Author: Seunghwan Ji

  • -
  • Last updated on Aug. 6, 2023

  • -
-
-
-

I-DDPM#

-
-

Abstract#

-
    -
  • DDPM을 약간 수정함으로써 High Quality를 유지하고, Log Likelihood수치도 개선할 수 있는 향상된 모델을 제안

  • -
  • Sampling시 Base 보다 더 적은 Step으로 비슷한 퀄리티의 결과를 낼 수 있는 방법을 제안

  • -
  • Model의 Scale과 Diffusion Step에 따른 Sample Quailty와 Likelihood 수치간의 관계를 연구

  • -
-
-
-

1. Introduction#

-
    -
  • 최근 DDPM(Ho et al.) 모델은 Generate 분야에서 High Quality의 이미지를 생성해내는 수준까지 왔다.

  • -
  • 하지만, Image의 Quality에 반해 log-likelihood 수치는 다른 generative 모델에비해 현저히 떨어졌다. (e.g. VAE)

  • -
  • 또 DDPM이 Diversity가 낮은 Dataset(CIFAR-10, LSUN)에서는 잘 동작했지만, High Diversity Dataset에서의 동작은 증명되지 못했다.

  • -
  • I-DDPM에서는

    -
      -
    1. Log-Likelihood 수치 개선

    2. -
    3. ImageNet같은 Diversity가 높은 Dataset에서도 잘 동작

    4. -
    5. Reverse Process에서의 Loss Term 개선

    6. -
    -

    한 모델을 제안하였다.

    -
  • -
  • 추가로 연구 과정 중, I-DDPM이 Base (DDPM) 모델에 비해 훨씬 더 적은 Step으로 비슷한 Quality를 내는 것을 확인

  • -
-

Log-Likelihood 값이 중요한 이유

-
    -
  • 기존 연구들에서 Loglikelihood 수치와 Sample의 Quality간의 연관성을 보이는 연구들이 많았다.

    -
      -
    • Data의 Distribution에 대해 Model이 학습한 정도를 수치화한 느낌

    • -
    -
  • -
  • 수치가 좋아지면 Sample Quality도 따라 증가하는 경향을 보였다.

  • -
  • 따라서 DDPM에서도 LogLikelihood 수치를 개선한다면 Sample Quality도 따라서 더 증가할 가능성이 있지 않을까?

  • -
  • https://angeloyeo.github.io/2020/07/17/MLE.html

  • -
-
-
-

2. Denoising Diffusion Probabilistic Models#

-

DDPM

-
    -
  • Process

    -
      -
    • Forward Process

      -
      -I-DDPM_00 -
      -

      Fig. 185 Equation 1#

      -
      -
      -
    • -
    • Reverse Process

      -
      -I-DDPM_01 -
      -

      Fig. 186 Equation 2#

      -
      -
      -
    • -
    -
  • -
  • Forward Process에서 입힌 Noise를 Neural Model의 Reverse Process로 예측하도록 학습하는 형태

  • -
  • 이 때 Noising & Denoising에 관한 (Hyper) Parameter로 \({B_{t}}\)\(\tilde{B_{t}}\)를 사용

    -
      -
    • \({B_{t}}\) : time step 에 따른 noising할 정도

    • -
    • \(\tilde{B_{t}}\) : Reverse Step에서 Denoising을 위한 Parameter로 아래와같이 정의

      -
      -I-DDPM_02 -
      -

      Fig. 187 Equation 3#

      -
      -
      -
    • -
    -
  • -
  • 하지만 DDPM에서는 \(\tilde{B_{t}}\) 대신 \({B_{t}}\)를 사용해도 비슷한 수치를 보여서 \({B_{t}}\) (constant)로 고정

  • -
-
-
-

3. Improving the Log-likelihood#

-
    -
  • 위의 문장 (\(\tilde{B_{t}}\) 대신 \({B_{t}}\)를 사용)에서 의문점

    -
      -
    • 사실 \({B_{t}}\)\(\tilde{B_{t}}\)는 정 반대의 역할을 하는 Parameter인데 왜 비슷한 결과를 보였고, 결국 같은 값으로 Fix를 하는게 맞을까?

      -
      -I-DDPM_03 -
      -

      Fig. 188 Figure 1#

      -
      -
      -
    • -
    • Diffusion Step간 \({B_{t}}\)\(\tilde{B_{t}}\)의 차이를 비교해보면 Diffusion Step이 커질수록 두개의 값은 거의 동일해진다. (Figure.1)

      -
      -I-DDPM_04 -
      -

      Fig. 189 Figure 2#

      -
      -
      -
    • -
    • 하지만 Figure.2를 보면 모델의 성능은 대부분 Step 초반에 결정되는데, Step 초반에는 두 값의 차이가 큰 것을 확인할 수 있다.

      -
        -
      • Model의 성능이 결정되는 부분 = Loss 가 급격하게 떨어지는 부분

      • -
      -

      ⇒ 따라서, \({B_{t}}\)\(\tilde{B_{t}}\)를 동일한 값으로 두고 \(\tilde{B_{t}}\)를 Non Trainable Parameter로 두는것은 설계의 Miss

      -
    • -
    • 하지만, \(\tilde{B_{t}}\) 자체를 학습하기에는 값의 범위가 너무 작아서 \({B_{t}}\)\(\tilde{B_{t}}\)의 Interpolation 값을 Predict하도록 설계

      -
      -I-DDPM_05 -
      -

      Fig. 190 Figure 3#

      -
      -
      -
    • -
    • Hybrid Loss

      -
        -
      • \(L_{hyprid} = L_{simple} + λL_{vlb}\)

      • -
      -
    • -
    -
  • -
  • Noise Schedule

    -
      -
    • DDPM의 경우 High Resolution 이미지에대해 잘 동작하지만, Low-Resolution (e.g. 32x32, 64x64)의 이미지에 대해서는 잘 동작하지 않는것을 확인

    • -
    • Noise Scheduling에서 Linear mode의 Limitation이 있음을 지적

      -
      -I-DDPM_06 -
      -

      Fig. 191 Equation 4#

      -
      -
      -
    • -
    • Step이 거듭날수록 Linear schedule(상단)의 이미지가 너무 빠르게 Noisy해짐

    • -
    • 추가로 Reverse Process의 20%를 Skip해도 성능에 큰 영향이 없음을 확인

    • -
    -

    ⇒ 결국 Linear mode를 사용하면 특정 Step 이후의 Noise는 학습에 의미있는 영향을 미치지 못한다.

    -
      -
    • I-DDPM에서는 이러한 scheduling Equation을 새로 정의

      -
      -I-DDPM_07 -
      -

      Fig. 192 Equation 5#

      -
      -
      -
    • -
    • 새로 정의한 식은 중간 단계에서는 Noise가 강하게 입혀지지만 0과 T 부근에서는 비교적 덜 Noisy해짐

      -
      -I-DDPM_08 -
      -

      Fig. 193 Figure 3#

      -
      -
      -
    • -
    -
  • -
  • Gradient Noise

    -
      -
    • Model을 \(L_{vlb}\)를 Direct로 최적화하도록 설계하면 Best

    • -
    • 하지만 아래 이미지와같이 Loss 자체가 unstable해서 직접 최적화에는 어려움이 있음

      -
      -I-DDPM_09 -
      -

      Fig. 194 Figure 4#

      -
      -
      -
    • -
    • 따라서 \(L_{vlb}\)의 Variance를 줄이기위해(=stable) Importance Sampling 기법을 도입

    • -
    • 위 Fig.2에서 보면 학습 말기는 Loss의 변화에 큰 영향이 없으므로 확률적으로 학습 초반의 데이터를 좀더 sampling해서 학습하도록 설계

    • -
    • 실제로 적용해본 결과 \(L_{hybrid}\)보다 더 낮은 Loss 를 보임

    • -
    • \(L_{hybrid}\)에 Importance Sampling을 적용하면?

      -
        -
      • 적용 전보다 좋지 않은 결과를 보인다..

      • -
      -
    • -
    -
  • -
-

Result

-
-I-DDPM_10 -
-

Fig. 195 Table 1#

-
-
-
-I-DDPM_11 -
-

Fig. 196 Table 2#

-
-
-
    -
  • DDPM에서 다소 취약했던 ImageNet 64x64와 CIDAR-10 데이터를 기준

    -
      -
    • \(L_{vlb}\)의 경우 Importance sampling을 적용한 결과

    • -
    -
  • -
-
-I-DDPM_12 -
-

Fig. 197 Table 3#

-
-
-
    -
  • Convolution 모델이나 Diffusion 모델중에서는 뛰어나지만, Fully Transformer 모델에 비해서는 다소 부족한 면이 있음

  • -
-
-
-

4. Improcing Sampling Speed#

-
    -
  • Sampling Speed를 높이기 위한 방법을 제안

    -
      -
    • Training 시에는 전체 Step(1, … , T)을 학습

    • -
    • Sampling 시에는 몇몇 Step만 Sampling

    • -
    -
  • -
  • 결과는?

  • -
-
-I-DDPM_13 -
-

Fig. 198 Figure 5#

-
-
-
-I-DDPM_14 -
-

Fig. 199 Figure 6#

-
-
-

⇒ 100 Step만 가도 Full Model과 비슷한 FiD값을 보임

-
-
-

5. Comparison to GANs#

-
    -
  • Class Conditional Generation + P&R Metric으로 GAN 모델(BigGAN)과 성능을 비교

    -
    -I-DDPM_15 -
    -

    Fig. 200 Figure 7#

    -
    -
    -
      -
    • Big-GAN Deep 모델보다 생성 타겟에 대한 FiD 수치나 Recall metric에서 더 뛰어난 성능을 보임

    • -
    -
  • -
-
-
-

6. Scaling Model Size#

-
    -
  • 다양한 Capacity를 가진 모델의 FiD와 NLL 값을 비교

  • -
-
-I-DDPM_16 -
-

Fig. 201 Figure 8#

-
-
-
-I-DDPM_17 -
-

Fig. 202 Figure 9#

-
-
-

⇒ 모델의 크기와 학습량 모두 Step에 어느정도 비례함

-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + I-DDPM — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: Improved Denoising Diffusion Probabilistic Models (CVPR 2021)

  • +
  • Reference

    + +
  • +
  • Author: Seunghwan Ji

  • +
  • Last updated on Aug. 6, 2023

  • +
+
+
+

I-DDPM#

+
+

Abstract#

+
    +
  • DDPM을 약간 수정함으로써 High Quality를 유지하고, Log Likelihood수치도 개선할 수 있는 향상된 모델을 제안

  • +
  • Sampling시 Base 보다 더 적은 Step으로 비슷한 퀄리티의 결과를 낼 수 있는 방법을 제안

  • +
  • Model의 Scale과 Diffusion Step에 따른 Sample Quailty와 Likelihood 수치간의 관계를 연구

  • +
+
+
+

1. Introduction#

+
    +
  • 최근 DDPM(Ho et al.) 모델은 Generate 분야에서 High Quality의 이미지를 생성해내는 수준까지 왔다.

  • +
  • 하지만, Image의 Quality에 반해 log-likelihood 수치는 다른 generative 모델에비해 현저히 떨어졌다. (e.g. VAE)

  • +
  • 또 DDPM이 Diversity가 낮은 Dataset(CIFAR-10, LSUN)에서는 잘 동작했지만, High Diversity Dataset에서의 동작은 증명되지 못했다.

  • +
  • I-DDPM에서는

    +
      +
    1. Log-Likelihood 수치 개선

    2. +
    3. ImageNet같은 Diversity가 높은 Dataset에서도 잘 동작

    4. +
    5. Reverse Process에서의 Loss Term 개선

    6. +
    +

    한 모델을 제안하였다.

    +
  • +
  • 추가로 연구 과정 중, I-DDPM이 Base (DDPM) 모델에 비해 훨씬 더 적은 Step으로 비슷한 Quality를 내는 것을 확인

  • +
+

Log-Likelihood 값이 중요한 이유

+
    +
  • 기존 연구들에서 Loglikelihood 수치와 Sample의 Quality간의 연관성을 보이는 연구들이 많았다.

    +
      +
    • Data의 Distribution에 대해 Model이 학습한 정도를 수치화한 느낌

    • +
    +
  • +
  • 수치가 좋아지면 Sample Quality도 따라 증가하는 경향을 보였다.

  • +
  • 따라서 DDPM에서도 LogLikelihood 수치를 개선한다면 Sample Quality도 따라서 더 증가할 가능성이 있지 않을까?

  • +
  • https://angeloyeo.github.io/2020/07/17/MLE.html

  • +
+
+
+

2. Denoising Diffusion Probabilistic Models#

+

DDPM

+
    +
  • Process

    +
      +
    • Forward Process

      +
      +I-DDPM_00 +
      +

      Fig. 185 Equation 1#

      +
      +
      +
    • +
    • Reverse Process

      +
      +I-DDPM_01 +
      +

      Fig. 186 Equation 2#

      +
      +
      +
    • +
    +
  • +
  • Forward Process에서 입힌 Noise를 Neural Model의 Reverse Process로 예측하도록 학습하는 형태

  • +
  • 이 때 Noising & Denoising에 관한 (Hyper) Parameter로 \({B_{t}}\)\(\tilde{B_{t}}\)를 사용

    +
      +
    • \({B_{t}}\) : time step 에 따른 noising할 정도

    • +
    • \(\tilde{B_{t}}\) : Reverse Step에서 Denoising을 위한 Parameter로 아래와같이 정의

      +
      +I-DDPM_02 +
      +

      Fig. 187 Equation 3#

      +
      +
      +
    • +
    +
  • +
  • 하지만 DDPM에서는 \(\tilde{B_{t}}\) 대신 \({B_{t}}\)를 사용해도 비슷한 수치를 보여서 \({B_{t}}\) (constant)로 고정

  • +
+
+
+

3. Improving the Log-likelihood#

+
    +
  • 위의 문장 (\(\tilde{B_{t}}\) 대신 \({B_{t}}\)를 사용)에서 의문점

    +
      +
    • 사실 \({B_{t}}\)\(\tilde{B_{t}}\)는 정 반대의 역할을 하는 Parameter인데 왜 비슷한 결과를 보였고, 결국 같은 값으로 Fix를 하는게 맞을까?

      +
      +I-DDPM_03 +
      +

      Fig. 188 Figure 1#

      +
      +
      +
    • +
    • Diffusion Step간 \({B_{t}}\)\(\tilde{B_{t}}\)의 차이를 비교해보면 Diffusion Step이 커질수록 두개의 값은 거의 동일해진다. (Figure.1)

      +
      +I-DDPM_04 +
      +

      Fig. 189 Figure 2#

      +
      +
      +
    • +
    • 하지만 Figure.2를 보면 모델의 성능은 대부분 Step 초반에 결정되는데, Step 초반에는 두 값의 차이가 큰 것을 확인할 수 있다.

      +
        +
      • Model의 성능이 결정되는 부분 = Loss 가 급격하게 떨어지는 부분

      • +
      +

      ⇒ 따라서, \({B_{t}}\)\(\tilde{B_{t}}\)를 동일한 값으로 두고 \(\tilde{B_{t}}\)를 Non Trainable Parameter로 두는것은 설계의 Miss

      +
    • +
    • 하지만, \(\tilde{B_{t}}\) 자체를 학습하기에는 값의 범위가 너무 작아서 \({B_{t}}\)\(\tilde{B_{t}}\)의 Interpolation 값을 Predict하도록 설계

      +
      +I-DDPM_05 +
      +

      Fig. 190 Figure 3#

      +
      +
      +
    • +
    • Hybrid Loss

      +
        +
      • \(L_{hyprid} = L_{simple} + λL_{vlb}\)

      • +
      +
    • +
    +
  • +
  • Noise Schedule

    +
      +
    • DDPM의 경우 High Resolution 이미지에대해 잘 동작하지만, Low-Resolution (e.g. 32x32, 64x64)의 이미지에 대해서는 잘 동작하지 않는것을 확인

    • +
    • Noise Scheduling에서 Linear mode의 Limitation이 있음을 지적

      +
      +I-DDPM_06 +
      +

      Fig. 191 Equation 4#

      +
      +
      +
    • +
    • Step이 거듭날수록 Linear schedule(상단)의 이미지가 너무 빠르게 Noisy해짐

    • +
    • 추가로 Reverse Process의 20%를 Skip해도 성능에 큰 영향이 없음을 확인

    • +
    +

    ⇒ 결국 Linear mode를 사용하면 특정 Step 이후의 Noise는 학습에 의미있는 영향을 미치지 못한다.

    +
      +
    • I-DDPM에서는 이러한 scheduling Equation을 새로 정의

      +
      +I-DDPM_07 +
      +

      Fig. 192 Equation 5#

      +
      +
      +
    • +
    • 새로 정의한 식은 중간 단계에서는 Noise가 강하게 입혀지지만 0과 T 부근에서는 비교적 덜 Noisy해짐

      +
      +I-DDPM_08 +
      +

      Fig. 193 Figure 3#

      +
      +
      +
    • +
    +
  • +
  • Gradient Noise

    +
      +
    • Model을 \(L_{vlb}\)를 Direct로 최적화하도록 설계하면 Best

    • +
    • 하지만 아래 이미지와같이 Loss 자체가 unstable해서 직접 최적화에는 어려움이 있음

      +
      +I-DDPM_09 +
      +

      Fig. 194 Figure 4#

      +
      +
      +
    • +
    • 따라서 \(L_{vlb}\)의 Variance를 줄이기위해(=stable) Importance Sampling 기법을 도입

    • +
    • 위 Fig.2에서 보면 학습 말기는 Loss의 변화에 큰 영향이 없으므로 확률적으로 학습 초반의 데이터를 좀더 sampling해서 학습하도록 설계

    • +
    • 실제로 적용해본 결과 \(L_{hybrid}\)보다 더 낮은 Loss 를 보임

    • +
    • \(L_{hybrid}\)에 Importance Sampling을 적용하면?

      +
        +
      • 적용 전보다 좋지 않은 결과를 보인다..

      • +
      +
    • +
    +
  • +
+

Result

+
+I-DDPM_10 +
+

Fig. 195 Table 1#

+
+
+
+I-DDPM_11 +
+

Fig. 196 Table 2#

+
+
+
    +
  • DDPM에서 다소 취약했던 ImageNet 64x64와 CIDAR-10 데이터를 기준

    +
      +
    • \(L_{vlb}\)의 경우 Importance sampling을 적용한 결과

    • +
    +
  • +
+
+I-DDPM_12 +
+

Fig. 197 Table 3#

+
+
+
    +
  • Convolution 모델이나 Diffusion 모델중에서는 뛰어나지만, Fully Transformer 모델에 비해서는 다소 부족한 면이 있음

  • +
+
+
+

4. Improcing Sampling Speed#

+
    +
  • Sampling Speed를 높이기 위한 방법을 제안

    +
      +
    • Training 시에는 전체 Step(1, … , T)을 학습

    • +
    • Sampling 시에는 몇몇 Step만 Sampling

    • +
    +
  • +
  • 결과는?

  • +
+
+I-DDPM_13 +
+

Fig. 198 Figure 5#

+
+
+
+I-DDPM_14 +
+

Fig. 199 Figure 6#

+
+
+

⇒ 100 Step만 가도 Full Model과 비슷한 FiD값을 보임

+
+
+

5. Comparison to GANs#

+
    +
  • Class Conditional Generation + P&R Metric으로 GAN 모델(BigGAN)과 성능을 비교

    +
    +I-DDPM_15 +
    +

    Fig. 200 Figure 7#

    +
    +
    +
      +
    • Big-GAN Deep 모델보다 생성 타겟에 대한 FiD 수치나 Recall metric에서 더 뛰어난 성능을 보임

    • +
    +
  • +
+
+
+

6. Scaling Model Size#

+
    +
  • 다양한 Capacity를 가진 모델의 FiD와 NLL 값을 비교

  • +
+
+I-DDPM_16 +
+

Fig. 201 Figure 8#

+
+
+
+I-DDPM_17 +
+

Fig. 202 Figure 9#

+
+
+

⇒ 모델의 크기와 학습량 모두 Step에 어느정도 비례함

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/Latent_Diffusion_Model.html b/docs/review/Latent_Diffusion_Model.html old mode 100644 new mode 100755 index 6c0e861c..a76a8c6d --- a/docs/review/Latent_Diffusion_Model.html +++ b/docs/review/Latent_Diffusion_Model.html @@ -1,669 +1,688 @@ - - - - - - - - - - - - Latent Diffusion Model — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

Latent Diffusion Model

- -
-
- -
-

Contents

-
- -
-
-
- - - - -
- -
-

Information

- -
-
-

Latent Diffusion Model#

-

오늘 알아볼 모델은 Latent Diffusion Model입니다. -기존에 다뤘던 Diffusion Model과 유사하게 동작하는 생성 모델입니다. 이 논문에서는 컴퓨터 자원의 소모를 줄이면서 Diffusion Model과 유사한 성능을 얻는것이 그 목표입니다.

-

Latent Diffusion Model은 전반적으로 아래와 같은 구조를 가집니다.

-
-../../_images/Unet.png -
-

Fig. 147 Structure of Latent Diffusion Model#

-
-
-

\(x \in \mathbb{R}^{H\times W \times 3}\)이 input으로 주어졌을때 이를 encoder \(\mathcal{E}\)를 통해서 \(z=\mathcal{E}(x) \in \mathbb{R}^{h\times w\times c }\)로 인코딩 하고 \(\hat{x}=\mathcal{D}(z)\) -로 디코딩을 한다. 이 논문에서 \(f=H/h=W/w=2^m\), \(m\in \mathbb{N}\)이 되도록 여러 \(m\)에 대해서 테스트를 진행하였다. 또한 Latent space에서 분산이 커지지 않도록 KL divergence와 vector quantization(VQ)을 활용하였다. -이미지외 텍스트나, sematic map과 같이 추가적인 정보는 \(\tau_\theta\)를 통해서 전달을 하였고,

-
-\[ Q=W^{(i)}_Q \phi_i(z_i), K=W^{(i)}_K \phi_i(z_i), V=W^{(i)}_V \phi_i(z_i) \]
-

로 정의되고 \(\phi_i(z_i)\)\(U\)-Net 중간의 representation, \(W^{i}_V, W^{i}_K, W^{i}_Q\)는 학습 가능한 projection matrix이다. -\(Q, K, V\) 는 attention의 query, key, value에 해당하며

-
-\[ -Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d}})\cdot V -\]
-

로 연산이 진행된다. 학습을 위한 loss 함수는 다음과 같이표현된다.

-
-\[ -\mathcal{L}_{LDM} = \mathbb{E}_{\mathcal{E}(x), -\epsilon \sim \mathcal{N}(0,1),t} \left[ \|\epsilon-\epsilon_{\theta}(z_t,t) \|_{2}^{2}\right]. -\]
-

여기서 주목할만한 부분은 기존 Diffusion Model에서

-
-\[ -\mathcal{L}_{DM} = \mathbb{E}_{x, -\epsilon \sim \mathcal{N}(0,1),t} \left[ \|\epsilon-\epsilon_{\theta}(x_t,t) \|_{2}^{2}\right]. -\]
-

와 같은 loss function으로 학습을 진행시키는데 \(x_t\)\(z_t\)로 바꾸면서 연산의 양을 줄였다는 점이다.

-
-
-

Experiments#

-

해당 논문에서는 다양한 task에 대해서 실험을 진행하였는데, 그중 일부만 소개하도록 하겠다. -아래의 그림은 다양한 dataset에서 뽑은 샘플과 text to image sample들입니다.

-
-../../_images/experiment1.png -
-

Fig. 148 Sample images#

-
-
-
-../../_images/text_to_image.png -
-

Fig. 149 text to image on LAION#

-
-
-

실험을 통해서 나온 결과 \(m=2,3,4\) 혹은 \(f=4, 8, 16\)인 경우 적절한 FID 점수와 효율성을 보여주었습니다.

-
-../../_images/trade_off.png -
-

Fig. 150 text to image on LAION#

-
-
-

Layout이 주어졌을 때, 이를 기반으로 image를 생성하는 layout-to-image의 샘플 결과입니다.

-
-../../_images/layout_to_image.png -
-

Fig. 151 layout-to-image#

-
-
-
- - - - -
- - - - - - -
- - - -
- - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Latent Diffusion Model — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Latent Diffusion Model

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Information

+ +
+
+

Latent Diffusion Model#

+

오늘 알아볼 모델은 Latent Diffusion Model입니다. +기존에 다뤘던 Diffusion Model과 유사하게 동작하는 생성 모델입니다. 이 논문에서는 컴퓨터 자원의 소모를 줄이면서 Diffusion Model과 유사한 성능을 얻는것이 그 목표입니다.

+

Latent Diffusion Model은 전반적으로 아래와 같은 구조를 가집니다.

+
+../../_images/Unet.png +
+

Fig. 147 Structure of Latent Diffusion Model#

+
+
+

\(x \in \mathbb{R}^{H\times W \times 3}\)이 input으로 주어졌을때 이를 encoder \(\mathcal{E}\)를 통해서 \(z=\mathcal{E}(x) \in \mathbb{R}^{h\times w\times c }\)로 인코딩 하고 \(\hat{x}=\mathcal{D}(z)\) +로 디코딩을 한다. 이 논문에서 \(f=H/h=W/w=2^m\), \(m\in \mathbb{N}\)이 되도록 여러 \(m\)에 대해서 테스트를 진행하였다. 또한 Latent space에서 분산이 커지지 않도록 KL divergence와 vector quantization(VQ)을 활용하였다. +이미지외 텍스트나, sematic map과 같이 추가적인 정보는 \(\tau_\theta\)를 통해서 전달을 하였고,

+
+\[ Q=W^{(i)}_Q \phi_i(z_i), K=W^{(i)}_K \phi_i(z_i), V=W^{(i)}_V \phi_i(z_i) \]
+

로 정의되고 \(\phi_i(z_i)\)\(U\)-Net 중간의 representation, \(W^{i}_V, W^{i}_K, W^{i}_Q\)는 학습 가능한 projection matrix이다. +\(Q, K, V\) 는 attention의 query, key, value에 해당하며

+
+\[ +Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d}})\cdot V +\]
+

로 연산이 진행된다. 학습을 위한 loss 함수는 다음과 같이표현된다.

+
+\[ +\mathcal{L}_{LDM} = \mathbb{E}_{\mathcal{E}(x), +\epsilon \sim \mathcal{N}(0,1),t} \left[ \|\epsilon-\epsilon_{\theta}(z_t,t) \|_{2}^{2}\right]. +\]
+

여기서 주목할만한 부분은 기존 Diffusion Model에서

+
+\[ +\mathcal{L}_{DM} = \mathbb{E}_{x, +\epsilon \sim \mathcal{N}(0,1),t} \left[ \|\epsilon-\epsilon_{\theta}(x_t,t) \|_{2}^{2}\right]. +\]
+

와 같은 loss function으로 학습을 진행시키는데 \(x_t\)\(z_t\)로 바꾸면서 연산의 양을 줄였다는 점이다.

+
+
+

Experiments#

+

해당 논문에서는 다양한 task에 대해서 실험을 진행하였는데, 그중 일부만 소개하도록 하겠다. +아래의 그림은 다양한 dataset에서 뽑은 샘플과 text to image sample들입니다.

+
+../../_images/experiment1.png +
+

Fig. 148 Sample images#

+
+
+
+../../_images/text_to_image.png +
+

Fig. 149 text to image on LAION#

+
+
+

실험을 통해서 나온 결과 \(m=2,3,4\) 혹은 \(f=4, 8, 16\)인 경우 적절한 FID 점수와 효율성을 보여주었습니다.

+
+../../_images/trade_off.png +
+

Fig. 150 text to image on LAION#

+
+
+

Layout이 주어졌을 때, 이를 기반으로 image를 생성하는 layout-to-image의 샘플 결과입니다.

+
+../../_images/layout_to_image.png +
+

Fig. 151 layout-to-image#

+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/LoRA.html b/docs/review/LoRA.html old mode 100644 new mode 100755 index 50bb1812..b15a6d92 --- a/docs/review/LoRA.html +++ b/docs/review/LoRA.html @@ -1,917 +1,936 @@ - - - - - - - - - - - - LoRA — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

LoRA#

-
-
-

0. Abstract#

-

LoRA는 PEFT(Parameter Effecient Fine-Tuning)의 기법 중 하나이다. Pre-trained model의 weight는 고정한 채로, 몇 개의 dense(fc) layer만 학습시켜 downstream task의 연산량을 줄일 수 있다. GPT-3을 기준으로 parameter는 10000배, GPU 메모리는 3배를 줄일 수 있다. 또한 inference 과정에서 추가적인 latency가 없음

-
-
    -
  • PEFT: 모델의 모든 파라미터를 튜닝하는 것이 아닌 일부 파라미터만을 튜닝함으로써 모델의 성능을 적은 자원으로도 높게 유지하는 방법론

  • -
-
-
    -
  • Downstream task: pre-trained model을 사용해, 어떤 문제를 해결하기 위해 fine-tuning 하는것

  • -
  • Upstream task: Pre-train model을 학습시키는것

  • -
  • Latency: 어떤 요청의 시작부터 완료까지 걸리는 시간

  • -
-
-
-
-

1. Introduction#

-

LLM은 기본적으로 pre-trained model을 특정 task에 맞게 fine-tuning을 시킴. 하지만 fine-tuning에서 모든 weight를 다시 학습시키면 GPT-2, GPT-3, RoBERTa 등 큰 모델의 경우 학습에 몇 달이 걸림.

-

이전 연구에서 over-parameterized model들은 low intrinsic dimension에 기반하고 있다는 사실에 기반해, 저자는 학습 과정에서도 모델은 low intrinsic rank을 갖고 있을 것이라 가정함.

-

LoRA는 기존 pre-trained weight는 고정하고, 몇 개의 dense layer만 rank decomposition matrices를 최적화하는 방식으로 학습시키기로 함.

-
-LoRA_00 -
-

Fig. 176 LoRA structure#

-
-
-
-LoRA_01 -
-

Fig. 177 LoRA structure 2#

-
-
-

위 그림처럼 기존 pre-trained weight \(W\)는 고정하고 low rank decomposition된 weight \(A, B\)만 학습시켜 \(W\)에 더해줌. \(A, B\)의 크기는 \(W\)보다 작아 time, computational cost를 최대 3배까지 줄일 수 있음. 또한 task에 따라 LoRA module(\(A, B\))만 바꿔주면 되기 때문에 storage requirement, task-switching overhead를 줄일 수 있음. 이 외에도 추가적인 inference latency가 없다, 다른 기법들과 함께 적용이 가능하다는 장점이 있음.

-
-

1.1. Terminologies and Conventions#

-
    -
  • \(d_{model}\): Transformer의 input/output dimension size

  • -
  • \(W_q, W_k, W_v, W_o\): Self-attention module의 query/key/value/output projection matrices

  • -
  • \(W, W_0\): Pre-trained weight

  • -
  • \(\Delta W\): Adaptation 중 accumulated된 gradient update

  • -
  • \(r\): LoRA module의 rank

  • -
  • 이전 연구의 convention을 사용하고 optimizer는 Adam을 이용

  • -
  • Transformer MLP feedforward dimension \(d_{ffn} = 4 \times d_{model}\)

  • -
-
-
-
-
-

2. Problem Statement#

-

LoRA는 agnostic하지만 본 논문에서는 language model에 집중함.

-
-
    -
  • agnostic: model에 구애받지 않고 해석이 가능함

  • -
-
-
-\[ -\max _{\Phi} \sum_{(x, y) \in \mathcal{Z}} \sum_{t=1}^{|y|} \log \left(P_{\Phi}\left(y_t \mid x, y_{<t}\right)\right) -\]
-
    -
  • \(P_{\Phi}\left(y \mid x\right)\): \(\Phi\)로 parameterized된 pre-trained model

  • -
  • \(\mathcal{Z} = \{(x_i, y_i)\}_{i=1,...,N}\): context-target쌍으로 된 학습 데이터셋, \(x_i, y_i\)는 token sequence

  • -
-

Fine-tuning 과정에서 model은 \(\Phi_0\)으로 init.되고 objective를 maximize하기 위해 \(\Phi_0 + \Delta \Phi\) 로 업데이트됨. 각 downstream task를 위해 매번 \(|\Phi_0|\)와 같은 크기의 \(|\Delta \Phi|\)를 학습해 엄청난 cost가 발생.

-
-\[ -\max _{\Theta} \sum_{(x, y) \in \mathcal{Z}} \sum_{t=1}^{|y|} \log \left(p_{\Phi_0+\Delta \Phi(\Theta)}\left(y_t \mid x, y_{<t}\right)\right) -\]
-

반면 위와 같은 LoRA 방식으로 fine-tuning할 경우 \(|\Phi_0|\) 전체가 아니라 그보다 작은 \(|\Theta|\)를 찾아내는 방식으로 바뀌기 때문에 compute-/memory-effecient해짐. \(|\Theta|\)는 최대 \(|\Phi_0|\)의 0.01%까지 작아질 수 있음.

-
-
-
-

3. Aren’t Existing Solutions Good Enough?#

-

기존에도 transfer learning에서 parameter-/compute-effecient를 위한 방법은 몇 가지가 있었음.

-
-LoRA_02 -
-

Fig. 178 Performance Comparison#

-
-
-

하지만 adapter layer를 추가하는 방식은 hardware parellelism이 없다면 작은 bottleneck layer만 추가해도 latency가 상당히 증가해 사용하기 어려웠음.

-

Prefix tuning은 optimize가 어려웠음.

-
-
-
-

4. Our Method#

-
-

4.1. Low-Rank-Parameterized Update Matrices#

-
-\[ -h=W_0 x+\Delta W x=W_0 x+B A x -\]
-
    -
  • \(W_0 \in \mathbb{R}^{d \times k}\)

  • -
  • \(B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times k}\)

  • -
  • \(r \ll min(d,k)\)

  • -
-

\(W_0\)는 고정하고 \(A, B\)만 학습. 이후 \(W_0\)\(\Delta W = BA\)는 같은 input \(x\)에 곱해진 후 output vector끼리 coordinate-wise하게 sum.

-

\(A\)는 random Gaussian init., \(B\)는 zero-init.이라 \(\Delta W\) 또한 처음에는 zero-init. \(\Delta W x\)\(\alpha/x\)로 scaling됨. \(\alpha\)는 learning rate처럼 tuning해서 r과 같은 값으로 설정. 실제 코드에서는 보통 \(r, \alpha\)는 (8, 16)이나 (16,32)를 사용한다고 함.

-
	...
-        # Actual trainable parameters
-    	# define A, B
-        if r > 0:
-            self.lora_A = nn.Parameter(self.weight.new_zeros((r, num_embeddings)))
-            self.lora_B = nn.Parameter(self.weight.new_zeros((embedding_dim, r)))
-            self.scaling = self.lora_alpha / self.r
-            # Freezing the pre-trained weight matrix
-            self.weight.requires_grad = False
-        self.reset_parameters()
-
-	# initialize A, B
-    def reset_parameters(self):
-        nn.Embedding.reset_parameters(self)
-        if hasattr(self, 'lora_A'):
-            # initialize A the same way as the default for nn.Linear and B to zero
-            nn.init.zeros_(self.lora_A)
-            nn.init.normal_(self.lora_B)
-
-    def train(self, mode: bool = True):
-        nn.Embedding.train(self, mode)
-        if mode:
-            if self.merge_weights and self.merged:
-                # Make sure that the weights are not merged
-                if self.r > 0:
-                    self.weight.data -= (self.lora_B @ self.lora_A).transpose(0, 1) * self.scaling
-                self.merged = False
-        else:
-            if self.merge_weights and not self.merged:
-                # Merge the weights and mark it
-                if self.r > 0:
-                    self.weight.data += (self.lora_B @ self.lora_A).transpose(0, 1) * self.scaling
-                self.merged = True
-        
-    def forward(self, x: torch.Tensor):
-        if self.r > 0 and not self.merged:
-        	# pre-trained weight W_0 * x
-            result = nn.Embedding.forward(self, x)
-            if self.r > 0:
-            	# BA * x
-                after_A = F.embedding(
-                    x, self.lora_A.transpose(0, 1), self.padding_idx, self.max_norm,
-                    self.norm_type, self.scale_grad_by_freq, self.sparse
-                )
-                # W_0x + BAx
-                result += (after_A @ self.lora_B.transpose(0, 1)) * self.scaling
-            return result
-        else:
-            return nn.Embedding.forward(self, x)
-
-
-
-
-

4.1.1. No Additional Inference Latency#

-

LoRA를 이용하면 inference시 latency 성능 하락이 없음. 또한 다른 task에 사용할 경우엔 \(BA\)만 제외하고 \(W_0\)로 학습한 다른 \(B'A'\)만 추가하면 되기 때문에 memory overhead가 낮음.

-
-
-
-

4.2. Applying LoRA to Transformer#

-

본 논문에서는 trainable weight를 최소화하기 위해 LoRA를 attention weight만 적용하고 MLP module은 고정함. 이를 통해 GPT-3 175B를 기준으로 VRAM은 1.2TB에서 350GB, checkpoint size는 350GB에서 35MB로 줄임. 또한 학습 속도 또한 25% 정도 빨라짐.

-
-
-
-
-

5.Empirical Experiments#

-
-LoRA_03 -
-

Fig. 179 Performance on BERT#

-
-
-
-LoRA_04 -
-

Fig. 180 Performance on GPT-2#

-
-
-
-LoRA_05 -
-

Fig. 181 Performance on GPT-3#

-
-
-

대부분의 경우에서 성능이 좋음

-
-LoRA_06 -
-

Fig. 182 Validation accuracy table with different hyper-parameters#

-
-
-
-LoRA_07 -
-

Fig. 183 Validation accuracy table with different hyper-parameters#

-
-
-

Transformer에서 한 projection matrix에 큰 r을 적용하는 것보다 모든 matrices에 작은 r을 적용하는 것이 더 성능이 좋았음.

-
-
-
-

+a) IA3#

-
-LoRA_08 -
-

Fig. 184 IA3 structure#

-
-
-

뉴럴네트워크의 Inner Activation을 줄이기도하고 늘리기도하는 어댑터를 중간에 삽입하는 방법론. 기존에 공개된 LoRA보다 적은 파라미터를 사용하면서 높은 성능을 내는 것으로 알려져있으며, GPT-3를 in-context learning 했을때 보다도 성능이 좋다 라고 주장하고 있음. 학습시간도 매우 짧아 A100 GPU 하나로 30분만에 튜닝할 수 있었다고 함.

-
-
-
-

+aa) LoRA 사용법#

-
    -
  1. loralib 설치

  2. -
-
pip install loralib
-# Alternatively
-# pip install git+https://github.com/microsoft/LoRA
-
-
-
    -
  1. 기존 nn.Linear, nn.Embedding, nn.Conv2dlora.~로 대체

  2. -
-
# ===== Before =====
-# layer = nn.Linear(in_features, out_features)
-
-# ===== After ======
-import loralib as lora
-# Add a pair of low-rank adaptation matrices with rank r=16
-layer = lora.Linear(in_features, out_features, r=16)
-
-
-
    -
  1. 학습 전, lora parameter만 학습 가능하게 설정

  2. -
-
import loralib as lora
-model = BigModel()
-# This sets requires_grad to False for all parameters without the string "lora_" in their names
-lora.mark_only_lora_as_trainable(model)
-# Training loop
-for batch in dataloader:
-   ...
-
-
-
    -
  1. checkpoint를 저장할 때엔 state_dict가 LoRA parameter만 저장하게 함.

  2. -
-
# ===== Before =====
-# torch.save(model.state_dict(), checkpoint_path)
-# ===== After =====
-torch.save(lora.lora_state_dict(model), checkpoint_path)
-
-
-
    -
  1. checkpoint를 불러올 때엔 load_state_dict에서 strict=False로 설정.

  2. -
-
# Load the pretrained checkpoint first
-model.load_state_dict(torch.load('ckpt_pretrained.pt'), strict=False)
-# Then load the LoRA checkpoint
-model.load_state_dict(torch.load('ckpt_lora.pt'), strict=False)
-
-
-
-
-
-

Reference#

- -
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + LoRA — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

LoRA#

+
+
+

0. Abstract#

+

LoRA는 PEFT(Parameter Effecient Fine-Tuning)의 기법 중 하나이다. Pre-trained model의 weight는 고정한 채로, 몇 개의 dense(fc) layer만 학습시켜 downstream task의 연산량을 줄일 수 있다. GPT-3을 기준으로 parameter는 10000배, GPU 메모리는 3배를 줄일 수 있다. 또한 inference 과정에서 추가적인 latency가 없음

+
+
    +
  • PEFT: 모델의 모든 파라미터를 튜닝하는 것이 아닌 일부 파라미터만을 튜닝함으로써 모델의 성능을 적은 자원으로도 높게 유지하는 방법론

  • +
+
+
    +
  • Downstream task: pre-trained model을 사용해, 어떤 문제를 해결하기 위해 fine-tuning 하는것

  • +
  • Upstream task: Pre-train model을 학습시키는것

  • +
  • Latency: 어떤 요청의 시작부터 완료까지 걸리는 시간

  • +
+
+
+
+

1. Introduction#

+

LLM은 기본적으로 pre-trained model을 특정 task에 맞게 fine-tuning을 시킴. 하지만 fine-tuning에서 모든 weight를 다시 학습시키면 GPT-2, GPT-3, RoBERTa 등 큰 모델의 경우 학습에 몇 달이 걸림.

+

이전 연구에서 over-parameterized model들은 low intrinsic dimension에 기반하고 있다는 사실에 기반해, 저자는 학습 과정에서도 모델은 low intrinsic rank을 갖고 있을 것이라 가정함.

+

LoRA는 기존 pre-trained weight는 고정하고, 몇 개의 dense layer만 rank decomposition matrices를 최적화하는 방식으로 학습시키기로 함.

+
+LoRA_00 +
+

Fig. 176 LoRA structure#

+
+
+
+LoRA_01 +
+

Fig. 177 LoRA structure 2#

+
+
+

위 그림처럼 기존 pre-trained weight \(W\)는 고정하고 low rank decomposition된 weight \(A, B\)만 학습시켜 \(W\)에 더해줌. \(A, B\)의 크기는 \(W\)보다 작아 time, computational cost를 최대 3배까지 줄일 수 있음. 또한 task에 따라 LoRA module(\(A, B\))만 바꿔주면 되기 때문에 storage requirement, task-switching overhead를 줄일 수 있음. 이 외에도 추가적인 inference latency가 없다, 다른 기법들과 함께 적용이 가능하다는 장점이 있음.

+
+

1.1. Terminologies and Conventions#

+
    +
  • \(d_{model}\): Transformer의 input/output dimension size

  • +
  • \(W_q, W_k, W_v, W_o\): Self-attention module의 query/key/value/output projection matrices

  • +
  • \(W, W_0\): Pre-trained weight

  • +
  • \(\Delta W\): Adaptation 중 accumulated된 gradient update

  • +
  • \(r\): LoRA module의 rank

  • +
  • 이전 연구의 convention을 사용하고 optimizer는 Adam을 이용

  • +
  • Transformer MLP feedforward dimension \(d_{ffn} = 4 \times d_{model}\)

  • +
+
+
+
+
+

2. Problem Statement#

+

LoRA는 agnostic하지만 본 논문에서는 language model에 집중함.

+
+
    +
  • agnostic: model에 구애받지 않고 해석이 가능함

  • +
+
+
+\[ +\max _{\Phi} \sum_{(x, y) \in \mathcal{Z}} \sum_{t=1}^{|y|} \log \left(P_{\Phi}\left(y_t \mid x, y_{<t}\right)\right) +\]
+
    +
  • \(P_{\Phi}\left(y \mid x\right)\): \(\Phi\)로 parameterized된 pre-trained model

  • +
  • \(\mathcal{Z} = \{(x_i, y_i)\}_{i=1,...,N}\): context-target쌍으로 된 학습 데이터셋, \(x_i, y_i\)는 token sequence

  • +
+

Fine-tuning 과정에서 model은 \(\Phi_0\)으로 init.되고 objective를 maximize하기 위해 \(\Phi_0 + \Delta \Phi\) 로 업데이트됨. 각 downstream task를 위해 매번 \(|\Phi_0|\)와 같은 크기의 \(|\Delta \Phi|\)를 학습해 엄청난 cost가 발생.

+
+\[ +\max _{\Theta} \sum_{(x, y) \in \mathcal{Z}} \sum_{t=1}^{|y|} \log \left(p_{\Phi_0+\Delta \Phi(\Theta)}\left(y_t \mid x, y_{<t}\right)\right) +\]
+

반면 위와 같은 LoRA 방식으로 fine-tuning할 경우 \(|\Phi_0|\) 전체가 아니라 그보다 작은 \(|\Theta|\)를 찾아내는 방식으로 바뀌기 때문에 compute-/memory-effecient해짐. \(|\Theta|\)는 최대 \(|\Phi_0|\)의 0.01%까지 작아질 수 있음.

+
+
+
+

3. Aren’t Existing Solutions Good Enough?#

+

기존에도 transfer learning에서 parameter-/compute-effecient를 위한 방법은 몇 가지가 있었음.

+
+LoRA_02 +
+

Fig. 178 Performance Comparison#

+
+
+

하지만 adapter layer를 추가하는 방식은 hardware parellelism이 없다면 작은 bottleneck layer만 추가해도 latency가 상당히 증가해 사용하기 어려웠음.

+

Prefix tuning은 optimize가 어려웠음.

+
+
+
+

4. Our Method#

+
+

4.1. Low-Rank-Parameterized Update Matrices#

+
+\[ +h=W_0 x+\Delta W x=W_0 x+B A x +\]
+
    +
  • \(W_0 \in \mathbb{R}^{d \times k}\)

  • +
  • \(B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times k}\)

  • +
  • \(r \ll min(d,k)\)

  • +
+

\(W_0\)는 고정하고 \(A, B\)만 학습. 이후 \(W_0\)\(\Delta W = BA\)는 같은 input \(x\)에 곱해진 후 output vector끼리 coordinate-wise하게 sum.

+

\(A\)는 random Gaussian init., \(B\)는 zero-init.이라 \(\Delta W\) 또한 처음에는 zero-init. \(\Delta W x\)\(\alpha/x\)로 scaling됨. \(\alpha\)는 learning rate처럼 tuning해서 r과 같은 값으로 설정. 실제 코드에서는 보통 \(r, \alpha\)는 (8, 16)이나 (16,32)를 사용한다고 함.

+
	...
+        # Actual trainable parameters
+    	# define A, B
+        if r > 0:
+            self.lora_A = nn.Parameter(self.weight.new_zeros((r, num_embeddings)))
+            self.lora_B = nn.Parameter(self.weight.new_zeros((embedding_dim, r)))
+            self.scaling = self.lora_alpha / self.r
+            # Freezing the pre-trained weight matrix
+            self.weight.requires_grad = False
+        self.reset_parameters()
+
+	# initialize A, B
+    def reset_parameters(self):
+        nn.Embedding.reset_parameters(self)
+        if hasattr(self, 'lora_A'):
+            # initialize A the same way as the default for nn.Linear and B to zero
+            nn.init.zeros_(self.lora_A)
+            nn.init.normal_(self.lora_B)
+
+    def train(self, mode: bool = True):
+        nn.Embedding.train(self, mode)
+        if mode:
+            if self.merge_weights and self.merged:
+                # Make sure that the weights are not merged
+                if self.r > 0:
+                    self.weight.data -= (self.lora_B @ self.lora_A).transpose(0, 1) * self.scaling
+                self.merged = False
+        else:
+            if self.merge_weights and not self.merged:
+                # Merge the weights and mark it
+                if self.r > 0:
+                    self.weight.data += (self.lora_B @ self.lora_A).transpose(0, 1) * self.scaling
+                self.merged = True
+        
+    def forward(self, x: torch.Tensor):
+        if self.r > 0 and not self.merged:
+        	# pre-trained weight W_0 * x
+            result = nn.Embedding.forward(self, x)
+            if self.r > 0:
+            	# BA * x
+                after_A = F.embedding(
+                    x, self.lora_A.transpose(0, 1), self.padding_idx, self.max_norm,
+                    self.norm_type, self.scale_grad_by_freq, self.sparse
+                )
+                # W_0x + BAx
+                result += (after_A @ self.lora_B.transpose(0, 1)) * self.scaling
+            return result
+        else:
+            return nn.Embedding.forward(self, x)
+
+
+
+
+

4.1.1. No Additional Inference Latency#

+

LoRA를 이용하면 inference시 latency 성능 하락이 없음. 또한 다른 task에 사용할 경우엔 \(BA\)만 제외하고 \(W_0\)로 학습한 다른 \(B'A'\)만 추가하면 되기 때문에 memory overhead가 낮음.

+
+
+
+

4.2. Applying LoRA to Transformer#

+

본 논문에서는 trainable weight를 최소화하기 위해 LoRA를 attention weight만 적용하고 MLP module은 고정함. 이를 통해 GPT-3 175B를 기준으로 VRAM은 1.2TB에서 350GB, checkpoint size는 350GB에서 35MB로 줄임. 또한 학습 속도 또한 25% 정도 빨라짐.

+
+
+
+
+

5.Empirical Experiments#

+
+LoRA_03 +
+

Fig. 179 Performance on BERT#

+
+
+
+LoRA_04 +
+

Fig. 180 Performance on GPT-2#

+
+
+
+LoRA_05 +
+

Fig. 181 Performance on GPT-3#

+
+
+

대부분의 경우에서 성능이 좋음

+
+LoRA_06 +
+

Fig. 182 Validation accuracy table with different hyper-parameters#

+
+
+
+LoRA_07 +
+

Fig. 183 Validation accuracy table with different hyper-parameters#

+
+
+

Transformer에서 한 projection matrix에 큰 r을 적용하는 것보다 모든 matrices에 작은 r을 적용하는 것이 더 성능이 좋았음.

+
+
+
+

+a) IA3#

+
+LoRA_08 +
+

Fig. 184 IA3 structure#

+
+
+

뉴럴네트워크의 Inner Activation을 줄이기도하고 늘리기도하는 어댑터를 중간에 삽입하는 방법론. 기존에 공개된 LoRA보다 적은 파라미터를 사용하면서 높은 성능을 내는 것으로 알려져있으며, GPT-3를 in-context learning 했을때 보다도 성능이 좋다 라고 주장하고 있음. 학습시간도 매우 짧아 A100 GPU 하나로 30분만에 튜닝할 수 있었다고 함.

+
+
+
+

+aa) LoRA 사용법#

+
    +
  1. loralib 설치

  2. +
+
pip install loralib
+# Alternatively
+# pip install git+https://github.com/microsoft/LoRA
+
+
+
    +
  1. 기존 nn.Linear, nn.Embedding, nn.Conv2dlora.~로 대체

  2. +
+
# ===== Before =====
+# layer = nn.Linear(in_features, out_features)
+
+# ===== After ======
+import loralib as lora
+# Add a pair of low-rank adaptation matrices with rank r=16
+layer = lora.Linear(in_features, out_features, r=16)
+
+
+
    +
  1. 학습 전, lora parameter만 학습 가능하게 설정

  2. +
+
import loralib as lora
+model = BigModel()
+# This sets requires_grad to False for all parameters without the string "lora_" in their names
+lora.mark_only_lora_as_trainable(model)
+# Training loop
+for batch in dataloader:
+   ...
+
+
+
    +
  1. checkpoint를 저장할 때엔 state_dict가 LoRA parameter만 저장하게 함.

  2. +
+
# ===== Before =====
+# torch.save(model.state_dict(), checkpoint_path)
+# ===== After =====
+torch.save(lora.lora_state_dict(model), checkpoint_path)
+
+
+
    +
  1. checkpoint를 불러올 때엔 load_state_dict에서 strict=False로 설정.

  2. +
+
# Load the pretrained checkpoint first
+model.load_state_dict(torch.load('ckpt_pretrained.pt'), strict=False)
+# Then load the LoRA checkpoint
+model.load_state_dict(torch.load('ckpt_lora.pt'), strict=False)
+
+
+
+
+
+

Reference#

+ +
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/Make_A_Video.html b/docs/review/Make_A_Video.html old mode 100644 new mode 100755 index 295fa28d..e2dbd6d8 --- a/docs/review/Make_A_Video.html +++ b/docs/review/Make_A_Video.html @@ -1,1167 +1,1186 @@ - - - - - - - - - - - - Make A Video — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

Make A Video#

- - -
-

1. Introduction#

-
-

Make-A-video 제안 배경#

-
    -
  • T2I 모델링을 할 수 있는 데이터는 인터넷을 통해 확보될 수 있으나, 비슷한 규모의 텍스트 비디오 데이터셋을 수집하기는 어렵다.

  • -
  • T2I 모델이 존재하는데 T2V 모델을 처음부터 학습 시키는 것은 낭비일 수 있다.

  • -
  • 비지도 학습을 사용하여 더 많은 데이터를 학습할 수 있다.

  • -
-
-
-

Make-A-video 특성#

-
    -
  • T2I 모델을 활용하여, 레이블이 지정되지 않은 비디오 데이터에 대해 비지도 학습을 사용하여 학습한다 → 페어링된 텍스트-비디오 데이터 없이도 텍스트에서 비디오를 생성할 수 있다.

  • -
  • 텍스트 없이도 비지도 비디오만으로 세상의 다양한 개체가 어떻게 움직이고 상호 작용하는지 학습할 수 있다.

  • -
-
-
-

Contribution#

-
    -
  • 디퓨전 기반의 T2I 모델을 T2V로 확장하는 효과적인 방법인 Make-A-Video를 소개한다.

  • -
  • Text-to-image 를 prior로 사용하여 text-video 데이터의 필요성을 우회한다.

  • -
  • 고화질, 고프레임률 비디오를 생성하는 super-resolution 전략을 제안한다.

  • -
  • Make-A-Video를 기존 T2V 시스템과 비교하여 평가한다. 또한, 제로샷 T2V human evaluation을 위해 300개의 프롬프트 테스트 세트를 수집하여 공개할 계획이다.

  • -
-
-
-
-

2. Previous Work#

-
-
-

3. Method#

-
    -
  • Make-A-Video의 주요 요소

    -
      -
    1. 텍스트-이미지 쌍으로 학습된 base T2I 모델

    2. -
    3. 신경망의 블록을 시간 차원으로 확장하는 시공간 convolution 및 attention layer

    4. -
    5. 두 시공간 layer로 구성된 시공간 신경망과 높은 프레임 속도 생성을 위한 frame interpolation network

    6. -
    -
  • -
  • Make-A-Video의 최종 inference 수식

    -
    -make_a_video_00 -
    -

    Fig. 489 최종 inference 수식#

    -
    -
    -
      -
    • \(SR_h\): spatial super-resolution network

    • -
    • \(SR^t_l\): spatiotemporal super-resolution network

    • -
    • \(\uparrow_{F}\): frame interpolation network

    • -
    • \(D^t\): spatiotemporal decoder

    • -
    • \(P\): prior network

    • -
    • \(\hat{x}\): BPE-encoded text

    • -
    • \(C_x\): CLIP text encoder

    • -
    • \(x\): input text

    • -
    -
  • -
-
-

3.1. Text-To-Image Model#

-
    -
  • “Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding(Imagen)”와 연구 내용을 공유하였다.

  • -
  • Imagen

    -
    -make_a_video_01 -
    -

    Fig. 490 Imagen 구조#

    -
    -
    -
  • -
  • 고해상도 이미지를 만들기 위해 사용한 네트워크

    -
      -
    • A prior Network \(P\): 텍스트 임베딩 \(x_e\)와 BPE encoded text tokens \(\hat{x}\)이 주어졌을 때 이미지 임베딩 \(y_e\)를 생성하는 네트워크

    • -
    • Decoder Network \(D\): 이미지 임베딩 \(y_e\)로부터 저해상도 64X64 RGB 이미지 \(\hat{y}_l\)를 생성하는 네트워크

    • -
    • Super-resolution network \(SR_l\), \(SR_h\): D에서 생성된 이미지 64X64 저해상도 이미지 \(\hat{y}_l\)를 256X256, 768X768 픽셀로 증가시켜 최종 이미지 \(\hat{y}\)를 만드는 네트워크

      -
      -make_a_video_02 -
      -

      Fig. 491 text \(x\)가 prior \(P\)를 통해 image embedding 변환된다. -fps: desired frame rate#

      -
      -
      -
    • -
    -
  • -
-
-
-

3.2. Spatiotemporal Layers#

-
    -
  • 2차원 조건부 네트워크를 시간적 차원으로 확장하기 위해 다음의 구성 요소를 수정한다.

    -
      -
    • Convolutional layers

    • -
    • Attention layers

    • -
    -
  • -
  • Fully-connected layers는 특별한 수정을 할 필요 없이 시간 정보만 추가해주면 된다.

  • -
  • 구성 요소 수정 결과 \(D^t\)는 64X64 사이즈의 16 RGB frame을 만들게 된다.

  • -
  • Frame interpolation network \(\uparrow_{F}\)가 생성된 16개의 프레임과 super-resolution 네트워크 \(SR^t_l\) 사이를 보간하여 프레임 속도를 증가시킨다.

  • -
  • Super-resolution 네트워크에는 hallucinating information(환각 정보)가 포함 된다. 깜박이는 잔상이 생기지 않으려면, 환각이 프레임 전체에 걸쳐 일관성을 유지해야 한다.

    -
      -
    • Hallucinating information

      -

      실제로 존재하지 않는 정보나 세부 사항을 생성하거나 가상으로 추가하는 것

      -
    • -
    -
  • -
  • 프레임당 super resolution을 수행하는 것보다 spatiotemporal 모듈인 \(SR^t_l\)가 더 좋은 성능을 보였다.

  • -
  • 하지만, \(SR_h\)를 위와 같은 모듈로 만들기엔 메모리 및 컴퓨팅 제약과 고해상도 비디오 데이터의 부족으로 \(SR_h\)를 위와 같이 시간적 차원으로 확장하는 것은 어려웠다 → \(SR_h\)는 공간적 차원에서 작동한다.( 각 프레임에 대해 동일한 노이즈 초기화를 사용하여 프레임 전반에 걸쳐 일관된 환각을 제공함)

  • -
-
-

3.2.1 Pseudo-3D convolutional layers#

-
-make_a_video_03 -
-

Fig. 492 Architecture of Pseudo-3D convolutional layers#

-
-
-
    -
  • 2D 컨벌루션 레이어 다음에 1D 컨벌루션을 쌓는다 (Cf:separable convolution)

    -
      -
    • 3D 컨벌루션의 계산 load를 줄일 수 있다.

    • -
    • 사전 학습된 2D 컨볼루션 레이어와 새로 초기화된 1D 컨벌루션 레이어 사이에 명확한 경계를 생성하여, spatial information을 유지한 채 temporal convolution을 처음부터 학습할 수 있게 한다.

    • -
    -
  • -
  • Pseudo-3D convolutional layer

    -
    -make_a_video_04 -
    -

    Fig. 493 Pseudo-3D convolutional layer#

    -
    -
    -
      -
    • \(h\): 입력 텐서 (dimension: \(B\)(batch),\(C\)(channels),\(F\)(frames),\(H\)(height),\(W\)(width))

    • -
    • \(\text{o}T\): transpose operator (spatial ↔ temporal)

    • -
    • \(Conv_{2_D}\)는 pretrained T2I 모델에서 초기화 되고, \(Conv_{1_D}\)는 identity 함수로 초기화 된다.

    • -
    -
  • -
-
-
-

3.2.2. Psuedo-3D attention layers#

-
-make_a_video_05 -
-

Fig. 494 Architecture of Pseudo-3D attention layers#

-
-
-
    -
  • “Video Diffusion Models**”**에 영감을 받아 dimension decomposition 전략을 attention layer에 확장하였다.

  • -
  • Pseudo-3D convolutional layer처럼 각각의 spatial attenion layer를 쌓아, 전체 spatiotemporal attention layer를 근사화하는 temporal attention layer를 쌓는다.

  • -
  • Pseudo-3D attention layer

    -
    -make_a_video_06 -
    -

    Fig. 495 Pseudo-3D attention layer#

    -
    -
    -
      -
    • \(h\): 입력 텐서 (dimension: \(B\)(batch),\(C\)(channels),\(F\)(frames),\(H\)(height),\(W\)(width))

    • -
    • flatten: spatial dimension 축에 대해 flatten하는 연산 (결과 dimension: \(B\),\(C\),\(F\),\(HW\))

    • -
    • \(ATTN_{2D}\)는 pretrained T2I 모델에서 초기화되고, \(ATTN_{1D}\)는 identity function으로 초기화 된다.

    • -
    • Code

      -
      class SpatioTemporalAttention(nn.Module):
      -    def __init__(
      -        self,
      -        dim,
      -        *,
      -        dim_head = 64,
      -        heads = 8,
      -        add_feed_forward = True,
      -        ff_mult = 4,
      -        pos_bias = True,
      -        flash = False,
      -        causal_time_attn = False
      -    ):
      -        super().__init__()
      -        assert not (flash and pos_bias), 'learned positional attention bias is not compatible with flash attention'
      -
      -        self.spatial_attn = Attention(dim = dim, dim_head = dim_head, heads = heads, flash = flash)
      -        self.spatial_rel_pos_bias = ContinuousPositionBias(dim = dim // 2, heads = heads, num_dims = 2) if pos_bias else None
      -
      -        self.temporal_attn = Attention(dim = dim, dim_head = dim_head, heads = heads, flash = flash, causal = causal_time_attn)
      -        self.temporal_rel_pos_bias = ContinuousPositionBias(dim = dim // 2, heads = heads, num_dims = 1) if pos_bias else None
      -
      -        self.has_feed_forward = add_feed_forward
      -        if not add_feed_forward:
      -            return
      -
      -        self.ff = FeedForward(dim = dim, mult = ff_mult)
      -
      -    def forward(
      -        self,
      -        x,
      -        enable_time = True
      -    ):
      -        b, c, *_, h, w = x.shape
      -        is_video = x.ndim == 5
      -        enable_time &= is_video
      -
      -        if is_video:
      -            x = rearrange(x, 'b c f h w -> (b f) (h w) c') #[bXf, hXw, c]
      -        else:
      -            x = rearrange(x, 'b c h w -> b (h w) c')#[b, hXw, c]
      -
      -        space_rel_pos_bias = self.spatial_rel_pos_bias(h, w) if exists(self.spatial_rel_pos_bias) else None
      -
      -        x = self.spatial_attn(x, rel_pos_bias = space_rel_pos_bias) + x
      -
      -        if is_video:
      -            x = rearrange(x, '(b f) (h w) c -> b c f h w', b = b, h = h, w = w)
      -        else:
      -            x = rearrange(x, 'b (h w) c -> b c h w', h = h, w = w)
      -
      -        if enable_time:
      -
      -            x = rearrange(x, 'b c f h w -> (b h w) f c') #[bXhXw, f, c] 
      -
      -            time_rel_pos_bias = self.temporal_rel_pos_bias(x.shape[1]) if exists(self.temporal_rel_pos_bias) else None
      -
      -            x = self.temporal_attn(x, rel_pos_bias = time_rel_pos_bias) + x
      -
      -            x = rearrange(x, '(b h w) f c -> b c f h w', w = w, h = h)
      -
      -        if self.has_feed_forward:
      -            x = self.ff(x, enable_time = enable_time) + x
      -
      -        return x
      -
      -
      -
    • -
    -
  • -
  • Frame rate conditioning

    -
      -
    • 비디오의 초당 프레임 수를 나타내는 추가 컨디셔닝 파라미터 \(fps\)를 추가한다.

    • -
    -
  • -
-
-
-
-

3.3 Frame Interpolation Network#

-
    -
  • ↑F (Frame Interpolation Network)란?

    -
      -
    • 생성된 프레임 수를 증가시켜, 생성된 비디오를 더 부드럽게 만들고 비디오 길이를 연장 시킬 수 있는 네트워크

    • -
    • 프레임을 보간하고 extrapolation을 하는 네트워크

      -
        -
      • Extrapolation: 주어진 데이터 또는 정보를 사용하여 미래의 값을 예측하거나 확장

      • -
      -
    • -
    -
  • -
  • ↑F (Frame Interpolation Network) 동작

    -
      -
    • Spatialtemporal decoder \(D^t\)에서 마스크 처리된 입력 프레임을 제로 패딩하고 비디오 업샘플링을 적용하여 masked frame interpolation을 파인 튜닝한다.

    • -
    • 파인 튜닝할 때 U-Net의 입력에 4개의 채널을 추가한다.

      -
        -
      • RGB 마스킹 비디오 입력을 위한 3개의 채널과 마스킹되는 프레임을 나타내는 추가 바이너리 채널

      • -
      -
    • -
    • 다양한 frame-skips과 \(fps\)에 대해 파인튜닝하여 추론시 여러 temporal upsample rate를 제공한다.

    • -
    -
  • -
  • 본 논문의 모든 실험에서는 ↑F를 frame skip 5로 적용하여 16프레임 비디오를 76프레임((16-1)X5+1)으로 업샘플링 하였다.

  • -
  • 비디오 시작 또는 끝 프레임을 마스킹하여 비디오 추정 또는 이미지 애니메이션에도 사용할 수 있다.

  • -
-
-
-

3.4 Training#

-
    -
  • 위에서 설명한 구성 요소들은 독립적으로 학습 된다.

  • -
  • 훈련 과정

    -
      -
    1. Prior \(P\) 훈련 (text-image 데이터 이용)

      -

      → 텍스트를 입력으로 받는 prior \(P\)는 text-image 데이터에 대해서만 학습 되고 비디오에 대해서는 파인 튜닝하지 않는다.

      -
    2. -
    3. 이미지를 이용한 학습

      -

      → Decoder, prior, 두개의 super-resolution 요소들은 먼저 텍스트 없이 이미지 만으로 학습 된다.

      -

      → Decoder는 Clip image embedding을 입력으로 받고, super-resolution 요소들은 학습 중에 입력으로 들어온 downsampled image를 입력으로 받는다.

      -
    4. -
    5. 비디오를 이용한 학습

      -
        -
      • 이미지에 대한 훈련이 끝나면 새로운 시간 레이어를 추가하고 초기화하여 레이블이 지정되지 않은 비디오 데이터에 대해 파인 튜닝한다.

      • -
      • 원본 비디오에서 16프레임이 샘플링 되며, 1에서 30 사이의 랜덤 \(fps\)를 사용한다.

      • -
      • 디코더를 학습하는 동안 훈련 초기에는 더 높은 \(fps\) 범위(모션이 적은)에서 시작하고, 이후에는 더 작은 \(fps\) 범위(모션이 많은)로 전환한다.

      • -
      • Masked-frame interpolation 네트워크는 temporal 디코더로부터 파인 튜닝된다.

      • -
      -
    6. -
    -
  • -
-
-
-
-

4. Experiments#

-
-

4.1 Dataset and Settings#

-
-

Datasets#

-
    -
  • Image, Text

    -
      -
    • LAION-5B 데이터셋의 일부 2.3B의 데이터를 사용하였다.

    • -
    • NSFW 이미지, 텍스트의 유해한 단어 또는 워터마크 확률이 0.5보다 큰 이미지가 있는 샘플 쌍을 필터링하였다. ****

      -
        -
      • NSFW: Not Safe For Work, 선정적이거나 음란하거나 폭력적인 내용을 포함한 콘텐츠

      • -
      -
    • -
    -
  • -
  • Video

    -
      -
    • WebVid-10M과, HD-VILA-100M 데이터셋의 일부 10M 데이터를 사용하였다.

      -
        -
      • Decoder \(D^t\), interpolation 모델 → WebVid-10M을 이용하여 학습

      • -
      • \(SR^t_l\) → WebVid-10M, HD-VILA-100M을 이용하여 학습

      • -
      -
    • -
    -
  • -
  • Zero-shot test 데이터

    -
      -
    • UCF-101, MSR-VTT

      -
        -
      • UCF-101: 액션 인식 연구를 위해 고안되었으며, 다양한 동작 및 환경에서 촬영된 비디오 클립 데이터셋

      • -
      • MSR-VTT: 비디오와 해당 비디오에 대한 텍스트 설명 또는 캡션을 포함하는 데이터셋

      • -
      -
    • -
    -
  • -
-
-
-

Automatic Metrics#

-
    -
  • UCF-101

    -
      -
    • 각 클래스에 대해 하나의 템플릿 문장을 작성하고 평가를 위해 수정한다.

    • -
    • 10K 샘플에 대해 Fretchet Video Distance(FVD)와 Inception Score(IS)를 측정한다.

    • -
    • Train셋과 동일한 클래스 분포를 따르는 샘플을 생성한다.

    • -
    -
  • -
  • MSR-VTT

    -
      -
    • 테스트 세트의 모든 59,794 캡션에 대한 FID와 CLIPSIM(비디오 프레임과 텍스트 간의 평균 CLIP 유사도)를 측정한다.

    • -
    -
  • -
-
-
-

Human Evaluation Set and Metrics#

-
    -
  • Amazon Mechanical Turk(AMT)에서 300개의 프롬프트로 이루어진 평가 세트를 수집하였다.

  • -
  • Annotator들에게 T2V 시스템이 있다면 어떤 것을 생성하고 싶은지 물어봤다.

  • -
  • 불완전하거나, 너무 추상적이거나, 불쾌감을 주는 프롬프트를 필터링 하였다.

  • -
  • 5가지 카테고리(동물, 판타지, 사람, 자연 및 풍경, 음식 및 음료)를 식별하고 해당 카테고리에 맞는 프롬프트를 선택하였다.

  • -
  • 이러한 프롬프트는 동영상을 만드는 데에 사용되지 않고 선택 되었으며, 고정된 상태로 유지했다.

  • -
  • Human evaluation을 위해 Imagen의 DrawBench 프롬프트도 사용하였다.

  • -
  • 비디오 품질과 text-vedio faithfulness를 평가하였다.

    -
      -
    • 비디오 품질 → 두 개의 비디오를 랜덤 순서로 보여주고 어떤 비디오의 품질이 더 좋은지 annotator에게 물어본다.

    • -
    • Text-vdeio faithfulness → 텍스트를 추가로 보여주고 어떤 비디오가 텍스트와 더 잘 일치하는지 annotator에게 물어본다.

    • -
    -
  • -
  • 보간 모델과 FILM의 비디오 모션 사실감을 비교하기 위한 평가도 진행하였다.

  • -
  • 5명의 각기 다른 annotator의 다수 득표를 최종 결과로 사용하였다.

  • -
-
-
-
-

4.2 Quantitative Results#

-
-

Automatic Evaluaton on MSR-VTT#

-
    -
  • MSR-VTT에 대해 성능을 보고하는 GODIVA, NUWA 외에도, 중국어와 영어를 모두 입력으로 받는 CogVideo 모델에 대해서도 추론을 수행하였다.

  • -
-
-make_a_video_06 -
-

Fig. 496 Automatic Evaluaton on MSR-VTT#

-
-
-

→ 가장 우수한 성능을 보인다.

-
-
-
-

Automatic Evluation on UCF-101#

-
-make_a_video_06 -
-

Fig. 497 Automatic Evluation on UCF-101#

-
-
-

→ Make-A-Video의 제로 샷 성능이 다른 방법보다 우수하다. Finetunning을 한 결과에서도 SOTA를 달성하였다.

-
-

Human Evaluation#

-
    -
  • DrawBench와 테스트셋에 대해서 CogVideo와 성능을 비교한다.

  • -
  • 또한, VDM의 웹 페이지에 표시된 28개의 동영상에 대해서도 평가한다.

  • -
  • 각 입력에 대해 8개의 동영상을 무작위로 생성하고, 8번 평가하여 평균 결과를 낸다.

  • -
  • 사람의 평가를 위해 76x256x256 해상도로 동영상을 생성한다.

  • -
-
-make_a_video_06 -
-

Fig. 498 Human Evaluation#

-
-
-

→ 평가자가 Make-A-Video 모델의 결과가 더 낫다고 투표한 퍼센트 비율. 대부분 평가자가 모든 벤치마크에서 Make-A-Video가 더 낫다고 평가하였다.

-
    -
  • Frame Interpolation Network와 FILM을 비교 평가하기

    -
      -
    • DrawBench의 텍스트 프롬프트와 평가 세트에서 저프레임률 비디오(1 FPS)를 생성한 다음, 4FPS까지 업샘플링한다.

    • -
    • 평가자들은 eval set에 대해서는 62%, DrawBench에 대해서는 54%로 Make-A-Video가 더 낫다고 평가하였다.

    • -
    • 프레임 간의 차이가 커서 물체가 어떻게 움직이는지에 대한 real-world 지식이 중요한 경우에는 본 논문에 방법이 더 뛰어난 것으로 관찰 되었다.

    • -
    -
  • -
-
-
-
-

4.3 Qualitative Results#

-
-make_a_video_06 -
-

Fig. 499 T2V Generation 결과. 맨 위: VDM, 가운데: CogVideo, 맨 아래: Make-A-Video -→ Make-A-Video가 모션의 일관성을 유지하면서 더 풍부한 콘텐츠를 생성할 수 있다.#

-
-
-
-make_a_video_06 -
-

Fig. 500 이미지에 mask frame interpolation 및 extrpolation network ↑F를 적용한 결과. -가장 왼쪽에 입력 이미지가 주어지면, 이를 동영상으로 애니메이션화 함. -사용자는 자신의 이미지를 사용하여 동영상을 생성할 수 있으며, 생성된 동영상을 개인화하고 직접 제어할 수 있음.#

-
-
-
-make_a_video_06 -
-

Fig. 501 두 이미지 사이의 interpolation 결과. 왼쪽: FILM, 오른쪽: 본 논문의 approach -FILM → 실제 움직이는 object에 대한 이해 없이 프레임을 부드럽게 전환하기만 함. -본 논문의 approach → 의미론적으로 더 의미있는 interpolation을 만듬.#

-
-
-
-make_a_video_06 -
-

Fig. 502 비디오 변형 예시. 위: 원본 비디오, 아래: 새로운 비디오#

-
-
- -
-
-
-

5. 결론#

-
    -
  • 주변 세계로부터 지식을 배우는 human intelligence처럼 generative system도 인간의 학습 방식을 모방할 수 있다면, 더욱 창의적이고 유용할 것이다.

  • -
  • 연구자들은 비지도 학습을 통해 훨씬 더 많은 동영상에서 세계의 dynamic을 학습함으로써 기존의 한계를 극복할 수 있다.

  • -
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Make A Video — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

Make A Video#

+ + +
+

1. Introduction#

+
+

Make-A-video 제안 배경#

+
    +
  • T2I 모델링을 할 수 있는 데이터는 인터넷을 통해 확보될 수 있으나, 비슷한 규모의 텍스트 비디오 데이터셋을 수집하기는 어렵다.

  • +
  • T2I 모델이 존재하는데 T2V 모델을 처음부터 학습 시키는 것은 낭비일 수 있다.

  • +
  • 비지도 학습을 사용하여 더 많은 데이터를 학습할 수 있다.

  • +
+
+
+

Make-A-video 특성#

+
    +
  • T2I 모델을 활용하여, 레이블이 지정되지 않은 비디오 데이터에 대해 비지도 학습을 사용하여 학습한다 → 페어링된 텍스트-비디오 데이터 없이도 텍스트에서 비디오를 생성할 수 있다.

  • +
  • 텍스트 없이도 비지도 비디오만으로 세상의 다양한 개체가 어떻게 움직이고 상호 작용하는지 학습할 수 있다.

  • +
+
+
+

Contribution#

+
    +
  • 디퓨전 기반의 T2I 모델을 T2V로 확장하는 효과적인 방법인 Make-A-Video를 소개한다.

  • +
  • Text-to-image 를 prior로 사용하여 text-video 데이터의 필요성을 우회한다.

  • +
  • 고화질, 고프레임률 비디오를 생성하는 super-resolution 전략을 제안한다.

  • +
  • Make-A-Video를 기존 T2V 시스템과 비교하여 평가한다. 또한, 제로샷 T2V human evaluation을 위해 300개의 프롬프트 테스트 세트를 수집하여 공개할 계획이다.

  • +
+
+
+
+

2. Previous Work#

+
+
+

3. Method#

+
    +
  • Make-A-Video의 주요 요소

    +
      +
    1. 텍스트-이미지 쌍으로 학습된 base T2I 모델

    2. +
    3. 신경망의 블록을 시간 차원으로 확장하는 시공간 convolution 및 attention layer

    4. +
    5. 두 시공간 layer로 구성된 시공간 신경망과 높은 프레임 속도 생성을 위한 frame interpolation network

    6. +
    +
  • +
  • Make-A-Video의 최종 inference 수식

    +
    +make_a_video_00 +
    +

    Fig. 489 최종 inference 수식#

    +
    +
    +
      +
    • \(SR_h\): spatial super-resolution network

    • +
    • \(SR^t_l\): spatiotemporal super-resolution network

    • +
    • \(\uparrow_{F}\): frame interpolation network

    • +
    • \(D^t\): spatiotemporal decoder

    • +
    • \(P\): prior network

    • +
    • \(\hat{x}\): BPE-encoded text

    • +
    • \(C_x\): CLIP text encoder

    • +
    • \(x\): input text

    • +
    +
  • +
+
+

3.1. Text-To-Image Model#

+
    +
  • “Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding(Imagen)”와 연구 내용을 공유하였다.

  • +
  • Imagen

    +
    +make_a_video_01 +
    +

    Fig. 490 Imagen 구조#

    +
    +
    +
  • +
  • 고해상도 이미지를 만들기 위해 사용한 네트워크

    +
      +
    • A prior Network \(P\): 텍스트 임베딩 \(x_e\)와 BPE encoded text tokens \(\hat{x}\)이 주어졌을 때 이미지 임베딩 \(y_e\)를 생성하는 네트워크

    • +
    • Decoder Network \(D\): 이미지 임베딩 \(y_e\)로부터 저해상도 64X64 RGB 이미지 \(\hat{y}_l\)를 생성하는 네트워크

    • +
    • Super-resolution network \(SR_l\), \(SR_h\): D에서 생성된 이미지 64X64 저해상도 이미지 \(\hat{y}_l\)를 256X256, 768X768 픽셀로 증가시켜 최종 이미지 \(\hat{y}\)를 만드는 네트워크

      +
      +make_a_video_02 +
      +

      Fig. 491 text \(x\)가 prior \(P\)를 통해 image embedding 변환된다. +fps: desired frame rate#

      +
      +
      +
    • +
    +
  • +
+
+
+

3.2. Spatiotemporal Layers#

+
    +
  • 2차원 조건부 네트워크를 시간적 차원으로 확장하기 위해 다음의 구성 요소를 수정한다.

    +
      +
    • Convolutional layers

    • +
    • Attention layers

    • +
    +
  • +
  • Fully-connected layers는 특별한 수정을 할 필요 없이 시간 정보만 추가해주면 된다.

  • +
  • 구성 요소 수정 결과 \(D^t\)는 64X64 사이즈의 16 RGB frame을 만들게 된다.

  • +
  • Frame interpolation network \(\uparrow_{F}\)가 생성된 16개의 프레임과 super-resolution 네트워크 \(SR^t_l\) 사이를 보간하여 프레임 속도를 증가시킨다.

  • +
  • Super-resolution 네트워크에는 hallucinating information(환각 정보)가 포함 된다. 깜박이는 잔상이 생기지 않으려면, 환각이 프레임 전체에 걸쳐 일관성을 유지해야 한다.

    +
      +
    • Hallucinating information

      +

      실제로 존재하지 않는 정보나 세부 사항을 생성하거나 가상으로 추가하는 것

      +
    • +
    +
  • +
  • 프레임당 super resolution을 수행하는 것보다 spatiotemporal 모듈인 \(SR^t_l\)가 더 좋은 성능을 보였다.

  • +
  • 하지만, \(SR_h\)를 위와 같은 모듈로 만들기엔 메모리 및 컴퓨팅 제약과 고해상도 비디오 데이터의 부족으로 \(SR_h\)를 위와 같이 시간적 차원으로 확장하는 것은 어려웠다 → \(SR_h\)는 공간적 차원에서 작동한다.( 각 프레임에 대해 동일한 노이즈 초기화를 사용하여 프레임 전반에 걸쳐 일관된 환각을 제공함)

  • +
+
+

3.2.1 Pseudo-3D convolutional layers#

+
+make_a_video_03 +
+

Fig. 492 Architecture of Pseudo-3D convolutional layers#

+
+
+
    +
  • 2D 컨벌루션 레이어 다음에 1D 컨벌루션을 쌓는다 (Cf:separable convolution)

    +
      +
    • 3D 컨벌루션의 계산 load를 줄일 수 있다.

    • +
    • 사전 학습된 2D 컨볼루션 레이어와 새로 초기화된 1D 컨벌루션 레이어 사이에 명확한 경계를 생성하여, spatial information을 유지한 채 temporal convolution을 처음부터 학습할 수 있게 한다.

    • +
    +
  • +
  • Pseudo-3D convolutional layer

    +
    +make_a_video_04 +
    +

    Fig. 493 Pseudo-3D convolutional layer#

    +
    +
    +
      +
    • \(h\): 입력 텐서 (dimension: \(B\)(batch),\(C\)(channels),\(F\)(frames),\(H\)(height),\(W\)(width))

    • +
    • \(\text{o}T\): transpose operator (spatial ↔ temporal)

    • +
    • \(Conv_{2_D}\)는 pretrained T2I 모델에서 초기화 되고, \(Conv_{1_D}\)는 identity 함수로 초기화 된다.

    • +
    +
  • +
+
+
+

3.2.2. Psuedo-3D attention layers#

+
+make_a_video_05 +
+

Fig. 494 Architecture of Pseudo-3D attention layers#

+
+
+
    +
  • “Video Diffusion Models**”**에 영감을 받아 dimension decomposition 전략을 attention layer에 확장하였다.

  • +
  • Pseudo-3D convolutional layer처럼 각각의 spatial attenion layer를 쌓아, 전체 spatiotemporal attention layer를 근사화하는 temporal attention layer를 쌓는다.

  • +
  • Pseudo-3D attention layer

    +
    +make_a_video_06 +
    +

    Fig. 495 Pseudo-3D attention layer#

    +
    +
    +
      +
    • \(h\): 입력 텐서 (dimension: \(B\)(batch),\(C\)(channels),\(F\)(frames),\(H\)(height),\(W\)(width))

    • +
    • flatten: spatial dimension 축에 대해 flatten하는 연산 (결과 dimension: \(B\),\(C\),\(F\),\(HW\))

    • +
    • \(ATTN_{2D}\)는 pretrained T2I 모델에서 초기화되고, \(ATTN_{1D}\)는 identity function으로 초기화 된다.

    • +
    • Code

      +
      class SpatioTemporalAttention(nn.Module):
      +    def __init__(
      +        self,
      +        dim,
      +        *,
      +        dim_head = 64,
      +        heads = 8,
      +        add_feed_forward = True,
      +        ff_mult = 4,
      +        pos_bias = True,
      +        flash = False,
      +        causal_time_attn = False
      +    ):
      +        super().__init__()
      +        assert not (flash and pos_bias), 'learned positional attention bias is not compatible with flash attention'
      +
      +        self.spatial_attn = Attention(dim = dim, dim_head = dim_head, heads = heads, flash = flash)
      +        self.spatial_rel_pos_bias = ContinuousPositionBias(dim = dim // 2, heads = heads, num_dims = 2) if pos_bias else None
      +
      +        self.temporal_attn = Attention(dim = dim, dim_head = dim_head, heads = heads, flash = flash, causal = causal_time_attn)
      +        self.temporal_rel_pos_bias = ContinuousPositionBias(dim = dim // 2, heads = heads, num_dims = 1) if pos_bias else None
      +
      +        self.has_feed_forward = add_feed_forward
      +        if not add_feed_forward:
      +            return
      +
      +        self.ff = FeedForward(dim = dim, mult = ff_mult)
      +
      +    def forward(
      +        self,
      +        x,
      +        enable_time = True
      +    ):
      +        b, c, *_, h, w = x.shape
      +        is_video = x.ndim == 5
      +        enable_time &= is_video
      +
      +        if is_video:
      +            x = rearrange(x, 'b c f h w -> (b f) (h w) c') #[bXf, hXw, c]
      +        else:
      +            x = rearrange(x, 'b c h w -> b (h w) c')#[b, hXw, c]
      +
      +        space_rel_pos_bias = self.spatial_rel_pos_bias(h, w) if exists(self.spatial_rel_pos_bias) else None
      +
      +        x = self.spatial_attn(x, rel_pos_bias = space_rel_pos_bias) + x
      +
      +        if is_video:
      +            x = rearrange(x, '(b f) (h w) c -> b c f h w', b = b, h = h, w = w)
      +        else:
      +            x = rearrange(x, 'b (h w) c -> b c h w', h = h, w = w)
      +
      +        if enable_time:
      +
      +            x = rearrange(x, 'b c f h w -> (b h w) f c') #[bXhXw, f, c] 
      +
      +            time_rel_pos_bias = self.temporal_rel_pos_bias(x.shape[1]) if exists(self.temporal_rel_pos_bias) else None
      +
      +            x = self.temporal_attn(x, rel_pos_bias = time_rel_pos_bias) + x
      +
      +            x = rearrange(x, '(b h w) f c -> b c f h w', w = w, h = h)
      +
      +        if self.has_feed_forward:
      +            x = self.ff(x, enable_time = enable_time) + x
      +
      +        return x
      +
      +
      +
    • +
    +
  • +
  • Frame rate conditioning

    +
      +
    • 비디오의 초당 프레임 수를 나타내는 추가 컨디셔닝 파라미터 \(fps\)를 추가한다.

    • +
    +
  • +
+
+
+
+

3.3 Frame Interpolation Network#

+
    +
  • ↑F (Frame Interpolation Network)란?

    +
      +
    • 생성된 프레임 수를 증가시켜, 생성된 비디오를 더 부드럽게 만들고 비디오 길이를 연장 시킬 수 있는 네트워크

    • +
    • 프레임을 보간하고 extrapolation을 하는 네트워크

      +
        +
      • Extrapolation: 주어진 데이터 또는 정보를 사용하여 미래의 값을 예측하거나 확장

      • +
      +
    • +
    +
  • +
  • ↑F (Frame Interpolation Network) 동작

    +
      +
    • Spatialtemporal decoder \(D^t\)에서 마스크 처리된 입력 프레임을 제로 패딩하고 비디오 업샘플링을 적용하여 masked frame interpolation을 파인 튜닝한다.

    • +
    • 파인 튜닝할 때 U-Net의 입력에 4개의 채널을 추가한다.

      +
        +
      • RGB 마스킹 비디오 입력을 위한 3개의 채널과 마스킹되는 프레임을 나타내는 추가 바이너리 채널

      • +
      +
    • +
    • 다양한 frame-skips과 \(fps\)에 대해 파인튜닝하여 추론시 여러 temporal upsample rate를 제공한다.

    • +
    +
  • +
  • 본 논문의 모든 실험에서는 ↑F를 frame skip 5로 적용하여 16프레임 비디오를 76프레임((16-1)X5+1)으로 업샘플링 하였다.

  • +
  • 비디오 시작 또는 끝 프레임을 마스킹하여 비디오 추정 또는 이미지 애니메이션에도 사용할 수 있다.

  • +
+
+
+

3.4 Training#

+
    +
  • 위에서 설명한 구성 요소들은 독립적으로 학습 된다.

  • +
  • 훈련 과정

    +
      +
    1. Prior \(P\) 훈련 (text-image 데이터 이용)

      +

      → 텍스트를 입력으로 받는 prior \(P\)는 text-image 데이터에 대해서만 학습 되고 비디오에 대해서는 파인 튜닝하지 않는다.

      +
    2. +
    3. 이미지를 이용한 학습

      +

      → Decoder, prior, 두개의 super-resolution 요소들은 먼저 텍스트 없이 이미지 만으로 학습 된다.

      +

      → Decoder는 Clip image embedding을 입력으로 받고, super-resolution 요소들은 학습 중에 입력으로 들어온 downsampled image를 입력으로 받는다.

      +
    4. +
    5. 비디오를 이용한 학습

      +
        +
      • 이미지에 대한 훈련이 끝나면 새로운 시간 레이어를 추가하고 초기화하여 레이블이 지정되지 않은 비디오 데이터에 대해 파인 튜닝한다.

      • +
      • 원본 비디오에서 16프레임이 샘플링 되며, 1에서 30 사이의 랜덤 \(fps\)를 사용한다.

      • +
      • 디코더를 학습하는 동안 훈련 초기에는 더 높은 \(fps\) 범위(모션이 적은)에서 시작하고, 이후에는 더 작은 \(fps\) 범위(모션이 많은)로 전환한다.

      • +
      • Masked-frame interpolation 네트워크는 temporal 디코더로부터 파인 튜닝된다.

      • +
      +
    6. +
    +
  • +
+
+
+
+

4. Experiments#

+
+

4.1 Dataset and Settings#

+
+

Datasets#

+
    +
  • Image, Text

    +
      +
    • LAION-5B 데이터셋의 일부 2.3B의 데이터를 사용하였다.

    • +
    • NSFW 이미지, 텍스트의 유해한 단어 또는 워터마크 확률이 0.5보다 큰 이미지가 있는 샘플 쌍을 필터링하였다. ****

      +
        +
      • NSFW: Not Safe For Work, 선정적이거나 음란하거나 폭력적인 내용을 포함한 콘텐츠

      • +
      +
    • +
    +
  • +
  • Video

    +
      +
    • WebVid-10M과, HD-VILA-100M 데이터셋의 일부 10M 데이터를 사용하였다.

      +
        +
      • Decoder \(D^t\), interpolation 모델 → WebVid-10M을 이용하여 학습

      • +
      • \(SR^t_l\) → WebVid-10M, HD-VILA-100M을 이용하여 학습

      • +
      +
    • +
    +
  • +
  • Zero-shot test 데이터

    +
      +
    • UCF-101, MSR-VTT

      +
        +
      • UCF-101: 액션 인식 연구를 위해 고안되었으며, 다양한 동작 및 환경에서 촬영된 비디오 클립 데이터셋

      • +
      • MSR-VTT: 비디오와 해당 비디오에 대한 텍스트 설명 또는 캡션을 포함하는 데이터셋

      • +
      +
    • +
    +
  • +
+
+
+

Automatic Metrics#

+
    +
  • UCF-101

    +
      +
    • 각 클래스에 대해 하나의 템플릿 문장을 작성하고 평가를 위해 수정한다.

    • +
    • 10K 샘플에 대해 Fretchet Video Distance(FVD)와 Inception Score(IS)를 측정한다.

    • +
    • Train셋과 동일한 클래스 분포를 따르는 샘플을 생성한다.

    • +
    +
  • +
  • MSR-VTT

    +
      +
    • 테스트 세트의 모든 59,794 캡션에 대한 FID와 CLIPSIM(비디오 프레임과 텍스트 간의 평균 CLIP 유사도)를 측정한다.

    • +
    +
  • +
+
+
+

Human Evaluation Set and Metrics#

+
    +
  • Amazon Mechanical Turk(AMT)에서 300개의 프롬프트로 이루어진 평가 세트를 수집하였다.

  • +
  • Annotator들에게 T2V 시스템이 있다면 어떤 것을 생성하고 싶은지 물어봤다.

  • +
  • 불완전하거나, 너무 추상적이거나, 불쾌감을 주는 프롬프트를 필터링 하였다.

  • +
  • 5가지 카테고리(동물, 판타지, 사람, 자연 및 풍경, 음식 및 음료)를 식별하고 해당 카테고리에 맞는 프롬프트를 선택하였다.

  • +
  • 이러한 프롬프트는 동영상을 만드는 데에 사용되지 않고 선택 되었으며, 고정된 상태로 유지했다.

  • +
  • Human evaluation을 위해 Imagen의 DrawBench 프롬프트도 사용하였다.

  • +
  • 비디오 품질과 text-vedio faithfulness를 평가하였다.

    +
      +
    • 비디오 품질 → 두 개의 비디오를 랜덤 순서로 보여주고 어떤 비디오의 품질이 더 좋은지 annotator에게 물어본다.

    • +
    • Text-vdeio faithfulness → 텍스트를 추가로 보여주고 어떤 비디오가 텍스트와 더 잘 일치하는지 annotator에게 물어본다.

    • +
    +
  • +
  • 보간 모델과 FILM의 비디오 모션 사실감을 비교하기 위한 평가도 진행하였다.

  • +
  • 5명의 각기 다른 annotator의 다수 득표를 최종 결과로 사용하였다.

  • +
+
+
+
+

4.2 Quantitative Results#

+
+

Automatic Evaluaton on MSR-VTT#

+
    +
  • MSR-VTT에 대해 성능을 보고하는 GODIVA, NUWA 외에도, 중국어와 영어를 모두 입력으로 받는 CogVideo 모델에 대해서도 추론을 수행하였다.

  • +
+
+make_a_video_06 +
+

Fig. 496 Automatic Evaluaton on MSR-VTT#

+
+
+

→ 가장 우수한 성능을 보인다.

+
+
+
+

Automatic Evluation on UCF-101#

+
+make_a_video_06 +
+

Fig. 497 Automatic Evluation on UCF-101#

+
+
+

→ Make-A-Video의 제로 샷 성능이 다른 방법보다 우수하다. Finetunning을 한 결과에서도 SOTA를 달성하였다.

+
+

Human Evaluation#

+
    +
  • DrawBench와 테스트셋에 대해서 CogVideo와 성능을 비교한다.

  • +
  • 또한, VDM의 웹 페이지에 표시된 28개의 동영상에 대해서도 평가한다.

  • +
  • 각 입력에 대해 8개의 동영상을 무작위로 생성하고, 8번 평가하여 평균 결과를 낸다.

  • +
  • 사람의 평가를 위해 76x256x256 해상도로 동영상을 생성한다.

  • +
+
+make_a_video_06 +
+

Fig. 498 Human Evaluation#

+
+
+

→ 평가자가 Make-A-Video 모델의 결과가 더 낫다고 투표한 퍼센트 비율. 대부분 평가자가 모든 벤치마크에서 Make-A-Video가 더 낫다고 평가하였다.

+
    +
  • Frame Interpolation Network와 FILM을 비교 평가하기

    +
      +
    • DrawBench의 텍스트 프롬프트와 평가 세트에서 저프레임률 비디오(1 FPS)를 생성한 다음, 4FPS까지 업샘플링한다.

    • +
    • 평가자들은 eval set에 대해서는 62%, DrawBench에 대해서는 54%로 Make-A-Video가 더 낫다고 평가하였다.

    • +
    • 프레임 간의 차이가 커서 물체가 어떻게 움직이는지에 대한 real-world 지식이 중요한 경우에는 본 논문에 방법이 더 뛰어난 것으로 관찰 되었다.

    • +
    +
  • +
+
+
+
+

4.3 Qualitative Results#

+
+make_a_video_06 +
+

Fig. 499 T2V Generation 결과. 맨 위: VDM, 가운데: CogVideo, 맨 아래: Make-A-Video +→ Make-A-Video가 모션의 일관성을 유지하면서 더 풍부한 콘텐츠를 생성할 수 있다.#

+
+
+
+make_a_video_06 +
+

Fig. 500 이미지에 mask frame interpolation 및 extrpolation network ↑F를 적용한 결과. +가장 왼쪽에 입력 이미지가 주어지면, 이를 동영상으로 애니메이션화 함. +사용자는 자신의 이미지를 사용하여 동영상을 생성할 수 있으며, 생성된 동영상을 개인화하고 직접 제어할 수 있음.#

+
+
+
+make_a_video_06 +
+

Fig. 501 두 이미지 사이의 interpolation 결과. 왼쪽: FILM, 오른쪽: 본 논문의 approach +FILM → 실제 움직이는 object에 대한 이해 없이 프레임을 부드럽게 전환하기만 함. +본 논문의 approach → 의미론적으로 더 의미있는 interpolation을 만듬.#

+
+
+
+make_a_video_06 +
+

Fig. 502 비디오 변형 예시. 위: 원본 비디오, 아래: 새로운 비디오#

+
+
+ +
+
+
+

5. 결론#

+
    +
  • 주변 세계로부터 지식을 배우는 human intelligence처럼 generative system도 인간의 학습 방식을 모방할 수 있다면, 더욱 창의적이고 유용할 것이다.

  • +
  • 연구자들은 비지도 학습을 통해 훨씬 더 많은 동영상에서 세계의 dynamic을 학습함으로써 기존의 한계를 극복할 수 있다.

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/Muse.html b/docs/review/Muse.html old mode 100644 new mode 100755 index 45afca9e..82c37a94 --- a/docs/review/Muse.html +++ b/docs/review/Muse.html @@ -1,980 +1,999 @@ - - - - - - - - - - - - Muse — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: Muse: Text-To-Image Generation via Masked Generative Transformers

  • -
  • Reference

    - -
  • -
  • Author: Jun-Hyoung Lee

  • -
  • Last updated on Mar. 25. 2024

  • -
-
-
-

Muse#

-
-fig_1 -
-

Fig. 425 Figure 1#

-
-
-
    -
  • Muse: T2I transformer model + Masked Modeling

    -
      -
    • diffusion, autoregressive model 보다 효과적인 성능을 냄

    • -
    • discrete token space 에서 masked modeling 방식으로 학습

      -
        -
      • pretrained LLM(T5-XXL) 으로 부터 추출된 text embedding이 주어지고, 랜덤하게 masked image token 을 예측하는 방식으로 학습

      • -
      -
    • -
    • Imagen, DALL-E 2 와 비교할 때, sampling iteration이 적어 빠른 inference 수행 가능

    • -
    • LLM 을 사용해 fine-grained 한 정보를 추출하여 high-fidelity 이미지 생성을 할 수 있고, 시각적 concept(object, spatial 관계, 자세, 등)을 더 잘 이해할 수 있음

    • -
    • Muse-900M, CC3M 에서 SOTA 달성, FID 6.06

    • -
    • Muse-3B, zero-shot COCO 에서 FID 7.88 달성, CLIP score 0.32

    • -
    • 따로 파인튜닝 없이 inpainting, outpainting, mask-free editing 이 가능함

    • -
    -
  • -
-
-

1. Masked modeling#

-
    -
  • [22.02] MaskGIT: Masked Generative Image Transformer

    -
      -
    • CVPR 2022, Google Research

    • -
    -
  • -
-
-fig_1 -
-

Fig. 426 maskgit 1#

-
-
-
-fig_1 -
-

Fig. 427 maskgit 2#

-
-
-
    -
  • VQGAN 사용, non-autoregressive 디코딩 방식

  • -
  • inference 시에 모든 마스킹된 토큰을 예측하지만, 신뢰도가 높은 토큰만 실제 디코딩됨

    -
      -
    • 따라서 autoregressive 모델의 256 step → 8 step 으로 줄여 inference 속도가 향상

    • -
    -
  • -
-
-
-

2. Model Architecture#

-
-fig_1 -
-

Fig. 428 Figure 3#

-
-
-
    -
  1. VQGAN tokenizer model 사용

    -
      -
    • input image 가 discrete token 으로 인코딩되고, 그 후 디코딩되어 input 이미지와 유사하게 잘 복원되는 모델

    • -
    • 두 개의 VQGAN 사용 (256x256 저해상도 + 512x512 고해상도)

      -
        -
      • 첫 학습은 256x256 저해상도(16x16 latent) 학습

      • -
      • 이후 512x512 고해상도(64x64 latent) 학습 진행

      • -
      -
    • -
    -
  2. -
  3. Masked image model 사용

    -
      -
    • Muse 파라미터의 대부분이 masked image model 파라미터로 구성

    • -
    • unmaked 토큰과 T5XXL text embedding 을 condition으로 masked 저해상도 토큰에 대해 예측 진행

    • -
    -
  4. -
  5. “Super-res” transformer model 사용

    -
      -
    • T5XXL text embedding 을 condition으로 저해상도 토큰을 고해상도 토큰으로 바꾸는데 사용

    • -
    -
  6. -
-
-

2.1. Pre-trained Text Encoders#

-
    -
  • Imagen 에서 pretrained LLM 사용하면 효과적인 high-quality 의 이미지 생성 가능

  • -
  • 풍부한 visual, semantic 정보를 추출할 수 있는 T5-XXL 사용

    -
      -
    • objects (nouns), actions (verbs), visual properties (adjectives), spatial relationships (prepositions)

    • -
    • Muse 가 이러한 정보를 이미지 생성을 위한 LLM embedding 에서 잘 mapping 을 할 수 있을 것이라고 가정

      - -
    • -
    -
  • -
  • 인코딩 과정

    -
      -
    1. 4096 차원의 embedding vector를 얻음

    2. -
    3. linearly projection 진행되어 base, super-res transformer에 입력되게 차원을 맞춤

    4. -
    -
  • -
-
-
-

2.2. Semantic Tokenization using VQGAN#

-
    -
  • VQGAN

    -
      -
    • encoder + decoder

    • -
    • encoder feature 를 vector quantization 이 진행된 후, codebook 으로 부터 매핑을 통해 디코딩이 진행

    • -
    -
  • -
  • 다른 해상도의 이미지를 인코딩할 수 있도록 encoder와 decoder 모두 convolutional layer 로 구성

  • -
  • 256x256 픽셀 이미지에 맞는 VQGAN 모델(base model)과 512x512 픽셀 이미지에 맞는 VQGAN 모델(super-res model) 구성

  • -
  • Taming transformers for high-resolution image synthesis 에서 인코딩된 discrete 토큰이 low level noise를 무시하면서 high level semantic 함을 더 잘 capture 한다는 것을 연구 진행

    -
      -
    • 이 때문에, cross-entropy loss 를 통해 masked 토큰을 예측하는데 사용할 수 있게됨

    • -
    -
  • -
-
-
-

2.3. Base Model#

-
    -
  • base model

    -
      -
    • projected T5 embedding + 이미지 토큰을 입력으로 한 masked transformer 로 구성

    • -
    • text embedding 은 unmasked, 이미지 토큰은 랜덤하게 masking 진행 → [MASK] 토큰으로 교체

    • -
    -
  • -
  • 이미지 토큰을 embedding 으로 선형적으로 mapping 진행(transformer 의 input/hidden 사이즈에 맞게) + positional embedding 도 포함

  • -
  • transformer layer는 self-attention, cross-attention, MLP 블럭이 포함

    -
      -
    • MLP 는 masked image embedding 을 logit 값으로 변경하는데 사용되고

    • -
    • cross-entropy loss 는 ground truth 토큰과 함께 오차를 계산함

    • -
    -
  • -
  • 학습 때, base model은 각 step 마다 모든 masked tokens를 예측하지만,

    -
      -
    • inference 에서는 퀄리티를 증가하기 위한 iterative 방식으로 mask 예측 진행

    • -
    -
  • -
-
-
-

2.4. Super-Resolution Model#

-
-fig_1 -
-

Fig. 429 Figure 4#

-
-
-
    -
  • 바로 512x512 로 예측하도록 모델을 구성했을 때, low level detail 에 더 포커싱되어 학습이 진행됨. → 따라서 위의 그림과 같이 계층적으로 설계했음

  • -
  • base model은 16x16 latent map 을 생성하고, super resolution 모델이 base latent map 을 64x64 latent map 으로 upsampling

    -
      -
    • base 모델이 학습이 완료되면, 그 이후에 super resolution 모델 학습 진행

    • -
    -
  • -
  • Architecture

    -
    -fig_1 -
    -

    Fig. 430 Table 6#

    -
    -
    -
  • -
-
-
-

2.5. Decoder Finetuning#

-
    -
  • 디테일을 높이기 위해 residual layer를 더 추가하고 channel 늘림

    -
      -
    • residual layer: 2개 → 4개, channel: 128 → 256

    • -
    -
  • -
  • encoder weight, codebook, base, super-res transformer 모델은 freezing

  • -
-
-fig_1 -
-

Fig. 431 Figure 13#

-
-
-
    -
  • 해당 그림에서는 표지판이 더 finetuned decoder 가 복원이 잘 됐음

  • -
-
-
-

2.7. Classifier Free Guidance#

-
    -
  • 이미지 생성 퀄리티와 text-image alignment 향상을 위해 도입

  • -
  • 학습 때, 랜덤하게 10% 만 text conditioning 을 제거

    -
      -
    • inference

      -
        -
      • \(\ell_g=(1+t) \ell_c-t \ell_u\)

      • -
      • \(l_c\): conditional logit / \(l_u\): unconditional logit / \(t\): guidance scale

      • -
      -
    • -
    -
  • -
  • CFG 는 diversity ↔ fidelity 의 trade-off 관계

    -
      -
    • Muse 에서는 t 를 선형적으로 증가시키는 샘플링 과정을 거쳐 diversity 의 한계를 극복

    • -
    • 초반에는 guidance 가 없거나 낮게 해서 logit 값을 설정하고, 후반에는 conditional prompt 가 가능하게 많은 가중치를 주게 된다.

    • -
    • unconditional logit → negative prompt 로도 사용 가능

    • -
    -
  • -
-
-
-

2.8. Iterative Parallel Decoding at Inference#

-
    -
  • Muse 의 시간 효율성

    -
      -
    • parallel decoding 으로 인해 한 번의 foward 연산으로 multiple token 을 예측하는 방식으로 동작함

      -
        -
      • Markovian 속성: 많은 토큰이 주어진 다른 토큰에 대해 conditionally independent 함 -→ parallel decoding 가능

      • -
      -
    • -
    -
  • -
  • Maskgit 논문 에서 Decoding 은 cosine schedule 에 의해 수행됨

    -
      -
    • 해당 step 에서 예측되는 가장 높은 신뢰도의 masked 토큰을 선택해 decoding 진행됨

    • -
    • 그 후 decoding 된 것은 masking 이 해제되는 방식

    • -
    -
  • -
  • 이러한 절차를 따라서, Muse 에서는 base 모델의 256 토큰은 24 step 을 사용하고, super-res 모델의 4096 토큰은 8 step 만 사용

    - -
  • -
-
-fig_1 -
-

Fig. 432 Figure 5#

-
-
-
-
-
-

3. Results#

-
    -
  • Imagen dataset

    -
      -
    • 460M text-image pairs

    • -
    -
  • -
  • train step: 1M

  • -
  • train time: 1 week

  • -
  • batch size: 512 on 512-core TPU-v4 chips

  • -
  • Adafactor optimizer

  • -
-
-fig_1 -
-

Fig. 433 Figure 6#

-
-
-
    -
  • cardinality: 동일한 객체를 여러 번 생성할 때, Muse 는 크기, 색상, 회전된 모습

  • -
-
-fig_1 -
-

Fig. 434 Figure 7#

-
-
-
    -
  • 정량적 평가

  • -
-

:::{figure-md} -fig_1        Table 6 -        :::

-
    -
  • FID(diversity) ↔ CLIP score(image-text alignment)

    -
    -fig_1 -
    -

    Fig. 435 Figure 8#

    -
    -
    -
  • -
  • inpainting, outpainting

    -
    -fig_1 -
    -

    Fig. 436 Figure 10#

    -
    -
    -
  • -
-
-
-
-

Contribution#

-
    -
  1. FID, CLIP score 기반으로 text-to-image 모델에 대한 SOTA 를 달성

    -
      -
    • 이미지 생성 퀄리티, 다양성, text prompt와의 alignment 측정했음

    • -
    -
  2. -
  3. quantized 이미지 토큰과 parallel decoding 으로 인해 빠른 inference 가 가능

  4. -
  5. inpainting, outpainting, mask-free editing 을 포함한 zero-shot editing 가능

  6. -
-
-
-

Q&A#

-
    -
  1. Muse 와 같은 transformer 기반의 generation 모델에서는 어떻게 diversity 한 결과를 가져올 수 있나요?

    -
      -
    1. 아무래도 Muse 는 random latent 에서 생성하는 것이 아니라 text-to-image 모델이라, text 에 따라서 다양한 이미지 생성 결과가 나타날 수 있을 것 같습니다.

    2. -
    -
  2. -
  3. Muse 는 결국 GAN 모델인가요?

    -
      -
    1. 기준점이 어떻냐에 따라 GAN 이다, 아니다, 라고 정하기 어려울 것 같습니다. VQGAN을 사용해서 GAN이라고 생각할 수 도 있고, GAN 처럼 random latent 결과에 따라 이미지 생성이 달라질 수 있는 관점에서 생각하면 아니다라고 말할 수 있을 것 같습니다.

    2. -
    -
  4. -
  5. Token 은 어떤 의미를 갖나요?

    -
      -
    1. VQGAN에서 input 이미지를 인코딩하고, vector-quantization 과정을 거쳐 압축 후, codebook의 값을 가져와 feature를 구성하는데요, 이때 feature에 포함되어 있는 하나의 포인트에 해당하는 것이 token이라고 생각하시면 될 것 같습니다.

    2. -
    -
  6. -
  7. 텍스트 프롬프트를 넣었을때 실제 이미지 생성은 어떻게 이뤄지나요? Inference에서는 입력 이미지가 없는데 base transformer에 입력 이미지에 대한 masked token대신 뭐가 들어가게 되나요?

    -
      -
    1. 실제 inference 과정에서는 input 이미지가 없기 때문에 모두 마스크된 형태로 입력되게 됩니다. text prompt 의 condition 에 따라 각 step을 거쳐 decoding 이 수행됩니다.

    2. -
    -
  8. -
  9. text embedding이 어떻게 objective function 수식에 들어가나요?

    -
      -
    1. base transformer 에 대해 text embedding 값이 key, value로 입력되어 cross-attention 이 수행되게 됩니다. 그렇게 예측된 feature와 GT의 feature 끼리 cross entropy loss를 통해 마스크 예측할 수 있는 base transformer 가 학습이 됩니다.

    2. -
    -
  10. -
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Muse — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: Muse: Text-To-Image Generation via Masked Generative Transformers

  • +
  • Reference

    + +
  • +
  • Author: Jun-Hyoung Lee

  • +
  • Last updated on Mar. 25. 2024

  • +
+
+
+

Muse#

+
+fig_1 +
+

Fig. 425 Figure 1#

+
+
+
    +
  • Muse: T2I transformer model + Masked Modeling

    +
      +
    • diffusion, autoregressive model 보다 효과적인 성능을 냄

    • +
    • discrete token space 에서 masked modeling 방식으로 학습

      +
        +
      • pretrained LLM(T5-XXL) 으로 부터 추출된 text embedding이 주어지고, 랜덤하게 masked image token 을 예측하는 방식으로 학습

      • +
      +
    • +
    • Imagen, DALL-E 2 와 비교할 때, sampling iteration이 적어 빠른 inference 수행 가능

    • +
    • LLM 을 사용해 fine-grained 한 정보를 추출하여 high-fidelity 이미지 생성을 할 수 있고, 시각적 concept(object, spatial 관계, 자세, 등)을 더 잘 이해할 수 있음

    • +
    • Muse-900M, CC3M 에서 SOTA 달성, FID 6.06

    • +
    • Muse-3B, zero-shot COCO 에서 FID 7.88 달성, CLIP score 0.32

    • +
    • 따로 파인튜닝 없이 inpainting, outpainting, mask-free editing 이 가능함

    • +
    +
  • +
+
+

1. Masked modeling#

+
    +
  • [22.02] MaskGIT: Masked Generative Image Transformer

    +
      +
    • CVPR 2022, Google Research

    • +
    +
  • +
+
+fig_1 +
+

Fig. 426 maskgit 1#

+
+
+
+fig_1 +
+

Fig. 427 maskgit 2#

+
+
+
    +
  • VQGAN 사용, non-autoregressive 디코딩 방식

  • +
  • inference 시에 모든 마스킹된 토큰을 예측하지만, 신뢰도가 높은 토큰만 실제 디코딩됨

    +
      +
    • 따라서 autoregressive 모델의 256 step → 8 step 으로 줄여 inference 속도가 향상

    • +
    +
  • +
+
+
+

2. Model Architecture#

+
+fig_1 +
+

Fig. 428 Figure 3#

+
+
+
    +
  1. VQGAN tokenizer model 사용

    +
      +
    • input image 가 discrete token 으로 인코딩되고, 그 후 디코딩되어 input 이미지와 유사하게 잘 복원되는 모델

    • +
    • 두 개의 VQGAN 사용 (256x256 저해상도 + 512x512 고해상도)

      +
        +
      • 첫 학습은 256x256 저해상도(16x16 latent) 학습

      • +
      • 이후 512x512 고해상도(64x64 latent) 학습 진행

      • +
      +
    • +
    +
  2. +
  3. Masked image model 사용

    +
      +
    • Muse 파라미터의 대부분이 masked image model 파라미터로 구성

    • +
    • unmaked 토큰과 T5XXL text embedding 을 condition으로 masked 저해상도 토큰에 대해 예측 진행

    • +
    +
  4. +
  5. “Super-res” transformer model 사용

    +
      +
    • T5XXL text embedding 을 condition으로 저해상도 토큰을 고해상도 토큰으로 바꾸는데 사용

    • +
    +
  6. +
+
+

2.1. Pre-trained Text Encoders#

+
    +
  • Imagen 에서 pretrained LLM 사용하면 효과적인 high-quality 의 이미지 생성 가능

  • +
  • 풍부한 visual, semantic 정보를 추출할 수 있는 T5-XXL 사용

    +
      +
    • objects (nouns), actions (verbs), visual properties (adjectives), spatial relationships (prepositions)

    • +
    • Muse 가 이러한 정보를 이미지 생성을 위한 LLM embedding 에서 잘 mapping 을 할 수 있을 것이라고 가정

      + +
    • +
    +
  • +
  • 인코딩 과정

    +
      +
    1. 4096 차원의 embedding vector를 얻음

    2. +
    3. linearly projection 진행되어 base, super-res transformer에 입력되게 차원을 맞춤

    4. +
    +
  • +
+
+
+

2.2. Semantic Tokenization using VQGAN#

+
    +
  • VQGAN

    +
      +
    • encoder + decoder

    • +
    • encoder feature 를 vector quantization 이 진행된 후, codebook 으로 부터 매핑을 통해 디코딩이 진행

    • +
    +
  • +
  • 다른 해상도의 이미지를 인코딩할 수 있도록 encoder와 decoder 모두 convolutional layer 로 구성

  • +
  • 256x256 픽셀 이미지에 맞는 VQGAN 모델(base model)과 512x512 픽셀 이미지에 맞는 VQGAN 모델(super-res model) 구성

  • +
  • Taming transformers for high-resolution image synthesis 에서 인코딩된 discrete 토큰이 low level noise를 무시하면서 high level semantic 함을 더 잘 capture 한다는 것을 연구 진행

    +
      +
    • 이 때문에, cross-entropy loss 를 통해 masked 토큰을 예측하는데 사용할 수 있게됨

    • +
    +
  • +
+
+
+

2.3. Base Model#

+
    +
  • base model

    +
      +
    • projected T5 embedding + 이미지 토큰을 입력으로 한 masked transformer 로 구성

    • +
    • text embedding 은 unmasked, 이미지 토큰은 랜덤하게 masking 진행 → [MASK] 토큰으로 교체

    • +
    +
  • +
  • 이미지 토큰을 embedding 으로 선형적으로 mapping 진행(transformer 의 input/hidden 사이즈에 맞게) + positional embedding 도 포함

  • +
  • transformer layer는 self-attention, cross-attention, MLP 블럭이 포함

    +
      +
    • MLP 는 masked image embedding 을 logit 값으로 변경하는데 사용되고

    • +
    • cross-entropy loss 는 ground truth 토큰과 함께 오차를 계산함

    • +
    +
  • +
  • 학습 때, base model은 각 step 마다 모든 masked tokens를 예측하지만,

    +
      +
    • inference 에서는 퀄리티를 증가하기 위한 iterative 방식으로 mask 예측 진행

    • +
    +
  • +
+
+
+

2.4. Super-Resolution Model#

+
+fig_1 +
+

Fig. 429 Figure 4#

+
+
+
    +
  • 바로 512x512 로 예측하도록 모델을 구성했을 때, low level detail 에 더 포커싱되어 학습이 진행됨. → 따라서 위의 그림과 같이 계층적으로 설계했음

  • +
  • base model은 16x16 latent map 을 생성하고, super resolution 모델이 base latent map 을 64x64 latent map 으로 upsampling

    +
      +
    • base 모델이 학습이 완료되면, 그 이후에 super resolution 모델 학습 진행

    • +
    +
  • +
  • Architecture

    +
    +fig_1 +
    +

    Fig. 430 Table 6#

    +
    +
    +
  • +
+
+
+

2.5. Decoder Finetuning#

+
    +
  • 디테일을 높이기 위해 residual layer를 더 추가하고 channel 늘림

    +
      +
    • residual layer: 2개 → 4개, channel: 128 → 256

    • +
    +
  • +
  • encoder weight, codebook, base, super-res transformer 모델은 freezing

  • +
+
+fig_1 +
+

Fig. 431 Figure 13#

+
+
+
    +
  • 해당 그림에서는 표지판이 더 finetuned decoder 가 복원이 잘 됐음

  • +
+
+
+

2.7. Classifier Free Guidance#

+
    +
  • 이미지 생성 퀄리티와 text-image alignment 향상을 위해 도입

  • +
  • 학습 때, 랜덤하게 10% 만 text conditioning 을 제거

    +
      +
    • inference

      +
        +
      • \(\ell_g=(1+t) \ell_c-t \ell_u\)

      • +
      • \(l_c\): conditional logit / \(l_u\): unconditional logit / \(t\): guidance scale

      • +
      +
    • +
    +
  • +
  • CFG 는 diversity ↔ fidelity 의 trade-off 관계

    +
      +
    • Muse 에서는 t 를 선형적으로 증가시키는 샘플링 과정을 거쳐 diversity 의 한계를 극복

    • +
    • 초반에는 guidance 가 없거나 낮게 해서 logit 값을 설정하고, 후반에는 conditional prompt 가 가능하게 많은 가중치를 주게 된다.

    • +
    • unconditional logit → negative prompt 로도 사용 가능

    • +
    +
  • +
+
+
+

2.8. Iterative Parallel Decoding at Inference#

+
    +
  • Muse 의 시간 효율성

    +
      +
    • parallel decoding 으로 인해 한 번의 foward 연산으로 multiple token 을 예측하는 방식으로 동작함

      +
        +
      • Markovian 속성: 많은 토큰이 주어진 다른 토큰에 대해 conditionally independent 함 +→ parallel decoding 가능

      • +
      +
    • +
    +
  • +
  • Maskgit 논문 에서 Decoding 은 cosine schedule 에 의해 수행됨

    +
      +
    • 해당 step 에서 예측되는 가장 높은 신뢰도의 masked 토큰을 선택해 decoding 진행됨

    • +
    • 그 후 decoding 된 것은 masking 이 해제되는 방식

    • +
    +
  • +
  • 이러한 절차를 따라서, Muse 에서는 base 모델의 256 토큰은 24 step 을 사용하고, super-res 모델의 4096 토큰은 8 step 만 사용

    + +
  • +
+
+fig_1 +
+

Fig. 432 Figure 5#

+
+
+
+
+
+

3. Results#

+
    +
  • Imagen dataset

    +
      +
    • 460M text-image pairs

    • +
    +
  • +
  • train step: 1M

  • +
  • train time: 1 week

  • +
  • batch size: 512 on 512-core TPU-v4 chips

  • +
  • Adafactor optimizer

  • +
+
+fig_1 +
+

Fig. 433 Figure 6#

+
+
+
    +
  • cardinality: 동일한 객체를 여러 번 생성할 때, Muse 는 크기, 색상, 회전된 모습

  • +
+
+fig_1 +
+

Fig. 434 Figure 7#

+
+
+
    +
  • 정량적 평가

  • +
+

:::{figure-md} +fig_1        Table 6 +        :::

+
    +
  • FID(diversity) ↔ CLIP score(image-text alignment)

    +
    +fig_1 +
    +

    Fig. 435 Figure 8#

    +
    +
    +
  • +
  • inpainting, outpainting

    +
    +fig_1 +
    +

    Fig. 436 Figure 10#

    +
    +
    +
  • +
+
+
+
+

Contribution#

+
    +
  1. FID, CLIP score 기반으로 text-to-image 모델에 대한 SOTA 를 달성

    +
      +
    • 이미지 생성 퀄리티, 다양성, text prompt와의 alignment 측정했음

    • +
    +
  2. +
  3. quantized 이미지 토큰과 parallel decoding 으로 인해 빠른 inference 가 가능

  4. +
  5. inpainting, outpainting, mask-free editing 을 포함한 zero-shot editing 가능

  6. +
+
+
+

Q&A#

+
    +
  1. Muse 와 같은 transformer 기반의 generation 모델에서는 어떻게 diversity 한 결과를 가져올 수 있나요?

    +
      +
    1. 아무래도 Muse 는 random latent 에서 생성하는 것이 아니라 text-to-image 모델이라, text 에 따라서 다양한 이미지 생성 결과가 나타날 수 있을 것 같습니다.

    2. +
    +
  2. +
  3. Muse 는 결국 GAN 모델인가요?

    +
      +
    1. 기준점이 어떻냐에 따라 GAN 이다, 아니다, 라고 정하기 어려울 것 같습니다. VQGAN을 사용해서 GAN이라고 생각할 수 도 있고, GAN 처럼 random latent 결과에 따라 이미지 생성이 달라질 수 있는 관점에서 생각하면 아니다라고 말할 수 있을 것 같습니다.

    2. +
    +
  4. +
  5. Token 은 어떤 의미를 갖나요?

    +
      +
    1. VQGAN에서 input 이미지를 인코딩하고, vector-quantization 과정을 거쳐 압축 후, codebook의 값을 가져와 feature를 구성하는데요, 이때 feature에 포함되어 있는 하나의 포인트에 해당하는 것이 token이라고 생각하시면 될 것 같습니다.

    2. +
    +
  6. +
  7. 텍스트 프롬프트를 넣었을때 실제 이미지 생성은 어떻게 이뤄지나요? Inference에서는 입력 이미지가 없는데 base transformer에 입력 이미지에 대한 masked token대신 뭐가 들어가게 되나요?

    +
      +
    1. 실제 inference 과정에서는 input 이미지가 없기 때문에 모두 마스크된 형태로 입력되게 됩니다. text prompt 의 condition 에 따라 각 step을 거쳐 decoding 이 수행됩니다.

    2. +
    +
  8. +
  9. text embedding이 어떻게 objective function 수식에 들어가나요?

    +
      +
    1. base transformer 에 대해 text embedding 값이 key, value로 입력되어 cross-attention 이 수행되게 됩니다. 그렇게 예측된 feature와 GT의 feature 끼리 cross entropy loss를 통해 마스크 예측할 수 있는 base transformer 가 학습이 됩니다.

    2. +
    +
  10. +
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/NeRF.html b/docs/review/NeRF.html new file mode 100755 index 00000000..3c5ab831 --- /dev/null +++ b/docs/review/NeRF.html @@ -0,0 +1,1161 @@ + + + + + + + + + + + + NeRF : Representing Scenes as Neural Radiance Fields for View Synthesis — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

  • +
  • Reference

    + +
  • +
  • Author: Jeongin Lee

  • +
  • Last updated on May. 22, 2024

  • +
+
+
+

NeRF : Representing Scenes as Neural Radiance Fields for View Synthesis#

+

https://youtu.be/JuH79E8rdKc?feature=shared

+
    +
  • 기존의 3D object 자체를 구성하여 렌더링하는 explicit method → 저장 용량이 많이 소요

  • +
  • NeRF 는 3D object 자체를 구성하지 않는, synthesizing novel views +좌표를 mlp에 넣어 픽셀 별 색상 및 밀도 값을 얻는 implicit method

  • +
  • synthesizing novel views
    +특정한 장면(Scene)에서 여러 각도로 찍은 일부의 사진들을 가지고 완전 새로운 각도의 모습을 유추하는 task

  • +
+
+

0. Abstract#

+
    +
  • NeRF

    +
      +
    • 한정된 수의 입력 뷰 이미지들을 사용

    • +
    • continous volumetric scene 함수 최적화를 통해 synthesizing novel views 에서 SOTA 달성

    • +
    +
  • +
  • Algorithm

    +
      +
    • FC layer 사용 (non-convolutional)

      +
        +
      • input : 5 차원 좌표 (공간적 위치\((x, y, z)\) & 바라보는 방향\((\theta, \phi))\)

      • +
      • output : volume density와 해당 방향에 대한 색상 값

      • +
      +
    • +
    • 5 차원 좌표 입력 → 카메라 광선을 따라 RGB 값, Volume density 예측 +→ 고전적 Volume rendering 기술을 사용하여 image 로 합성

    • +
    +
  • +
  • 복잡한 구조 및 외형을 갖는 scene 에 대한 Novel views rendering 을 위해 NeRF 를 최적화하는 방법을 제시 (+ Positional Encoding, Hierarchical volume sampling)

  • +
  • 실험을 통해 기존 작업을 능가하는 결과를 입증

  • +
  • Keywords : scene representation, view synthesis, image-based rendering, +volume rendering, 3D deep learning

  • +
+

field representation} \ (source: {https://arxiv.org/pdf/2003.08934v2}) +:::

+
+
+

1. Introduction#

+

캡처된 이미지들의 렌더링 오차를 최소화하기 위해 연속적인 \(5 \mathrm{D}\) scene 함수의 파라미터를 직접 최적화하여 View synthesis 분야의 오랜 문제를 새로운 방식으로 해결함

+
+
    +
  • 정적 장면 → 연속적인 \(5 \mathrm{D}\) 함수로 표현

    +
      +
    • FC layer = Regression Function : +a single \(5 \mathrm{D}\) coord \((x, y, z, \theta, \phi)\) → density, view-dependent RGB color

    • +
    +
  • +
  • Output

    +
      +
    • 공간 상의 각 지점 \((x, y, z)\)에서 각 방향 \((\theta, \phi)\) 으로 방출된 색상

    • +
    • 각 지점 \((x, y, z)\) 의 밀도(density) = \(\sigma\)

      +
        +
      • 밀도의 누적값을 통해 얼마나 많은 빛이 \((𝑥,𝑦,𝑧)\) 를 통과하는 광선에 의해 누적되는지를 표현

      • +
      +
    • +
    +
  • +
+
+
    +
  • 특정 시점으로부터의 NeRF 렌더링

    +
      +
    1. 광선을 따라 이동하여 샘플링된 \(3 \mathrm{D}\) 포인트 집합을 생성

    2. +
    3. 해당 포인트들과 이에 해당하는 \(2 \mathrm{D}\) 시점 방향을 신경망에 대한 입력으로 사용하여 색상과 밀도의 집합을 생성

    4. +
    5. 고전적 Volume rendering 기술을 사용하여 \(2 \mathrm{D}\) image 로 합성

    6. +
    +
  • +
+
+
    +
  • Optimization

    +
      +
    • 미분 가능, gradient descent 를 통한 최적화

    • +
    • 각 관찰된 이미지와 렌더링된 해당 views사이의 오차를 최소화

    • +
    • 다양한 views 에서 오차 최소화를 통해 실제 장면의 cotents 가 포함된 위치에 높은 밀도정확한 색상을 할당하여 장면의 일관된 모델을 예측

    • +
    +
  • +
+
+
    +
  • NeRF 최적화의 Basic implementation의 한계 및 대안

    +
      +
    1. 복잡한 장면에 대해서 충분히 고해상도 표현으로 수렴되지 않음

      +
        +
      • positional encoding 으로 입력 5D 좌표를 변환

      • +
      • MLP가 더 높은 주파수의 함수를 나타낼 수 있음.

      • +
      +
    2. +
    3. 카메라 광선당 요구되는 샘플링 수가 비효율적

      +
        +
      • 계층적 샘플링 절차를 제안

      • +
      • 고주파수의 장면 표현을 적절하게 샘플링하기 위해 필요한 쿼리 수를 감소시킴

      • +
      +
    4. +
    +
  • +
+
+
    +
  • 본 논문의 접근 방식은 volumetric 표현의 이점을 상속

    +
      +
    • 복잡한 실세계의 기하학적 형태와 외형을 표현 가능

    • +
    • 투영된 이미지를 사용한 Gradient-based 최적화에 적합

    • +
    • 고해상도에서 복잡한 장면을 모델링할 때 이산화된 복셀 그리드의 엄청난 저장 비용을 극복

    • +
    + +
  • +
+
+
    +
  • Technical contributions

    +
      +
    • 복잡한 기하학과 소재를 가진 연속적인 장면을 5차원 NeRF 로 나타내는 접근 방법, 기본 MLP 네트워크로 매개변수화

    • +
    • 고전적인 볼륨 렌더링 기법을 기반으로 한 미분 가능한 렌더링 절차를 사용하여 이러한 표현을 표준 RGB 이미지로부터 최적화하는 방법을 제안

    • +
    • hierarchical sampling strategy : MLP’s capacity 를 시각적인 장면 내용이 있는 공간으로 할당 (물체가 있을 확률이 높은 부분을 모델이 집중적으로 학습)

    • +
    • Positional encoding : 입력 5차원 좌표를 고차원 공간으로 매핑하기 위해 NeRF를 성공적으로 최적화하여 고주파의 장면 콘텐츠를 표현가능

    • +
    +
  • +
  • 최초의 continuous neural scene representation 제안

  • +
+
+ +
+

3. Neural Radiance Field Scene Representation#

+
    +
  • 5차원 벡터 함수 (MLP) \(F_{\Theta}:(\mathbf{x}, \mathbf{d}) \rightarrow(\mathbf{c}, \sigma)\)

    +
      +
    • input : \(3 \mathrm{D}\) location \(\mathbf{x}=(x, y, z)\) , \(2 \mathrm{D}\) viewing direction \(\mathbf{d}=(\theta, \phi)\)

      +
        +
      • (practically) direction as a \(3 \mathrm{D}\) Cartesian unit vector \(\mathbf{d}\)

      • +
      • 벡터 \(\mathbf{d} =(𝑑_𝑥,𝑑_𝑦,𝑑_𝑧)\) 는 방향을 나타내며, 이는 단위 벡터(길이가 1)로 정규화

      • +
      +
    • +
    • output : emitted color \(\mathbf{c}=(r, g, b)\), volume density \(\sigma\)

    • +
    +
  • +
  • \(\mathbf{x}\) → \(\sigma\) , \((\mathbf{x, d})\) → RGB 색상 \(\mathbf{c}\) 를 예측하도록 권장 (색상은 view dependent 이므로)

    +
      +
    1. MLP \(F_{\Theta}\) 는 먼저 8개의 fully-connected layer (ReLU, 256개 채널 사용) 로 +입력 3D 좌표 \(\mathbf{x}\) →  \(\sigma\) , 256차원 feature 벡터를 출력

    2. +
    3. a 의 feature 벡터는 카메라 광선의 시점 방향과 concat

    4. +
    5. 뷰에 따른 RGB 색상을 출력하는 하나의 추가 fully-connected layer (ReLU,128개 채널 사용)로 전달됨

      +

      Untitled

      +
    6. +
    +
  • +
  • View 를 고려하여 색상을 예측해야 하는 이유 : non-Lambertian effects

    +
      +
    • Lambertian 효과

      +
        +
      • 물체의 표면에서 나오는 광선이 균일하게 반사되는 현상

      • +
      • 표면의 방향과 상관없이 광선이 표면에서 나오는 각도에 따라 반사되는 광량이 일정하다는 원리를 기반

      • +
      +
    • +
    • Fig. 3 : 입력 시선 방향을 사용하여 non-Lambertian effects 를 표현한 예시

    • +
    +
      +
    • Fig. 4 : view dependence 를 고려하지 않고 (only \(\mathbf{x}\) input) 학습된 모델은 반사성(specularity)을 표현하는데 어려움이 있음

    • +
    +
  • +
+
+
+

4. Volume Rendering with Radiance Fields#

+
    +
  • 5D NeRF 는 장면을 volume density 와 특정 포인트에서 방출된 빛(색상)으로 표현

  • +
  • 볼륨 렌더링 : scene 을 통과하는 모든 광선의 색상을 렌더링

    +
      +
    • NeRF 로부터 View 를 렌더링하려면 원하는 가상 카메라의 각 픽셀을 거쳐 추적된 카메라 광선에 대해 적분값 \(C(\mathbf{r})\) 을 추정을 요구

    • +
    • \(\mathbf{r}(t)=\mathbf{o}+t \mathbf{d}\) : 카메라 광선

    • +
    • \(C(\mathbf{r})\) : near bound \(t_n\) , far bound \(t_f\) 에서 카메라 광선 \(\mathbf{r}(t)\) 의 예측된 색상

    • +
    • \(T(t)\) : ray 를 따라 \(t_n\) 부터 \(t\) 까지 누적된 투과율(transmittance)

    • +
    +
  • +
+
+\[ +C(\mathbf{r})=\int_{t_n}^{t_f} T(t) \sigma(\mathbf{r}(t)) \mathbf{c}(\mathbf{r}(t), \mathbf{d}) d t, \text { where } T(t)=\exp \left(-\int_{t_n}^t \sigma(\mathbf{r}(s)) d s\right) +\]
+
    +
  • Quadrature (구적법) 을 통해 연속적 적분값을 수치적으로 추정

    +
      +
    • 이산화된 ****voxel grids 렌더링에 사용되는 결정론적 구적법의 한계

    • +
    • 일반적으로 이산화된 복셀 그리드를 렌더링하는 데 사용되는 결정론적 구적법은 MLP가 고정된 이산 위치 집합에서만 쿼리되기 때문에 표현의 해상도를 제한

    • +
    +
  • +
+ +
    +
  • 위의 샘플링 방법을 통해 뽑은 샘플들로 [26]에서 리뷰된 볼륨 렌더링에서 논의된 구적법으로 \(C(\mathbf{r})\) 을 추정 (적분을 sample sum 으로)

    +
    +\[\begin{split} + \hat{C}(\mathbf{r})=\sum_{i=1}^N T_i\left(1-\exp \left(-\sigma_i \delta_i\right)\right) \mathbf{c}_i, \\ \text { where } T_i=\exp \left(-\sum_{j=1}^{i-1} \sigma_j \delta_j\right), + \end{split}\]
    +
      +
    • \(\delta_i=t_{i+1}-t_i\) is the distance between adjacent samples (\(dt\) 를 대체)

    • +
    • \(\left(\mathbf{c}_i, \sigma_i\right)\) 의 집합으로부터 \(\hat{C}(\mathbf{r})\) 을 계산하는 함수는 쉽게 미분 가능하며 +\(\alpha_i=1-\exp \left(-\sigma_i \delta_i\right)\) 를 사용한 전통적인 alpha compositing

    • +
    • **alpha compositing (**알파 합성)

      +
        +
      • 여러 이미지 또는 픽셀을 결합하여 하나의 이미지로 만드는 기술

      • +
      • ex) 투명한 이미지(유리, 그림자)를 배경 이미지 위에 겹칠 때 알파 컴포지팅을 사용하여 자연스러운 합성 수행

      • +
      +
    • +
    +
  • +
+
+
+

5. Optimizing a Neural Radiance Field#

+

[REMIND]

+
    +
  • 지금까지 NeRF 로 scene 을 모델링하는 것, 이 표현으로 새로운 views 를 렌더링 하는 것 에 필요한 핵심적인 구성요소를 다룸

    +
      +
    • 하지만 해당 요소들로 SOTA 성능을 달성하기에는 한계 존재

    • +
    • 고해상도 + 복잡한 scene 을 표현 가능하게 하는 두개의 개선점을 도입

    • +
    +
  • +
+
    +
  1. Positional encoding of the input coordinates +that assists the MLP in representing high-frequency functions

  2. +
  3. hierarchical sampling procedure +that allows us to efficiently sample this high-frequency representation.

  4. +
+
+

5.1 Positional encoding#

+
    +
  • Neural network \(F_{\Theta}\) 가 직접 \((x, y, z, \theta, \phi)\) input coordinates 에서 직접 연산하는 경우, 색상과 형태에서 고주파 변동을 표현하는데 성능이 좋지 않았음

  • +
  • [35] On the spectral bias of neural networks 논문 결과와 동일,

    +
      +
    • 깊은 신경망이 저주파 함수를 학습하는 쪽으로 편향되었음을 보여줌

    • +
    • 신경망을 통과하기 전 고주파 함수를 사용하여 입력을 고차원 공간으로 맵핑하는 것은 고주파 변동이 포함된 데이터를 더 잘 적합 가능하게 함을 제시

    • +
    • 저자들은 Neural scene representations 에서 위의 결과를 이용

    • +
    +
  • +
  • \(F_{\Theta}\) 를 두개의 함수로 구성 \(F_{\Theta}=F_{\Theta}^{\prime} \circ \gamma\) 성능을 상당히 개선 (\(\gamma\) : 학습 X)

    +
    +\[ + \gamma(p)=\left(\sin \left(2^0 \pi p\right), \cos \left(2^0 \pi p\right), \cdots, \sin \left(2^{L-1} \pi p\right), \cos \left(2^{L-1} \pi p\right)\right) . + \]
    +
      +
    • \(\gamma\) : mapping \(\mathbb{R}\)\(\mathbb{R}^{2 L}\), \(F_{\Theta}^{\prime}\) : Regular MLP

    • +
    • \(\gamma(\cdot)\) : \(\mathbf{x}\) 의 각 세개의 좌표값과 Cartesian 시점 방향 벡터 \(\mathbf{d}\) 의 세 성분에 \([-1,1]\)사이로 정규화 후 개별적으로 적용에 분리되어 적용됨

    • +
    • Experiments : \(L=10\) for \(\gamma(\mathbf{x})\) and \(L=4\) for \(\gamma(\mathbf{d})\)

    • +
    +
  • +
+
+
+

5.2 Hierarchical volume sampling#

+
    +
  • Stratified Sampling

    +
      +
    • 비효율적

    • +
    • 렌더링된 이미지에 기여하지 않는 여유 공간(비어있는 부분) 막혀있는(가려진) 영역이 여전히 반복적으로 샘플링됨.

    • +
    +
  • +
  • Hierarchical volume sampling

    +
      +
    • 최종 렌더링에 대한 예상 효과에 비례하여 샘플을 할당

    • +
    • 렌더링 효율성을 증가시킴

    • +
    +

    ➡️ Content가 더 있을 것 같은 곳을 더 뽑자 !

    +
  • +
  • scene 표현을 위해 단순히 단일 네트워크를 사용하는 것 대신에 우리는 동시에 2개의 네트워크를 최적화

    +

    Step 1. Coarse

    +

    Step 2. Fine

    +
  • +
+
+
    +
  1. Coarse

    +

    Stratified sampling\(N_c\) 개의 위치 집합을 샘플링, 이 위치에서 \(\hat{C(r)}\) 을 예측하여 Coarse network 를 평가

    +
  2. +
  3. Fine

    +
      +
    1. 1에서 주어진 Coarse 네트워크의 출력을 바탕으로 더 많은 정보에 기반한 포인트 샘플링을 생성 (더 많은 정보에 기반한 포인트 샘플링을 생성)

    2. +
    3. Coarse 네트워크에서의 알파 합성 색상 \(\hat{C}_c(\mathbf{r})\)을 광선을 따라 샘플링된 모든 컬러 \(c_i\)들의 가중합 형태로 다시 씀

      +
      +\[ + \hat{C}_c(\mathbf{r})=\sum_{i=1}^{N_c} w_i c_i, \quad w_i=T_i\left(1-\exp \left(-\sigma_i \delta_i\right)\right) . + \]
      +
    4. +
    +
  4. +
  5. piecewise-constant PDF

    +

    Normalizing weight 를 통해 생성

    +
  6. +
+
+\[ +\hat{w}i= \dfrac{w_i}{\sum_{j=1}^{N_c} w_j} +\]
+
    +
  • 역변환 샘플링을 통해 확률 밀도함수 값에 기반한 2번째 샘플집합의 샘플 \(N_f\) 개를 샘플링

  • +
  • 첫 번째와 두 번째 샘플 집합의 합집합에서 fine 네트워크를 평가

  • +
  • 모든 \(N_c+N_f\) 샘플을 사용하여 광선의 최종 렌더링된 색상 \(\hat{C}_f(\mathbf{r})\) 를 계산

  • +
  • 이 절차에서는 관측 가능한 content가 포함될 것으로 예상되는 영역에 더 많은 샘플을 할당

  • +
+
+
+

5.3 Implementation details#

+
    +
  • 각 Scene 에 대해 네트워크 를 별도로 최적화

    +

    scene이 캡처된 RGB 이미지, extrinsic parameter(해당 카메라 포즈), intrinsic parameter, 장면 경계로 구성된 데이터셋이 필요

    +
      +
    • extrinsic parameter, intrinsic parameter

      +

      Extrinsic Parameter

      +

      3D 공간 내에서 카메라가 어디에 위치(3D Translation)하고 있고, 어디를 바라보고 있는지(3D Rotation)에 대한 Parameter

      +

      Intrinsic Parameter

      +

      카메라 렌즈와 센서 위치에 의해서 결정되어지는 항목으로,

      +

      이미지 패널이 얼마나 이동(2D Translation)하고, 얼마나 확대하고(2D Scaling),  +얼마나 기울어졌는지(2D Shear) 대한 intrinsic parameter

      +
        +
      • 카메라 영상 : 3차원 공간상의 점들을 2차원 이미지 평면에 투사(perspective projection)

      • +
      +
    • +
    +
  • +
  • Training

    +
      +
    1. 각 최적화 iteration에서 데이터셋의 모든 픽셀 집합에서 카메라 광선 batch를 무작위로 샘플링

    2. +
    3. 계층적 샘플링을 따라 coarse 네트워크의 \(N_c\) 개의 샘플과 fine 네트워크의\(N_c + N_f\)개의 샘플을 쿼리

    4. +
    5. volume rendering 절차를 사용하여 두샘플 집합 모두에서 광선의 색상을 렌더링

    6. +
    +
  • +
  • Loss +coarse 렌더링과 fine 렌더링의 색상 vs 실제 픽셀 색상 간의 총 제곱 오차

    +
    +\[ + \mathcal{L}=\sum_{\mathbf{r} \in \mathcal{R}}\left[\left\|\hat{C}_c(\mathbf{r})-C(\mathbf{r})\right\|_2^2+\left\|\hat{C}_f(\mathbf{r})-C(\mathbf{r})\right\|_2^2\right] + \]
    +
      +
    • \(\mathcal{R}\) : 각 batch 의 광선의 집합

    • +
    • \(C(\mathbf{r})\) : Ray \(\mathbf{r}\) 에 대한 Ground Truth RGB colors

    • +
    • \(\hat{C}_c(\mathbf{r})\) : Ray \(\mathbf{r}\) 에 대한 Coarse volume predicted RGB colors

    • +
    • \(\hat{C}_f(\mathbf{r})\) : Ray \(\mathbf{r}\) 에 대한 Fine volume predicted RGB colors

    • +
    • 최종 렌더링은 \(\hat{C}_f(\mathbf{r})\) 이지만, \(\hat{C}_c(\mathbf{r})\) 의 Loss 역시 최소화

      +
        +
      • Coarse 네트워크의 weight 분포가 fine network 의 샘플링의 기반이 되기 때문

      • +
      +
    • +
    +
  • +
+
+
+
+

5.4 Experiments detail#

+
    +
  • a batch size of 4096 rays

  • +
  • sampling coordinates :

    +
      +
    • \(N_c=64\) in the coarse volume

    • +
    • \(N_f=128\) in the fine volume

    • +
    +
  • +
  • Optimizer : Adam, lr : \(5 \times 10^{-4}\)\(5 \times 10^{-5}\) (exponentially decay learning rate)

    +
      +
    • Default : \(\beta_1=0.9, \beta_2=0.999\),

    • +
    +
  • +
  • iteration: 한 장면 당 10~30만 iter (NVIDIA V100 GPU 1개로 1~2일 소요)

  • +
+
+
+

6. Results#

+
+

6.1 Datasets#

+
    +
  • Synthetic renderings of object +:::{figure-md} +Diffuse Synthetic +{Diffuse Synthetic : Lambertian, Realistic Synthetic : non-Lambertian} +:::

  • +
+
    +
  1. Diffuse / Synthetic \(360\degree\)

    +
      +
    1. 총 4개의 Lambertian 물체가 간단한 geometry로 구성

    2. +
    3. object : 512×512

    4. +
    5. 상반구에 대한 viewpoint 를 렌더링

    6. +
    7. Train : 479, Test : 1000

    8. +
    +
  2. +
  3. Real / Synthetic \(360\degree\), Forward-Facing

    +
      +
    1. 총 8개의 non-Lambertian 물체 8개,

    2. +
    3. 각각의 pathtraced image 를 포함한 형태의 데이터 셋을 구성

    4. +
    5. object : 800×800

    6. +
    7. 6 Scenes : 상반구에 대한 viewpoint 를 렌더링, 2 Scenes : 구 전체에 대한 viewpoint 를 렌더링

    8. +
    9. Train : 100, Test : 200

    10. +
    +
  4. +
  5. Real / Forward-Facing

    +
      +
    1. 복잡한 형태의 현실 scene을 앞쪽에서 본 모습을 사용

    2. +
    3. 총 8개의 scene, (5 scenes : LLFF paper 3 scenes : 직접 캡처)

    4. +
    5. object : \(1008\times 756\)

    6. +
    7. Train : Test = 7 : 1

    8. +
    +
  6. +
+
+
+

6.2 Comparisons#

+
    +
  • Models

    +
      +
    • Neural Volumes (NV)

    • +
    • Scene Representation Networks (SRN)

    • +
    • Local Light Field Fusion (LLFF)

    • +
    +
  • +
+
+
+

6.3 Discussion#

+
    +
  1. comparison : Diffuse Synthetic : Lambertian, Realistic Synthetic : non-Lambertian

  2. +
+
    +
  • \(\text{Nerf}\) : 미세 디테일, 기하학적 구조, 외양, nonLambertian 반사 반영

  • +
  • \(\text{LLFF}\) : ghosting artifact (ship, lego)

  • +
  • \(\text{SRN}\) : blurry and distorted rendering

  • +
  • \(\text{NV}\) : detail 및 기하적 구조 반영 실패

  • +
  • Ghosting : 렌더링에서의 객체 겹침 혹은 번짐

  • +
  • Lambertian : 모든 각도에서 동일한 밝기

  • +
  • Non-Lambertian : 각도에 따라 밝기와 색상 변화 / 광택, 반사, 투명도 등을 가짐

  • +
+
    +
  1. comparison : reconstruction partially occluded regions

  2. +
+
+
+

6.4 Ablation studies#

+
    +
  • Realistic Synthetic 360도 scene

  • +
  • 위치 인코딩(PE), 시점 의존성(VD), 계층적 샘플링(H)

  • +
  • 최대 주파수 \(L\) 의 선택

    +
      +
    • 5→10 (성능 향상), 10→15 (성능 감소)

    • +
    • \(2^L\) 이 샘플링 된 입력 이미지에서 존재하는 최대 주파수(본 데이터는 1024)를 초과할 때 추가적인 성능 향상에 제한

    • +
    +
  • +
+
+
+
+
+

(Appendix) A. Additional Implementation Details#

+
    +
  1. Volume Bounds +For experiments with synthetic images, we scale the scene so that it lies within a cube of +side length 2 centered at the origin, and only query the representation within this bounding volume. we use normalized device coordinates to map the depth range of these points into [−1, 1].

  2. +
  3. Training Details +adding random Gaussian noise with zero mean and unit variance to the output σ values during optimization

  4. +
  5. Rendering Details +:::{figure-md} +NeRF architecture>

    +
     {fully-connected network architecture} \  (source: {https://arxiv.org/pdf/2003.08934v2})
    + :::
    +
    +
    +
  6. +
+
    +
  • Coarse network 64 + fine network 128 = 192

  • +
  • fully-connected network 구조

  • +
  • positional encoding이 더해진 형태의 위치 정보**\((\gamma(x))\)** 를 input으로 투입

  • +
  • 256 채널과 ReLU로 엮인 총 8개의 네트워크를 통과하게 된다. 해당 논문에서는 DeepSDF 구조를 따르고, skip connection을 5번째 layer의 activation에 투입

  • +
  • 추가 레이어는 volume density 를 output으로 산출

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/docs/review/SDEdit.html b/docs/review/SDEdit.html old mode 100644 new mode 100755 index 2a73db95..f6af2106 --- a/docs/review/SDEdit.html +++ b/docs/review/SDEdit.html @@ -1,809 +1,828 @@ - - - - - - - - - - - - SDEdit — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: SDEdit: Guided Image Synthesis and Editing with Stochastic Differential Equations

  • -
  • Reference

    - -
  • -
  • Author: Seunghwan Ji

  • -
  • Last updated on Oct. 03, 2023

  • -
-
-
-

SDEdit#

-
-

Abstract#

-
    -
  • 최근 이미지 생성 분야에서의 놀라운 진화 속도가 계속 되어오고있다. (GAN, Diffusion etc..)

  • -
  • 이 중 이미지에 random noise를 추가해 denoising 과정을 학습하는 Diffusion을 통해 high quality의 이미지를 생성할 수 있다.

  • -
  • 또, 생성되는 이미지를 사용자가 원하는 방향으로 이끌어내려는 연구 분야도 활발히 진행되고있다 (a.k.a Editing)

  • -
  • 하지만, GAN 또는 Diffusion을 포함한 방식으로의 Editing에는 몇가지 단점이 있고, SDEdit은 그런 문제점을 해결해나아갔다는 점을 논문의 핵심 Contribution으로 제시하였다.

  • -
-
-
-

1. Introduction#

-
    -
  • Abstract에서 말한 Editing이란, 유저가 생성하고자 하는 Guide를 제시하면 모델은 해당 Guide를 기반으로 이미지를 생성해내는 Vision Task를 의미한다.

  • -
  • 이때 두가지의 평가요소가 있는데

    -
      -
    1. faithful : 유저의 Guide를 얼마나 잘 따르는지

    2. -
    3. realistic : 생성된 이미지가 얼마나 real한지

    4. -
    -
  • -
  • 기존의 연구방식은 크게 두가지로 나뉜다.

    -
      -
    1. GAN(Generative Adversarial Network) 기반

    2. -
    3. Diffusion 기반

    4. -
    -
  • -
  • 이 중 기존에 SOTA를 이룬 GAN 방식을 살펴보면 다시 크게 두가지로 나뉜다.

    -
      -
    1. conditional GAN

      -
        -
      • 특징 : 원본 이미지에서 Edit된 Pair 이미지를 직접 학습

      • -
      • 단점 : Pair Dataset이 반드시 필요하고, Condition마다 재학습을 요구

      • -
      -
    2. -
    3. GAN Inversion

      -
        -
      • 특징 : 이미지를 Latent space로 Inversion한 후, Latent vactor를 조작해(manipulate) Edited image를 생성

      • -
      • 단점 : 새로운 loss function이 정의되어야하고, condition마다 재학습을 요구

      • -
      -
    4. -
    -
  • -
  • 그에 반해 SDEdit은

    -
      -
    1. Pair Dataset이 필요하지 않다.

    2. -
    3. 추가적인 loss function과 재학습이 모두 필요하지 않다.

    4. -
    5. 단 한개의 pretrained weight로 모든 condition의 이미지를 생성할 수 있다.

    6. -
    -
  • -
-
- -
-

3. Methods#

-
    -
  1. Pre-Setup

    -
      -
    • Guide image의 Level을 정의한다.

      -
      -SDEdit_02 -
      -

      Fig. 231 Image 3#

      -
      -
      -
        -
      1. low-level guide : real 이미지위에 image patch를 추가

      2. -
      3. mid-level guide : real 이미지위에 stroke를 추가

      4. -
      5. high-level guide : 단순히 coarse한 stroke의 이미지

      6. -
      -
    • -
    -
  2. -
  3. Procedure

    -
      -
    • DDPM과 달리 SDE의 경우, 완전히 noise화된 이미지 즉, random noise로부터 denoising을 진행할 필요가 없다.

    • -
    • 즉, 적절한 \(t_{0} \in [0,1]\)를 지정한 후 denoising process가 가능하다.

      -
      -SDEdit_03 -
      -

      Fig. 232 Image 4#

      -
      -
      -
    • -
    • 이 때, 적절한 \(t_{0}\)를 정의해야하는데,

      -
        -
      1. \(t_{0}\) = 1 (i.e. random noise)이면, realistic하지만, faithful 하지않은 이미지

      2. -
      3. \(t_{0}\) = 0 이면, faithful하지만, artistic한 이미지

      4. -
      -

      를 얻게된다.

      -
      -SDEdit_04 -
      -

      Fig. 233 Image 5#

      -
      -
      -
    • -
    • 아래는 SDEdit의 적용 과정이다.

      -
      -SDEdit_05 -
      -

      Fig. 234 Image 6#

      -
      -
      -
    • -
    -
  4. -
-
-
-

4. Experiments#

-
    -
  • Score

    -
      -
    • Metric

      -
        -
      • realistic : Kid score (lower is better)

      • -
      • faithful : \(L_{2}\) score (lower is better)

      • -
      • 그 외 종합적인 평가 지표로 survey를 통한 수치를 제시하였다.

        -
        -SDEdit_06 -
        -

        Fig. 235 Image 7#

        -
        -
        -
      • -
      -
    • -
    • 기존의 GAN 방식들과 비교했을 때 Kid, \(L_{2}\) score 모두 더 좋은 수치를 보이는 것을 확인할 수 있다.

    • -
    -
  • -
  • Comparison with GAN (styleGAN-ADA + Inversion)

    -
    -SDEdit_07 -
    -

    Fig. 236 Image 8#

    -
    -
    -
      -
    • SDEdit이 GAN Based model보다 더 자연스럽고(realistic), 유저의 guide를 잘 따르는(faithful)것을 확인할 수 있다.

    • -
    -
  • -
  • Comparison with original blending technique

    -
    -SDEdit_08 -
    -

    Fig. 237 Image 9#

    -
    -
    -
    -SDEdit_09 -
    -

    Fig. 238 Image 10#

    -
    -
    -
      -
    • 기존의 전통적인 방식의 몇가지 blending 기법과 비교해도 더 좋은 성능과 수치를 보이는 것을 확인할 수 있다.

    • -
    -
  • -
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + SDEdit — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: SDEdit: Guided Image Synthesis and Editing with Stochastic Differential Equations

  • +
  • Reference

    + +
  • +
  • Author: Seunghwan Ji

  • +
  • Last updated on Oct. 03, 2023

  • +
+
+
+

SDEdit#

+
+

Abstract#

+
    +
  • 최근 이미지 생성 분야에서의 놀라운 진화 속도가 계속 되어오고있다. (GAN, Diffusion etc..)

  • +
  • 이 중 이미지에 random noise를 추가해 denoising 과정을 학습하는 Diffusion을 통해 high quality의 이미지를 생성할 수 있다.

  • +
  • 또, 생성되는 이미지를 사용자가 원하는 방향으로 이끌어내려는 연구 분야도 활발히 진행되고있다 (a.k.a Editing)

  • +
  • 하지만, GAN 또는 Diffusion을 포함한 방식으로의 Editing에는 몇가지 단점이 있고, SDEdit은 그런 문제점을 해결해나아갔다는 점을 논문의 핵심 Contribution으로 제시하였다.

  • +
+
+
+

1. Introduction#

+
    +
  • Abstract에서 말한 Editing이란, 유저가 생성하고자 하는 Guide를 제시하면 모델은 해당 Guide를 기반으로 이미지를 생성해내는 Vision Task를 의미한다.

  • +
  • 이때 두가지의 평가요소가 있는데

    +
      +
    1. faithful : 유저의 Guide를 얼마나 잘 따르는지

    2. +
    3. realistic : 생성된 이미지가 얼마나 real한지

    4. +
    +
  • +
  • 기존의 연구방식은 크게 두가지로 나뉜다.

    +
      +
    1. GAN(Generative Adversarial Network) 기반

    2. +
    3. Diffusion 기반

    4. +
    +
  • +
  • 이 중 기존에 SOTA를 이룬 GAN 방식을 살펴보면 다시 크게 두가지로 나뉜다.

    +
      +
    1. conditional GAN

      +
        +
      • 특징 : 원본 이미지에서 Edit된 Pair 이미지를 직접 학습

      • +
      • 단점 : Pair Dataset이 반드시 필요하고, Condition마다 재학습을 요구

      • +
      +
    2. +
    3. GAN Inversion

      +
        +
      • 특징 : 이미지를 Latent space로 Inversion한 후, Latent vactor를 조작해(manipulate) Edited image를 생성

      • +
      • 단점 : 새로운 loss function이 정의되어야하고, condition마다 재학습을 요구

      • +
      +
    4. +
    +
  • +
  • 그에 반해 SDEdit은

    +
      +
    1. Pair Dataset이 필요하지 않다.

    2. +
    3. 추가적인 loss function과 재학습이 모두 필요하지 않다.

    4. +
    5. 단 한개의 pretrained weight로 모든 condition의 이미지를 생성할 수 있다.

    6. +
    +
  • +
+
+ +
+

3. Methods#

+
    +
  1. Pre-Setup

    +
      +
    • Guide image의 Level을 정의한다.

      +
      +SDEdit_02 +
      +

      Fig. 231 Image 3#

      +
      +
      +
        +
      1. low-level guide : real 이미지위에 image patch를 추가

      2. +
      3. mid-level guide : real 이미지위에 stroke를 추가

      4. +
      5. high-level guide : 단순히 coarse한 stroke의 이미지

      6. +
      +
    • +
    +
  2. +
  3. Procedure

    +
      +
    • DDPM과 달리 SDE의 경우, 완전히 noise화된 이미지 즉, random noise로부터 denoising을 진행할 필요가 없다.

    • +
    • 즉, 적절한 \(t_{0} \in [0,1]\)를 지정한 후 denoising process가 가능하다.

      +
      +SDEdit_03 +
      +

      Fig. 232 Image 4#

      +
      +
      +
    • +
    • 이 때, 적절한 \(t_{0}\)를 정의해야하는데,

      +
        +
      1. \(t_{0}\) = 1 (i.e. random noise)이면, realistic하지만, faithful 하지않은 이미지

      2. +
      3. \(t_{0}\) = 0 이면, faithful하지만, artistic한 이미지

      4. +
      +

      를 얻게된다.

      +
      +SDEdit_04 +
      +

      Fig. 233 Image 5#

      +
      +
      +
    • +
    • 아래는 SDEdit의 적용 과정이다.

      +
      +SDEdit_05 +
      +

      Fig. 234 Image 6#

      +
      +
      +
    • +
    +
  4. +
+
+
+

4. Experiments#

+
    +
  • Score

    +
      +
    • Metric

      +
        +
      • realistic : Kid score (lower is better)

      • +
      • faithful : \(L_{2}\) score (lower is better)

      • +
      • 그 외 종합적인 평가 지표로 survey를 통한 수치를 제시하였다.

        +
        +SDEdit_06 +
        +

        Fig. 235 Image 7#

        +
        +
        +
      • +
      +
    • +
    • 기존의 GAN 방식들과 비교했을 때 Kid, \(L_{2}\) score 모두 더 좋은 수치를 보이는 것을 확인할 수 있다.

    • +
    +
  • +
  • Comparison with GAN (styleGAN-ADA + Inversion)

    +
    +SDEdit_07 +
    +

    Fig. 236 Image 8#

    +
    +
    +
      +
    • SDEdit이 GAN Based model보다 더 자연스럽고(realistic), 유저의 guide를 잘 따르는(faithful)것을 확인할 수 있다.

    • +
    +
  • +
  • Comparison with original blending technique

    +
    +SDEdit_08 +
    +

    Fig. 237 Image 9#

    +
    +
    +
    +SDEdit_09 +
    +

    Fig. 238 Image 10#

    +
    +
    +
      +
    • 기존의 전통적인 방식의 몇가지 blending 기법과 비교해도 더 좋은 성능과 수치를 보이는 것을 확인할 수 있다.

    • +
    +
  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/SDXL.html b/docs/review/SDXL.html old mode 100644 new mode 100755 index 12f0d450..c708e832 --- a/docs/review/SDXL.html +++ b/docs/review/SDXL.html @@ -1,739 +1,758 @@ - - - - - - - - - - - - SDXL — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

SDXL#

-
-

Abstract#

-

SDXL은 T2I latent diffusion 모델이다. Stable Diffusion과 비교하면, SDXL은 세 배 더 큰 규모의 UNet을 포함한다. 더 많은 attention 블록과 더 큰 cross attention context 가 SDXL에서 두 번째 text encoder로 사용되면서 모델 파라미터가 증가했다. 다수의 새로운 conditioning 방법과 다양한 비율에 맞도록 SDXL을 학습할 수 있도록 설계했다. 또한 후처리 방식의 image to image 기술을 사용해 SDXL의 생성 샘플의 시각적인 fidelity를 향상시킨 refinement model을 소개한다. SDXL은 대폭 향상된 성능을 보여준다.

-
-sdxl_result -
-

Fig. 239 SDXL result#

-
-
-
-
-

Introduction#

-

세 가지 주요 기능이라 볼 수 있는데,

-
    -
  1. 3배 더 큰 UNet backbone,

  2. -
  3. 어떤 형태의 추가 감독(supervision)없는 간단하면서도 효과적인 추가의 conditioning 기술

  4. -
  5. noising-denoising 과정을 적용해 시각적 품질을 향상하는 latent를 생성할 수 있는 별개의 diffusion 기반 img-to-img refinement 모델을 포함한다.

  6. -
-
-fig_1 -
-

Fig. 240 Figure 1#

-
-
-

그림 1에서 왼쪽 그림을 보면 추가의 refinement 단계를 추가해 성능을 높인 SDXL이 기존 SD보다 성능이 우수한 것을 확인할 수 있다. 오른쪽 그림은 아키텍처를 시각화했는데, 128x128 크기의 latent를 생성한다. 그 후 고해상도 refinement 모델을 활용하고 동일한 프롬프트를 활용해 첫 번째 단계에서 생성된 latent를 SDEdit을 적용한다. SDXL과 refinement 모델은 동일한 autoencoder를 사용한다.

-
-table_1 -
-

Fig. 241 Table 1#

-
-
-

SD와 다르게 UNet 내의 transformer 블록의 heterogeneous 분포를 사용했다는 점이다. 테이블 1을 참고하면 highest feature level에서 transformer 블럭을 사용했고, lower level에서는 2, 10 개의 블럭을 사용했고, UNet에서 lowest level(8x downsampling)을 제거했다. text conditioning을 위한 pretrained 된 text encoder를 사용했다. 특히, CLIP Vit-L과 함께 OpenCLIP ViT-bigG를 사용했고, 채널 축에 두 번째 text encoder의 output을 concat 했다. 게다가 text input으로 모델에 condition을 주기 위해 cross attention 레이어를 사용했으며, 또 OpenCLIP로부터 pooled text embedding을 모델에 condition으로 추가했다. 이러한 변화는 UNet의 파라미터 사이즈가 2.6B로 증가했다. text encoder는 817M 파라미터를 가지고 있다.

-
-
-

2.2 Micro-Conditioning#

-
-fig_2 -
-

Fig. 242 Figure 2#

-
-
-

SD 1.4/1.5 같은 경우 512 픽셀 이하 크기의 이미지는 제외하고 학습을 시키거나, 너무 작은 이미지는 upscale하여 학습을 시켰다. 이는 학습할 때의 최소 크기가 정해지는 문제점이 발생한다. 따라서 성능을 저하시키거나, 일반화를 잘 못할 수 있다.

-

그림 2를 보면 SDXL의 데이터 셋의 분포를 시각화해주는 그림이다. 제안된 size-conditiong 없이, 256x256 픽셀 크기 미만의 데이터가 39%나 달한다. upscale 하게 된다면 최종 결과물이 blur 한 결과를 가져와 좋지 않은 아티팩트가 생긴다.

-

대신, 저자들은 원래의 이미지 해상도에서 UNet 모델에 condition을 주었다. 특히 어떠한 rescaling 전의 원래의 크기인 \(c_\text{size}=(h_\text{original}, w_\text{original})\)를 제공해 추가의 condition을 줄 수 있게 했다. UNet의 denoising 할 때의 condition으로 추가된다.

-

Inference 때, 사용자가 size-conditioning을 통해 해상도를 정할 수 있다. 모델은 conditioning 크기를 해상도에 의존적인 이미지 feature과 연관시키도록 하는 방법을 학습했다.

-
-fig_3 -
-

Fig. 243 Figure 3#

-
-
-

또 ImageNet으로 평가를 진행해 size-conditiong에 대한 우수성을 입증했다.

-
-table_2 -
-

Fig. 244 Table 2#

-
-
-

CIN-512-only 는 512 미만의 이미지를 제외하고 학습을 시켰고(70k 장), CIN-nocond 는 모든 ImageNet 이미지를 사용했으며, CIN-size-cond 는 추가 size-condition을 사용했다. 표 2에서 보다시피 CIN-size-cond 모델이 FID, IS 모두 높은 성능을 보였다.

-
-

Conditioning the Model on Cropping Parameters#

-
-fig_4 -
-

Fig. 245 Figure 4#

-
-
-

그림 4에서 SD 같은 경우 고양이 머리가 잘려진 결과를 얻었다. 이러한 이유는 학습할 때, random cropping으로 인해 생성되었기 때문이다.

-

이러한 문제를 해결하기 위해, 간단한 효과적인 방법을 제안한다. 데이터를 loading 할 때, 균등하게 \(c_\text{top}\)\(c_\text{left}\) (높이 및 너비 축을 따라 왼쪽 상단 모서리에서 잘린 픽셀의 양을 지정하는 정수)를 샘플링한다. 그 후 Fourier feature 임베딩을 통해 conditioning 파라미터로써 모델에 입력한다. 위에서 언급한 size conditioning과 비슷하다. concat 된 임베딩 \(c_\text{crop}\)은 추가의 conditioning 파라미터로 사용된다.

-

저자들은 LDM 뿐만 아니라 어떠한 DM에서도 사용될 수 있다고 강조한다. crop 및 size-conditioning은 쉽게 결합될 수 있다. 이러한 경우, crop 및 size-conditioning을 feature 임베딩을 채널 축에 concat 하고 UNet의 타임스텝 임베딩에 추가한다.

-
-
-
-

2.3 Multi-Aspect Training#

-

일반적인 T2I 모델에서 결과물의 크기는 512x512, 1024x1024 로 얻을 수 있는데, 이는 현실 세계에서 부자연스럽다. 이유는 현실 세계에서는 다양한 크기, 비율을 가진 이미지가 많고, 풍경 같은 경우 16:9 비율의 크기를 지니고 있다.

-

따라서, 다양한 비율을 동시에 다룰수 있도록 모델을 파인튜닝했다. 픽셀수를 1024x1024 만큼 수를 최대한 유지하면서 다양한 비율의 데이터를 사용했고, 64의 배수를 지니도록 했다.

-
-multi_aspect_ratio -
-

Fig. 246 Multi aspect ratio#

-
-
-

최적화 동안, 학습 배치는 동일한 버킷(같은 비율의 이미지들?)의 이미지로 구성되며, 각 훈련 스텝마다 버킷 크기를 번갈아 가며 사용했다. 추가적으로, 모델은 버킷 크기(혹은 타겟 크기)를 conditioning으로 주었으며, 위에서 언급한 size, crop conditioning과 유사하게 Fourier 공간에 임베딩되는 \(c_\text{ar}=(h_\text{tgt}, w_\text{tgt})\) 형태로 표현된다.

-

실제로, 모델이 고정된 비율및 해상도의 데이터로 pretraining이 마친 후 파인튜닝 단계에서는 다양한 비율의 데이터로 학습했고, 채널 축으로 concat 하는 2.2절에서 소개한 conditioning 기술과 함께 결합했다. 이를 아래의 그림 16에서 코드로 확인할 수 있다.

-
-
-

2.4 Improved Autoencoder#

-

SD는 LDM 중 하나이고, autoencoder의 latent space를 학습한다. semantic composition은 LDM으로부터 표현되지만 저자들은 local, high frequency 디테일한 부분을 향상하고자 autoencoder를 향상했다. 끝으로, 원래의 SD를 사용한 autoencoder 아키텍처에서 더 큰 배치사이즈(256 vs 9)로 학습했고 추가로 exponential moving average를 사용한 가중치를 사용했다. 결과 autoencoder의 성능이 reconstruction 메트릭에 좋은 결과를 가져왔다.

-
-table_3 -
-

Fig. 247 Table 3#

-
-
-
-
-

2.5 Putting Everything Together#

-

학습 파라미터를 정리해주는 절입니다. diffusion time step은 1000 step을 사용했다. 우선, base model를 내부 데이터 셋으로 그림 2에 나와있는 높이-너비 분포에 맞게 학습을 시켰다. 600,000 step을 사용했으며, 256x256 사이즈로, 배치는 2048로, size & crop conditioning을 사용했다. 그 후 512x512 이미지를 추가로 200,000 최적화 step으로 학습시켰고, 마침내 offset 노이즈 [11, 25] 0.05 수준과 함께 다중 비율 학습을 활용하여 ~ 1024x1024 영역의 다양한 비율로 모델을 학습했다.

-
-

Refinement Stage#

-
-fig_6 -
-

Fig. 248 Figure 6#

-
-
-

경험적으로, 그림 6처럼 특정 부분 퀄리티가 낮은 샘플의 결과를 찾았다. 왼쪽 그림이 refinement stage 적용 전, 오른쪽 그림이 refinement stage를 적용한 그림이다.

-

이를 해결하기 위해, 고품질, 고해상도 데이터에 특화된 latent space 내에서 별도의 LDM을 학습했다. 기본 모델의 샘플에 대해 SDEdit에서 도입한 노이즈 제거 과정을 사용했다. eDiff-I 방법을 따랐으며, 이를 첫 200 노이즈 스케일에 refinement 모델을 사용했다. inference에서, base SDXL에서 latent를 추출하고 바로 diffuse와 denoise를 refinement 모델에 넣었다. 이 스텝은 선택이지만 배경 및 사람 얼굴과 같은 디테일에서 향상된 결과(그림 6, 13)를 얻을 수 있었다.

-
-fig_13 -
-

Fig. 249 Figure 13#

-
-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + SDXL — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

SDXL#

+
+

Abstract#

+

SDXL은 T2I latent diffusion 모델이다. Stable Diffusion과 비교하면, SDXL은 세 배 더 큰 규모의 UNet을 포함한다. 더 많은 attention 블록과 더 큰 cross attention context 가 SDXL에서 두 번째 text encoder로 사용되면서 모델 파라미터가 증가했다. 다수의 새로운 conditioning 방법과 다양한 비율에 맞도록 SDXL을 학습할 수 있도록 설계했다. 또한 후처리 방식의 image to image 기술을 사용해 SDXL의 생성 샘플의 시각적인 fidelity를 향상시킨 refinement model을 소개한다. SDXL은 대폭 향상된 성능을 보여준다.

+
+sdxl_result +
+

Fig. 239 SDXL result#

+
+
+
+
+

Introduction#

+

세 가지 주요 기능이라 볼 수 있는데,

+
    +
  1. 3배 더 큰 UNet backbone,

  2. +
  3. 어떤 형태의 추가 감독(supervision)없는 간단하면서도 효과적인 추가의 conditioning 기술

  4. +
  5. noising-denoising 과정을 적용해 시각적 품질을 향상하는 latent를 생성할 수 있는 별개의 diffusion 기반 img-to-img refinement 모델을 포함한다.

  6. +
+
+fig_1 +
+

Fig. 240 Figure 1#

+
+
+

그림 1에서 왼쪽 그림을 보면 추가의 refinement 단계를 추가해 성능을 높인 SDXL이 기존 SD보다 성능이 우수한 것을 확인할 수 있다. 오른쪽 그림은 아키텍처를 시각화했는데, 128x128 크기의 latent를 생성한다. 그 후 고해상도 refinement 모델을 활용하고 동일한 프롬프트를 활용해 첫 번째 단계에서 생성된 latent를 SDEdit을 적용한다. SDXL과 refinement 모델은 동일한 autoencoder를 사용한다.

+
+table_1 +
+

Fig. 241 Table 1#

+
+
+

SD와 다르게 UNet 내의 transformer 블록의 heterogeneous 분포를 사용했다는 점이다. 테이블 1을 참고하면 highest feature level에서 transformer 블럭을 사용했고, lower level에서는 2, 10 개의 블럭을 사용했고, UNet에서 lowest level(8x downsampling)을 제거했다. text conditioning을 위한 pretrained 된 text encoder를 사용했다. 특히, CLIP Vit-L과 함께 OpenCLIP ViT-bigG를 사용했고, 채널 축에 두 번째 text encoder의 output을 concat 했다. 게다가 text input으로 모델에 condition을 주기 위해 cross attention 레이어를 사용했으며, 또 OpenCLIP로부터 pooled text embedding을 모델에 condition으로 추가했다. 이러한 변화는 UNet의 파라미터 사이즈가 2.6B로 증가했다. text encoder는 817M 파라미터를 가지고 있다.

+
+
+

2.2 Micro-Conditioning#

+
+fig_2 +
+

Fig. 242 Figure 2#

+
+
+

SD 1.4/1.5 같은 경우 512 픽셀 이하 크기의 이미지는 제외하고 학습을 시키거나, 너무 작은 이미지는 upscale하여 학습을 시켰다. 이는 학습할 때의 최소 크기가 정해지는 문제점이 발생한다. 따라서 성능을 저하시키거나, 일반화를 잘 못할 수 있다.

+

그림 2를 보면 SDXL의 데이터 셋의 분포를 시각화해주는 그림이다. 제안된 size-conditiong 없이, 256x256 픽셀 크기 미만의 데이터가 39%나 달한다. upscale 하게 된다면 최종 결과물이 blur 한 결과를 가져와 좋지 않은 아티팩트가 생긴다.

+

대신, 저자들은 원래의 이미지 해상도에서 UNet 모델에 condition을 주었다. 특히 어떠한 rescaling 전의 원래의 크기인 \(c_\text{size}=(h_\text{original}, w_\text{original})\)를 제공해 추가의 condition을 줄 수 있게 했다. UNet의 denoising 할 때의 condition으로 추가된다.

+

Inference 때, 사용자가 size-conditioning을 통해 해상도를 정할 수 있다. 모델은 conditioning 크기를 해상도에 의존적인 이미지 feature과 연관시키도록 하는 방법을 학습했다.

+
+fig_3 +
+

Fig. 243 Figure 3#

+
+
+

또 ImageNet으로 평가를 진행해 size-conditiong에 대한 우수성을 입증했다.

+
+table_2 +
+

Fig. 244 Table 2#

+
+
+

CIN-512-only 는 512 미만의 이미지를 제외하고 학습을 시켰고(70k 장), CIN-nocond 는 모든 ImageNet 이미지를 사용했으며, CIN-size-cond 는 추가 size-condition을 사용했다. 표 2에서 보다시피 CIN-size-cond 모델이 FID, IS 모두 높은 성능을 보였다.

+
+

Conditioning the Model on Cropping Parameters#

+
+fig_4 +
+

Fig. 245 Figure 4#

+
+
+

그림 4에서 SD 같은 경우 고양이 머리가 잘려진 결과를 얻었다. 이러한 이유는 학습할 때, random cropping으로 인해 생성되었기 때문이다.

+

이러한 문제를 해결하기 위해, 간단한 효과적인 방법을 제안한다. 데이터를 loading 할 때, 균등하게 \(c_\text{top}\)\(c_\text{left}\) (높이 및 너비 축을 따라 왼쪽 상단 모서리에서 잘린 픽셀의 양을 지정하는 정수)를 샘플링한다. 그 후 Fourier feature 임베딩을 통해 conditioning 파라미터로써 모델에 입력한다. 위에서 언급한 size conditioning과 비슷하다. concat 된 임베딩 \(c_\text{crop}\)은 추가의 conditioning 파라미터로 사용된다.

+

저자들은 LDM 뿐만 아니라 어떠한 DM에서도 사용될 수 있다고 강조한다. crop 및 size-conditioning은 쉽게 결합될 수 있다. 이러한 경우, crop 및 size-conditioning을 feature 임베딩을 채널 축에 concat 하고 UNet의 타임스텝 임베딩에 추가한다.

+
+
+
+

2.3 Multi-Aspect Training#

+

일반적인 T2I 모델에서 결과물의 크기는 512x512, 1024x1024 로 얻을 수 있는데, 이는 현실 세계에서 부자연스럽다. 이유는 현실 세계에서는 다양한 크기, 비율을 가진 이미지가 많고, 풍경 같은 경우 16:9 비율의 크기를 지니고 있다.

+

따라서, 다양한 비율을 동시에 다룰수 있도록 모델을 파인튜닝했다. 픽셀수를 1024x1024 만큼 수를 최대한 유지하면서 다양한 비율의 데이터를 사용했고, 64의 배수를 지니도록 했다.

+
+multi_aspect_ratio +
+

Fig. 246 Multi aspect ratio#

+
+
+

최적화 동안, 학습 배치는 동일한 버킷(같은 비율의 이미지들?)의 이미지로 구성되며, 각 훈련 스텝마다 버킷 크기를 번갈아 가며 사용했다. 추가적으로, 모델은 버킷 크기(혹은 타겟 크기)를 conditioning으로 주었으며, 위에서 언급한 size, crop conditioning과 유사하게 Fourier 공간에 임베딩되는 \(c_\text{ar}=(h_\text{tgt}, w_\text{tgt})\) 형태로 표현된다.

+

실제로, 모델이 고정된 비율및 해상도의 데이터로 pretraining이 마친 후 파인튜닝 단계에서는 다양한 비율의 데이터로 학습했고, 채널 축으로 concat 하는 2.2절에서 소개한 conditioning 기술과 함께 결합했다. 이를 아래의 그림 16에서 코드로 확인할 수 있다.

+
+
+

2.4 Improved Autoencoder#

+

SD는 LDM 중 하나이고, autoencoder의 latent space를 학습한다. semantic composition은 LDM으로부터 표현되지만 저자들은 local, high frequency 디테일한 부분을 향상하고자 autoencoder를 향상했다. 끝으로, 원래의 SD를 사용한 autoencoder 아키텍처에서 더 큰 배치사이즈(256 vs 9)로 학습했고 추가로 exponential moving average를 사용한 가중치를 사용했다. 결과 autoencoder의 성능이 reconstruction 메트릭에 좋은 결과를 가져왔다.

+
+table_3 +
+

Fig. 247 Table 3#

+
+
+
+
+

2.5 Putting Everything Together#

+

학습 파라미터를 정리해주는 절입니다. diffusion time step은 1000 step을 사용했다. 우선, base model를 내부 데이터 셋으로 그림 2에 나와있는 높이-너비 분포에 맞게 학습을 시켰다. 600,000 step을 사용했으며, 256x256 사이즈로, 배치는 2048로, size & crop conditioning을 사용했다. 그 후 512x512 이미지를 추가로 200,000 최적화 step으로 학습시켰고, 마침내 offset 노이즈 [11, 25] 0.05 수준과 함께 다중 비율 학습을 활용하여 ~ 1024x1024 영역의 다양한 비율로 모델을 학습했다.

+
+

Refinement Stage#

+
+fig_6 +
+

Fig. 248 Figure 6#

+
+
+

경험적으로, 그림 6처럼 특정 부분 퀄리티가 낮은 샘플의 결과를 찾았다. 왼쪽 그림이 refinement stage 적용 전, 오른쪽 그림이 refinement stage를 적용한 그림이다.

+

이를 해결하기 위해, 고품질, 고해상도 데이터에 특화된 latent space 내에서 별도의 LDM을 학습했다. 기본 모델의 샘플에 대해 SDEdit에서 도입한 노이즈 제거 과정을 사용했다. eDiff-I 방법을 따랐으며, 이를 첫 200 노이즈 스케일에 refinement 모델을 사용했다. inference에서, base SDXL에서 latent를 추출하고 바로 diffuse와 denoise를 refinement 모델에 넣었다. 이 스텝은 선택이지만 배경 및 사람 얼굴과 같은 디테일에서 향상된 결과(그림 6, 13)를 얻을 수 있었다.

+
+fig_13 +
+

Fig. 249 Figure 13#

+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/StyO.html b/docs/review/StyO.html old mode 100644 new mode 100755 index 03087372..0146969b --- a/docs/review/StyO.html +++ b/docs/review/StyO.html @@ -1,860 +1,879 @@ - - - - - - - - - - - - StyO — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: StyO: Stylize Your Face in Only One-Shot

  • -
  • Reference

    - -
  • -
  • Author: Seunghwan Ji

  • -
  • Last updated on Aug. 6, 2023

  • -
-
-
-

StyO#

-
-

Abstract#

-
    -
  • Stylize the face in only One-shot.”

  • -
  • 한장의 이미지만으로 다른 이미지로 스타일을 Transfer!

  • -
-
-
-

1. Introduction#

-
    -
  • 현재 다양한 분야에서 이미지에 특정 스타일을 입히고자하는 연구들이 활발히 진행중이다.

  • -
  • 이전까지의 연구들은 대부분 각각의 source 이미지, target 이미지 한장씩을 사용해 GAN based model을 활용하려는 식이 주를 이루었다.

  • -
  • 단 이러한 방식에는 한계가 있는데,

    -
      -
    1. Real Face를 학습한 pre-trained GAN 모델의 의존도가 너무 커서 Style을 입히기 힘들다.

    2. -
    3. latent space안에서 Content 정보와 Style 정보가 Entangle 되어있다.

    4. -
    -
  • -
  • StyO는?

    -
      -
    • GAN 대신 Data의 Distribution을 더 잘 포용하는 Latent Diffusion Model을 Base모델로 채용한다.

    • -
    • 총 2 Stage로 구성되는데

      -
        -
      1. Identifier Disentanglement Learner(IDL)

        -
          -
        • 이미지의 content 정보와 Style 정보를 분리

        • -
        -
      2. -
      3. Fine-grained Content Controller(FCC)

        -
          -
        • IDL로부터 분리된 Content와 Style을 원하는대로 재조합

        • -
        -
      4. -
      -
    • -
    • 추가로 src 이미지의 detail한 정보(head-pose, hair color 등)를 유지하기위해 Generate 과정에서 src 이미지의 attention map을 재사용하는 trick을 제안했다.

    • -
    -
  • -
  • 이러한 StyO는 GAN based 모델에 비해 더 좋은 퀄리티의 이미지를 생성해내고, one-shot face stylization 분야에서 SOTA를 기록했다.

  • -
-
- -
-

3. Method#

-
-

3.2. Framework of StyO#

-
-StyO_00 -
-

Fig. 203 Figure 1#

-
-
-
    -
  • image 간의 style transfer를 위해 identifier disentaglement learnerfine-grained content controller를 제안한다.

  • -
-

IDL

-
    -
  • image의 content 정보와 style 정보를 분리하는 방향으로 학습이 진행

  • -
  • src 이미지는 "a drawing with $S_{src}$ not $S_{tgt}$ style of $C_{src}$ not $C_{tgt}$ portrait" prompt로 학습 (tgt 이미지는 반대)

  • -
-

⇒ 이미지 간의 Style 정보와 Content 정보가 Disentangle 되고, \(S_{src}\)안에 이미지 A의 Style 정보가, \(C_{tgt}\) 안에 src 이미지의 content 정보가 embedding 되도록 학습

-
    -
  • 이 때 \(S_{src}\), \(C_{src}\)에 target 이미지의 conext 정보를 배제함과 동시에\(S_{tgt}\), \(C_{tgt}\)에 포함하기위해 앞에 negator(=부정의 의미를 가진 단어)를 사용

    -
      -
    • e.g. not, without, except …

    • -
    -
  • -
  • src, tgt 이미지에 추가로 auxiliary 이미지 셋을 구성해 “a drawing with $S_{src}$ not $S_{tgt}$ style of portrait” prompt로 학습

    -
      -
    • \(X_{aux}\) : FFHQ dataset에서 임의로 200장의 데이터를 sampling

    • -
    -
  • -
  • 효과

    -
      -
    1. auxiliary 이미지를 학습함으로써 key prompt간 disentanglement를 향상

    2. -
    3. auxiliary 이미지에는 없는 src 이미지만의 정보를 \(C_{src}\) 에 주입

    4. -
    5. src 이미지의 style과 tgt 이미지의 style을 구별하는데 도움을 줌

    6. -
    -
  • -
  • Full Loss

    -
    -StyO_01 -
    -

    Fig. 204 Equation 1#

    -
    -
    -
  • -
  • 이러한 IDL의 학습만으로 src 이미지와 tgt 이미지의 style transfer가 가능하다.

    -
      -
    • “a drawing with $S_{tgt}$ not $S_{src}$ style of $C_{src}$ not $C_{tgt}$ portrait”

      -
      -StyO_02 -
      -

      Fig. 205 Figure 2#

      -
      -
      -
    • -
    -
  • -
  • 하지만 위 이미지처럼 src 이미지의 content 정보(head-pose, facial feature)를 잃어버리는 경향이 있다.

  • -
  • 이러한 문제점을 개선하기위해 FCC를 추가로 도입하였다.

  • -
-

FCC

-
    -
  • IDL로 분리된 content 정보와 style 정보를 원하는 방식으로 조합(Recombination)할 때 A의 Content 정보를 유지하도록 하는 Trick

  • -
-
    -
  1. Cross Attention Control

    -
      -
    • LDM은 기본적으로 Text 정보를 생성 이미지에 주입하기위해 cross attention mechanism을 사용

      -
        -
      • \(Attn(z, r) = M(z, r)V\), z : image latent, r : text embedding

      • -
      -
    • -
    • 이 때 “prompt-to-promt” paper에서 attention map M의 값이 생성 이미지의 Layout에 강한 영향을 미친다는 점을 확인

    • -
    • 따라서 src 이미지의 attention mask를 generate 과정에 주입합으로써 content 정보를 좀 더 잘 유지하도록 유도

    • -
    • 단, attention map의 모든 값을 replace하지않고, content에 관한 Index만 선택적으로 replace

      -
        -
      • content index : ‘\(C_{src}\), not, \(C_{tgt}\), portrait`

        -
        -StyO_03 -
        -

        Fig. 206 Equation 3#

        -
        -
        -
      • -
      -
    • -
    -
  2. -
  3. Augmented Text Prompt

    -
      -
    • training time에서 key prompt를 n번 사용함으로서 생성되는 이미지에 context 정보를 강하게 주입

      -
        -
      • src 이미지는 “a drawing with ($S_{src}$ not $S_{tgt}$) * $n_{s}$ style of ($C_{src}$ not $C_{tgt}$) * $n_{c}$ portrait” (tgt 이미지는 반대)

      • -
      -
    • -
    • 실험상 hyperparameter \(n_{s}\)\(n_{c}\)는 3 이하의 값을 추천

    • -
    -
  4. -
-
-
-
-

4. Experiments#

-

Implementation Details

-
    -
  • base model : Pretrained LDM model checkpoint (trained by LAION-5B)

  • -
  • hyper parameter

    -
      -
    • key prompt : “ak47”, “aug”, “sks”, m4a1”

    • -
    • Learning rate : 1e-6

    • -
    • Optimizer : Adam

    • -
    • train step : 400

    • -
    • \(n_{s}\) : 3, \(n_{c}\) : 1

    • -
    • 나머지는 LDM과 동일

    • -
    -
  • -
-

Comparison with SOTA methods

-
-StyO_04 -
-

Fig. 207 Figure 3#

-
-
-
    -
  • StyO가 src 이미지의 face identity와 local detail 모두 잘 유지함과 동시에, style 정보를 자연스럽게 입힌 결과물을 생성해낸다.

  • -
  • User Study도 다른 모델들에 비해 좋은 결과를 보였다.

    -
    -StyO_05 -
    -

    Fig. 208 Table 1#

    -
    -
    -
  • -
-

Ablation Study

-
    -
  1. Effect of Contrastive Disentangled Prompt Template

    -
      -
    • negative prompt 없이 positive prompt만 넣고 학습할경우 학습 이미지의 overfitting이 심하고, style과 content 정보의 분리에 어려움을 보인다.

      -
      -StyO_06 -
      -

      Fig. 209 Figure 4#

      -
      -
      -
    • -
    • 또, source 이미지의 local detail을 유지하기위해 auxiliary set의 trick도 적용하는것이 Best Quality의 결과물을 생성해냈다.

    • -
    -
  2. -
  3. Effect of Fine-grained Content Controller

    -
      -
    • FCC 없이 Inference할 경우 generated 이미지의 높은 diversity를 보이지만, FCC를 포함할 경우 src 이미지의 fidelity가 높아져 좀더 significant한 이미지가 생성되는것을 보여주었다.

      -
      -StyO_07 -
      -

      Fig. 210 Figure 5#

      -
      -
      -
    • -
    -
  4. -
  5. Hyper-parameters in Augmented Text Prompt

    -
      -
    • \(n_{s}\) 값이 커질수록 이미지가 photorealistic에서 artistic하게 바뀌고, \(n_{c}\)도 마찬가지로 값이 커질수록 src 이미지에 overfitting된 이미지가 나오는 경향을 보여주었다.

    • -
    -
  6. -
-
-
-

5. Conclusion#

-
    -
  • StyO는 IDL과 FCC를 사용해 기존 GAN을 이용한 SOTA 모델들보다 더 자연스럽고 Quality 좋은 style transfered 이미지를 생성해낼 수 있었다.

  • -
  • 단, style 하나의 transfer를 위해 single GPU로 10분이 걸리므로 time-efficiency가 좋지 못하다는 단점이 있다.

  • -
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + StyO — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: StyO: Stylize Your Face in Only One-Shot

  • +
  • Reference

    + +
  • +
  • Author: Seunghwan Ji

  • +
  • Last updated on Aug. 6, 2023

  • +
+
+
+

StyO#

+
+

Abstract#

+
    +
  • Stylize the face in only One-shot.”

  • +
  • 한장의 이미지만으로 다른 이미지로 스타일을 Transfer!

  • +
+
+
+

1. Introduction#

+
    +
  • 현재 다양한 분야에서 이미지에 특정 스타일을 입히고자하는 연구들이 활발히 진행중이다.

  • +
  • 이전까지의 연구들은 대부분 각각의 source 이미지, target 이미지 한장씩을 사용해 GAN based model을 활용하려는 식이 주를 이루었다.

  • +
  • 단 이러한 방식에는 한계가 있는데,

    +
      +
    1. Real Face를 학습한 pre-trained GAN 모델의 의존도가 너무 커서 Style을 입히기 힘들다.

    2. +
    3. latent space안에서 Content 정보와 Style 정보가 Entangle 되어있다.

    4. +
    +
  • +
  • StyO는?

    +
      +
    • GAN 대신 Data의 Distribution을 더 잘 포용하는 Latent Diffusion Model을 Base모델로 채용한다.

    • +
    • 총 2 Stage로 구성되는데

      +
        +
      1. Identifier Disentanglement Learner(IDL)

        +
          +
        • 이미지의 content 정보와 Style 정보를 분리

        • +
        +
      2. +
      3. Fine-grained Content Controller(FCC)

        +
          +
        • IDL로부터 분리된 Content와 Style을 원하는대로 재조합

        • +
        +
      4. +
      +
    • +
    • 추가로 src 이미지의 detail한 정보(head-pose, hair color 등)를 유지하기위해 Generate 과정에서 src 이미지의 attention map을 재사용하는 trick을 제안했다.

    • +
    +
  • +
  • 이러한 StyO는 GAN based 모델에 비해 더 좋은 퀄리티의 이미지를 생성해내고, one-shot face stylization 분야에서 SOTA를 기록했다.

  • +
+
+ +
+

3. Method#

+
+

3.2. Framework of StyO#

+
+StyO_00 +
+

Fig. 203 Figure 1#

+
+
+
    +
  • image 간의 style transfer를 위해 identifier disentaglement learnerfine-grained content controller를 제안한다.

  • +
+

IDL

+
    +
  • image의 content 정보와 style 정보를 분리하는 방향으로 학습이 진행

  • +
  • src 이미지는 "a drawing with $S_{src}$ not $S_{tgt}$ style of $C_{src}$ not $C_{tgt}$ portrait" prompt로 학습 (tgt 이미지는 반대)

  • +
+

⇒ 이미지 간의 Style 정보와 Content 정보가 Disentangle 되고, \(S_{src}\)안에 이미지 A의 Style 정보가, \(C_{tgt}\) 안에 src 이미지의 content 정보가 embedding 되도록 학습

+
    +
  • 이 때 \(S_{src}\), \(C_{src}\)에 target 이미지의 conext 정보를 배제함과 동시에\(S_{tgt}\), \(C_{tgt}\)에 포함하기위해 앞에 negator(=부정의 의미를 가진 단어)를 사용

    +
      +
    • e.g. not, without, except …

    • +
    +
  • +
  • src, tgt 이미지에 추가로 auxiliary 이미지 셋을 구성해 “a drawing with $S_{src}$ not $S_{tgt}$ style of portrait” prompt로 학습

    +
      +
    • \(X_{aux}\) : FFHQ dataset에서 임의로 200장의 데이터를 sampling

    • +
    +
  • +
  • 효과

    +
      +
    1. auxiliary 이미지를 학습함으로써 key prompt간 disentanglement를 향상

    2. +
    3. auxiliary 이미지에는 없는 src 이미지만의 정보를 \(C_{src}\) 에 주입

    4. +
    5. src 이미지의 style과 tgt 이미지의 style을 구별하는데 도움을 줌

    6. +
    +
  • +
  • Full Loss

    +
    +StyO_01 +
    +

    Fig. 204 Equation 1#

    +
    +
    +
  • +
  • 이러한 IDL의 학습만으로 src 이미지와 tgt 이미지의 style transfer가 가능하다.

    +
      +
    • “a drawing with $S_{tgt}$ not $S_{src}$ style of $C_{src}$ not $C_{tgt}$ portrait”

      +
      +StyO_02 +
      +

      Fig. 205 Figure 2#

      +
      +
      +
    • +
    +
  • +
  • 하지만 위 이미지처럼 src 이미지의 content 정보(head-pose, facial feature)를 잃어버리는 경향이 있다.

  • +
  • 이러한 문제점을 개선하기위해 FCC를 추가로 도입하였다.

  • +
+

FCC

+
    +
  • IDL로 분리된 content 정보와 style 정보를 원하는 방식으로 조합(Recombination)할 때 A의 Content 정보를 유지하도록 하는 Trick

  • +
+
    +
  1. Cross Attention Control

    +
      +
    • LDM은 기본적으로 Text 정보를 생성 이미지에 주입하기위해 cross attention mechanism을 사용

      +
        +
      • \(Attn(z, r) = M(z, r)V\), z : image latent, r : text embedding

      • +
      +
    • +
    • 이 때 “prompt-to-promt” paper에서 attention map M의 값이 생성 이미지의 Layout에 강한 영향을 미친다는 점을 확인

    • +
    • 따라서 src 이미지의 attention mask를 generate 과정에 주입합으로써 content 정보를 좀 더 잘 유지하도록 유도

    • +
    • 단, attention map의 모든 값을 replace하지않고, content에 관한 Index만 선택적으로 replace

      +
        +
      • content index : ‘\(C_{src}\), not, \(C_{tgt}\), portrait`

        +
        +StyO_03 +
        +

        Fig. 206 Equation 3#

        +
        +
        +
      • +
      +
    • +
    +
  2. +
  3. Augmented Text Prompt

    +
      +
    • training time에서 key prompt를 n번 사용함으로서 생성되는 이미지에 context 정보를 강하게 주입

      +
        +
      • src 이미지는 “a drawing with ($S_{src}$ not $S_{tgt}$) * $n_{s}$ style of ($C_{src}$ not $C_{tgt}$) * $n_{c}$ portrait” (tgt 이미지는 반대)

      • +
      +
    • +
    • 실험상 hyperparameter \(n_{s}\)\(n_{c}\)는 3 이하의 값을 추천

    • +
    +
  4. +
+
+
+
+

4. Experiments#

+

Implementation Details

+
    +
  • base model : Pretrained LDM model checkpoint (trained by LAION-5B)

  • +
  • hyper parameter

    +
      +
    • key prompt : “ak47”, “aug”, “sks”, m4a1”

    • +
    • Learning rate : 1e-6

    • +
    • Optimizer : Adam

    • +
    • train step : 400

    • +
    • \(n_{s}\) : 3, \(n_{c}\) : 1

    • +
    • 나머지는 LDM과 동일

    • +
    +
  • +
+

Comparison with SOTA methods

+
+StyO_04 +
+

Fig. 207 Figure 3#

+
+
+
    +
  • StyO가 src 이미지의 face identity와 local detail 모두 잘 유지함과 동시에, style 정보를 자연스럽게 입힌 결과물을 생성해낸다.

  • +
  • User Study도 다른 모델들에 비해 좋은 결과를 보였다.

    +
    +StyO_05 +
    +

    Fig. 208 Table 1#

    +
    +
    +
  • +
+

Ablation Study

+
    +
  1. Effect of Contrastive Disentangled Prompt Template

    +
      +
    • negative prompt 없이 positive prompt만 넣고 학습할경우 학습 이미지의 overfitting이 심하고, style과 content 정보의 분리에 어려움을 보인다.

      +
      +StyO_06 +
      +

      Fig. 209 Figure 4#

      +
      +
      +
    • +
    • 또, source 이미지의 local detail을 유지하기위해 auxiliary set의 trick도 적용하는것이 Best Quality의 결과물을 생성해냈다.

    • +
    +
  2. +
  3. Effect of Fine-grained Content Controller

    +
      +
    • FCC 없이 Inference할 경우 generated 이미지의 높은 diversity를 보이지만, FCC를 포함할 경우 src 이미지의 fidelity가 높아져 좀더 significant한 이미지가 생성되는것을 보여주었다.

      +
      +StyO_07 +
      +

      Fig. 210 Figure 5#

      +
      +
      +
    • +
    +
  4. +
  5. Hyper-parameters in Augmented Text Prompt

    +
      +
    • \(n_{s}\) 값이 커질수록 이미지가 photorealistic에서 artistic하게 바뀌고, \(n_{c}\)도 마찬가지로 값이 커질수록 src 이미지에 overfitting된 이미지가 나오는 경향을 보여주었다.

    • +
    +
  6. +
+
+
+

5. Conclusion#

+
    +
  • StyO는 IDL과 FCC를 사용해 기존 GAN을 이용한 SOTA 모델들보다 더 자연스럽고 Quality 좋은 style transfered 이미지를 생성해낼 수 있었다.

  • +
  • 단, style 하나의 transfer를 위해 single GPU로 10분이 걸리므로 time-efficiency가 좋지 못하다는 단점이 있다.

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/StyleGAN.html b/docs/review/StyleGAN.html old mode 100644 new mode 100755 index 2f5c31df..ff4c5454 --- a/docs/review/StyleGAN.html +++ b/docs/review/StyleGAN.html @@ -1,753 +1,772 @@ - - - - - - - - - - - - StyleGAN — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

StyleGAN

- -
- -
-
- - - - -
- -
-

Information

- -
-
-

StyleGAN#

-

오늘 알아볼 모델은 StyleGAN입니다. 기존에 다뤘던 GAN과 같이 이미지를 생성하는 모델입니다. generator 구조를 변경함으로써 성능을 올리고 feature의 control이 가능하게 했습니다. loss나 discriminator 구조 개선에 관한 논문은 아닙니다. 먼저 결과를 보도록 하죠.

-
-stylegan_01 -
-

Fig. 61 Images generated by StyleGAN#

-
-
-

이 논문의 contribution은 다음과 같습니다.

-
    -
  1. 새로운 구조를 제안하여 성능을 높이면서 feature의 control이 가능해졌습니다.

  2. -
  3. 새로운 데이터셋을 제안했습니다. (FFHQ)

  4. -
-

이 중에서 첫 번째 contribution을 자세히 보도록 하겠습니다. 논문의 abstract에는 다음과 같은 문장이 있습니다.

-
-

The new architecture leads to an automatically learned, unsupervised separation of high-level attributes (e.g., pose and identity when trained on human faces) and stochastic variation in the generated images (e.g., freckles, hair), and it enables intuitive, scale-specific control of the synthesis.

-
-

논문에서 제안한 새로운 generator 구조가 할 수 있는 일을 설명하는 부분입니다. 여기서 보시면 high level attribute의 separation이 가능하다고 얘기하고 있습니다. 저는 개인적으로 이 부분이 StyleGAN의 가장 중요한 특징이라고 생각합니다.

-

생성 모델로 이미지를 생성하고자 할 때, 사용자는 어떠한 목적을 가지고 자신이 원하는 이미지를 만들고자 할 것입니다. 이미지의 품질이 좋더라도 모델이 사용자의 의도와 상관없는 랜덤한 이미지를 내뱉어준다면 그 모델의 실용성이 좋다고 할 수 없을 것입니다. 근래에 Text-to-Image 모델들이 인기를 얻었던 이유도 누구나 쉽게 텍스트를 통해서 생성되는 이미지를 조절할 수 있다는 점도 한몫했다고 생각합니다. StyleGAN은 그런 controllability를 어느 정도 가능하게 한 모델이라는 측면에서 의미있다고 생각합니다.

-

StyleGAN의 구조는 아래 그림과 같습니다. synthesis network는 해상도를 4x4에서 시작해서 1024x1024까지 높여줍니다. 최종적으로 1024x1024 해상도를 가지는 이미지를 갖게됩니다. 아래 구조를 보면 기존 GAN하고 비교해서 특이한 점이 세 가지 있습니다.

-
    -
  1. z를 input으로 받는 mapping network

  2. -
  3. style과 AdaIN

  4. -
  5. noise와 B (stochastic variation)

  6. -
-

이 각각에 대해서 알아보도록 합시다.

-
-stylegan_02 -
-

Fig. 62 Structure of StyleGAN#

-
-
-
-

Mapping Network#

-
-stylegan_03 -
-

Fig. 63 Mappings with \(w\) and without \(w\)#

-
-
-

기존 GAN을 생각해보면 z를 input으로 받아서 generator를 거쳐서 이미지를 생성하는 구조입니다. 이 z는 보통 Gaussian distribution에서 샘플링으로 얻습니다. GAN은 학습을 통해 Gaussian distribution을 data distribution으로 보내는 방법을 배우게 될 것이고, 이 분포는 (b)처럼 생기게 될 것입니다. 그런데 데이터가 (a)처럼 주어져서 특정한 데이터가 없거나 적을 수도 있을 것입니다. 예를 들어, 데이터에 피부가 희면서 머리가 긴 샘플들이 없다고 해봅시다. 그러면 피부색과 머리 길이라는 두 feature는 서로 얽히게(entangled)되어, 하나를 바꿀 때 다른 하나도 같이 바뀌는 현상이 일어나게 됩니다. 이런 현상을 완화하기 위해 논문에서는 Gaussian에서 뽑은 z를 바로 사용하는 것이 아니라 mapping network를 통해 learnable distribution에서 뽑은 w를 사용합니다.

-
-
-

Style and AdaIN#

-

instance normalization은 샘플 하나의 각 채널마다 정규화를 취해주는 방법입니다.

-
-stylegan_04 -
-

Fig. 64 Normalization methods#

-
-
-

adaptive instance normalization (AdaIN) 은 instance normalization에 scale을 곱해주고 bias를 더해주는 형태입니다. 그런데 이 scale과 bias가 style vector의 linear transformation으로 주어지는 형태입니다. linear layer를 통해서 w는 \(\mathbf{y}=(\mathbf{y}_{s},\mathbf{y}_{b})\)로 보내지게 됩니다. AdaIN의 수식은 아래와 같습니다.

-
-\[ -AdaIN(\mathbf{x}_{i},\mathbf{y})=\mathbf{y}_{s,i}\frac{\mathbf{x}_{i}-\mu(\mathbf{x}_{i})}{\sigma(\mathbf{x}_{i})}+\mathbf{y}_{b,i} -\]
-

AdaIN은 각 블록마다 두 개씩 들어가서 style은 총 열여덟 번 AdaIN을 통해 generator에 들어가게 됩니다. AdaIN은 localization이라는 특징과도 연관이 있습니다. 여기서 말하는 localization이란 열여덟 개의 style 중에서 일부를 바꿈으로써 이미지의 일부 특징들을 바꿀 수 있다는 의미입니다. AdaIN은 각 convolution layer 다음에 적용이 됩니다. 이 때 feature map들은 normalization되고 style에 의해 새로운 statistics를 가지게 됩니다. style은 하나의 convolution에 적용되고, 다음 convolution에서 다시 normalization이 수행되기 때문에 이전 layer에 적용된 style과 다음 layer에 적용된 style이 분리되게 학습될 수 있습니다.

-

관련 코드

-
class StyleMod(nn.Module):
-    def __init__(self, latent_size, channels, use_wscale):
-        super(StyleMod, self).__init__()
-        self.lin = EqualizedLinear(latent_size,
-                                   channels * 2,
-                                   gain=1.0, use_wscale=use_wscale)
-
-    def forward(self, x, latent):
-        style = self.lin(latent)  # style => [batch_size, n_channels*2]
-
-        shape = [-1, 2, x.size(1)] + (x.dim() - 2) * [1]
-        style = style.view(shape)  # [batch_size, 2, n_channels, ...]
-        x = x * (style[:, 0] + 1.) + style[:, 1]
-        return x
-
-class LayerEpilogue(nn.Module):
-    """Things to do at the end of each layer."""
-
-    def __init__(self, channels, dlatent_size, use_wscale,
-                 use_noise, use_pixel_norm, use_instance_norm, use_styles, activation_layer):
-        super().__init__()
-
-        layers = []
-        if use_noise:
-            layers.append(('noise', NoiseLayer(channels)))
-        layers.append(('activation', activation_layer))
-        if use_pixel_norm:
-            layers.append(('pixel_norm', PixelNormLayer()))
-        if use_instance_norm:
-            layers.append(('instance_norm', nn.InstanceNorm2d(channels)))
-
-        self.top_epi = nn.Sequential(OrderedDict(layers))
-
-        if use_styles:
-            self.style_mod = StyleMod(dlatent_size, channels, use_wscale=use_wscale)
-        else:
-            self.style_mod = None
-
-    def forward(self, x, dlatents_in_slice=None):
-        x = self.top_epi(x)
-        if self.style_mod is not None:
-            x = self.style_mod(x, dlatents_in_slice)
-        else:
-            assert dlatents_in_slice is None
-        return x
-
-
-

code from huangzh13/StyleGAN.pytorch

-

아래 그림은 source A의 style 중 일부를 source B의 style로 변경해서 만든 이미지들입니다. style은 총 18곳에서 사용되는데 처음 4곳 (\(4^2 - 8^2\))을 coarse, 그다음 4곳 (\(16^2-32^2\))을 middle, 마지막 10곳 (\(64^2-1024^2\))을 fine style로 정의하였습니다. 그림을 보시면 윗 부분에서는 포즈나 전체적인 머리 스타일같이 coarse style은 source B의 것을 유지하고, 아래로 갈수록 source A의 큰 틀을 유지하면서 세부적인 부분들을 B에서 가져왔음을 볼 수 있습니다.

-
-stylegan_05 -
-

Fig. 65 Mixing two styles#

-
-
-
-
-

Stochastic Variation#

-

한 사람의 이미지 안에는 확률적으로 바뀔 수 있는 부분이 있습니다. (주근깨, 머릿결, 피부) 이를 모델링하기 위해서 noise를 추가적인 input으로 사용하여 각 convolution layer 다음에 더해집니다. 아래 그림에서 (a)의 생성된 한 사람의 이미지 안에서도 디테일들은 (b)와 같이 달라질 수 있습니다. (c)와 같이 standard deviation을 구해봤을 때 얼굴형과 같은 attribute는 변하지않지만 noise에 의해서 머리카락과 같은 부분은 variation이 생김을 볼 수 있습니다.

-
-stylegan_06 -
-

Fig. 66 Examples of stochastic variation#

-
-
-

아래 그림에서 (a)는 모든 layer에 noise를 준 경우, (b)는 noise를 주지 않은 경우, (c)는 fine layers (\(64^2 - 1024^2\))에만 noise를 준 경우, (d)는 coarse layers (\(4^2 - 32^2\))에만 noise를 준 경우입니다. (b)를 보면 noise가 없을 경우 머리카락같은 디테일이 제대로 살아있지 않은 것을 볼 수 있습니다. (c)와 (d)를 보면 fine layers에 들어간 noise가 머리카락의 더 세밀한 부분에 영향을 끼친다는 것을 볼 수 있습니다.

-
-stylegan_07 -
-

Fig. 67 Effect of noise inputs at different layers#

-
-
-
-
-

Mixing Regularization#

-

논문에서는 localization이 더 잘 되게하기 위해 style mixing이라는 방법을 훈련에 사용합니다. 두 개의 style vector \(\mathbf{w}_{1},\mathbf{w}_{2}\)를 사용하여 앞 쪽 layer에는 \(\mathbf{w}_{1}\)을, 뒤 쪽 layer에는 \(\mathbf{w}_{2}\)를 사용하는 방법입니다. 이는 generator가 인접한 style끼리 correlated되어있다고 학습하는 것을 막아서 localization을 더 잘 되게 하는 목적입니다.

-
-
-

실험 결과#

-

마지막으로 저자들이 제안한 방법들이 실제로 효과가 있었는지 확인해봅시다. 아래 표와 같이 실험적으로 보았을 때 저자들이 제안한 방법들을 모두 사용한 경우 FID가 가장 우수하게 나왔습니다.

-
-stylegan_08 -
-

Fig. 68 FID for various generator designs#

-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + StyleGAN — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

StyleGAN

+ +
+ +
+
+ + + + +
+ +
+

Information

+ +
+
+

StyleGAN#

+

오늘 알아볼 모델은 StyleGAN입니다. 기존에 다뤘던 GAN과 같이 이미지를 생성하는 모델입니다. generator 구조를 변경함으로써 성능을 올리고 feature의 control이 가능하게 했습니다. loss나 discriminator 구조 개선에 관한 논문은 아닙니다. 먼저 결과를 보도록 하죠.

+
+stylegan_01 +
+

Fig. 61 Images generated by StyleGAN#

+
+
+

이 논문의 contribution은 다음과 같습니다.

+
    +
  1. 새로운 구조를 제안하여 성능을 높이면서 feature의 control이 가능해졌습니다.

  2. +
  3. 새로운 데이터셋을 제안했습니다. (FFHQ)

  4. +
+

이 중에서 첫 번째 contribution을 자세히 보도록 하겠습니다. 논문의 abstract에는 다음과 같은 문장이 있습니다.

+
+

The new architecture leads to an automatically learned, unsupervised separation of high-level attributes (e.g., pose and identity when trained on human faces) and stochastic variation in the generated images (e.g., freckles, hair), and it enables intuitive, scale-specific control of the synthesis.

+
+

논문에서 제안한 새로운 generator 구조가 할 수 있는 일을 설명하는 부분입니다. 여기서 보시면 high level attribute의 separation이 가능하다고 얘기하고 있습니다. 저는 개인적으로 이 부분이 StyleGAN의 가장 중요한 특징이라고 생각합니다.

+

생성 모델로 이미지를 생성하고자 할 때, 사용자는 어떠한 목적을 가지고 자신이 원하는 이미지를 만들고자 할 것입니다. 이미지의 품질이 좋더라도 모델이 사용자의 의도와 상관없는 랜덤한 이미지를 내뱉어준다면 그 모델의 실용성이 좋다고 할 수 없을 것입니다. 근래에 Text-to-Image 모델들이 인기를 얻었던 이유도 누구나 쉽게 텍스트를 통해서 생성되는 이미지를 조절할 수 있다는 점도 한몫했다고 생각합니다. StyleGAN은 그런 controllability를 어느 정도 가능하게 한 모델이라는 측면에서 의미있다고 생각합니다.

+

StyleGAN의 구조는 아래 그림과 같습니다. synthesis network는 해상도를 4x4에서 시작해서 1024x1024까지 높여줍니다. 최종적으로 1024x1024 해상도를 가지는 이미지를 갖게됩니다. 아래 구조를 보면 기존 GAN하고 비교해서 특이한 점이 세 가지 있습니다.

+
    +
  1. z를 input으로 받는 mapping network

  2. +
  3. style과 AdaIN

  4. +
  5. noise와 B (stochastic variation)

  6. +
+

이 각각에 대해서 알아보도록 합시다.

+
+stylegan_02 +
+

Fig. 62 Structure of StyleGAN#

+
+
+
+

Mapping Network#

+
+stylegan_03 +
+

Fig. 63 Mappings with \(w\) and without \(w\)#

+
+
+

기존 GAN을 생각해보면 z를 input으로 받아서 generator를 거쳐서 이미지를 생성하는 구조입니다. 이 z는 보통 Gaussian distribution에서 샘플링으로 얻습니다. GAN은 학습을 통해 Gaussian distribution을 data distribution으로 보내는 방법을 배우게 될 것이고, 이 분포는 (b)처럼 생기게 될 것입니다. 그런데 데이터가 (a)처럼 주어져서 특정한 데이터가 없거나 적을 수도 있을 것입니다. 예를 들어, 데이터에 피부가 희면서 머리가 긴 샘플들이 없다고 해봅시다. 그러면 피부색과 머리 길이라는 두 feature는 서로 얽히게(entangled)되어, 하나를 바꿀 때 다른 하나도 같이 바뀌는 현상이 일어나게 됩니다. 이런 현상을 완화하기 위해 논문에서는 Gaussian에서 뽑은 z를 바로 사용하는 것이 아니라 mapping network를 통해 learnable distribution에서 뽑은 w를 사용합니다.

+
+
+

Style and AdaIN#

+

instance normalization은 샘플 하나의 각 채널마다 정규화를 취해주는 방법입니다.

+
+stylegan_04 +
+

Fig. 64 Normalization methods#

+
+
+

adaptive instance normalization (AdaIN) 은 instance normalization에 scale을 곱해주고 bias를 더해주는 형태입니다. 그런데 이 scale과 bias가 style vector의 linear transformation으로 주어지는 형태입니다. linear layer를 통해서 w는 \(\mathbf{y}=(\mathbf{y}_{s},\mathbf{y}_{b})\)로 보내지게 됩니다. AdaIN의 수식은 아래와 같습니다.

+
+\[ +AdaIN(\mathbf{x}_{i},\mathbf{y})=\mathbf{y}_{s,i}\frac{\mathbf{x}_{i}-\mu(\mathbf{x}_{i})}{\sigma(\mathbf{x}_{i})}+\mathbf{y}_{b,i} +\]
+

AdaIN은 각 블록마다 두 개씩 들어가서 style은 총 열여덟 번 AdaIN을 통해 generator에 들어가게 됩니다. AdaIN은 localization이라는 특징과도 연관이 있습니다. 여기서 말하는 localization이란 열여덟 개의 style 중에서 일부를 바꿈으로써 이미지의 일부 특징들을 바꿀 수 있다는 의미입니다. AdaIN은 각 convolution layer 다음에 적용이 됩니다. 이 때 feature map들은 normalization되고 style에 의해 새로운 statistics를 가지게 됩니다. style은 하나의 convolution에 적용되고, 다음 convolution에서 다시 normalization이 수행되기 때문에 이전 layer에 적용된 style과 다음 layer에 적용된 style이 분리되게 학습될 수 있습니다.

+

관련 코드

+
class StyleMod(nn.Module):
+    def __init__(self, latent_size, channels, use_wscale):
+        super(StyleMod, self).__init__()
+        self.lin = EqualizedLinear(latent_size,
+                                   channels * 2,
+                                   gain=1.0, use_wscale=use_wscale)
+
+    def forward(self, x, latent):
+        style = self.lin(latent)  # style => [batch_size, n_channels*2]
+
+        shape = [-1, 2, x.size(1)] + (x.dim() - 2) * [1]
+        style = style.view(shape)  # [batch_size, 2, n_channels, ...]
+        x = x * (style[:, 0] + 1.) + style[:, 1]
+        return x
+
+class LayerEpilogue(nn.Module):
+    """Things to do at the end of each layer."""
+
+    def __init__(self, channels, dlatent_size, use_wscale,
+                 use_noise, use_pixel_norm, use_instance_norm, use_styles, activation_layer):
+        super().__init__()
+
+        layers = []
+        if use_noise:
+            layers.append(('noise', NoiseLayer(channels)))
+        layers.append(('activation', activation_layer))
+        if use_pixel_norm:
+            layers.append(('pixel_norm', PixelNormLayer()))
+        if use_instance_norm:
+            layers.append(('instance_norm', nn.InstanceNorm2d(channels)))
+
+        self.top_epi = nn.Sequential(OrderedDict(layers))
+
+        if use_styles:
+            self.style_mod = StyleMod(dlatent_size, channels, use_wscale=use_wscale)
+        else:
+            self.style_mod = None
+
+    def forward(self, x, dlatents_in_slice=None):
+        x = self.top_epi(x)
+        if self.style_mod is not None:
+            x = self.style_mod(x, dlatents_in_slice)
+        else:
+            assert dlatents_in_slice is None
+        return x
+
+
+

code from huangzh13/StyleGAN.pytorch

+

아래 그림은 source A의 style 중 일부를 source B의 style로 변경해서 만든 이미지들입니다. style은 총 18곳에서 사용되는데 처음 4곳 (\(4^2 - 8^2\))을 coarse, 그다음 4곳 (\(16^2-32^2\))을 middle, 마지막 10곳 (\(64^2-1024^2\))을 fine style로 정의하였습니다. 그림을 보시면 윗 부분에서는 포즈나 전체적인 머리 스타일같이 coarse style은 source B의 것을 유지하고, 아래로 갈수록 source A의 큰 틀을 유지하면서 세부적인 부분들을 B에서 가져왔음을 볼 수 있습니다.

+
+stylegan_05 +
+

Fig. 65 Mixing two styles#

+
+
+
+
+

Stochastic Variation#

+

한 사람의 이미지 안에는 확률적으로 바뀔 수 있는 부분이 있습니다. (주근깨, 머릿결, 피부) 이를 모델링하기 위해서 noise를 추가적인 input으로 사용하여 각 convolution layer 다음에 더해집니다. 아래 그림에서 (a)의 생성된 한 사람의 이미지 안에서도 디테일들은 (b)와 같이 달라질 수 있습니다. (c)와 같이 standard deviation을 구해봤을 때 얼굴형과 같은 attribute는 변하지않지만 noise에 의해서 머리카락과 같은 부분은 variation이 생김을 볼 수 있습니다.

+
+stylegan_06 +
+

Fig. 66 Examples of stochastic variation#

+
+
+

아래 그림에서 (a)는 모든 layer에 noise를 준 경우, (b)는 noise를 주지 않은 경우, (c)는 fine layers (\(64^2 - 1024^2\))에만 noise를 준 경우, (d)는 coarse layers (\(4^2 - 32^2\))에만 noise를 준 경우입니다. (b)를 보면 noise가 없을 경우 머리카락같은 디테일이 제대로 살아있지 않은 것을 볼 수 있습니다. (c)와 (d)를 보면 fine layers에 들어간 noise가 머리카락의 더 세밀한 부분에 영향을 끼친다는 것을 볼 수 있습니다.

+
+stylegan_07 +
+

Fig. 67 Effect of noise inputs at different layers#

+
+
+
+
+

Mixing Regularization#

+

논문에서는 localization이 더 잘 되게하기 위해 style mixing이라는 방법을 훈련에 사용합니다. 두 개의 style vector \(\mathbf{w}_{1},\mathbf{w}_{2}\)를 사용하여 앞 쪽 layer에는 \(\mathbf{w}_{1}\)을, 뒤 쪽 layer에는 \(\mathbf{w}_{2}\)를 사용하는 방법입니다. 이는 generator가 인접한 style끼리 correlated되어있다고 학습하는 것을 막아서 localization을 더 잘 되게 하는 목적입니다.

+
+
+

실험 결과#

+

마지막으로 저자들이 제안한 방법들이 실제로 효과가 있었는지 확인해봅시다. 아래 표와 같이 실험적으로 보았을 때 저자들이 제안한 방법들을 모두 사용한 경우 FID가 가장 우수하게 나왔습니다.

+
+stylegan_08 +
+

Fig. 68 FID for various generator designs#

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification.html b/docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification.html old mode 100644 new mode 100755 index 9d77b046..bc0081e3 --- a/docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification.html +++ b/docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification.html @@ -1,843 +1,862 @@ - - - - - - - - - - - - Synthetic Data from Diffusion Models Improves ImageNet Classification — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

Synthetic Data from Diffusion Models Improves ImageNet Classification#

-

이번에 리뷰할 논문은 구글 리서치 그룹에서 TMLR(Transactions on Machine Learning Research) 2023에 제출한 논문인 Synthetic Data from Diffusion Models Improves ImageNet Classification입니다.

-

생성 모델이 놀라운 속도로 발전하고 있는데요! 해당 논문에서는 생성 모델의 수준이 얼만큼 왔는지, 복잡한 이미지 데이터인 ImageNet 데이터에 대해서도 충분한 퀄리티의 데이터를 생성할 수 있는 정도가 되었는지, 그래서 이 생성된 데이터를 augment된 데이터로 사용할 수 있는 정도까지 왔는지에 대한 실험과 답을 제시합니다. 이 글의 목차는 논문 내용과 동일하게 구성하였습니다.

- -

본 논문에서는 기술적으로 엄청 새로운 내용은 없는데요! 다만 보통 사전학습된 text-to-image diffusion 모델을 사용하던 기존 방법들과는 달리 Imagen을 ImageNet에 대해 파인튜닝 했다는 것이 새롭습니다.

-
-
-

1. Introduction#

-

Diffusion 모델의 등장으로 생성 기술이 크게 발전되었습니다. 현재 생성 기술 수준이 data augmentation으로 사용될 수 있을 만큼의 자연스러운 이미지를 생성하는 것도 가능할까?에 대한 질문이 나오는 것은 당연하고, 본 논문에서는 이에 대한 답을 찾고자 했습니다. 먼저 이 질문에 대한 답을 이야기 하면 아래와 같습니다.

-
    -
  • 결과 요약

    -
      -
    • ImageNet에 대해 fine-tuning된 Imagen이 FID, Inception Score, CAS 성능에 대해 SOTA 성능을 달성 하였다.

    • -
    • 합성 데이터와 실제 데이터를 결합하여 사용하고, 합성 데이터의 양이 많고, 훈련 시간이 길수록 생성 데이터로 훈련된 모델의 성능이 더욱 향상되었다.

      -
      -improved_imagenet_classification_00 -
      -

      Fig. 287 위 그림: 합성 데이터로만 학습된 모델 분류 성능과 진짜 데이터로 학습된 모델의 분류 성능 비교 \ -아래 그림: 합성 및 진짜 데이터를 사용하였을 때의 분류 성능과 진짜 데이터로 학습된 모델의 분류 성능 비교#

      -
      -
      -
    • -
    -
  • -
-

위의 그림에서 볼 수 있듯이 합성 데이터로만 학습한 모델의 정확도와 실제 데이터로 학습한 모델의 정확도를 비교했을 때, 다른 모델들에 비해 본 논문에서 제안한 모델이 훨씬 성능 차이가 적다는 것을 알 수 있습니다. 또한, 아래 그림을 보면, 실제 데이터와 생성된 데이터를 더해서 학습했을 경우에는 ResNet 기반 모델과 Transformer 기반 모델들에서 모두 실제 데이터를 사용했을 때보다 성능 향상이 있었습니다.

-
- -
-

3. Background#

-

본 논문에서는 Classification Accuracy Scores(CAS)라는 성능 지표를 소개합니다. FID와 Inception Score는 생성 모델의 성능 지표로 워낙 많이 쓰여서 설명은 생략하고, CAS에 대해서는 논문에서 써져 있는 내용으로 소개하겠습니다.

-

CAS는 FID와 Inception Score와 마찬가지로 생성 모델이 만들어낸 샘플의 품질을 평가하는 방법으로 제안 된 성능 지표입니다. 이것은 ‘합성 데이터’로만 훈련된 ResNet-50 모델에 대한 ImageNet validation set에 대한 분류 성능을 의미합니다. 먼저, 생성 모델을 통해 ImageNet 데이터에 대한 합성 데이터를 만들어냅니다. 그리고 이 합성 데이터만을 이용하여 ResNet-50을 훈련 시키고, 그 훈련된 모델의 실제 ImageNet validation set에 대해 분류 성능이 CAS가 됩니다. 만약 합성 데이터가 실제 ImageNet과 비슷하다면 그 합성 데이터로 학습된 모델은 실제 ImageNet validation set에 대해 좋은 분류 성능을 보일 것이라는 가정을 이용한 성능 지표라고 이해하면 될 것 같습니다.

-

저자에 의하면 그동안 생성모델의 CAS 성능은 좋지 않았다고 합니다. 생성된 샘플로만 훈련된 모델은 실제 데이터로 훈련된 모델보다 성능이 떨어졌고 (이는 당연해보입니다), 실제 데이터에 합성 데이터를 추가하면 성능이 떨어졌다고 합니다. 이는 아마도 생성된 샘플의 품질, 다양성 등이 원인일 수 있을 것이라고 합니다.

-
-
-

4. Generative Model Training and Sampling#

-

여기서는 실제로 저자들이 어떻게 text-to-image diffusion 모델을 학습하고, 샘플링을 하였는지에 대한 설명을 합니다.

-

먼저 저자들은 text-to-image diffusion 모델로는 Imagen을 사용하였습니다. Text-to-image 모델을 어떻게 ImageNet 클래스와 alignment 할 지에 대한 고민이 필요했다고 합니다. 처음에는 CLIP에서 사용한 방법과 유사하게 짧은 텍스트를 ImageNet 클래스의 텍스트 프롬프트로 사용했다고 하였는데 이 경우에 성능이 좋지 않았다고 합니다. 이는 Imagen에서 high guidance weight를 사용하여 샘플의 다양성이 저하 되면서 생기는 현상일 수 있다고 합니다. 따라서, 저자들은 프롬프트를 한 두단어 클래스 이름으로 수정하고, 모델의 weight와 sampling parameter를 fine-tuning 했다고 합니다.

-
-improved_imagenet_classification_01 -
-

Fig. 288 Figure 2#

-
-
-

왼쪽 그림이 fine-tuning이 적용된 Imagen이 만들어낸 이미지고, 오른쪽이 fine-tuning이 적용되지 않은 Imagen입니다. 아래에서 두 번째 클래스인 Schipperke를 보면, 이것은 스키퍼키라는 개 품종을 의미하는데 fine-tuning이 적용되지 않은 Imagen의 경우는 꽃과 같은 전혀 엉뚱한 이미지를 만들고 있는 것을 볼 수 있습니다.

-
-

4.1. Imagen Fine-tuning#

-

이 부분은 Imagen을 어떻게 fine-tuning 했는지를 설명하는 부분입니다.

-

먼저 Imagen 구조는 아래와 같습니다.

-
-improved_imagenet_classification_02 -
-

Fig. 289 Imagen 구조#

-
-
-

본 논문에서는 위의 Imagen 구조에서 빨간 원으로 표시된 부분에 대해서만 fine-tuning 했습니다. Frozen Text Encoder의 경우는 원래 Imagen에서도 학습을 하지 않는 부분이라 마찬가지로 학습을 하지 않았고, 1024x1024 Image를 출력으로 하는 마지막 Super-Resolution Diffusion Model의 경우 ImageNet에 고해상도의 데이터가 적어서 fine-tuning을 하지 않았다고 합니다.

-

64x64 모델의 경우는 210K step 정도 학습하였고, optimizer의 경우는 Imagen에서 사용하였던 Adafactor optimizer를 사용하였다고 합니다. 64x64 → 256x256 super-resolution 모델의 경우는 490K step 정도 하였고, Adam optimizer를 사용하였다고 합니다.

-

최적의 모델 선택의 기준으로는 기본 Imagen sampler와 ImageNet-1K validation set에 대해 10K개의 샘플들에 대해 FID score를 계산했을 때 가장 좋은 성능의 모델을 선택했다고 합니다.

-
-
-

4.2. Sampling Parameters#

-

이 부분은 본 논문에서 sampling parameter는 어떻게 정했는지를 설명하는 부분입니다. 먼저, Text-conditioned diffusion model 샘플링의 품질, 다양성, 속도는 디퓨전 스텝 수, noise condition augmentation, guidance weight for classifier-free guidance, log-variance mixing coefficient 등에 대해 큰 영향을 받는다고 합니다.

-

각각에 대해 간단하게 설명하면 아래와 같습니다.

-
    -
  • Noise condition augmentation:

    -

    이미지 생성 과정에서 확률적인 요소를 도입하여 생성된 이미지의 다양성을 증가시키는 기술. 일반적으로, 모델은 잠재 공간의 랜덤한 노이즈를 입력으로 받아 다양한 이미지를 생성하게 됨. 이것은 생성된 이미지가 조금씩 다른 것으로 보이게 만들며, 더 다양한 결과를 얻을 수 있게 함 (자세한 내용은 “Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding”를 참고해주세요) -

    -
  • -
  • Guidance weight for classifier-free guidance:

    -

    “Classifier-free guidance”는 이미지를 생성하는 데 분류기나 특정 지표 없이 외부 정보를 사용한다는 것. “Guidance weights”는 외부 정보를 모델에 어떻게 반영할지를 조절하는 가중치를 의미할 수 있으며, 이러한 가중치를 조절하여 모델이 원하는 특성이나 스타일을 가진 이미지를 더 잘 생성하도록 함 (자세한 내용은 “Classifier-free diffusion guidance”를 참고해주세요) -

    -
  • -
  • Log-variance mixing coefficient:

    -

    이미지 생성 모델에서 사용되는 확률 분포의 변동성을 조절하는 데 사용되는 계수를 나타냄. 이미지 생성 모델은 일반적으로 확률 분포를 사용하여 이미지를 생성하며, 이 확률 분포의 평균과 분산을 조절함으로써 생성된 이미지의 다양성과 품질을 조절할 수 있음. 로그-분산 혼합 계수는 이러한 분산을 조절하는 데 사용되며, 높은 값은 더 큰 분산을 의미하고, 작은 값은 더 작은 분산을 의미함. 이를 통해 이미지 생성의 다양성을 조절할 수 있음 (자세한 내용은 “Improved denoising diffusion probabilistic models”를 참고해주세요)
    -

    -
  • -
-

64x64 기반 모델의 샘플링 parameter 설정법에 대해 설명하겠습니다. 해당 모델의 샘플링 이미지 샘플링의 전반적인 특징과 다양성의 영향을 주게 됩니다. 1차 sweep으로 DDPM 샘플러를 이용하여 FID-50K에 대해 가장 최적의 하이퍼파라미터를 찾습니다. Sweep의 사용한 각 하이퍼파라미터의 범위는 아래와 같습니다.

-
    -
  • Guidance weight: [1.0, 1.25, 1.5, 1.75, 2.0, 5.0]

  • -
  • Log-variance: [0.0, 0.2, 0.3, 0.4, 1.0]

  • -
  • Denoise step: [128, 500, 1000]

  • -
-

1차 sweep 결과 최적의 FID는 log-variance는 0이고 denoising step은 1000이었을 때라고 합니다.

-

1차 sweep이 끝난 후에는 guidance weight에 대해서만 sweep을 합니다. 이 때에는 1.2M 이미지를 사용하고, 각 guidacne weight에 대해 FID, IS, CAS를 측정했다고 합니다.

-

각 샘플링 하이퍼파라미터에 대한 실험 결과는 아래와 같습니다.

-
-improved_imagenet_classification_03 -
-

Fig. 290 Figure 3#

-
-
-

왼쪽 그림이 1차 sweep에 대한 결과고, 가운데와 오른쪽 그림이 2차 sweep에 대한 결과로 guidance weight에 따른 FID, IS, CAS를 나타낸 결과입니다.

-

이제 다음으로는 64x64 → 256x256 super-resolution 모델에 대해 하이퍼파라미터를 선택하는 부분에 대해 설명하겠습니다. 하이퍼파라미터의 range는 아래와 같습니다. -- Guidance weight: [1.0, 2.0, 5.0, 10.0, 30.0] -- Noise conditioning augmentation: [0.0, 0.1, 0.2, 0.3, 0.4] -- Log-variance mixing coefficients: [0,1, 0.3] -- Denose steps: [129, 500, 1000]

-
-improved_imagenet_classification_04 -
-

Fig. 291 Figure 4#

-
-
-

위 그래프는 guidance weight를 1.0으로 설정하고 noise condition 파라미터를 변경했을 때 FID와 CAS의 그래프를 나타낸 그래프입니다. CAS 같은 경우는 logvar coeff가 0.3일 때 전반적으로 좋은 성능을 보였으며, FID 같은 경우도 logvar coeff가 0.3일 때 전반적으로 좋은 성능을 보인 것을 알 수 있습니다.

-
-

샘플링 하이퍼파라미터의 결과를 분석해보자면, 전반적으로 FID와 CAS는 높은 상관관계가 있으며 (Figure 4 참고), guidance weight가 작을수록 CAS는 높아지지만, Inception Score에는 부정적인 영향을 주며 (Figure 3 참고), noise augmentation이 0일 때 FID가 가장 작은 것을 볼 수 있습니다. (Figure 4 참고)

-
-

이런 하이퍼파라미터 설정 방법을 기준으로 본 논문에서 최종적으로 설정한 값은 아래와 같다고 합니다.

-
    -
  • Guidance weight

    -
      -
    • 베이스 모델: 1.25

    • -
    • 나머지 resolution: 1.0

    • -
    -
  • -
  • Log-variance mixing coefficients (sampler, steps)

    -
      -
    • 64x64 샘플: 0.0 (DDPM, 1000 denoising steps)

    • -
    • 256x256 샘플: 0.1 (DDPM, 1000 denoising steps)

    • -
    • 1024x1024 샘플: 0.0 (DDIM, 32 denoising steps)

    • -
    -
  • -
-
-
-

4.3. Generation Protocol#

-

이 부분은 실제로 데이터 합성은 어떤 프로토콜을 따랐는지에 대해 설명하는 부분입니다. 본 논문에서는 원본 데이터셋의 class balance를 유지하며 데이터를 합성했으며, 합성된 결과 총 훈련 데이터셋의 규모는 1배인 1.2M 에서 10배인 12M 규모의 데이터셋의 범위를 가지도록 데이터를 합성했다고 합니다.

-
-
-
-

5. Result#

-
-

5-1. Sample Quality: FID and IS#

-

먼저, 합성된 데이터의 품질을 합성 태스크에서 많이 사용되는 지표인 FID와 IS의 관점으로 봅니다.

-
-improved_imagenet_classification_05 -
-

Fig. 292 Table 1#

-
-
-

위 표에서 볼 수 있듯이, 본 논문의 파인 튜닝된 Imagen이 ImageNet에 대한 데이터 생성에 대해 다른 베이스모델들 보다 FID와 IS가 뛰어난 것을 알 수 있습니다. 이는 64x64 resolution과 256x256 resolution에서 모두 해당되었습니다.

-
-
-

5.2. Classification Accuracy Score#

-

이 부분은 CAS 성능 지표를 통해 본 논문에서 제안한 모델의 데이터 합성 능력을 확인하는 부분입니다.

-
-improved_imagenet_classification_06 -
-

Fig. 293 CAS score#

-
-
-

Figure 5에서 파란색 부분은 실제 학습 데이터로 학습된 모델의 분류 성능이고, 빨간색 부분은 합성된 데이터로 학습된 모델의 분류 성능입니다. 왼쪽 그림은 베이스라인 중 하나인 CDM 모델의 성능을 나타낸 그림이며, 가운데는 본 논문에서 256x256 resolution 모델의 성능, 오른쪽은 본 논문에서 제안한 1024x1024 resolution 모델의 성능을 나타낸 것입니다. 빨간색 부분이 파란색 부분보다 전반적으로 위쪽에 위치하면 모델의 성능이 좋다고 해석할 수 있습니다. 이 그림을 통해 본 논문에서 제안한 모델들이 베이스라인보다 좋은 성능을 보인다는 것을 알 수 있습니다.

-

Table 2에서도 마찬가지로 본 논문 모델이 다른 베이스 모델보다 성능이 뛰어난 것을 알 수 있습니다. 여기서 주목할 만한 점은 CAS를 평가하기 위한 ResNet50이 256x256으로 입력 데이터를 다운샘플링 함에도 1024x1024 샘플에 대한 결과가 훨씬 좋다는 것을 볼 수 있습니다. (Ours 256x256 resolution보다 Ours 1024x1024 resolution의 CAS 성능이 월등히 높음)

-
-
-

5.3. Classification Accuracy with Different Models#

-

이 부분은 합성된 데이터를 여러 종류의 모델로 학습 시켰을 때, 각 모델의 분류 성능을 확인하는 부분입니다. CAS와 비슷하지만 CAS에서는 ResNet50 모델로 분류 성능을 확인했지만 여기서는 ResNet50 이외에 모델로도 분류 성능을 본다는 차이점이 있습니다.

-
-improved_imagenet_classification_06 -
-

Fig. 294 Table 3#

-
-
-

위 표에서 확인할 수 있듯이, 다양한 모델에 대해서 분류 정확도를 살펴본 결과 생성된 데이터로만 학습될 경우에는 실제 데이터로 학습할 때 보다 성능이 낮았지만, 실제 데이터와 생성된 데이터를 합쳐서 학습할 경우 실제 데이터만 사용했을 때보다 성능이 증가한 것을 볼 수 있습니다. 이것은 onvNet기반 모델과 transformer 기반 모델에 대해서 동일한 양상을 보였습니다.

-
-
-

5.4. Merging Real and Synthetic Data at Scale#

-

이 부분은 합성 데이터 규모에 따른 ResNet-50의 성능을 분석한 부분입니다.

-
-improved_imagenet_classification_06 -
-

Fig. 295 Figure 6#

-
-
-

64x64 이미지의 경우 생성되는 데이터의 양이 증가함에 따라 성능이 지속적으로 향상되는 것을 볼 수 있습니다.

-
-improved_imagenet_classification_06 -
-

Fig. 296 Table 4#

-
-
-

하지만 다른 resolution에 대해서는 다른 양상을 보였습니다. 학습 데이터가 4.8M 규모가 될 때까지는 합성 데이터를 추가하는 것이 분류 성능에 좋았으나, 합성 데이터를 더 늘려 그 이상의 규모가 되었을 때는 오히려 성능이 떨어지는 것을 볼 수 있었습니다.

-
-
-
-

6. Conclusion#

-

본 논문에 결론 부분을 보자면, 이 논문에서는 Large-sclae text-to-image diffusion 모델을 파인튜닝하여 FID, Inception Score, CAS 성능 지표에 대해서 SOTA를 달성했습니다.

-
    -
  • FID: 1.76 at 256x256

  • -
  • Inception Score: 239 at 256x256

  • -
  • CAS: 64.96 for 256x256, 69.24 for 1024x1024

  • -
-

또한 그렇게 생성 데이터를 이용하여 ResNet과 Transformer 기반 모델들에 대한 ImageNet classification accuracy를 향상 시켰습니다.

-

실험 결과에 대해서 생각해볼만한 거리들이 있었는데 그 중 하나는 CAS 성능 측정할 때 ResNet50이 입력을 256x256으로 다운샘플링 함에도 불구하고 256x256보다 1024x1024의 모델의 CAS가 좋은 것이 있었습니다. 이는 다운샘플링을 하더라도 다운샘플링 전 원본 데이터 resolution이 클 때 더 많은 정보를 담는다는 것을 의미하는 것일 수 있습니다. 또한, 64x64 데이터에서 합성 데이터의 양이 증가함에 따라 분류 정확도가 지속적으로 증가했지만 고해상도 데이터에서는 그렇지 않았던 것을 통해 고해상도에 이미지에 대해서는 보다 정교한 훈련 방법이 필요할 수 있음을 시사하고 있습니다.

-
-

이렇게 Synthetic Data from Diffusion Models Improves ImageNet Classification 논문의 리뷰를 마치겠습니다. 개인적으로 느낀 점은 실제 산업에서는 data shortage나 class imbalance 문제가 대부분 발생하는데 본 논문이 그 해결법 중 하나가 될 수 있을 것 같다는 생각이 들었습니다. 다만 Frozen Text Encoder는 추가적으로 파인튜닝이 되지 않기 때문에 특정 산업에서만 쓰이는 특정 텍스트가 들어왔을 때는 잘 동작할 수 있을까 하는 의문이 들었습니다. 또한 합성하고자 하는 데이터셋에 맞게 파인튜닝을 해야하는 점이 꽤나 불편할 것 같아서 파인튜닝이 모델 성능에 얼마나 큰 의미를 갖는지, 파인튜닝을 하지 않았을 때의 CAS 성능도 논문에 있었으면 좋았을 것 같다는 개인적인 생각이 들었습니다. (물론 Figure 2를 보고 어느 정도 결과를 유추해볼 순 있지만요!)

-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Synthetic Data from Diffusion Models Improves ImageNet Classification — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

Synthetic Data from Diffusion Models Improves ImageNet Classification#

+

이번에 리뷰할 논문은 구글 리서치 그룹에서 TMLR(Transactions on Machine Learning Research) 2023에 제출한 논문인 Synthetic Data from Diffusion Models Improves ImageNet Classification입니다.

+

생성 모델이 놀라운 속도로 발전하고 있는데요! 해당 논문에서는 생성 모델의 수준이 얼만큼 왔는지, 복잡한 이미지 데이터인 ImageNet 데이터에 대해서도 충분한 퀄리티의 데이터를 생성할 수 있는 정도가 되었는지, 그래서 이 생성된 데이터를 augment된 데이터로 사용할 수 있는 정도까지 왔는지에 대한 실험과 답을 제시합니다. 이 글의 목차는 논문 내용과 동일하게 구성하였습니다.

+ +

본 논문에서는 기술적으로 엄청 새로운 내용은 없는데요! 다만 보통 사전학습된 text-to-image diffusion 모델을 사용하던 기존 방법들과는 달리 Imagen을 ImageNet에 대해 파인튜닝 했다는 것이 새롭습니다.

+
+
+

1. Introduction#

+

Diffusion 모델의 등장으로 생성 기술이 크게 발전되었습니다. 현재 생성 기술 수준이 data augmentation으로 사용될 수 있을 만큼의 자연스러운 이미지를 생성하는 것도 가능할까?에 대한 질문이 나오는 것은 당연하고, 본 논문에서는 이에 대한 답을 찾고자 했습니다. 먼저 이 질문에 대한 답을 이야기 하면 아래와 같습니다.

+
    +
  • 결과 요약

    +
      +
    • ImageNet에 대해 fine-tuning된 Imagen이 FID, Inception Score, CAS 성능에 대해 SOTA 성능을 달성 하였다.

    • +
    • 합성 데이터와 실제 데이터를 결합하여 사용하고, 합성 데이터의 양이 많고, 훈련 시간이 길수록 생성 데이터로 훈련된 모델의 성능이 더욱 향상되었다.

      +
      +improved_imagenet_classification_00 +
      +

      Fig. 287 위 그림: 합성 데이터로만 학습된 모델 분류 성능과 진짜 데이터로 학습된 모델의 분류 성능 비교 \ +아래 그림: 합성 및 진짜 데이터를 사용하였을 때의 분류 성능과 진짜 데이터로 학습된 모델의 분류 성능 비교#

      +
      +
      +
    • +
    +
  • +
+

위의 그림에서 볼 수 있듯이 합성 데이터로만 학습한 모델의 정확도와 실제 데이터로 학습한 모델의 정확도를 비교했을 때, 다른 모델들에 비해 본 논문에서 제안한 모델이 훨씬 성능 차이가 적다는 것을 알 수 있습니다. 또한, 아래 그림을 보면, 실제 데이터와 생성된 데이터를 더해서 학습했을 경우에는 ResNet 기반 모델과 Transformer 기반 모델들에서 모두 실제 데이터를 사용했을 때보다 성능 향상이 있었습니다.

+
+ +
+

3. Background#

+

본 논문에서는 Classification Accuracy Scores(CAS)라는 성능 지표를 소개합니다. FID와 Inception Score는 생성 모델의 성능 지표로 워낙 많이 쓰여서 설명은 생략하고, CAS에 대해서는 논문에서 써져 있는 내용으로 소개하겠습니다.

+

CAS는 FID와 Inception Score와 마찬가지로 생성 모델이 만들어낸 샘플의 품질을 평가하는 방법으로 제안 된 성능 지표입니다. 이것은 ‘합성 데이터’로만 훈련된 ResNet-50 모델에 대한 ImageNet validation set에 대한 분류 성능을 의미합니다. 먼저, 생성 모델을 통해 ImageNet 데이터에 대한 합성 데이터를 만들어냅니다. 그리고 이 합성 데이터만을 이용하여 ResNet-50을 훈련 시키고, 그 훈련된 모델의 실제 ImageNet validation set에 대해 분류 성능이 CAS가 됩니다. 만약 합성 데이터가 실제 ImageNet과 비슷하다면 그 합성 데이터로 학습된 모델은 실제 ImageNet validation set에 대해 좋은 분류 성능을 보일 것이라는 가정을 이용한 성능 지표라고 이해하면 될 것 같습니다.

+

저자에 의하면 그동안 생성모델의 CAS 성능은 좋지 않았다고 합니다. 생성된 샘플로만 훈련된 모델은 실제 데이터로 훈련된 모델보다 성능이 떨어졌고 (이는 당연해보입니다), 실제 데이터에 합성 데이터를 추가하면 성능이 떨어졌다고 합니다. 이는 아마도 생성된 샘플의 품질, 다양성 등이 원인일 수 있을 것이라고 합니다.

+
+
+

4. Generative Model Training and Sampling#

+

여기서는 실제로 저자들이 어떻게 text-to-image diffusion 모델을 학습하고, 샘플링을 하였는지에 대한 설명을 합니다.

+

먼저 저자들은 text-to-image diffusion 모델로는 Imagen을 사용하였습니다. Text-to-image 모델을 어떻게 ImageNet 클래스와 alignment 할 지에 대한 고민이 필요했다고 합니다. 처음에는 CLIP에서 사용한 방법과 유사하게 짧은 텍스트를 ImageNet 클래스의 텍스트 프롬프트로 사용했다고 하였는데 이 경우에 성능이 좋지 않았다고 합니다. 이는 Imagen에서 high guidance weight를 사용하여 샘플의 다양성이 저하 되면서 생기는 현상일 수 있다고 합니다. 따라서, 저자들은 프롬프트를 한 두단어 클래스 이름으로 수정하고, 모델의 weight와 sampling parameter를 fine-tuning 했다고 합니다.

+
+improved_imagenet_classification_01 +
+

Fig. 288 Figure 2#

+
+
+

왼쪽 그림이 fine-tuning이 적용된 Imagen이 만들어낸 이미지고, 오른쪽이 fine-tuning이 적용되지 않은 Imagen입니다. 아래에서 두 번째 클래스인 Schipperke를 보면, 이것은 스키퍼키라는 개 품종을 의미하는데 fine-tuning이 적용되지 않은 Imagen의 경우는 꽃과 같은 전혀 엉뚱한 이미지를 만들고 있는 것을 볼 수 있습니다.

+
+

4.1. Imagen Fine-tuning#

+

이 부분은 Imagen을 어떻게 fine-tuning 했는지를 설명하는 부분입니다.

+

먼저 Imagen 구조는 아래와 같습니다.

+
+improved_imagenet_classification_02 +
+

Fig. 289 Imagen 구조#

+
+
+

본 논문에서는 위의 Imagen 구조에서 빨간 원으로 표시된 부분에 대해서만 fine-tuning 했습니다. Frozen Text Encoder의 경우는 원래 Imagen에서도 학습을 하지 않는 부분이라 마찬가지로 학습을 하지 않았고, 1024x1024 Image를 출력으로 하는 마지막 Super-Resolution Diffusion Model의 경우 ImageNet에 고해상도의 데이터가 적어서 fine-tuning을 하지 않았다고 합니다.

+

64x64 모델의 경우는 210K step 정도 학습하였고, optimizer의 경우는 Imagen에서 사용하였던 Adafactor optimizer를 사용하였다고 합니다. 64x64 → 256x256 super-resolution 모델의 경우는 490K step 정도 하였고, Adam optimizer를 사용하였다고 합니다.

+

최적의 모델 선택의 기준으로는 기본 Imagen sampler와 ImageNet-1K validation set에 대해 10K개의 샘플들에 대해 FID score를 계산했을 때 가장 좋은 성능의 모델을 선택했다고 합니다.

+
+
+

4.2. Sampling Parameters#

+

이 부분은 본 논문에서 sampling parameter는 어떻게 정했는지를 설명하는 부분입니다. 먼저, Text-conditioned diffusion model 샘플링의 품질, 다양성, 속도는 디퓨전 스텝 수, noise condition augmentation, guidance weight for classifier-free guidance, log-variance mixing coefficient 등에 대해 큰 영향을 받는다고 합니다.

+

각각에 대해 간단하게 설명하면 아래와 같습니다.

+
    +
  • Noise condition augmentation:

    +

    이미지 생성 과정에서 확률적인 요소를 도입하여 생성된 이미지의 다양성을 증가시키는 기술. 일반적으로, 모델은 잠재 공간의 랜덤한 노이즈를 입력으로 받아 다양한 이미지를 생성하게 됨. 이것은 생성된 이미지가 조금씩 다른 것으로 보이게 만들며, 더 다양한 결과를 얻을 수 있게 함 (자세한 내용은 “Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding”를 참고해주세요) +

    +
  • +
  • Guidance weight for classifier-free guidance:

    +

    “Classifier-free guidance”는 이미지를 생성하는 데 분류기나 특정 지표 없이 외부 정보를 사용한다는 것. “Guidance weights”는 외부 정보를 모델에 어떻게 반영할지를 조절하는 가중치를 의미할 수 있으며, 이러한 가중치를 조절하여 모델이 원하는 특성이나 스타일을 가진 이미지를 더 잘 생성하도록 함 (자세한 내용은 “Classifier-free diffusion guidance”를 참고해주세요) +

    +
  • +
  • Log-variance mixing coefficient:

    +

    이미지 생성 모델에서 사용되는 확률 분포의 변동성을 조절하는 데 사용되는 계수를 나타냄. 이미지 생성 모델은 일반적으로 확률 분포를 사용하여 이미지를 생성하며, 이 확률 분포의 평균과 분산을 조절함으로써 생성된 이미지의 다양성과 품질을 조절할 수 있음. 로그-분산 혼합 계수는 이러한 분산을 조절하는 데 사용되며, 높은 값은 더 큰 분산을 의미하고, 작은 값은 더 작은 분산을 의미함. 이를 통해 이미지 생성의 다양성을 조절할 수 있음 (자세한 내용은 “Improved denoising diffusion probabilistic models”를 참고해주세요)
    +

    +
  • +
+

64x64 기반 모델의 샘플링 parameter 설정법에 대해 설명하겠습니다. 해당 모델의 샘플링 이미지 샘플링의 전반적인 특징과 다양성의 영향을 주게 됩니다. 1차 sweep으로 DDPM 샘플러를 이용하여 FID-50K에 대해 가장 최적의 하이퍼파라미터를 찾습니다. Sweep의 사용한 각 하이퍼파라미터의 범위는 아래와 같습니다.

+
    +
  • Guidance weight: [1.0, 1.25, 1.5, 1.75, 2.0, 5.0]

  • +
  • Log-variance: [0.0, 0.2, 0.3, 0.4, 1.0]

  • +
  • Denoise step: [128, 500, 1000]

  • +
+

1차 sweep 결과 최적의 FID는 log-variance는 0이고 denoising step은 1000이었을 때라고 합니다.

+

1차 sweep이 끝난 후에는 guidance weight에 대해서만 sweep을 합니다. 이 때에는 1.2M 이미지를 사용하고, 각 guidacne weight에 대해 FID, IS, CAS를 측정했다고 합니다.

+

각 샘플링 하이퍼파라미터에 대한 실험 결과는 아래와 같습니다.

+
+improved_imagenet_classification_03 +
+

Fig. 290 Figure 3#

+
+
+

왼쪽 그림이 1차 sweep에 대한 결과고, 가운데와 오른쪽 그림이 2차 sweep에 대한 결과로 guidance weight에 따른 FID, IS, CAS를 나타낸 결과입니다.

+

이제 다음으로는 64x64 → 256x256 super-resolution 모델에 대해 하이퍼파라미터를 선택하는 부분에 대해 설명하겠습니다. 하이퍼파라미터의 range는 아래와 같습니다. +- Guidance weight: [1.0, 2.0, 5.0, 10.0, 30.0] +- Noise conditioning augmentation: [0.0, 0.1, 0.2, 0.3, 0.4] +- Log-variance mixing coefficients: [0,1, 0.3] +- Denose steps: [129, 500, 1000]

+
+improved_imagenet_classification_04 +
+

Fig. 291 Figure 4#

+
+
+

위 그래프는 guidance weight를 1.0으로 설정하고 noise condition 파라미터를 변경했을 때 FID와 CAS의 그래프를 나타낸 그래프입니다. CAS 같은 경우는 logvar coeff가 0.3일 때 전반적으로 좋은 성능을 보였으며, FID 같은 경우도 logvar coeff가 0.3일 때 전반적으로 좋은 성능을 보인 것을 알 수 있습니다.

+
+

샘플링 하이퍼파라미터의 결과를 분석해보자면, 전반적으로 FID와 CAS는 높은 상관관계가 있으며 (Figure 4 참고), guidance weight가 작을수록 CAS는 높아지지만, Inception Score에는 부정적인 영향을 주며 (Figure 3 참고), noise augmentation이 0일 때 FID가 가장 작은 것을 볼 수 있습니다. (Figure 4 참고)

+
+

이런 하이퍼파라미터 설정 방법을 기준으로 본 논문에서 최종적으로 설정한 값은 아래와 같다고 합니다.

+
    +
  • Guidance weight

    +
      +
    • 베이스 모델: 1.25

    • +
    • 나머지 resolution: 1.0

    • +
    +
  • +
  • Log-variance mixing coefficients (sampler, steps)

    +
      +
    • 64x64 샘플: 0.0 (DDPM, 1000 denoising steps)

    • +
    • 256x256 샘플: 0.1 (DDPM, 1000 denoising steps)

    • +
    • 1024x1024 샘플: 0.0 (DDIM, 32 denoising steps)

    • +
    +
  • +
+
+
+

4.3. Generation Protocol#

+

이 부분은 실제로 데이터 합성은 어떤 프로토콜을 따랐는지에 대해 설명하는 부분입니다. 본 논문에서는 원본 데이터셋의 class balance를 유지하며 데이터를 합성했으며, 합성된 결과 총 훈련 데이터셋의 규모는 1배인 1.2M 에서 10배인 12M 규모의 데이터셋의 범위를 가지도록 데이터를 합성했다고 합니다.

+
+
+
+

5. Result#

+
+

5-1. Sample Quality: FID and IS#

+

먼저, 합성된 데이터의 품질을 합성 태스크에서 많이 사용되는 지표인 FID와 IS의 관점으로 봅니다.

+
+improved_imagenet_classification_05 +
+

Fig. 292 Table 1#

+
+
+

위 표에서 볼 수 있듯이, 본 논문의 파인 튜닝된 Imagen이 ImageNet에 대한 데이터 생성에 대해 다른 베이스모델들 보다 FID와 IS가 뛰어난 것을 알 수 있습니다. 이는 64x64 resolution과 256x256 resolution에서 모두 해당되었습니다.

+
+
+

5.2. Classification Accuracy Score#

+

이 부분은 CAS 성능 지표를 통해 본 논문에서 제안한 모델의 데이터 합성 능력을 확인하는 부분입니다.

+
+improved_imagenet_classification_06 +
+

Fig. 293 CAS score#

+
+
+

Figure 5에서 파란색 부분은 실제 학습 데이터로 학습된 모델의 분류 성능이고, 빨간색 부분은 합성된 데이터로 학습된 모델의 분류 성능입니다. 왼쪽 그림은 베이스라인 중 하나인 CDM 모델의 성능을 나타낸 그림이며, 가운데는 본 논문에서 256x256 resolution 모델의 성능, 오른쪽은 본 논문에서 제안한 1024x1024 resolution 모델의 성능을 나타낸 것입니다. 빨간색 부분이 파란색 부분보다 전반적으로 위쪽에 위치하면 모델의 성능이 좋다고 해석할 수 있습니다. 이 그림을 통해 본 논문에서 제안한 모델들이 베이스라인보다 좋은 성능을 보인다는 것을 알 수 있습니다.

+

Table 2에서도 마찬가지로 본 논문 모델이 다른 베이스 모델보다 성능이 뛰어난 것을 알 수 있습니다. 여기서 주목할 만한 점은 CAS를 평가하기 위한 ResNet50이 256x256으로 입력 데이터를 다운샘플링 함에도 1024x1024 샘플에 대한 결과가 훨씬 좋다는 것을 볼 수 있습니다. (Ours 256x256 resolution보다 Ours 1024x1024 resolution의 CAS 성능이 월등히 높음)

+
+
+

5.3. Classification Accuracy with Different Models#

+

이 부분은 합성된 데이터를 여러 종류의 모델로 학습 시켰을 때, 각 모델의 분류 성능을 확인하는 부분입니다. CAS와 비슷하지만 CAS에서는 ResNet50 모델로 분류 성능을 확인했지만 여기서는 ResNet50 이외에 모델로도 분류 성능을 본다는 차이점이 있습니다.

+
+improved_imagenet_classification_06 +
+

Fig. 294 Table 3#

+
+
+

위 표에서 확인할 수 있듯이, 다양한 모델에 대해서 분류 정확도를 살펴본 결과 생성된 데이터로만 학습될 경우에는 실제 데이터로 학습할 때 보다 성능이 낮았지만, 실제 데이터와 생성된 데이터를 합쳐서 학습할 경우 실제 데이터만 사용했을 때보다 성능이 증가한 것을 볼 수 있습니다. 이것은 onvNet기반 모델과 transformer 기반 모델에 대해서 동일한 양상을 보였습니다.

+
+
+

5.4. Merging Real and Synthetic Data at Scale#

+

이 부분은 합성 데이터 규모에 따른 ResNet-50의 성능을 분석한 부분입니다.

+
+improved_imagenet_classification_06 +
+

Fig. 295 Figure 6#

+
+
+

64x64 이미지의 경우 생성되는 데이터의 양이 증가함에 따라 성능이 지속적으로 향상되는 것을 볼 수 있습니다.

+
+improved_imagenet_classification_06 +
+

Fig. 296 Table 4#

+
+
+

하지만 다른 resolution에 대해서는 다른 양상을 보였습니다. 학습 데이터가 4.8M 규모가 될 때까지는 합성 데이터를 추가하는 것이 분류 성능에 좋았으나, 합성 데이터를 더 늘려 그 이상의 규모가 되었을 때는 오히려 성능이 떨어지는 것을 볼 수 있었습니다.

+
+
+
+

6. Conclusion#

+

본 논문에 결론 부분을 보자면, 이 논문에서는 Large-sclae text-to-image diffusion 모델을 파인튜닝하여 FID, Inception Score, CAS 성능 지표에 대해서 SOTA를 달성했습니다.

+
    +
  • FID: 1.76 at 256x256

  • +
  • Inception Score: 239 at 256x256

  • +
  • CAS: 64.96 for 256x256, 69.24 for 1024x1024

  • +
+

또한 그렇게 생성 데이터를 이용하여 ResNet과 Transformer 기반 모델들에 대한 ImageNet classification accuracy를 향상 시켰습니다.

+

실험 결과에 대해서 생각해볼만한 거리들이 있었는데 그 중 하나는 CAS 성능 측정할 때 ResNet50이 입력을 256x256으로 다운샘플링 함에도 불구하고 256x256보다 1024x1024의 모델의 CAS가 좋은 것이 있었습니다. 이는 다운샘플링을 하더라도 다운샘플링 전 원본 데이터 resolution이 클 때 더 많은 정보를 담는다는 것을 의미하는 것일 수 있습니다. 또한, 64x64 데이터에서 합성 데이터의 양이 증가함에 따라 분류 정확도가 지속적으로 증가했지만 고해상도 데이터에서는 그렇지 않았던 것을 통해 고해상도에 이미지에 대해서는 보다 정교한 훈련 방법이 필요할 수 있음을 시사하고 있습니다.

+
+

이렇게 Synthetic Data from Diffusion Models Improves ImageNet Classification 논문의 리뷰를 마치겠습니다. 개인적으로 느낀 점은 실제 산업에서는 data shortage나 class imbalance 문제가 대부분 발생하는데 본 논문이 그 해결법 중 하나가 될 수 있을 것 같다는 생각이 들었습니다. 다만 Frozen Text Encoder는 추가적으로 파인튜닝이 되지 않기 때문에 특정 산업에서만 쓰이는 특정 텍스트가 들어왔을 때는 잘 동작할 수 있을까 하는 의문이 들었습니다. 또한 합성하고자 하는 데이터셋에 맞게 파인튜닝을 해야하는 점이 꽤나 불편할 것 같아서 파인튜닝이 모델 성능에 얼마나 큰 의미를 갖는지, 파인튜닝을 하지 않았을 때의 CAS 성능도 논문에 있었으면 좋았을 것 같다는 개인적인 생각이 들었습니다. (물론 Figure 2를 보고 어느 정도 결과를 유추해볼 순 있지만요!)

+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/Textual_Inversion.html b/docs/review/Textual_Inversion.html old mode 100644 new mode 100755 index dffbefb1..9019adfe --- a/docs/review/Textual_Inversion.html +++ b/docs/review/Textual_Inversion.html @@ -1,875 +1,894 @@ - - - - - - - - - - - - Textual Inversion — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

Textual Inversion#

-
-
-

Abstract#

-
이미지 3-5장으로 새로운 개념(또는 콘셉트, concept) 학습해 관련된 이미지를 뽑아내는 모델
-
-
-

text-to-image model은 자연어를 통한 creation에 전례없는 자유도를 주었다. 하지만, 특정한 contept를 생성하고, 그것의 생김새를 바꾸거나, 새로운 역할이 주어지거나 참신한 장면이 그려지는건 아직 불분명하다. 즉, ‘이것을 그려줘’라고 말할 때, ‘이것’에 대한 설명을 prompt로 어떻게 할 것이냐는 물음에는 아직 한계가 있는 것 같다. 이를 해결하기 위해, 저자는 image를 3-5개만으로 사물이나 스타일과 같은 concept, 즉 새로운 ‘단어’를 고정된 text-to-image model의 embedding space에서 표현하는 방법을 제안한다. 이러한 ‘단어’는 자연어 문장에 녹아들어가, 직관적인 방법으로 ‘개인화된’ 이미지 생성을 이끌어 낸다. 특히, 독자적이면서 다양한 콘셉트를 capture하기 위해서는 single word embedding이 충분하다는 것을 알게 되었다.

-
-textual inverison example -
-

Fig. 152 textual inversion example \ (source: https://arxiv.org/abs/2208.01618)#

-
-
-
-
-

Introduction#

-

대규모 학습된 모델에 새로운 개념을 도입하는 일은 어려운 일이다. 각 새로운 개념에 대해 확장된 데이터 셋을 사용해 모델을 retraining하는 것은 엄청나게 비용이 많이 들고, 몇 가지 예제에 해서 fine-tuning은 보통 치명적인 망각을 초래한다. 따라서 저자들은 사전 훈련된 텍스트-이미지 모델의 텍스트 임베딩 공간에서 새로운 단어를 찾아 이러한 문제를 극복할 것을 제안.

-
-architecture -
-

Fig. 153 architecture \ (source: https://arxiv.org/abs/2208.01618)#

-
-
-

위 figure에서, “A photo of S*”은 tokenizer를 지나면서 각각 ‘508’, ‘701’, ‘73’, ‘*’과 같은 형태의 token set으로 변환되고, 이후 각 토큰은 자체 임베딩 벡터로 변환되고 이러한 벡터는 다운스트림 모델을 통해 제공됨.

-

input image의 concept를 나타내는, 새로운 pseudo-word인 S를 이용해 새로운 embedding vector(v)를 나타낸다. 이후 이 vector는 다른 단어와 같이 처리되며 생성 모델에 대한 새로운 text query를 구성하는데 사용될 수 있음. 따라서 이 query는 generator에 들어가서 사용자가 의도한바와 일치하도록 새로운 image를 생성하도록 하는 것이 전반적인 그림이라고 볼 수 있음.

-

여기서 중요한 것은, 이 과정에서 생성모델(여기서는 LDM이 쓰임)은 untouched되어 있다는 것(즉, 따로 수정이 들어가지 않는듯함). 그렇게 함으로써 새로운 task에 대한 fine-tuning을 할 때 일반적으로 손실되는 text에 대한 이해도나 generalization을 유지할 수 있음.

-

이러한 ‘유사단어’를 찾기 위해, 이 작업을 하나로 inversion시켜 프레임화 한다. 그리고 고정된, pre-trained text-to-image model을 사용하고, 3-5개의 concept를 나타내는 small image set이 주어진다. 저자들은 ‘a photo of S*’와 같은 형태의 문장을 설정해 주어진 작은 dataset에서 이미지를 재구성 하는 것으로 이어지는 single-word embedding을 찾는 것을 목표로 함.

-

이 모델의 목표는 새로운 concept인 입력 이미지를 나타내는 S*를 표현하는 방법을 찾는 것이며, 이러한 task를 **’textual inversion’**이라고 한다고 함.

-
This embedding is found through an optimization process, which we refer to as “Textual Inversion”.
-
-
-
- -
-

Method#

-
Our goal is to enable language-guided generation of new, user-specified concepts.
-
-
-
    -
  • 의역) 목표: 유저가 의도한 것에 초첨을 맞춘, 새로운 concept를 embedding으로 잘 가이드해서 괜찮은 성과물을 내는 것.

  • -
-

따라서 pre-trained text-to-image model의 중간 단계의 representation으로 이러한 새로운 ‘concepts’을 인코딩하는데 초점을 맞춤. 일반적인 text-to-image model에서는 image의 representation에 대한 후보군을 text encoder의 word-embedding 단계에서 찾는다. 그러나 이러한 접근 방식은 이미지에 대한 in-depth visual understanding을 필요로 하지 않는다(생성자가 이미지에 대해서 시각적인 이해? 없이 그린다.) 따라서 여기서는 GAN inversion에서 영감을 받은 visual reconstruction objective를 제시.

-
-

cf) GAN Inversion(이해 못함)#

-

출처) - https://hyoseok-personality.tistory.com/entry/GAN-Inversion

-
-GAN inversion -
-

Fig. 154 GAN inversion \ (source: https://hyoseok-personality.tistory.com/entry/GAN-Inversion)#

-
-
-
    -
  • 입력 이미지와 유사한 결과 이미지를 얻을 수 있도록 하는 latent vector를 찾는 과정. GAN이 학습되면 random latent vector로부터 이미지를 생성해낸다. GAN inversion은 이의 역과정으로써 GAN의 latent space로 input image를 inverting시켜 latent vector를 알아가는 과정.

  • -
-
-
-

LDM(Latent Diffusion Model)#

-

논문에서는 생성모델로서 LDM(Latent Diffusion Model)을 사용함. 이전에 말했듯이, LDM은 하나도 건들지 않음.

-
-LDM objective function -
-

Fig. 155 LDM objective function \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

-
-
-
-
-

Text Embeddings#

-
-Text-Embedding -
-

Fig. 156 Text-Embedding \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

-
-
-
    -
  • 입력된 문자열의 각 단어, 하위 단어는 tokenizer를 통과하며, 미리 정의된 dictionary에서 index token으로 변환함. 각 토큰을 통해 찾을 수 있는 고유한 임베딩 벡터에 연결됨.

  • -
  • index에 의한 embedding vector는 일반적으로 text encoder인 C_Θ의 일부로 학습된다. 이러한 space를 inversion target으로 삼았음. 새로운 개념을 나타내기 위해 자리표시자 문자열인 S를 새롭게 지정함. 이 과정에서 PALAVRA를 사용했을 것으로 추정함. 임베딩 process에 개입해서 tokenize된 문자열과 관련된 vector를 새로운 학습된 embedding V로 대체하여 본질적으로 어휘(pseudo-word)에 개념을 주입함. 이렇게 함으로써 다른 단어와 마찬가지로 concept를 포함하는 새로운 문장을 만들 수 있었음.

  • -
-
-
-

Textual Inversion#

-

새로운 embedding을 찾기 위해 작은 규모의 dataset(3-5장)을 사용해 다양한 배경 또는 포즈와 같은 여러 설정에 걸쳐 목표 concept을 묘사함. 이러한 작은 dataset에서 LDM loss를 최소화하는 과정을 통해 V를 최적화함. 생성 조건을 고정하기 위해 CLIP ImageNet 템플릿에서 파생된 중립 컨텍스트 텍스트를 무작위로 샘플링한다. 여기에는 “A photo of S*”, “A rendition of S*” 등의 형식 프롬프트가 포함된다.(아마 원본 이미지와 최대한 비슷하게 만들어서 원본과 비교하기 위한 목적이 아닐까 싶음) 최적화 목표식은 다음과 같음.

-
-textual inversion objective function -
-

Fig. 157 textual inversion objective function \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

-
-
-

LDM loss함수와 매우 유사함. 여기서 CΘ와 eΘ는 고정. 해당 따라서 학습된 embedding이 개념에 미세한 시각적 detail을 포착할 수 있을것으로 기대함.

-
-
-
-

성능평가#

-
-

DALL:E-2와 비교#

-
-compare with DALLE-2 -
-

Fig. 158 compare with DALLE-2 \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

-
-
-
    -
  • input image에 대한 디테일을 더 잘 포착하는 모습을 볼 수 있다.

  • -
-
-
-

Text guided synthesis#

-
-text guided synthesis -
-

Fig. 159 text guided synthesis - 입력 이미지의 스타일과 유사하면서도 text guide에 맞춰서 잘 진행함. -\ (source: https://arxiv.org/pdf/2208.01618.pdf)#

-
-
-
    -
  • Textual Inversion 모델은 새로운 주제에 대해 더 정확하게 개념을 보존하고, 새로운 임베딩과 나머지 캡션들에 대해서도 모두 추론이 가능했음.

  • -
-
-style transfer -
-

Fig. 160 style transfer \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

-
-
-
    -
  • 적은 데이터셋으로도 style을 보존하면서 표현한 그림

  • -
-
-
-

pseudo word 두 개 사용#

-
-two pseudo word -
-

Fig. 161 two pseudo word \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

-
-
-
-
-

Bias Reduction#

-
-Bias reduction -
-

Fig. 162 Bias reduction \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

-
-
-

기존 모델의 결과를 보면, 위 사진에서와 같이 ‘의사’라는 단어를 사용하면, 보통 백인 남성 의사를 잘 그려냈음. 이는 기존 데이터셋에서 남성 의사 사진 데이터가 많았음을 보여준다. 보다 작은 imageset에서 새로운 embedding을 학습함으로써 이러한 bias를 줄일 수 있음을 보여준다(즉, 성별 및 인종적 다양성에 대한 인식을 높일 수 있음).

-
-
-
-

정량평가#

-

latent space embedding의 품질을 분석.

-
    -
  1. reconstruction(y축?): target concept를 얼마나 잘 복제하는지. 특정 이미지가 아닌 개념에 대한 변형을 생성하므로 의미적 CLIP 공간 거리를 고려하여 유사성을 측정.(이미지에 자체가 아닌, 이미지가 가진 ‘개념’에 대해 latent space를 생성하므로) 각 컨셉에 대해 “A photo of S*”라는 prompt를 사용해 64개의 이미지를 생성.

  2. -
  3. editability(x축?): text prompt를 사용해 개념을 수정하는 능력을 평가. 다양한 난이도와 다양한 설정의 prompt를 사용해 일련의 이미지를 생성.

  4. -
-

각 prompt 별로, 50 DDIM step을 사용해 64개의 샘플을 만들고, CLIP-space embedding을 평가, textual prompt의 CLIP-space embedding에서 cosine similarity를 계산. 높은 스코어는 더 높은 editing capability와 prompt의 신뢰도를 보여줌.

-
-

평가 setups#

-

GAN inversion에서 영감을 받은 실험 환경 설정에 따름. 생략

-
-
-

결과#

-
-quantative evaluation1 -
-

Fig. 163 quantative evaluation1 \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

-
-
-
-

주목할 점#

-
    -
  1. 많은 baseline과 우리 방법의 semantic reconstruction quality는 단순히 training set에서 임의의 이미지를 샘플링하는 것과 비슷함(== 원본 이미지와 생성된 이미지가 큰 차이가 없었다?)

  2. -
  3. single-word method는 비슷한 reconstruction quality를 달성하고, 모든 multi-word baseline에서 상당히 향상된 editablity을 달성. 이러한 점은 text embedding space의 인상적인 유연성을 나타내고, 단일 pseudo word만 사용하면서 높은 정확도로 새로운 개념을 캡처하는데 도움이 될 수 있음을 보여줌.

  4. -
  5. baseline이 distortion-editability tradeoff 곡선의 outline을 그리며 실제 단어 분포에 더 가까운 embedding이 더 쉽게 수정될 수 있음. 그러나 target의 세부 정보를 캡처하지는 못함. 반대로, 단어 분포에서 멀리 벗어나면 editability가 크게 감소하는 대신 향상된 reconstruction이 가능해짐. 특히 single embedding model은 단순히 learning rate를 변경해 이 곡선을 따라 이동할 수 있으므로 사용자에게 이 tradeoff에 대한 어느 정도의 제어를 제공함.

  6. -
  7. concept에 대한 human description을 사용하면 유사성을 포착하지 못하면서도, editability가 감소함.

  8. -
-
-
-
-

사용자평가#

-
-human test -
-

Fig. 164 human test \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

-
-
-

두 개의 설문지:

-
    -
  1. 사용자는 concept의 training set에서 4개의 이미지를 제공받았고, 이미지와의 유사성에 따라 5개의 모델에서 생성된 결과의 순위를 매김.

  2. -
  3. 이미지 context를 설명하는 텍스트를 제공받았고, 텍스트와 생성된 이미지의 유사성에 따라 순위를 매김.

  4. -
-

각 질문별로 600개씩 총 1,200개의 응답을 수집.

-
-
-
-

Limitation#

-
    -
  1. 이미지 생성에 더 많은 자유도를 제공하지만, concept의 의미론적인 본질을 파악하거나, 정확한 shape를 학습하는데 한계.

  2. -
  3. 최적화가 오래 걸린다. 하나의 concept를 학습하는데 약 2시간이 소요됨.

  4. -
-
-
-

마무리#

-

: 새로운 설정과 장면에서 특정 concept의 이미지를 생성하기 위해 text-to-image model를 활용하는 개인화되며, language-guided generation을 소개함. 여기서 사용한 ‘text inversion’은 pretrained text-to-image 모델의 text embedding space 내에서 concept를 새로운 pseudo word로 inverse하여 작동함. 이러한 pseudo-word는 간단한 자연어 설명을 사용해 새로운 장면에 삽입할 수 있으므로 간단하고 직관적인 수정이 가능함.

-

어떤 의미에서 이 방법은 사용자가 편집하기 쉽도록 텍스트 기반 interpace를 사용하지만 자연 언어의 한계에 접근할 때 시각적 단서를 제공하는 등 multi modal 정보를 활용할 수 있도록 함.

-

이러한 접근 방식은 공개적으로 사용가능한 가장 큰 text-to-image model인 LDM을 통해 구현됨. 그러나 접근 방식에 아키텍처 세부 정보에 의존하지 않음. 따라서 textual inversion은 추가적인 대규모 text-to-image model에 쉽게 적용할 수 있다고 생각. 거기에서 text-to-image alignment, shape preseravation, image generation fidelity가 더 향상될 수 있음.

-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Textual Inversion — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

Textual Inversion#

+
+
+

Abstract#

+
이미지 3-5장으로 새로운 개념(또는 콘셉트, concept) 학습해 관련된 이미지를 뽑아내는 모델
+
+
+

text-to-image model은 자연어를 통한 creation에 전례없는 자유도를 주었다. 하지만, 특정한 contept를 생성하고, 그것의 생김새를 바꾸거나, 새로운 역할이 주어지거나 참신한 장면이 그려지는건 아직 불분명하다. 즉, ‘이것을 그려줘’라고 말할 때, ‘이것’에 대한 설명을 prompt로 어떻게 할 것이냐는 물음에는 아직 한계가 있는 것 같다. 이를 해결하기 위해, 저자는 image를 3-5개만으로 사물이나 스타일과 같은 concept, 즉 새로운 ‘단어’를 고정된 text-to-image model의 embedding space에서 표현하는 방법을 제안한다. 이러한 ‘단어’는 자연어 문장에 녹아들어가, 직관적인 방법으로 ‘개인화된’ 이미지 생성을 이끌어 낸다. 특히, 독자적이면서 다양한 콘셉트를 capture하기 위해서는 single word embedding이 충분하다는 것을 알게 되었다.

+
+textual inverison example +
+

Fig. 152 textual inversion example \ (source: https://arxiv.org/abs/2208.01618)#

+
+
+
+
+

Introduction#

+

대규모 학습된 모델에 새로운 개념을 도입하는 일은 어려운 일이다. 각 새로운 개념에 대해 확장된 데이터 셋을 사용해 모델을 retraining하는 것은 엄청나게 비용이 많이 들고, 몇 가지 예제에 해서 fine-tuning은 보통 치명적인 망각을 초래한다. 따라서 저자들은 사전 훈련된 텍스트-이미지 모델의 텍스트 임베딩 공간에서 새로운 단어를 찾아 이러한 문제를 극복할 것을 제안.

+
+architecture +
+

Fig. 153 architecture \ (source: https://arxiv.org/abs/2208.01618)#

+
+
+

위 figure에서, “A photo of S*”은 tokenizer를 지나면서 각각 ‘508’, ‘701’, ‘73’, ‘*’과 같은 형태의 token set으로 변환되고, 이후 각 토큰은 자체 임베딩 벡터로 변환되고 이러한 벡터는 다운스트림 모델을 통해 제공됨.

+

input image의 concept를 나타내는, 새로운 pseudo-word인 S를 이용해 새로운 embedding vector(v)를 나타낸다. 이후 이 vector는 다른 단어와 같이 처리되며 생성 모델에 대한 새로운 text query를 구성하는데 사용될 수 있음. 따라서 이 query는 generator에 들어가서 사용자가 의도한바와 일치하도록 새로운 image를 생성하도록 하는 것이 전반적인 그림이라고 볼 수 있음.

+

여기서 중요한 것은, 이 과정에서 생성모델(여기서는 LDM이 쓰임)은 untouched되어 있다는 것(즉, 따로 수정이 들어가지 않는듯함). 그렇게 함으로써 새로운 task에 대한 fine-tuning을 할 때 일반적으로 손실되는 text에 대한 이해도나 generalization을 유지할 수 있음.

+

이러한 ‘유사단어’를 찾기 위해, 이 작업을 하나로 inversion시켜 프레임화 한다. 그리고 고정된, pre-trained text-to-image model을 사용하고, 3-5개의 concept를 나타내는 small image set이 주어진다. 저자들은 ‘a photo of S*’와 같은 형태의 문장을 설정해 주어진 작은 dataset에서 이미지를 재구성 하는 것으로 이어지는 single-word embedding을 찾는 것을 목표로 함.

+

이 모델의 목표는 새로운 concept인 입력 이미지를 나타내는 S*를 표현하는 방법을 찾는 것이며, 이러한 task를 **’textual inversion’**이라고 한다고 함.

+
This embedding is found through an optimization process, which we refer to as “Textual Inversion”.
+
+
+
+ +
+

Method#

+
Our goal is to enable language-guided generation of new, user-specified concepts.
+
+
+
    +
  • 의역) 목표: 유저가 의도한 것에 초첨을 맞춘, 새로운 concept를 embedding으로 잘 가이드해서 괜찮은 성과물을 내는 것.

  • +
+

따라서 pre-trained text-to-image model의 중간 단계의 representation으로 이러한 새로운 ‘concepts’을 인코딩하는데 초점을 맞춤. 일반적인 text-to-image model에서는 image의 representation에 대한 후보군을 text encoder의 word-embedding 단계에서 찾는다. 그러나 이러한 접근 방식은 이미지에 대한 in-depth visual understanding을 필요로 하지 않는다(생성자가 이미지에 대해서 시각적인 이해? 없이 그린다.) 따라서 여기서는 GAN inversion에서 영감을 받은 visual reconstruction objective를 제시.

+
+

cf) GAN Inversion(이해 못함)#

+

출처) - https://hyoseok-personality.tistory.com/entry/GAN-Inversion

+
+GAN inversion +
+

Fig. 154 GAN inversion \ (source: https://hyoseok-personality.tistory.com/entry/GAN-Inversion)#

+
+
+
    +
  • 입력 이미지와 유사한 결과 이미지를 얻을 수 있도록 하는 latent vector를 찾는 과정. GAN이 학습되면 random latent vector로부터 이미지를 생성해낸다. GAN inversion은 이의 역과정으로써 GAN의 latent space로 input image를 inverting시켜 latent vector를 알아가는 과정.

  • +
+
+
+

LDM(Latent Diffusion Model)#

+

논문에서는 생성모델로서 LDM(Latent Diffusion Model)을 사용함. 이전에 말했듯이, LDM은 하나도 건들지 않음.

+
+LDM objective function +
+

Fig. 155 LDM objective function \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

+
+
+
+
+

Text Embeddings#

+
+Text-Embedding +
+

Fig. 156 Text-Embedding \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

+
+
+
    +
  • 입력된 문자열의 각 단어, 하위 단어는 tokenizer를 통과하며, 미리 정의된 dictionary에서 index token으로 변환함. 각 토큰을 통해 찾을 수 있는 고유한 임베딩 벡터에 연결됨.

  • +
  • index에 의한 embedding vector는 일반적으로 text encoder인 C_Θ의 일부로 학습된다. 이러한 space를 inversion target으로 삼았음. 새로운 개념을 나타내기 위해 자리표시자 문자열인 S를 새롭게 지정함. 이 과정에서 PALAVRA를 사용했을 것으로 추정함. 임베딩 process에 개입해서 tokenize된 문자열과 관련된 vector를 새로운 학습된 embedding V로 대체하여 본질적으로 어휘(pseudo-word)에 개념을 주입함. 이렇게 함으로써 다른 단어와 마찬가지로 concept를 포함하는 새로운 문장을 만들 수 있었음.

  • +
+
+
+

Textual Inversion#

+

새로운 embedding을 찾기 위해 작은 규모의 dataset(3-5장)을 사용해 다양한 배경 또는 포즈와 같은 여러 설정에 걸쳐 목표 concept을 묘사함. 이러한 작은 dataset에서 LDM loss를 최소화하는 과정을 통해 V를 최적화함. 생성 조건을 고정하기 위해 CLIP ImageNet 템플릿에서 파생된 중립 컨텍스트 텍스트를 무작위로 샘플링한다. 여기에는 “A photo of S*”, “A rendition of S*” 등의 형식 프롬프트가 포함된다.(아마 원본 이미지와 최대한 비슷하게 만들어서 원본과 비교하기 위한 목적이 아닐까 싶음) 최적화 목표식은 다음과 같음.

+
+textual inversion objective function +
+

Fig. 157 textual inversion objective function \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

+
+
+

LDM loss함수와 매우 유사함. 여기서 CΘ와 eΘ는 고정. 해당 따라서 학습된 embedding이 개념에 미세한 시각적 detail을 포착할 수 있을것으로 기대함.

+
+
+
+

성능평가#

+
+

DALL:E-2와 비교#

+
+compare with DALLE-2 +
+

Fig. 158 compare with DALLE-2 \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

+
+
+
    +
  • input image에 대한 디테일을 더 잘 포착하는 모습을 볼 수 있다.

  • +
+
+
+

Text guided synthesis#

+
+text guided synthesis +
+

Fig. 159 text guided synthesis - 입력 이미지의 스타일과 유사하면서도 text guide에 맞춰서 잘 진행함. +\ (source: https://arxiv.org/pdf/2208.01618.pdf)#

+
+
+
    +
  • Textual Inversion 모델은 새로운 주제에 대해 더 정확하게 개념을 보존하고, 새로운 임베딩과 나머지 캡션들에 대해서도 모두 추론이 가능했음.

  • +
+
+style transfer +
+

Fig. 160 style transfer \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

+
+
+
    +
  • 적은 데이터셋으로도 style을 보존하면서 표현한 그림

  • +
+
+
+

pseudo word 두 개 사용#

+
+two pseudo word +
+

Fig. 161 two pseudo word \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

+
+
+
+
+

Bias Reduction#

+
+Bias reduction +
+

Fig. 162 Bias reduction \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

+
+
+

기존 모델의 결과를 보면, 위 사진에서와 같이 ‘의사’라는 단어를 사용하면, 보통 백인 남성 의사를 잘 그려냈음. 이는 기존 데이터셋에서 남성 의사 사진 데이터가 많았음을 보여준다. 보다 작은 imageset에서 새로운 embedding을 학습함으로써 이러한 bias를 줄일 수 있음을 보여준다(즉, 성별 및 인종적 다양성에 대한 인식을 높일 수 있음).

+
+
+
+

정량평가#

+

latent space embedding의 품질을 분석.

+
    +
  1. reconstruction(y축?): target concept를 얼마나 잘 복제하는지. 특정 이미지가 아닌 개념에 대한 변형을 생성하므로 의미적 CLIP 공간 거리를 고려하여 유사성을 측정.(이미지에 자체가 아닌, 이미지가 가진 ‘개념’에 대해 latent space를 생성하므로) 각 컨셉에 대해 “A photo of S*”라는 prompt를 사용해 64개의 이미지를 생성.

  2. +
  3. editability(x축?): text prompt를 사용해 개념을 수정하는 능력을 평가. 다양한 난이도와 다양한 설정의 prompt를 사용해 일련의 이미지를 생성.

  4. +
+

각 prompt 별로, 50 DDIM step을 사용해 64개의 샘플을 만들고, CLIP-space embedding을 평가, textual prompt의 CLIP-space embedding에서 cosine similarity를 계산. 높은 스코어는 더 높은 editing capability와 prompt의 신뢰도를 보여줌.

+
+

평가 setups#

+

GAN inversion에서 영감을 받은 실험 환경 설정에 따름. 생략

+
+
+

결과#

+
+quantative evaluation1 +
+

Fig. 163 quantative evaluation1 \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

+
+
+
+

주목할 점#

+
    +
  1. 많은 baseline과 우리 방법의 semantic reconstruction quality는 단순히 training set에서 임의의 이미지를 샘플링하는 것과 비슷함(== 원본 이미지와 생성된 이미지가 큰 차이가 없었다?)

  2. +
  3. single-word method는 비슷한 reconstruction quality를 달성하고, 모든 multi-word baseline에서 상당히 향상된 editablity을 달성. 이러한 점은 text embedding space의 인상적인 유연성을 나타내고, 단일 pseudo word만 사용하면서 높은 정확도로 새로운 개념을 캡처하는데 도움이 될 수 있음을 보여줌.

  4. +
  5. baseline이 distortion-editability tradeoff 곡선의 outline을 그리며 실제 단어 분포에 더 가까운 embedding이 더 쉽게 수정될 수 있음. 그러나 target의 세부 정보를 캡처하지는 못함. 반대로, 단어 분포에서 멀리 벗어나면 editability가 크게 감소하는 대신 향상된 reconstruction이 가능해짐. 특히 single embedding model은 단순히 learning rate를 변경해 이 곡선을 따라 이동할 수 있으므로 사용자에게 이 tradeoff에 대한 어느 정도의 제어를 제공함.

  6. +
  7. concept에 대한 human description을 사용하면 유사성을 포착하지 못하면서도, editability가 감소함.

  8. +
+
+
+
+

사용자평가#

+
+human test +
+

Fig. 164 human test \ (source: https://arxiv.org/pdf/2208.01618.pdf)#

+
+
+

두 개의 설문지:

+
    +
  1. 사용자는 concept의 training set에서 4개의 이미지를 제공받았고, 이미지와의 유사성에 따라 5개의 모델에서 생성된 결과의 순위를 매김.

  2. +
  3. 이미지 context를 설명하는 텍스트를 제공받았고, 텍스트와 생성된 이미지의 유사성에 따라 순위를 매김.

  4. +
+

각 질문별로 600개씩 총 1,200개의 응답을 수집.

+
+
+
+

Limitation#

+
    +
  1. 이미지 생성에 더 많은 자유도를 제공하지만, concept의 의미론적인 본질을 파악하거나, 정확한 shape를 학습하는데 한계.

  2. +
  3. 최적화가 오래 걸린다. 하나의 concept를 학습하는데 약 2시간이 소요됨.

  4. +
+
+
+

마무리#

+

: 새로운 설정과 장면에서 특정 concept의 이미지를 생성하기 위해 text-to-image model를 활용하는 개인화되며, language-guided generation을 소개함. 여기서 사용한 ‘text inversion’은 pretrained text-to-image 모델의 text embedding space 내에서 concept를 새로운 pseudo word로 inverse하여 작동함. 이러한 pseudo-word는 간단한 자연어 설명을 사용해 새로운 장면에 삽입할 수 있으므로 간단하고 직관적인 수정이 가능함.

+

어떤 의미에서 이 방법은 사용자가 편집하기 쉽도록 텍스트 기반 interpace를 사용하지만 자연 언어의 한계에 접근할 때 시각적 단서를 제공하는 등 multi modal 정보를 활용할 수 있도록 함.

+

이러한 접근 방식은 공개적으로 사용가능한 가장 큰 text-to-image model인 LDM을 통해 구현됨. 그러나 접근 방식에 아키텍처 세부 정보에 의존하지 않음. 따라서 textual inversion은 추가적인 대규모 text-to-image model에 쉽게 적용할 수 있다고 생각. 거기에서 text-to-image alignment, shape preseravation, image generation fidelity가 더 향상될 수 있음.

+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/VideoLDM.html b/docs/review/VideoLDM.html old mode 100644 new mode 100755 index 9f5577eb..dc34f860 --- a/docs/review/VideoLDM.html +++ b/docs/review/VideoLDM.html @@ -1,931 +1,950 @@ - - - - - - - - - - - - VideoLDM — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: Align your Latents: High-Resolution Video Synthesis with Latent Diffusion Models

  • -
  • Reference

    - -
  • -
  • Author: Jun-Hyoung Lee

  • -
  • Last updated on Nov. 30. 2023

  • -
-
-
-

VideoLDM#

-
-figure1 -
-

Fig. 503 Video LDM samples#

-
-
-
-

Abstract#

-
    -
  • Latent Diffusion Models (LDMs)는 computing resource 를 줄이기 위해 낮은 차원의 latent space 로 압축하여 high quality 의 image synthesis 를 가능하게 했다.

  • -
  • 비디오 생성 모델링의 퀄리티 부족하며,

    -
      -
    • 이유가 학습에 필요한 computing cost 가 많이 발생, 데이터 셋 부족하다.

    • -
    -
  • -
  • 제안

    -
    -figure2 -
    -

    Fig. 504 Temproal Video finetuning#

    -
    -
    -
      -
    • 기존에는 가우시안 노이즈의 랜덤한 샘플들 끼리의 denoising 결과 다른 이미지를 생성했다.

    • -
    • Temporal Video finetuning 을 거치게 되면 비디오 시퀀스의 형태(시간축에 정렬된 이미지)로 생성할 수 있다.

    • -
    -
  • -
  • VideoLDM 은 기존 LDM 방법에 고해상도의 비디오 생성을 적용했다.

    -
      -
    1. 대규모 이미지 데이터 셋을 활용해 LDM 을 pre-train 했고, (only image)

      -
        -
      • pre-trained image LDMs 를 활용 가능하다.

        -
          -
        • temporal modeling 만 학습한다.(기존 이미지 LDM은 freeze)

        • -
        • 1280x2048 해상도 까지 가능하다.

        • -
        -
      • -
      -
    2. -
    3. 그 후, 이미지 generator 를 비디오 generator 로 전환한다.

      -
        -
      • latent space diffusion model 에 temporal(시간적) 차원을 적용한다.

      • -
      • 이미지 시퀀스(비디오)를 인코딩해 파인 튜닝 진행한다.

      • -
      -
    4. -
    5. diffusion model upsampler 를 시간적으로 정렬하여 일관적인 비디오 super resolution model 로 변환한다.

    6. -
    -
  • -
  • Applied task

    -
      -
    • 자율 주행의 시뮬레이션 엔진 (512x1024 해상도로 실제로 평가 진행해 sota 달성)

    • -
    • creative content creation (using text-to-video)

    • -
    -
  • -
-
-
-

3. Latent Video Diffusion Models#

-
    -
  • 비디오 데이터 셋: \(x ∈ R^{T×3×\tilde H×\tilde W}\) 로 표현

    -
      -
    • \(T\): frame 수, \(\tilde H, \tilde W\): 높이, 너비

    • -
    -
  • -
-
-

3.1. Turning Latent Image into Video Generators#

-
    -
  • 잘 학습된 image LDM 을 활용하는 것이 주요한 key point.

    -
      -
    • 문제점

      -
        -
      • image LDM 은 개별의 프레임에 대한 high quality 이미지를 생성할 수 있고, -→ 시간적인 정보는 포함하고 있지 않다.

      • -
      • 따라서 이를 연속적인 프레임으로 렌더링해 사용할 수 없다.

      • -
      -
    • -
    -
  • -
  • \(l_\phi ^i\) 로 표현하는 temporal neural network 를 추가했다.

    -
      -
    • 이는 이미지 LDM 의 공간적인 정보에 연관되며, 시간적으로 일관된 방식으로 개별 프레임을 정렬할 수 있도록 한다.

      -
        -
      • 비디오를 인식할 수 있는 backbone 을 정의한다.

      • -
      -
    • -
    -
    -figure4 -
    -

    Fig. 505 Video-Aware Temporal Backbone#

    -
    -
    -
    -einops -
    -

    Fig. 506 Einops notation#

    -
    -
    -
      -
    • einops 로 구현했으며, spatial layer 에서는 비디오(배치x시간) 정보가 함께 인코딩이 되며,

      -
        -
      • temporal layer 에서는 이를 rearrange 를 통해 배치, 시간 정보를 나눠 시간 차원에서 인코딩이 진행된다.

        -
          -
        • (option) 이때 text prompt 가 conditioning 이 될 수 있다.

        • -
        • (i) temporal attention (ii) 3D conv 로 구성된다.

          -
            -
            • -
            • Sinusoidal embedding 을 사용해 시간에 대한 위치 인코딩 활용했다.

            • -
            -
          • -
          -
        • -
        -
      • -
      • temporal layer 을 거친 후, spatial layer 의 output 과 가중합을 통해 정보가 결합된다.

      • -
      -
    • -
    -
  • -
-
-

3.1.1 Temporal Autoencoder Finetuning#

-
    -
  • Image LDM 을 사용하면 시퀀스로 생성할 때 flickering이 발생하는 문제가 있다.

    -
      -
    • 이를 해결하기 위해, autoencoder 의 decoder 에서 temporal 한 layer 를 추가한다.

    • -
    • 이는 3D conv 로 구축된 patch-wise temporal discriminator 도 추가해 비디오 데이터를 fine tuning 한다.

      -
      -figure3 -
      -

      Fig. 507 Temporal Autoencoder Finetuning#

      -
      -
      -
    • -
    -
  • -
  • 인코딩된 비디오 프레임의 latent space 내에서 image DM 을 사용할 수 있도록 인코더는 학습이 되지 않는다.

  • -
-
-
-
-

3.2. Prediction Models for Long-Term Generation#

-
    -
  • 그럼에도 불구하고, 긴 동영상은 생성하지 못하는 한계가 있다.

  • -
  • 따라서 전체 \(T\) 프레임에서 마스킹된 \(S\) 프레임으로 구성해 모델이 예측하게끔 학습을 한다.

    -
      -
    • 이러한 프레임들은 LDM 의 인코더를 통해 채널 차원에 concat 되며, temporal layer 에 입력된다.

    • -
    -
  • -
  • inference 에서는 반복적인 샘플링 과정을 통해 긴 영상을 생성할 수 있게 했다.

    -
      -
    • 최신 prediction 을 재 사용해 새로운 context 를 생성했다.

    • -
    • classifier-free guidance 를 도입해 마스킹된 프레임 수를 0, 1, 2 개를 사용해 학습.

    • -
    -
  • -
-
-
-

3.3. Temporal Interpolation for High Frame Rates#

-
-interpolation -
-

Fig. 508 Temporal Interpolation#

-
-
-
    -
  • High resolution video 란 해상도 뿐만 아니라 높은 frame rate 를 가지고 있어야 한다.

  • -
  • 이를 위해 두 가지 과정으로 진행한다.

    -
      -
    1. semantic 한 큰 변화가 있는 키 프레임을 생성한다.

      -
        -
      • 메모리 제약으로 인해 low frame rate 로 생성할 수 있다.

      • -
      -
    2. -
    3. 키 프레임을 활용한 interpolate 진행한다.

      -
        -
      • interpolate 할 프레임을 masking 을 씌운다.

        -
          -
        • 두 개의 키 프레임에 대해 세 개의 프레임을 예측하는 것으로 T → 4T interpolation model 을 학습해 사용했다.

        • -
        • 높은 frame rate 를 위해 16T 까지 interpolation 모델 구축.

        • -
        -
      • -
      -
    4. -
    -
  • -
-
-
-

3.4. Temporal Fine-tuning of SR Models#

-
    -
  • megapixel 의 해상도까지 생성하는 것이 목표이다.

    -
      -
    • cascaded DMs 에 영감받아 4배 해상도를 키웠다.

      -
      -cascaded_dms -
      -

      Fig. 509 Cascaded DM#

      -
      -
      -
    • -
    • noise augmentation(with noise level conditioning) 으로 super resolution 모델 학습했다.

    • -
    -
  • -
  • 또한 consistency 한 SR 모델을 구축하기 위해 spatial / temporal layer를 추가했다.

    -
      -
    • 저해상도 시퀀스 길이 \(T\) 를 concat 하여 conditioning

    • -
    • locally 하게 patch 단위로 연산하고, 후에 convolution 을 진행한다.

    • -
    -
  • -
  • computing resource

    -
      -
    • VideoLDM 에서의 main LDM 을 효율적으로 연산을 하기 위해 latent space 에서 모든 비디오 모델링이 수행된다.

      -
        -
      • 그로 인해, 높은 배치 사이즈 + 긴 영상 생성 가능하다.

      • -
      -
    • -
    • upsampler 는 패치 단위로 진행하기에 computing resource 를 줄일 수 있다.

    • -
    -
  • -
-
-
-
-

4. Experiments#

-
    -
  • Dataset

    -
      -
    • RDS(real driving scene): 683,060 개, 8초(30 fps), 512×1024, day/night, “crowdedness”

    • -
    • WebVid-10M: 10.7M video-caption pairs, 52K video hours, resized 320×512

    • -
    -
  • -
  • Evaluation metric

    -
      -
    • FVD + human evaluation

    • -
    • CLIP similarity (CLIP- SIM) + IS

    • -
    -
  • -
-
-

4.1. High-Resolution Driving Video Synthesis#

-
-figure7 -
-

Fig. 510 Real-World Driving Scenes with Video LDM#

-
-
-
-
-

4.2. Text-to-Video with Stable Diffusion#

-
    -
  • WebVid-10M 데이터셋(resized 320×512)으로 Stable Diffusion 의 spatial layer 에 대해 학습했고,

    -
      -
    • text-conditioning 을 적용한 temporal layer 를 추가해 학습 진행했다.

    • -
    • 그 후 upscaler 를 학습해 4배 upscale 해 1280×2048 해상도로 비디오 생성 가능해졌다.

      -
        -
      • 113 frames: 24fps 4.7초 or 30fps 3.8초

      • -
      -
      -figure6 -
      -

      Fig. 511 Text-to-Video with Stable Diffusion#

      -
      -
      -
    • -
    • 다양성이 적은 Real video 로 제한적인 데이터로 학습했지만, 기존 Stable Diffusion 의 생성 능력을 가져와 artistic 한 생성이 가능하다.

    • -
    • performance

      -
      -table4_5 -
      -

      Fig. 512 Performance Table#

      -
      -
      -
        -
      • Make-A-Video 의 경우 VideoLDM 보다 더 많은 데이터 셋과 text-to-video를 entirely하게 학습했다.

      • -
      -
    • -
    -
  • -
-
-

4.2.1 Personalized Text-to-Video with Dreambooth#

-
-figure8 -
-

Fig. 513 Text-to-Video with DreamBooth#

-
-
-
    -
  • 위쪽의 VideoLDM 을 활용한 결과가 consistency 한 결과를 가져왔다.

  • -
-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + VideoLDM — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: Align your Latents: High-Resolution Video Synthesis with Latent Diffusion Models

  • +
  • Reference

    + +
  • +
  • Author: Jun-Hyoung Lee

  • +
  • Last updated on Nov. 30. 2023

  • +
+
+
+

VideoLDM#

+
+figure1 +
+

Fig. 503 Video LDM samples#

+
+
+
+

Abstract#

+
    +
  • Latent Diffusion Models (LDMs)는 computing resource 를 줄이기 위해 낮은 차원의 latent space 로 압축하여 high quality 의 image synthesis 를 가능하게 했다.

  • +
  • 비디오 생성 모델링의 퀄리티 부족하며,

    +
      +
    • 이유가 학습에 필요한 computing cost 가 많이 발생, 데이터 셋 부족하다.

    • +
    +
  • +
  • 제안

    +
    +figure2 +
    +

    Fig. 504 Temproal Video finetuning#

    +
    +
    +
      +
    • 기존에는 가우시안 노이즈의 랜덤한 샘플들 끼리의 denoising 결과 다른 이미지를 생성했다.

    • +
    • Temporal Video finetuning 을 거치게 되면 비디오 시퀀스의 형태(시간축에 정렬된 이미지)로 생성할 수 있다.

    • +
    +
  • +
  • VideoLDM 은 기존 LDM 방법에 고해상도의 비디오 생성을 적용했다.

    +
      +
    1. 대규모 이미지 데이터 셋을 활용해 LDM 을 pre-train 했고, (only image)

      +
        +
      • pre-trained image LDMs 를 활용 가능하다.

        +
          +
        • temporal modeling 만 학습한다.(기존 이미지 LDM은 freeze)

        • +
        • 1280x2048 해상도 까지 가능하다.

        • +
        +
      • +
      +
    2. +
    3. 그 후, 이미지 generator 를 비디오 generator 로 전환한다.

      +
        +
      • latent space diffusion model 에 temporal(시간적) 차원을 적용한다.

      • +
      • 이미지 시퀀스(비디오)를 인코딩해 파인 튜닝 진행한다.

      • +
      +
    4. +
    5. diffusion model upsampler 를 시간적으로 정렬하여 일관적인 비디오 super resolution model 로 변환한다.

    6. +
    +
  • +
  • Applied task

    +
      +
    • 자율 주행의 시뮬레이션 엔진 (512x1024 해상도로 실제로 평가 진행해 sota 달성)

    • +
    • creative content creation (using text-to-video)

    • +
    +
  • +
+
+
+

3. Latent Video Diffusion Models#

+
    +
  • 비디오 데이터 셋: \(x ∈ R^{T×3×\tilde H×\tilde W}\) 로 표현

    +
      +
    • \(T\): frame 수, \(\tilde H, \tilde W\): 높이, 너비

    • +
    +
  • +
+
+

3.1. Turning Latent Image into Video Generators#

+
    +
  • 잘 학습된 image LDM 을 활용하는 것이 주요한 key point.

    +
      +
    • 문제점

      +
        +
      • image LDM 은 개별의 프레임에 대한 high quality 이미지를 생성할 수 있고, +→ 시간적인 정보는 포함하고 있지 않다.

      • +
      • 따라서 이를 연속적인 프레임으로 렌더링해 사용할 수 없다.

      • +
      +
    • +
    +
  • +
  • \(l_\phi ^i\) 로 표현하는 temporal neural network 를 추가했다.

    +
      +
    • 이는 이미지 LDM 의 공간적인 정보에 연관되며, 시간적으로 일관된 방식으로 개별 프레임을 정렬할 수 있도록 한다.

      +
        +
      • 비디오를 인식할 수 있는 backbone 을 정의한다.

      • +
      +
    • +
    +
    +figure4 +
    +

    Fig. 505 Video-Aware Temporal Backbone#

    +
    +
    +
    +einops +
    +

    Fig. 506 Einops notation#

    +
    +
    +
      +
    • einops 로 구현했으며, spatial layer 에서는 비디오(배치x시간) 정보가 함께 인코딩이 되며,

      +
        +
      • temporal layer 에서는 이를 rearrange 를 통해 배치, 시간 정보를 나눠 시간 차원에서 인코딩이 진행된다.

        +
          +
        • (option) 이때 text prompt 가 conditioning 이 될 수 있다.

        • +
        • (i) temporal attention (ii) 3D conv 로 구성된다.

          +
            +
            • +
            • Sinusoidal embedding 을 사용해 시간에 대한 위치 인코딩 활용했다.

            • +
            +
          • +
          +
        • +
        +
      • +
      • temporal layer 을 거친 후, spatial layer 의 output 과 가중합을 통해 정보가 결합된다.

      • +
      +
    • +
    +
  • +
+
+

3.1.1 Temporal Autoencoder Finetuning#

+
    +
  • Image LDM 을 사용하면 시퀀스로 생성할 때 flickering이 발생하는 문제가 있다.

    +
      +
    • 이를 해결하기 위해, autoencoder 의 decoder 에서 temporal 한 layer 를 추가한다.

    • +
    • 이는 3D conv 로 구축된 patch-wise temporal discriminator 도 추가해 비디오 데이터를 fine tuning 한다.

      +
      +figure3 +
      +

      Fig. 507 Temporal Autoencoder Finetuning#

      +
      +
      +
    • +
    +
  • +
  • 인코딩된 비디오 프레임의 latent space 내에서 image DM 을 사용할 수 있도록 인코더는 학습이 되지 않는다.

  • +
+
+
+
+

3.2. Prediction Models for Long-Term Generation#

+
    +
  • 그럼에도 불구하고, 긴 동영상은 생성하지 못하는 한계가 있다.

  • +
  • 따라서 전체 \(T\) 프레임에서 마스킹된 \(S\) 프레임으로 구성해 모델이 예측하게끔 학습을 한다.

    +
      +
    • 이러한 프레임들은 LDM 의 인코더를 통해 채널 차원에 concat 되며, temporal layer 에 입력된다.

    • +
    +
  • +
  • inference 에서는 반복적인 샘플링 과정을 통해 긴 영상을 생성할 수 있게 했다.

    +
      +
    • 최신 prediction 을 재 사용해 새로운 context 를 생성했다.

    • +
    • classifier-free guidance 를 도입해 마스킹된 프레임 수를 0, 1, 2 개를 사용해 학습.

    • +
    +
  • +
+
+
+

3.3. Temporal Interpolation for High Frame Rates#

+
+interpolation +
+

Fig. 508 Temporal Interpolation#

+
+
+
    +
  • High resolution video 란 해상도 뿐만 아니라 높은 frame rate 를 가지고 있어야 한다.

  • +
  • 이를 위해 두 가지 과정으로 진행한다.

    +
      +
    1. semantic 한 큰 변화가 있는 키 프레임을 생성한다.

      +
        +
      • 메모리 제약으로 인해 low frame rate 로 생성할 수 있다.

      • +
      +
    2. +
    3. 키 프레임을 활용한 interpolate 진행한다.

      +
        +
      • interpolate 할 프레임을 masking 을 씌운다.

        +
          +
        • 두 개의 키 프레임에 대해 세 개의 프레임을 예측하는 것으로 T → 4T interpolation model 을 학습해 사용했다.

        • +
        • 높은 frame rate 를 위해 16T 까지 interpolation 모델 구축.

        • +
        +
      • +
      +
    4. +
    +
  • +
+
+
+

3.4. Temporal Fine-tuning of SR Models#

+
    +
  • megapixel 의 해상도까지 생성하는 것이 목표이다.

    +
      +
    • cascaded DMs 에 영감받아 4배 해상도를 키웠다.

      +
      +cascaded_dms +
      +

      Fig. 509 Cascaded DM#

      +
      +
      +
    • +
    • noise augmentation(with noise level conditioning) 으로 super resolution 모델 학습했다.

    • +
    +
  • +
  • 또한 consistency 한 SR 모델을 구축하기 위해 spatial / temporal layer를 추가했다.

    +
      +
    • 저해상도 시퀀스 길이 \(T\) 를 concat 하여 conditioning

    • +
    • locally 하게 patch 단위로 연산하고, 후에 convolution 을 진행한다.

    • +
    +
  • +
  • computing resource

    +
      +
    • VideoLDM 에서의 main LDM 을 효율적으로 연산을 하기 위해 latent space 에서 모든 비디오 모델링이 수행된다.

      +
        +
      • 그로 인해, 높은 배치 사이즈 + 긴 영상 생성 가능하다.

      • +
      +
    • +
    • upsampler 는 패치 단위로 진행하기에 computing resource 를 줄일 수 있다.

    • +
    +
  • +
+
+
+
+

4. Experiments#

+
    +
  • Dataset

    +
      +
    • RDS(real driving scene): 683,060 개, 8초(30 fps), 512×1024, day/night, “crowdedness”

    • +
    • WebVid-10M: 10.7M video-caption pairs, 52K video hours, resized 320×512

    • +
    +
  • +
  • Evaluation metric

    +
      +
    • FVD + human evaluation

    • +
    • CLIP similarity (CLIP- SIM) + IS

    • +
    +
  • +
+
+

4.1. High-Resolution Driving Video Synthesis#

+
+figure7 +
+

Fig. 510 Real-World Driving Scenes with Video LDM#

+
+
+
+
+

4.2. Text-to-Video with Stable Diffusion#

+
    +
  • WebVid-10M 데이터셋(resized 320×512)으로 Stable Diffusion 의 spatial layer 에 대해 학습했고,

    +
      +
    • text-conditioning 을 적용한 temporal layer 를 추가해 학습 진행했다.

    • +
    • 그 후 upscaler 를 학습해 4배 upscale 해 1280×2048 해상도로 비디오 생성 가능해졌다.

      +
        +
      • 113 frames: 24fps 4.7초 or 30fps 3.8초

      • +
      +
      +figure6 +
      +

      Fig. 511 Text-to-Video with Stable Diffusion#

      +
      +
      +
    • +
    • 다양성이 적은 Real video 로 제한적인 데이터로 학습했지만, 기존 Stable Diffusion 의 생성 능력을 가져와 artistic 한 생성이 가능하다.

    • +
    • performance

      +
      +table4_5 +
      +

      Fig. 512 Performance Table#

      +
      +
      +
        +
      • Make-A-Video 의 경우 VideoLDM 보다 더 많은 데이터 셋과 text-to-video를 entirely하게 학습했다.

      • +
      +
    • +
    +
  • +
+
+

4.2.1 Personalized Text-to-Video with Dreambooth#

+
+figure8 +
+

Fig. 513 Text-to-Video with DreamBooth#

+
+
+
    +
  • 위쪽의 VideoLDM 을 활용한 결과가 consistency 한 결과를 가져왔다.

  • +
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier.html b/docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier.html old mode 100644 new mode 100755 index 1e2a1d2e..cd307437 --- a/docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier.html +++ b/docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier.html @@ -1,881 +1,899 @@ - - - - - - - - - - - - Your Diffusion Model is Secretly a Zero-Shot Classifier — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

Your Diffusion Model is Secretly a Zero-Shot Classifier

- -
-
- -
-
-
- - - - -
- -
-

Information

- -
-
-

Your Diffusion Model is Secretly a Zero-Shot Classifier#

-
    -
  • 핵심

    -
      -
    • 학습된 Diffusion Models 에서 Classifier 를 추가 학습 없이 획득할 수 있다.

      -
        -
      • Stable Diffusion 같은 거대 모델로부터 Zero-shot classifier 를 얻을 수 있다.

      • -
      • Class-conditional Diffusion Models 에서는 일반적인 (non Zero-shot) classifier 를 얻을 수 있다.

      • -
      -
    • -
    -
  • -
  • 결과 요약

    -
      -
    • Classification 성능이 나쁘지 않았다.

    • -
    • Zero-shot classifier 는 Multimodal Compositional reasoning ability 가 매우 훌륭했다.

    • -
    • 이렇게 Diffusion 모델에서 추출된 Classifiers 는 Distribution shift 에 대해 Robust 한 성능을 보여주었다.

    • -
    -
  • -
  • Classifier 구현 방법

  • -
-
-img_00 -
-

Fig. 362 Diffusion Classifier 아키텍쳐#

-
-
-
    -
  • 예시로 먼저 살펴보기.

  • -
  • 예를 들어, 어떤 동물 이미지 X 를 Stable Diffusion 으로 Classification 하고 싶다면..
    -1. 일단 해당 동물의 클래스를 포함하고 있을 만한 데이터셋을 구한다.
    -37개의 동물 클래스가 존재하는 Pets 데이터셋을 사용한다고 치자.
    -2. text prompts 로 “호랑이” 가 주어진 Stable Diffusion 으로,
    -X 의 Noised Image 에서 Reverse process 를 진행한다. 그럼 Loss 를 획득할 수 있을 것이다.
    -3. 37개의 모든 Pets Classes 에 대해서 이를 수행해서,
    -가장 Loss 가 작은 Class 를 판별한다.
    -이 Class 가 바로 이미지 X 의 클래스이다.

  • -
-
-img_01 -
-

Fig. 363 Algorithm 1 : Diffusion Classifier 학습 알고리즘#

-
-
-
    -
  1. n_samples 에 지정된 수 만큼 t 와 noise 를 각각 샘플링해 벡터를 만든다.

  2. -
  3. 클래스 판별이 필요한 이미지 X 의 t-step Noised image 인 X_t 를 구한다.

  4. -
  5. X_t 를 Diffusion Model 에 Input 으로 주어 Noise 를 출력한다.

  6. -
  7. loss 를 구한다.

  8. -
-
    -
  • 위 과정을, 여러 번 (n_trials 만큼) 시도해서 평균낼 수도 있다.

  • -
-
    -
  1. loss 가 가장 낮은 Class 를 찾을 때 까지, 가능한 모든 Class 에 대해 추론한다.

  2. -
  3. 최종 남은 Class 를 X 의 Class 라고 판정한다.

  4. -
-
    -
  • Zero-shot classification 도 위와 동일한 과정으로 진행된다.
    -다만 추론할 Class list 가 필요하다.
    -- 예를 들어서, Stable Diffusion 의 Zero-shot classification 을 수행하기 위해서는,
    -(Stable Diffusion 이 학습하지는 않았지만) 37개의 클래스가 정의되어 있는
    -Pets 와 같은 데이터셋으로 Classification 을 수행할 수 있다.

  • -
  • 하지만, Class 마다 n_samples 수 만큼 t 를 샘플링하고,
    -또 X_t 를 구하고,
    -Diffusion Model 로 노이즈를 추론하고,
    -loss 를 구하는 것은 Inference times 가 많이 소모됨.
    -따라서 다음의 방법을 활용해 inference times 을 줄인다.

  • -
-
-img_02 -
-

Fig. 364 Algorithm 2. Efficient Diffusion Classifier Algorithm#

-
-
-
    -
  1. 일단 작은 수의 n_samples 로 error 가 높은 class 들을 걸러낸다.

  2. -
  3. 소수의 class 만 남았다면,
    -이제는 정확한 추론을 위해서 더 큰 n_samples 를 설정해 추론한다.
    -(large n_samples 로 t 와 \(\epsilon\) 을 sampling 한다.)

  4. -
-
    -
  • c.f.

  • -
-
### Oxford-IIIT Pets
-```bash
-python eval_prob_adaptive.py --dataset pets --split test --n_trials 1 \
-        --to_keep 5 1 --n_samples 25 250 --loss l1 \
-        --prompt_path prompts/pets_prompts.csv
-
-
-
    -
  • 왜 이렇게까지 inference time 을 줄이려고 하지??
    -- 위의 스크립트 그대로 RTX 3090 에서 돌리면,
    -Pets 이미지 1장 Classification 하는데 18초 걸린다.
    -- ImageNet 은 Class 1,000 개 있는데,
    -512x512 이미지 1장 Classification 하려면 1,000 초 걸린다.

  • -
  • c.f. Loss 계산 코드 (eval_prob_adaptive.py)

  • -
-
all_noise = torch.randn((max_n_samples * args.n_trials, 4, latent_size, latent_size), device=latent.device)
-
-def eval_error(unet, scheduler, latent, all_noise, ts, noise_idxs,
-                text_embeds, text_embed_idxs, batch_size=32, dtype='float32', loss='l2'):
-        assert len(ts) == len(noise_idxs) == len(text_embed_idxs)
-        pred_errors = torch.zeros(len(ts), device='cpu')
-        idx = 0
-        with torch.inference_mode():
-        for _ in tqdm.trange(len(ts) // batch_size + int(len(ts) % batch_size != 0), leave=False):
-                batch_ts = torch.tensor(ts[idx: idx + batch_size])
-                noise = all_noise[noise_idxs[idx: idx + batch_size]]
-                noised_latent = latent * (scheduler.alphas_cumprod[batch_ts]  0.5).view(-1, 1, 1, 1).to(device) + \
-                                noise * ((1 - scheduler.alphas_cumprod[batch_ts])  0.5).view(-1, 1, 1, 1).to(device)
-                t_input = batch_ts.to(device).half() if dtype == 'float16' else batch_ts.to(device)
-                text_input = text_embeds[text_embed_idxs[idx: idx + batch_size]]
-                noise_pred = unet(noised_latent, t_input, encoder_hidden_states=text_input).sample
-                if loss == 'l2':
-                error = F.mse_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3))
-                elif loss == 'l1':
-                error = F.l1_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3))
-                elif loss == 'huber':
-                error = F.huber_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3))
-                else:
-                raise NotImplementedError
-                pred_errors[idx: idx + len(batch_ts)] = error.detach().cpu()
-                idx += len(batch_ts)
-        return pred_errors
-
-
-
    -
  • 실험 결과

    -
      -
    • Figure 2

      -
      -img_03 -
      -

      Fig. 365 Figure 2#

      -
      -
      -
        -
      • 특정한 이미지 x 의 모든 클래스에 대해서 loss 를 추론하게 될텐데,
        -모든 클래스에 대해서
        -동일한 \(\epsilon\)
        (즉 sampled noise) 과 동일한 t (즉 sampled time steps) 를 사용해야 한다.
        -이 두 변수에 따라 loss 가 크게 달라지기 때문.

      • -
      -
    • -
    -
  • -
  • Figure 3 & Figure 4

    -
      -
    • Figure 3

      -
        -
      • t 에 따라서, Classification 성능이 달라졌다.

      • -
      -
    • -
    • Figure 4

      -
        -
      • Figure 3 의 결과에 따라서,
        -intermediate timesteps 를 더 많이 sampling 하면 성능이 올라가는지 실험해보았다.

      • -
      • 그렇지 않았다.
        -timesteps 를 Uniform 하게 sampling 했을 때 성능이 가장 좋았다.

      • -
      -
    • -
    -
  • -
-
-img_04 -
-

Fig. 366 Figure 3#

-
-
-
-img_05 -
-

Fig. 367 Figure 4#

-
-
-
    -
  • Table 1 (+ F. Additional Implementation Details 참고)

  • -
-
-img_06 -
-

Fig. 368 Table 1#

-
-
-
    -
  • 본 논문에서 제시한 Diffusion Classifier 가 Classification 능력이 나쁘지 않았다.

  • -
-
    -
  1. Diffusion 모델에서 knowledge 를 추출해내는 다른 방법들보다 성능이 뛰어났다.
    -- Diffusion Classifier 는 Zero-shot 성능이,
    -“Stable Diffusion 으로 생성된 영상을“ 학습한 ResNet-50 classifier 보다 뛰어났다.
    -- Synthetic SD data :
    -Class 마다 10,000 장의 이미지를 Stable Diffusion 2.0 으로 생성해
    -데이터셋을 구축하고 (90% train / 10% validation),
    -해당 데이터셋으로 ResNet-50 classifier 를 학습시켜서 classification 수행한 결과
    -- Diffusion Classifier 는 Classification 성능이,
    -Stable Diffusion 의 intermediate U-Net layer 를 추출해 학습시킨
    -ResNet-based 모델
    보다 뛰어났다.
    -- SD features :
    -Input 이미지에 따른 Stable Diffusion 의 Intermediate U-Net features 를
    -ResNet 기반의 classifier 에 전달해서 추론.
    -이 때 classifier 는 모든 데이터셋을 직접 학습한다. 따라서 zero-shot 은 아니다.

  2. -
  3. CLIP ResNet-50 모델보다도 성능이 뛰어났다.

  4. -
  5. OpenCLIP ViT-H/14 모델에 competitive 했다.

  6. -
-
    -
  • Table 2

  • -
-
-img_07 -
-

Fig. 369 Table 2#

-
-
-
    -
  • Stable Diffusion 은
    -Resolution 이 높은지, Aesthetic 한지, Safe-for-work 한지에 따라서 filtered 된
    -LAION-5B 데이터셋을 학습
    했다.

  • -
  • 이와 같은 기준으로 filtering 하면,
    -CIFAR10, Pets, Flowers, STL10, ImageNet 데이터셋의 test set 은 97~100% 가 filtered out 된다.

  • -
  • 따라서, 이들 데이터셋은 Stable Diffusion 에게 완전한 out-of-distribution 데이터이다.

  • -
  • 따라서, 필터링이 안된 데이터로 Stable Diffusion 을 추가 학습시키면
    -classification 성능도 올라갈 것
    이다.

  • -
  • Figure 5 & Table 3

  • -
-
-img_08 -
-

Fig. 370 Figure 5#

-
-
-
-img_09 -
-

Fig. 371 Table 3#

-
-
-
    -
  • 본 논문에서는 Winoground 데이터셋을 활용해
    -visio-linguistic compositional reasoning abilities 를 측정했다.

    -
      -
    • 주어진 captions 를 적절한 이미지에 매치시키는 능력을 측정하는 것이다.

    • -
    • Winoground 데이터셋

      -
        -
      • Object 는 명사절끼리 뒤바뀐 경우

      • -
      • Relation 은 동사끼리 or 형용사끼리 or 부사끼리 뒤바뀐 경우

      • -
      • Both 는 다른 품사끼리 서로 뒤바뀐 경우

      • -
      -
    • -
    -
  • -
  • Stable Diffusion 의 Diffusion Classifier 가 최고의 성능을 보여주었다.

  • -
  • 본 논문에서 제시한 method 를 통해서 추가 학습 없이,
    -여느 diffusion 모델처럼 sample generation 만을 학습했음에도,
    -Stable Diffusion 모델을 훌륭한 classifier 이자 reasoner 로 변모시킬 수 있었다.

  • -
  • Table 4

  • -
-
-img_10 -
-

Fig. 372 Table 4#

-
-
-
    -
  • ImageNet 에 존재하는 1,000 개의 클래스를 활용해
    -Pretrained DiT (Diffusion Transformer) 를 활용한 Diffusion Classifier 의 성능을,
    -Discriminative Classifiers (ResNet-101 and ViT-B/16) 와 비교했다.

  • -
  • ImageNet 에 대해서, 79.1% 의 top-1 accuracy 를 기록하며 ViT-L/32 을 능가했다.

  • -
  • 더 적은 augmentation 기법을 사용하였고,
    -regularization 은 사용하지 않았음에도 Discriminative Classifiers 의 성능을 능가했다.

  • -
  • Figure 6

  • -
-
-img_11 -
-

Fig. 373 Figure 6#

-
-
-
    -
  • ImageNet 데이터셋에서,
    -ImageNet-A 와 겹치는 클래스에 대해서만 Classification 을 수행한다.

  • -
  • 일반적인 discriminative classifiers 는 신뢰구간 과 함께 파란 점으로 찍혀 있다.

  • -
  • Diffusion Classifiers 는 신뢰구간 과 함께 별 모양의 점으로 찍혀 있다.

  • -
  • Diffusion Classifiers 는 In-distribution (ImageNet) 에서 획득한 Accuracy 에 따라
    -기대되는 것보다,
    -훨씬 Out-of-distribution (ImageNet-A) 에서의 성능이 뛰어났다.
    -- 즉, OOD 에 훨씬 Robust 하다.

  • -
  • 결론

    -
      -
    • Diffusion Models 에서 Diffusion Classifier 를 추출하는 방법을 제시

    • -
    • Stable Diffusion 에서 추출한 Diffusion Classifier 가 Zero-shot 능력이 우수함을 확인

    • -
    • DiT 에서 추출한 Diffusion Classifier 가 Standard Classification 능력이 우수함을 확인

    • -
    • Diffusion Classifiers 의 Compositional Reasoning 능력이 우수함을 확인

    • -
    • Diffusion Classifiers 가 OOD 에 매우 Robust 함

    • -
    • Filtering 되지 않은 데이터도 학습시킬 수 있다면,
      -Stable Diffusion 의 Diffusion Classifier 성능은 더 개선될 것
      임.

    • -
    • Imagen 의 경우 OpenCLIP 보다 훨씬 큰 거대 언어 모델인, T5-XXL 을 활용했음.
      -Imagen 의 Classification 능력은 Stable Diffusion 보다 뛰어날 것으로 예상됨.

    • -
    -
  • -
-
- - - - -
- - - - - - -
- - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Your Diffusion Model is Secretly a Zero-Shot Classifier — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Your Diffusion Model is Secretly a Zero-Shot Classifier

+ +
+
+ +
+
+
+ + + + +
+ +
+

Information

+ +
+
+

Your Diffusion Model is Secretly a Zero-Shot Classifier#

+
    +
  • 핵심

    +
      +
    • 학습된 Diffusion Models 에서 Classifier 를 추가 학습 없이 획득할 수 있다.

      +
        +
      • Stable Diffusion 같은 거대 모델로부터 Zero-shot classifier 를 얻을 수 있다.

      • +
      • Class-conditional Diffusion Models 에서는 일반적인 (non Zero-shot) classifier 를 얻을 수 있다.

      • +
      +
    • +
    +
  • +
  • 결과 요약

    +
      +
    • Classification 성능이 나쁘지 않았다.

    • +
    • Zero-shot classifier 는 Multimodal Compositional reasoning ability 가 매우 훌륭했다.

    • +
    • 이렇게 Diffusion 모델에서 추출된 Classifiers 는 Distribution shift 에 대해 Robust 한 성능을 보여주었다.

    • +
    +
  • +
  • Classifier 구현 방법

  • +
+
+img_00 +
+

Fig. 362 Diffusion Classifier 아키텍쳐#

+
+
+
    +
  • 예시로 먼저 살펴보기.

  • +
  • 예를 들어, 어떤 동물 이미지 X 를 Stable Diffusion 으로 Classification 하고 싶다면..
    +1. 일단 해당 동물의 클래스를 포함하고 있을 만한 데이터셋을 구한다.
    +37개의 동물 클래스가 존재하는 Pets 데이터셋을 사용한다고 치자.
    +2. text prompts 로 “호랑이” 가 주어진 Stable Diffusion 으로,
    +X 의 Noised Image 에서 Reverse process 를 진행한다. 그럼 Loss 를 획득할 수 있을 것이다.
    +3. 37개의 모든 Pets Classes 에 대해서 이를 수행해서,
    +가장 Loss 가 작은 Class 를 판별한다.
    +이 Class 가 바로 이미지 X 의 클래스이다.

  • +
+
+img_01 +
+

Fig. 363 Algorithm 1 : Diffusion Classifier 학습 알고리즘#

+
+
+
    +
  1. n_samples 에 지정된 수 만큼 t 와 noise 를 각각 샘플링해 벡터를 만든다.

  2. +
  3. 클래스 판별이 필요한 이미지 X 의 t-step Noised image 인 X_t 를 구한다.

  4. +
  5. X_t 를 Diffusion Model 에 Input 으로 주어 Noise 를 출력한다.

  6. +
  7. loss 를 구한다.

  8. +
+
    +
  • 위 과정을, 여러 번 (n_trials 만큼) 시도해서 평균낼 수도 있다.

  • +
+
    +
  1. loss 가 가장 낮은 Class 를 찾을 때 까지, 가능한 모든 Class 에 대해 추론한다.

  2. +
  3. 최종 남은 Class 를 X 의 Class 라고 판정한다.

  4. +
+
    +
  • Zero-shot classification 도 위와 동일한 과정으로 진행된다.
    +다만 추론할 Class list 가 필요하다.
    +- 예를 들어서, Stable Diffusion 의 Zero-shot classification 을 수행하기 위해서는,
    +(Stable Diffusion 이 학습하지는 않았지만) 37개의 클래스가 정의되어 있는
    +Pets 와 같은 데이터셋으로 Classification 을 수행할 수 있다.

  • +
  • 하지만, Class 마다 n_samples 수 만큼 t 를 샘플링하고,
    +또 X_t 를 구하고,
    +Diffusion Model 로 노이즈를 추론하고,
    +loss 를 구하는 것은 Inference times 가 많이 소모됨.
    +따라서 다음의 방법을 활용해 inference times 을 줄인다.

  • +
+
+img_02 +
+

Fig. 364 Algorithm 2. Efficient Diffusion Classifier Algorithm#

+
+
+
    +
  1. 일단 작은 수의 n_samples 로 error 가 높은 class 들을 걸러낸다.

  2. +
  3. 소수의 class 만 남았다면,
    +이제는 정확한 추론을 위해서 더 큰 n_samples 를 설정해 추론한다.
    +(large n_samples 로 t 와 \(\epsilon\) 을 sampling 한다.)

  4. +
+
    +
  • c.f.

  • +
+
### Oxford-IIIT Pets
+```bash
+python eval_prob_adaptive.py --dataset pets --split test --n_trials 1 \
+        --to_keep 5 1 --n_samples 25 250 --loss l1 \
+        --prompt_path prompts/pets_prompts.csv
+
+
+
    +
  • 왜 이렇게까지 inference time 을 줄이려고 하지??
    +- 위의 스크립트 그대로 RTX 3090 에서 돌리면,
    +Pets 이미지 1장 Classification 하는데 18초 걸린다.
    +- ImageNet 은 Class 1,000 개 있는데,
    +512x512 이미지 1장 Classification 하려면 1,000 초 걸린다.

  • +
  • c.f. Loss 계산 코드 (eval_prob_adaptive.py)

  • +
+
all_noise = torch.randn((max_n_samples * args.n_trials, 4, latent_size, latent_size), device=latent.device)
+
+def eval_error(unet, scheduler, latent, all_noise, ts, noise_idxs,
+                text_embeds, text_embed_idxs, batch_size=32, dtype='float32', loss='l2'):
+        assert len(ts) == len(noise_idxs) == len(text_embed_idxs)
+        pred_errors = torch.zeros(len(ts), device='cpu')
+        idx = 0
+        with torch.inference_mode():
+        for _ in tqdm.trange(len(ts) // batch_size + int(len(ts) % batch_size != 0), leave=False):
+                batch_ts = torch.tensor(ts[idx: idx + batch_size])
+                noise = all_noise[noise_idxs[idx: idx + batch_size]]
+                noised_latent = latent * (scheduler.alphas_cumprod[batch_ts]  0.5).view(-1, 1, 1, 1).to(device) + \
+                                noise * ((1 - scheduler.alphas_cumprod[batch_ts])  0.5).view(-1, 1, 1, 1).to(device)
+                t_input = batch_ts.to(device).half() if dtype == 'float16' else batch_ts.to(device)
+                text_input = text_embeds[text_embed_idxs[idx: idx + batch_size]]
+                noise_pred = unet(noised_latent, t_input, encoder_hidden_states=text_input).sample
+                if loss == 'l2':
+                error = F.mse_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3))
+                elif loss == 'l1':
+                error = F.l1_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3))
+                elif loss == 'huber':
+                error = F.huber_loss(noise, noise_pred, reduction='none').mean(dim=(1, 2, 3))
+                else:
+                raise NotImplementedError
+                pred_errors[idx: idx + len(batch_ts)] = error.detach().cpu()
+                idx += len(batch_ts)
+        return pred_errors
+
+
+
    +
  • 실험 결과

    +
      +
    • Figure 2

      +
      +img_03 +
      +

      Fig. 365 Figure 2#

      +
      +
      +
        +
      • 특정한 이미지 x 의 모든 클래스에 대해서 loss 를 추론하게 될텐데,
        +모든 클래스에 대해서
        +동일한 \(\epsilon\)
        (즉 sampled noise) 과 동일한 t (즉 sampled time steps) 를 사용해야 한다.
        +이 두 변수에 따라 loss 가 크게 달라지기 때문.

      • +
      +
    • +
    +
  • +
  • Figure 3 & Figure 4

    +
      +
    • Figure 3

      +
        +
      • t 에 따라서, Classification 성능이 달라졌다.

      • +
      +
    • +
    • Figure 4

      +
        +
      • Figure 3 의 결과에 따라서,
        +intermediate timesteps 를 더 많이 sampling 하면 성능이 올라가는지 실험해보았다.

      • +
      • 그렇지 않았다.
        +timesteps 를 Uniform 하게 sampling 했을 때 성능이 가장 좋았다.

      • +
      +
    • +
    +
  • +
+
+img_04 +
+

Fig. 366 Figure 3#

+
+
+
+img_05 +
+

Fig. 367 Figure 4#

+
+
+
    +
  • Table 1 (+ F. Additional Implementation Details 참고)

  • +
+
+img_06 +
+

Fig. 368 Table 1#

+
+
+
    +
  • 본 논문에서 제시한 Diffusion Classifier 가 Classification 능력이 나쁘지 않았다.

  • +
+
    +
  1. Diffusion 모델에서 knowledge 를 추출해내는 다른 방법들보다 성능이 뛰어났다.
    +- Diffusion Classifier 는 Zero-shot 성능이,
    +“Stable Diffusion 으로 생성된 영상을“ 학습한 ResNet-50 classifier 보다 뛰어났다.
    +- Synthetic SD data :
    +Class 마다 10,000 장의 이미지를 Stable Diffusion 2.0 으로 생성해
    +데이터셋을 구축하고 (90% train / 10% validation),
    +해당 데이터셋으로 ResNet-50 classifier 를 학습시켜서 classification 수행한 결과
    +- Diffusion Classifier 는 Classification 성능이,
    +Stable Diffusion 의 intermediate U-Net layer 를 추출해 학습시킨
    +ResNet-based 모델
    보다 뛰어났다.
    +- SD features :
    +Input 이미지에 따른 Stable Diffusion 의 Intermediate U-Net features 를
    +ResNet 기반의 classifier 에 전달해서 추론.
    +이 때 classifier 는 모든 데이터셋을 직접 학습한다. 따라서 zero-shot 은 아니다.

  2. +
  3. CLIP ResNet-50 모델보다도 성능이 뛰어났다.

  4. +
  5. OpenCLIP ViT-H/14 모델에 competitive 했다.

  6. +
+
    +
  • Table 2

  • +
+
+img_07 +
+

Fig. 369 Table 2#

+
+
+
    +
  • Stable Diffusion 은
    +Resolution 이 높은지, Aesthetic 한지, Safe-for-work 한지에 따라서 filtered 된
    +LAION-5B 데이터셋을 학습
    했다.

  • +
  • 이와 같은 기준으로 filtering 하면,
    +CIFAR10, Pets, Flowers, STL10, ImageNet 데이터셋의 test set 은 97~100% 가 filtered out 된다.

  • +
  • 따라서, 이들 데이터셋은 Stable Diffusion 에게 완전한 out-of-distribution 데이터이다.

  • +
  • 따라서, 필터링이 안된 데이터로 Stable Diffusion 을 추가 학습시키면
    +classification 성능도 올라갈 것
    이다.

  • +
  • Figure 5 & Table 3

  • +
+
+img_08 +
+

Fig. 370 Figure 5#

+
+
+
+img_09 +
+

Fig. 371 Table 3#

+
+
+
    +
  • 본 논문에서는 Winoground 데이터셋을 활용해
    +visio-linguistic compositional reasoning abilities 를 측정했다.

    +
      +
    • 주어진 captions 를 적절한 이미지에 매치시키는 능력을 측정하는 것이다.

    • +
    • Winoground 데이터셋

      +
        +
      • Object 는 명사절끼리 뒤바뀐 경우

      • +
      • Relation 은 동사끼리 or 형용사끼리 or 부사끼리 뒤바뀐 경우

      • +
      • Both 는 다른 품사끼리 서로 뒤바뀐 경우

      • +
      +
    • +
    +
  • +
  • Stable Diffusion 의 Diffusion Classifier 가 최고의 성능을 보여주었다.

  • +
  • 본 논문에서 제시한 method 를 통해서 추가 학습 없이,
    +여느 diffusion 모델처럼 sample generation 만을 학습했음에도,
    +Stable Diffusion 모델을 훌륭한 classifier 이자 reasoner 로 변모시킬 수 있었다.

  • +
  • Table 4

  • +
+
+img_10 +
+

Fig. 372 Table 4#

+
+
+
    +
  • ImageNet 에 존재하는 1,000 개의 클래스를 활용해
    +Pretrained DiT (Diffusion Transformer) 를 활용한 Diffusion Classifier 의 성능을,
    +Discriminative Classifiers (ResNet-101 and ViT-B/16) 와 비교했다.

  • +
  • ImageNet 에 대해서, 79.1% 의 top-1 accuracy 를 기록하며 ViT-L/32 을 능가했다.

  • +
  • 더 적은 augmentation 기법을 사용하였고,
    +regularization 은 사용하지 않았음에도 Discriminative Classifiers 의 성능을 능가했다.

  • +
  • Figure 6

  • +
+
+img_11 +
+

Fig. 373 Figure 6#

+
+
+
    +
  • ImageNet 데이터셋에서,
    +ImageNet-A 와 겹치는 클래스에 대해서만 Classification 을 수행한다.

  • +
  • 일반적인 discriminative classifiers 는 신뢰구간 과 함께 파란 점으로 찍혀 있다.

  • +
  • Diffusion Classifiers 는 신뢰구간 과 함께 별 모양의 점으로 찍혀 있다.

  • +
  • Diffusion Classifiers 는 In-distribution (ImageNet) 에서 획득한 Accuracy 에 따라
    +기대되는 것보다,
    +훨씬 Out-of-distribution (ImageNet-A) 에서의 성능이 뛰어났다.
    +- 즉, OOD 에 훨씬 Robust 하다.

  • +
  • 결론

    +
      +
    • Diffusion Models 에서 Diffusion Classifier 를 추출하는 방법을 제시

    • +
    • Stable Diffusion 에서 추출한 Diffusion Classifier 가 Zero-shot 능력이 우수함을 확인

    • +
    • DiT 에서 추출한 Diffusion Classifier 가 Standard Classification 능력이 우수함을 확인

    • +
    • Diffusion Classifiers 의 Compositional Reasoning 능력이 우수함을 확인

    • +
    • Diffusion Classifiers 가 OOD 에 매우 Robust 함

    • +
    • Filtering 되지 않은 데이터도 학습시킬 수 있다면,
      +Stable Diffusion 의 Diffusion Classifier 성능은 더 개선될 것
      임.

    • +
    • Imagen 의 경우 OpenCLIP 보다 훨씬 큰 거대 언어 모델인, T5-XXL 을 활용했음.
      +Imagen 의 Classification 능력은 Stable Diffusion 보다 뛰어날 것으로 예상됨.

    • +
    +
  • +
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/consistency_models.html b/docs/review/consistency_models.html old mode 100644 new mode 100755 index 1e553d7d..6ff0641a --- a/docs/review/consistency_models.html +++ b/docs/review/consistency_models.html @@ -1,906 +1,925 @@ - - - - - - - - - - - - Consistency Models — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

Consistency Models#

-
-

1. Introduction#

-

Diffusion Models 은 image generation, audio synthesis, video generation 등의 다양한 분야에 연구가 진행되어 왔습니다. 하지만 single-step generative model 인 VAE, GAN, 그리고 normalizing flows 에 비해 추론 속도가 10-2000배 더 많은 연산작업을 요하는 치명적인 단점이 존재합니다.

-

이러한 문제를 해결하기 위해 논문에서 Consistency Model 을 소개합니다.

-
-consistency_models_01 -
-

Fig. 454 Overview of Consistency Models#

-
-
-

위의 사진처럼 주어진 PF ODE (Probability Flow Ordinary Differential Equation) 에 대해서 동일한 trajectory 에 있는 point 들이 동일한 시작점으로 매핑되도록 모델을 학습하는 방식을 제안하고, 이러한 self-consistency 특성을 만족시킬 수 있도록 2가지 학습 방식을 소개합니다.

-
    -
  1. 첫번째 방식으로는 우선적으로 numerical ODE solver 와 사전 학습된 diffusion model을 사용하여 PF ODE trajectory 에서 인접한 point 쌍을 생성합니다. 그리고 이러한 쌍에 대한 모델 출력 간의 차이를 최소화하도록 모델을 학습함으로써 diffusion model 을 consistency model 로 효과적으로 knowledge distillation 을 적용할 수 있고, 단 한번의 step 만으로도 high quality sample 을 생성할 수 있게 됩니다.

  2. -
  3. 두번째 방식으로는 사전학습된 diffusion model 에 의존하지 않고 독립적으로 consistency model 을 학습하는 방식입니다.

  4. -
-

CIFAR-10, ImageNet 64x64, LSUN 256x256 데이터셋에 실험한 결과, 기존 distillation 기법을 적용한 모델 (i.e., progressive distillation) 보다 성능이 개선되고, 독립적인 모델로서도 사전학습된 diffusion model 없이 GAN 을 제외한 single-step generative model 보다 성능이 좋다고 합니다. 마지막으로 다양한 zero-shot data editing (image denoising, interpolation, inpainting, colorization, super-resolution, stroke-guided image editing) task 에도 consistency model 이 좋은 성능을 보여준다는 것을 확인하였습니다.

-
-
-

2. Diffusion Models#

-

Diffusion Models in Continuous Time

-

Continuous time 에서의 diffusion model 을 다음과 같이 SDE 수식으로 표현할 수 있습니다. (Song et al., 2021)

-
-consistency_models_02 -
-

Fig. 455 Diffusion Models in Continuous Time#

-
-
-
    -
  • \(t \in [0,T], T > 0\)

  • -
  • \(\mu(\cdot,\cdot), \sigma(\cdot)\) := drift, diffusion coefficients

  • -
  • \(\{w_t\}_{t \in [0,T]}\) := standard Brownian motion

  • -
-

그리고 해당 SDE 는 아래 식과 같은 PF ODE 로 표현할 수 있다는 성질을 가지고 있습니다. 이때 \(\nabla \log p_t(x_t)\)score function 이라고 하고, 시점 t 에 대한 solution trajectory 가 \(p_t(x)\) 에 따라 분포합니다.

-
-consistency_models_03 -
-

Fig. 456 Probability Flow (PF) ODE#

-
-
-

일반적으로 위의 SDE 수식에서 \(p_T(x)\) 가 Gaussian distribution \(\pi(x)\) 를 따르도록 정의하고, 해당 논문에서 Karras et al., 2022 와 동일하게 \(\mu(x,t) = 0, \sigma(t) = \sqrt{2}t\) 로 설정하였습니다. 그리고 sampling 시, score matching 을 통해 score model \(s_{\phi}(x,t) \approx \nabla \log p_t(x)\) 우선적으로 학습한 후, 위의 식에 대입하면 다음과 같은 empirical PF ODE 로 표현할 수 있습니다

-
-consistency_models_04 -
-

Fig. 457 Empirical PF ODE#

-
-
-

다음 과정으로는 initial condition \(x_T \sim N(0, T^2I)\) 을 기반으로 Euler 나 Heun 등의 numerical ode solver 를 통해 역방향으로 풀어 solution trajectory \(\{x_t\}_{t \in [0,T]}\)\({x_t}\)\(\hat{x}_0\)\({x_t}\)\(p_{data}(x)\) 로부터 나온 샘플에 대한 근사값이라고 할 수 있습니다.

-

추가적으로 논문에서 numerical instability 를 방지하기 위해 고정된 작은 양수 \(\epsilon\) 에 대해 \(t = \epsilon\) 에서 solver 를 멈추고 \(\hat{x}_{\epsilon}\)\(p_{data}(x)\) 에 대한 근사값으로 간주합니다. 그리고 Karras et al., 2022 와 동일하게 이미지 픽셀 값을 \([-1,1]\) 로 rescale 하고 \(T = 80, \epsilon = 0.002\) 로 설정합니다.

-

앞서 소개드린 방식으로 diffusion model 을 통한 sampling 시, ode solver 를 사용하는데 score model \(s_{\phi}(x_t,t)\) 의 수많은 iterative evaluation 작업이 필요합니다. 빠른 sampling 작업을 위해, 더 빠른 numerical ode solver 에 대한 연구들이 진행되었지만, 이를 활용해도 최소 10번 이상의 evaluation step 을 거쳐야만 competitive 한 성능을 보여준다고 합니다. 여러 distillation 기법들에 대한 연구들도 진행되었지만, Salimans & Ho (2022) 를 제외하고는 distillation 작업을 하기 위해서 사전에 diffusion model 로부터 대량의 데이터를 수집해야한다는 단점이 있습니다.

-
-
-

3. Consistency Models#

-

논문에서 single-step generation 이 가능한 consistency model 을 제안하고, 학습하는 방식으로 1) 사전학습된 diffusion model 로부터 knowledge distillation 진행하는 방식과 2) 독립적으로 학습하는 방식 을 소개합니다.

-

Definition

-

주어진 PF ODE 에 대한 trajectory \(\{x_t\}_{t \in [0,T]}\) 에 대해서 다음과 같은 consistency function \(f : (x_t, t) \mapsto x_{\epsilon}\) 을 정의하고, 함수 \(f\) 는 동일한 trajectory 에 있는 임의의 두 \(t, t' \in [\epsilon, T]\) 에 대해 \(f(x_t, t) = f(x_{t'}, t')\), 즉 self-consistency 성질을 만족합니다. 이러한 함수 \(f\) 를 예측하기 위해 데이터로부터 \(f_{\theta}\) 을 학습하는 것이 consistency model 의 objective 이며, 이는 Bilos et al., 2021 에서 정의하는 neural flow 와 유사하지만, consistency model 은 invertible property 를 부여하지는 않습니다.

-
-consistency_models_05 -
-

Fig. 458 Self-Consistency#

-
-
-

Parameterization

-

앞서 정의한 부분에 의해, 모든 consistency function \(f\) 에 대해서 \(f(x_{\epsilon}, t) = x_{\epsilon}\) 를 만족해야 하는 boundary condition 이 존재하고, 이를 만족하기 위해 다음과 같이 두 가지 방식으로 parameterization 방식을 정의하였습니다.

-
-consistency_models_06 -
-

Fig. 459 Parameterization Method 1#

-
-
-

여기서 \(F_{\theta}(x,t)\) 는 output 차원이 \(x\) 와 동일한 free-form deep neural network 입니다. 두번째 방식으로는, 다음과 같이 skip-connection 을 활용합니다.

-
-consistency_models_07 -
-

Fig. 460 Parameterization Method 2#

-
-
-

이때, \(F_{\theta}(x,t), c_{skip}(t), c_{out}(t)\)\(c_{skip}(\epsilon) = 1, c_{out}(\epsilon) = 0\) 조건을 만족시키는 미분 가능한 함수로 정의합니다.

-
-consistency_models_08 -
-

Fig. 461 Parameterization Method 2 - \(c_{skip}(t), c_{out}(t)\)#

-
-
-

두번째 parameterization 기법이 diffusion model 형식과 매우 유사하여 이러한 diffusion model 아키텍쳐를 leverage 하기 위해 논문에서 두번째 방식으로 parameterization 을 하는 방식을 택합니다.

-

Sampling

-

학습된 consistency model \(f_{\theta}(\cdot,\cdot)\) 와 initial distribution \(\hat{x}_T \sim N(0, T^2I)\) 를 활용하여 단일 sampling step 만으로 \(\hat{x}_{\epsilon} = f_{\theta}(\hat{x}_{T}, T)\) 를 생성할 수 있습니다. 더불어 하단 pseudo code 에 보이듯이, denoising 과 noise injection 작업을 여러 번 거치는 multistep consistency sampling 을 통해 computing cost 와 sample quality 를 trade-off 할 수 있는 유연성도 제공합니다.

-
-consistency_models_09 -
-

Fig. 462 Multistep Consistency Sampling#

-
-
-

Zero-Shot Data Editing

-

Diffusion model 과 유사하게 추가적인 학습 없이 zero-shot 형태로 image editing 그리고 manipulation task 이 가능합니다. 예를 들어, consistency model 은 Gaussian noise 로부터 one-to-one mapping 을 통해 \(x_{\epsilon}\)을 생성하기 때문에 GAN, VAE, normalizing flow 와 유사하게 latent space 을 통해 sample 들간의 interpolation 이 가능합니다. 또한, multistep consistency sampling 을 통해 zero-shot 의 한계점을 보완하면서 image editing, inpainting, colorization, super-resolution, stroke-guided image editing (Meng et al., 2021) 등의 다양한 task 를 수행할 수 있습니다. 대표적으로 몇 가지 zero-shot image editing 결과 예시들을 공유합니다.

-
    -
  • Inpainting

    -
    -consistency_models_10 -
    -

    Fig. 463 Consistency Models - Inpainting#

    -
    -
    -
  • -
  • Interpolation

    -
    -consistency_models_11 -
    -

    Fig. 464 Consistency Models - Interpolation#

    -
    -
    -
  • -
  • Self-consistency

    -
    -consistency_models_12 -
    -

    Fig. 465 Consistency Models - Self-consistency#

    -
    -
    -
  • -
-
-
-

4. Training Consistency Models via Distillation#

-

앞서 소개한 두 가지 학습 방식 중, 첫번째로 사전학습된 score model \(s_{\phi}(x,t)\) 를 consistency model 에 knowledge distillation 하는 학습하는 방식을 소개합니다.

-

논문에서 특히 continuous time interval \([\epsilon, T]\) 을 boundary \(t_1 = \epsilon < t_2 < \cdots < t_N=T\) 를 기준으로 \(N-1\) 개의 interval 로 discretize 하는 상황을 가정하고, Karras et al., 2022 의 설정과 동일하게 boundary 를 다음과 같이 정의합니다.

-
-\[ -t_i = (\epsilon^{1/\rho} + \frac{i-1}{N-1}(T^{1/\rho}-\epsilon^{1/\rho}))^{\rho}, \quad \rho = 7 -\]
-

이때, \(N\) 이 충분히 크다면 다음과 같이 numerical ode solver 의 discretization step 을 한번 진행시켜 \(x_{t_{n+1}}\) 로부터 \(x_{t_n}\) 에 대한 정확한 예측값을 얻을 수 있다고 합니다.

-
-consistency_models_13 -
-

Fig. 466 One Discretization Step of a Numerical ODE Solver#

-
-
-

이때, \(\Phi(\cdots; \phi)\) 은 empirical PF ODE 에 적용되는 one step ODE solver 의 update function 입니다. Euler solver 같은 경우, \(\Phi(x,t;\phi) = -ts_{\phi}(x,t)\) 를 대입하면 다음과 같이 표현할 수 있게 됩니다.

-
-consistency_models_14 -
-

Fig. 467 One Discretization Step of a Euler ODE Solver#

-
-
-

위 수식을 활용하여 주어진 \(x \sim p_{data}\) 에 대해서 PF ODE trajectory 에 있는 인접한 두 지점 \((\hat{x}^{\phi}_{t_n}, x_{t_{n+1}})\) 을 샘플링할 수 있게 됩니다. 더 자세하게는, \(x_{t_{n+1}} \sim N(x,t^2_{n+1}I)\) 를 우선적으로 샘플링한 후, 위 수식을 기반으로 numerical ode solver 의 discretization step 을 한번 거쳐 \(\hat{x}^{\phi}_{t_n}\) 을 계산합니다. 최종적으로 \((\hat{x}^{\phi}_{t_n}, x_{t_{n+1}})\) 로부터의 모델 출력값 차이를 최소화하도록 consistency model 을 학습하게 되고, 학습 시 사용되는 consistency distillation loss 는 다음과 같이 정의합니다.

-
-consistency_models_15 -
-

Fig. 468 Consistency Distillation Loss#

-
-
-

여기서 metric function \(d(\cdot,\cdot)\) 로는 L1 distance, L2 distance, 그리고 LPIPS distance 를 사용하였고, 실험적으로 확인해본 결과 \(\lambda(t_n) \equiv 1\) 를 적용했을 때 모델 성능이 가장 좋은 부분을 확인할 수 있었다고 합니다. 파라미터 \(\theta\) 는 stochastic gradient descent 그리고 \(\theta^-\) 는 exponential moving average (EMA) 로 학습하였다고 합니다.

-
-consistency_models_16 -
-

Fig. 469 Exponential Moving Average (EMA)#

-
-
-

이처럼 EMA update 와 stopgrad operator 로 학습할 시, \(\theta = \theta^{-}\) 로 설정할때보다 모델을 더 안정적으로 학습할 수 있고 성능에도 개선이 있었다고 합니다. 전체적인 학습 절차는 하단의 Algorithm 2 처럼 정리할 수 있습니다.

-
-consistency_models_17 -
-

Fig. 470 Overview of Consistency Distillation (CD)#

-
-
-

\(\theta^{-}\) 는 과거 \(\theta\) 에 대한 running average 이므로 Algorithm 2 가 수렴할 시 이 둘은 일치하게 됩니다. 즉, target network \(f_{\theta^-}\)와 online network \(f_{\theta}\) 가 일치하게 됩니다.

-
-
-

5. Training Consistency Models in Isolation#

-

Consistency Distillation 방식에서는 ground truth score function \(\nabla \log p_t(x_t)\) 을 근사하는 사전학습된 score model \(s_{\phi}(x,t)\) 에 의존했다면, 이에 의존하지 않고 다음과 같은 \(\nabla \log p_t(x_t)\) 에 대한 unbiased estimator 를 활용할 수도 있습니다. 다시 말해, \(-(x_t - x)/t^2\)\(\nabla \log p_t(x_t)\) 를 근사할 수 있습니다.

-
-consistency_models_18 -
-

Fig. 471 Unbiased Estimator of Score Function#

-
-
-
    -
  • \(x \sim p_{data}, x_t \sim N(x; t^2I)\)

  • -
-

Consistency Training (CT) Loss 는 다음과 같이 정의하고, 이는 사전학습된 diffusion model 파라미터 \(\phi\) 와는 독립적인 사실을 확인할 수 있습다.

-
-\[ -L_{CT}^{N}(\theta,\theta^{-}) = \mathbb{E}[\lambda(t_n)d(f_{\theta}(x + t_{n+1}z, t_{n+1}), f_{\theta^-}(x+t_nz, t_n))] -\]
-
    -
  • \(x \sim p_{data}, n \sim \mathbb{U}[[1,N-1]], x_{t_{n+1}} \sim N(x;t^2_{n+1}I), z \sim N(0,I)\)

  • -
  • Consistency Training Loss 를 위와 같이 정의하게 된 배경은 다음과 같습니다.

    -
    -consistency_models_19 -
    -

    Fig. 472 Consistency Training Loss#

    -
    -
    -
  • -
-
-consistency_models_20 -
-

Fig. 473 Schedule Functions for Consistency Training#

-
-
-

논문에서 추가적인 성능 개선을 위해 \(N\) 을 점진적으로 증가시키는 방식을 제안합니다. \(N\) 이 작을수록 (\(i.e., \Delta t\) 가 클수록) consistency training loss 가 consistency distillation loss 와 비교했을때 variance 는 감소하지만 bias 는 증가하게 되어, 초기에 더 빠른 convergence 에 이르는데 용이합니다. 반면에, \(N\) 이 클수록 (\(i.e., \Delta t\) 가 작을수록) variance 는 증가하고 bias 는 감소하게 되어, 학습의 마지막 단계에 적용하는 것이 바람직하다고 제안합니다. EMA decay rate schedule function \(\mu(\cdot)\)\(N\) 에 따라 바뀌는 함수로 최종적으로 정의합니다. 전체적인 학습 절차는 하단의 Algorithm 3 처럼 정리할 수 있습니다.

-
-consistency_models_21 -
-

Fig. 474 Overview of Consistency Training (CT)#

-
-
-
-
-

6. Experiments#

-

논문에서 CIFAR-10, ImageNet 64x64, LSUN Bedroom 256x256, 그리고 LSUN Cat 256x256 데이터셋에 consistency distillation, consistency training 두 학습 방식을 모두 실험하였고, 모델 성능 지표는 FID, IS, Precision, 그리고 Recall 을 사용하였습니다. 모델 architecture 는 CIFAR-10 데이터셋에는 NCSN++, 그리고 그 외 데이터셋에는 ADM 모델을 사용하였습니다.

-
-

6.1. Training Consistency Models#

-

CIFAR-10 데이터셋에 다음과 같은 hyperparameter tuning 작업을 진행하였습니다. (metric function \(d(\cdot,\cdot)\), ODE solver, CD (Consistency Distillation) 에서의 number of discretization steps \(N\), 그리고 CT (Consistency Training)) 에서의 schedule functions \(N(\cdot), \mu(\cdot)\))

-

Parameter Initialization

-

모델 초기 파라미터 값은 다음과 같이 설정하였습니다.

-
    -
  • Consistency Distillation - 사전학습된 diffusion model 파라미터 값

  • -
  • Consistency Training - Random Initialization

  • -
-

Results

-

모델 실험 결과를 다음과 같이 정리할 수 있습니다.

-
-consistency_models_22 -
-

Fig. 475 Experimental Results - Hyperparameters#

-
-
-
    -
  • Consistency Distillation (CD)

    -
      -
    • LPIPS 를 metric function 으로 사용했을때 모델 성능이 가장 좋았고, 이는 LPIPS metric 이 CIFAR-10 와 같은 natural image 들 간의 유사도를 측정하는데 특화되어 있기 때문이라고 합니다.

    • -
    • Euler ODE solver 보다 Heun ODE solver 를 사용했을 때, 그리고 \(N = 18\) 로 설정했을때 모델 성능이 가장 좋았습니다. 또한, 동일한 \(N\) 에 대해서 Heun’s second ode solver 를 사용했을때 Euler’s first ode solver 를 사용했을 때보다 모델 성능이 우월한 부분을 확인할 수 있었다고 합니다.

    • -
    -

    이외에도 다른 데이터셋에 hyperparameter tuning 작업을 별도로 진행하였습니다.

    -
  • -
  • Consistency Training (CT)

    -
      -
    • CD 와 동일하게 LPIPS metric function 사용하였고, ODE solver 는 사용하지 않았습니다.

    • -
    • \(N\) 이 작을수록, 모델이 더 빨리 수렴하지만 생성된 이미지 퀄리티는 좋지 않은 부분을 재차 확인할 수 있습니다. (and vice versa)

    • -
    • \(N\) 을 점차적으로 증가시키면서 \(\mu\) 도 변화시켰을때 성능이 가장 좋았습니다.

    • -
    -
  • -
-
-

6.2. Few-Step Image Generation#

-

Distillation

-

논문에서는 Consistency Distillation 모델의 성능을 synthetic data generation 을 필요하지 않는 knowledge distillation 기법 (PD, Salimans & Ho (2022)) 과 다음과 같이 비교합니다.

-
-consistency_models_23 -
-

Fig. 476 Experimental Results - Distillation#

-
-
-

Direct Generation

-

CIFAR-10 데이터셋 기준으로 VAE, normalizing flow 를 비롯한 타 single-step generative model 보다 CT 가 성능이 가장 좋았습니다. 또한, distillation 기법 없이도 Progressive Distillation (PD, Salimans & Ho (2022)) 와 견줄만한 성능을 가진 부분을 확인할 수 있습니다. 마지막으로 동일한 noise 로부터 높은 structural similarity 를 가진 이미지들을 생성함으로써 self-consistency 성질도 확인할 수 있었다고 합니다.

-
-consistency_models_24 -
-

Fig. 477 Experimental Results - Direct Generation#

-
-
-
-
-
-

6.3. Zero-Shot Image Editing#

-

Diffusion model 과 유사하게 consistency model 도 multistep sampling 알고리즘을 수정함으로써 zero shot image editing 이 가능합니다. 해당 사진은 LSUN Bedroom 데이터셋에 colorization, super-resolution, stroke-guided image editing task 를 적용한 결과입니다.

-
-consistency_models_25 -
-

Fig. 478 Pseudocode for Zero-Shot Image Editing#

-
-
-
-consistency_models_26 -
-

Fig. 479 Zero-Shot Image Editing Results#

-
-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Consistency Models — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

Consistency Models#

+
+

1. Introduction#

+

Diffusion Models 은 image generation, audio synthesis, video generation 등의 다양한 분야에 연구가 진행되어 왔습니다. 하지만 single-step generative model 인 VAE, GAN, 그리고 normalizing flows 에 비해 추론 속도가 10-2000배 더 많은 연산작업을 요하는 치명적인 단점이 존재합니다.

+

이러한 문제를 해결하기 위해 논문에서 Consistency Model 을 소개합니다.

+
+consistency_models_01 +
+

Fig. 454 Overview of Consistency Models#

+
+
+

위의 사진처럼 주어진 PF ODE (Probability Flow Ordinary Differential Equation) 에 대해서 동일한 trajectory 에 있는 point 들이 동일한 시작점으로 매핑되도록 모델을 학습하는 방식을 제안하고, 이러한 self-consistency 특성을 만족시킬 수 있도록 2가지 학습 방식을 소개합니다.

+
    +
  1. 첫번째 방식으로는 우선적으로 numerical ODE solver 와 사전 학습된 diffusion model을 사용하여 PF ODE trajectory 에서 인접한 point 쌍을 생성합니다. 그리고 이러한 쌍에 대한 모델 출력 간의 차이를 최소화하도록 모델을 학습함으로써 diffusion model 을 consistency model 로 효과적으로 knowledge distillation 을 적용할 수 있고, 단 한번의 step 만으로도 high quality sample 을 생성할 수 있게 됩니다.

  2. +
  3. 두번째 방식으로는 사전학습된 diffusion model 에 의존하지 않고 독립적으로 consistency model 을 학습하는 방식입니다.

  4. +
+

CIFAR-10, ImageNet 64x64, LSUN 256x256 데이터셋에 실험한 결과, 기존 distillation 기법을 적용한 모델 (i.e., progressive distillation) 보다 성능이 개선되고, 독립적인 모델로서도 사전학습된 diffusion model 없이 GAN 을 제외한 single-step generative model 보다 성능이 좋다고 합니다. 마지막으로 다양한 zero-shot data editing (image denoising, interpolation, inpainting, colorization, super-resolution, stroke-guided image editing) task 에도 consistency model 이 좋은 성능을 보여준다는 것을 확인하였습니다.

+
+
+

2. Diffusion Models#

+

Diffusion Models in Continuous Time

+

Continuous time 에서의 diffusion model 을 다음과 같이 SDE 수식으로 표현할 수 있습니다. (Song et al., 2021)

+
+consistency_models_02 +
+

Fig. 455 Diffusion Models in Continuous Time#

+
+
+
    +
  • \(t \in [0,T], T > 0\)

  • +
  • \(\mu(\cdot,\cdot), \sigma(\cdot)\) := drift, diffusion coefficients

  • +
  • \(\{w_t\}_{t \in [0,T]}\) := standard Brownian motion

  • +
+

그리고 해당 SDE 는 아래 식과 같은 PF ODE 로 표현할 수 있다는 성질을 가지고 있습니다. 이때 \(\nabla \log p_t(x_t)\)score function 이라고 하고, 시점 t 에 대한 solution trajectory 가 \(p_t(x)\) 에 따라 분포합니다.

+
+consistency_models_03 +
+

Fig. 456 Probability Flow (PF) ODE#

+
+
+

일반적으로 위의 SDE 수식에서 \(p_T(x)\) 가 Gaussian distribution \(\pi(x)\) 를 따르도록 정의하고, 해당 논문에서 Karras et al., 2022 와 동일하게 \(\mu(x,t) = 0, \sigma(t) = \sqrt{2}t\) 로 설정하였습니다. 그리고 sampling 시, score matching 을 통해 score model \(s_{\phi}(x,t) \approx \nabla \log p_t(x)\) 우선적으로 학습한 후, 위의 식에 대입하면 다음과 같은 empirical PF ODE 로 표현할 수 있습니다

+
+consistency_models_04 +
+

Fig. 457 Empirical PF ODE#

+
+
+

다음 과정으로는 initial condition \(x_T \sim N(0, T^2I)\) 을 기반으로 Euler 나 Heun 등의 numerical ode solver 를 통해 역방향으로 풀어 solution trajectory \(\{x_t\}_{t \in [0,T]}\)\({x_t}\)\(\hat{x}_0\)\({x_t}\)\(p_{data}(x)\) 로부터 나온 샘플에 대한 근사값이라고 할 수 있습니다.

+

추가적으로 논문에서 numerical instability 를 방지하기 위해 고정된 작은 양수 \(\epsilon\) 에 대해 \(t = \epsilon\) 에서 solver 를 멈추고 \(\hat{x}_{\epsilon}\)\(p_{data}(x)\) 에 대한 근사값으로 간주합니다. 그리고 Karras et al., 2022 와 동일하게 이미지 픽셀 값을 \([-1,1]\) 로 rescale 하고 \(T = 80, \epsilon = 0.002\) 로 설정합니다.

+

앞서 소개드린 방식으로 diffusion model 을 통한 sampling 시, ode solver 를 사용하는데 score model \(s_{\phi}(x_t,t)\) 의 수많은 iterative evaluation 작업이 필요합니다. 빠른 sampling 작업을 위해, 더 빠른 numerical ode solver 에 대한 연구들이 진행되었지만, 이를 활용해도 최소 10번 이상의 evaluation step 을 거쳐야만 competitive 한 성능을 보여준다고 합니다. 여러 distillation 기법들에 대한 연구들도 진행되었지만, Salimans & Ho (2022) 를 제외하고는 distillation 작업을 하기 위해서 사전에 diffusion model 로부터 대량의 데이터를 수집해야한다는 단점이 있습니다.

+
+
+

3. Consistency Models#

+

논문에서 single-step generation 이 가능한 consistency model 을 제안하고, 학습하는 방식으로 1) 사전학습된 diffusion model 로부터 knowledge distillation 진행하는 방식과 2) 독립적으로 학습하는 방식 을 소개합니다.

+

Definition

+

주어진 PF ODE 에 대한 trajectory \(\{x_t\}_{t \in [0,T]}\) 에 대해서 다음과 같은 consistency function \(f : (x_t, t) \mapsto x_{\epsilon}\) 을 정의하고, 함수 \(f\) 는 동일한 trajectory 에 있는 임의의 두 \(t, t' \in [\epsilon, T]\) 에 대해 \(f(x_t, t) = f(x_{t'}, t')\), 즉 self-consistency 성질을 만족합니다. 이러한 함수 \(f\) 를 예측하기 위해 데이터로부터 \(f_{\theta}\) 을 학습하는 것이 consistency model 의 objective 이며, 이는 Bilos et al., 2021 에서 정의하는 neural flow 와 유사하지만, consistency model 은 invertible property 를 부여하지는 않습니다.

+
+consistency_models_05 +
+

Fig. 458 Self-Consistency#

+
+
+

Parameterization

+

앞서 정의한 부분에 의해, 모든 consistency function \(f\) 에 대해서 \(f(x_{\epsilon}, t) = x_{\epsilon}\) 를 만족해야 하는 boundary condition 이 존재하고, 이를 만족하기 위해 다음과 같이 두 가지 방식으로 parameterization 방식을 정의하였습니다.

+
+consistency_models_06 +
+

Fig. 459 Parameterization Method 1#

+
+
+

여기서 \(F_{\theta}(x,t)\) 는 output 차원이 \(x\) 와 동일한 free-form deep neural network 입니다. 두번째 방식으로는, 다음과 같이 skip-connection 을 활용합니다.

+
+consistency_models_07 +
+

Fig. 460 Parameterization Method 2#

+
+
+

이때, \(F_{\theta}(x,t), c_{skip}(t), c_{out}(t)\)\(c_{skip}(\epsilon) = 1, c_{out}(\epsilon) = 0\) 조건을 만족시키는 미분 가능한 함수로 정의합니다.

+
+consistency_models_08 +
+

Fig. 461 Parameterization Method 2 - \(c_{skip}(t), c_{out}(t)\)#

+
+
+

두번째 parameterization 기법이 diffusion model 형식과 매우 유사하여 이러한 diffusion model 아키텍쳐를 leverage 하기 위해 논문에서 두번째 방식으로 parameterization 을 하는 방식을 택합니다.

+

Sampling

+

학습된 consistency model \(f_{\theta}(\cdot,\cdot)\) 와 initial distribution \(\hat{x}_T \sim N(0, T^2I)\) 를 활용하여 단일 sampling step 만으로 \(\hat{x}_{\epsilon} = f_{\theta}(\hat{x}_{T}, T)\) 를 생성할 수 있습니다. 더불어 하단 pseudo code 에 보이듯이, denoising 과 noise injection 작업을 여러 번 거치는 multistep consistency sampling 을 통해 computing cost 와 sample quality 를 trade-off 할 수 있는 유연성도 제공합니다.

+
+consistency_models_09 +
+

Fig. 462 Multistep Consistency Sampling#

+
+
+

Zero-Shot Data Editing

+

Diffusion model 과 유사하게 추가적인 학습 없이 zero-shot 형태로 image editing 그리고 manipulation task 이 가능합니다. 예를 들어, consistency model 은 Gaussian noise 로부터 one-to-one mapping 을 통해 \(x_{\epsilon}\)을 생성하기 때문에 GAN, VAE, normalizing flow 와 유사하게 latent space 을 통해 sample 들간의 interpolation 이 가능합니다. 또한, multistep consistency sampling 을 통해 zero-shot 의 한계점을 보완하면서 image editing, inpainting, colorization, super-resolution, stroke-guided image editing (Meng et al., 2021) 등의 다양한 task 를 수행할 수 있습니다. 대표적으로 몇 가지 zero-shot image editing 결과 예시들을 공유합니다.

+
    +
  • Inpainting

    +
    +consistency_models_10 +
    +

    Fig. 463 Consistency Models - Inpainting#

    +
    +
    +
  • +
  • Interpolation

    +
    +consistency_models_11 +
    +

    Fig. 464 Consistency Models - Interpolation#

    +
    +
    +
  • +
  • Self-consistency

    +
    +consistency_models_12 +
    +

    Fig. 465 Consistency Models - Self-consistency#

    +
    +
    +
  • +
+
+
+

4. Training Consistency Models via Distillation#

+

앞서 소개한 두 가지 학습 방식 중, 첫번째로 사전학습된 score model \(s_{\phi}(x,t)\) 를 consistency model 에 knowledge distillation 하는 학습하는 방식을 소개합니다.

+

논문에서 특히 continuous time interval \([\epsilon, T]\) 을 boundary \(t_1 = \epsilon < t_2 < \cdots < t_N=T\) 를 기준으로 \(N-1\) 개의 interval 로 discretize 하는 상황을 가정하고, Karras et al., 2022 의 설정과 동일하게 boundary 를 다음과 같이 정의합니다.

+
+\[ +t_i = (\epsilon^{1/\rho} + \frac{i-1}{N-1}(T^{1/\rho}-\epsilon^{1/\rho}))^{\rho}, \quad \rho = 7 +\]
+

이때, \(N\) 이 충분히 크다면 다음과 같이 numerical ode solver 의 discretization step 을 한번 진행시켜 \(x_{t_{n+1}}\) 로부터 \(x_{t_n}\) 에 대한 정확한 예측값을 얻을 수 있다고 합니다.

+
+consistency_models_13 +
+

Fig. 466 One Discretization Step of a Numerical ODE Solver#

+
+
+

이때, \(\Phi(\cdots; \phi)\) 은 empirical PF ODE 에 적용되는 one step ODE solver 의 update function 입니다. Euler solver 같은 경우, \(\Phi(x,t;\phi) = -ts_{\phi}(x,t)\) 를 대입하면 다음과 같이 표현할 수 있게 됩니다.

+
+consistency_models_14 +
+

Fig. 467 One Discretization Step of a Euler ODE Solver#

+
+
+

위 수식을 활용하여 주어진 \(x \sim p_{data}\) 에 대해서 PF ODE trajectory 에 있는 인접한 두 지점 \((\hat{x}^{\phi}_{t_n}, x_{t_{n+1}})\) 을 샘플링할 수 있게 됩니다. 더 자세하게는, \(x_{t_{n+1}} \sim N(x,t^2_{n+1}I)\) 를 우선적으로 샘플링한 후, 위 수식을 기반으로 numerical ode solver 의 discretization step 을 한번 거쳐 \(\hat{x}^{\phi}_{t_n}\) 을 계산합니다. 최종적으로 \((\hat{x}^{\phi}_{t_n}, x_{t_{n+1}})\) 로부터의 모델 출력값 차이를 최소화하도록 consistency model 을 학습하게 되고, 학습 시 사용되는 consistency distillation loss 는 다음과 같이 정의합니다.

+
+consistency_models_15 +
+

Fig. 468 Consistency Distillation Loss#

+
+
+

여기서 metric function \(d(\cdot,\cdot)\) 로는 L1 distance, L2 distance, 그리고 LPIPS distance 를 사용하였고, 실험적으로 확인해본 결과 \(\lambda(t_n) \equiv 1\) 를 적용했을 때 모델 성능이 가장 좋은 부분을 확인할 수 있었다고 합니다. 파라미터 \(\theta\) 는 stochastic gradient descent 그리고 \(\theta^-\) 는 exponential moving average (EMA) 로 학습하였다고 합니다.

+
+consistency_models_16 +
+

Fig. 469 Exponential Moving Average (EMA)#

+
+
+

이처럼 EMA update 와 stopgrad operator 로 학습할 시, \(\theta = \theta^{-}\) 로 설정할때보다 모델을 더 안정적으로 학습할 수 있고 성능에도 개선이 있었다고 합니다. 전체적인 학습 절차는 하단의 Algorithm 2 처럼 정리할 수 있습니다.

+
+consistency_models_17 +
+

Fig. 470 Overview of Consistency Distillation (CD)#

+
+
+

\(\theta^{-}\) 는 과거 \(\theta\) 에 대한 running average 이므로 Algorithm 2 가 수렴할 시 이 둘은 일치하게 됩니다. 즉, target network \(f_{\theta^-}\)와 online network \(f_{\theta}\) 가 일치하게 됩니다.

+
+
+

5. Training Consistency Models in Isolation#

+

Consistency Distillation 방식에서는 ground truth score function \(\nabla \log p_t(x_t)\) 을 근사하는 사전학습된 score model \(s_{\phi}(x,t)\) 에 의존했다면, 이에 의존하지 않고 다음과 같은 \(\nabla \log p_t(x_t)\) 에 대한 unbiased estimator 를 활용할 수도 있습니다. 다시 말해, \(-(x_t - x)/t^2\)\(\nabla \log p_t(x_t)\) 를 근사할 수 있습니다.

+
+consistency_models_18 +
+

Fig. 471 Unbiased Estimator of Score Function#

+
+
+
    +
  • \(x \sim p_{data}, x_t \sim N(x; t^2I)\)

  • +
+

Consistency Training (CT) Loss 는 다음과 같이 정의하고, 이는 사전학습된 diffusion model 파라미터 \(\phi\) 와는 독립적인 사실을 확인할 수 있습다.

+
+\[ +L_{CT}^{N}(\theta,\theta^{-}) = \mathbb{E}[\lambda(t_n)d(f_{\theta}(x + t_{n+1}z, t_{n+1}), f_{\theta^-}(x+t_nz, t_n))] +\]
+
    +
  • \(x \sim p_{data}, n \sim \mathbb{U}[[1,N-1]], x_{t_{n+1}} \sim N(x;t^2_{n+1}I), z \sim N(0,I)\)

  • +
  • Consistency Training Loss 를 위와 같이 정의하게 된 배경은 다음과 같습니다.

    +
    +consistency_models_19 +
    +

    Fig. 472 Consistency Training Loss#

    +
    +
    +
  • +
+
+consistency_models_20 +
+

Fig. 473 Schedule Functions for Consistency Training#

+
+
+

논문에서 추가적인 성능 개선을 위해 \(N\) 을 점진적으로 증가시키는 방식을 제안합니다. \(N\) 이 작을수록 (\(i.e., \Delta t\) 가 클수록) consistency training loss 가 consistency distillation loss 와 비교했을때 variance 는 감소하지만 bias 는 증가하게 되어, 초기에 더 빠른 convergence 에 이르는데 용이합니다. 반면에, \(N\) 이 클수록 (\(i.e., \Delta t\) 가 작을수록) variance 는 증가하고 bias 는 감소하게 되어, 학습의 마지막 단계에 적용하는 것이 바람직하다고 제안합니다. EMA decay rate schedule function \(\mu(\cdot)\)\(N\) 에 따라 바뀌는 함수로 최종적으로 정의합니다. 전체적인 학습 절차는 하단의 Algorithm 3 처럼 정리할 수 있습니다.

+
+consistency_models_21 +
+

Fig. 474 Overview of Consistency Training (CT)#

+
+
+
+
+

6. Experiments#

+

논문에서 CIFAR-10, ImageNet 64x64, LSUN Bedroom 256x256, 그리고 LSUN Cat 256x256 데이터셋에 consistency distillation, consistency training 두 학습 방식을 모두 실험하였고, 모델 성능 지표는 FID, IS, Precision, 그리고 Recall 을 사용하였습니다. 모델 architecture 는 CIFAR-10 데이터셋에는 NCSN++, 그리고 그 외 데이터셋에는 ADM 모델을 사용하였습니다.

+
+

6.1. Training Consistency Models#

+

CIFAR-10 데이터셋에 다음과 같은 hyperparameter tuning 작업을 진행하였습니다. (metric function \(d(\cdot,\cdot)\), ODE solver, CD (Consistency Distillation) 에서의 number of discretization steps \(N\), 그리고 CT (Consistency Training)) 에서의 schedule functions \(N(\cdot), \mu(\cdot)\))

+

Parameter Initialization

+

모델 초기 파라미터 값은 다음과 같이 설정하였습니다.

+
    +
  • Consistency Distillation - 사전학습된 diffusion model 파라미터 값

  • +
  • Consistency Training - Random Initialization

  • +
+

Results

+

모델 실험 결과를 다음과 같이 정리할 수 있습니다.

+
+consistency_models_22 +
+

Fig. 475 Experimental Results - Hyperparameters#

+
+
+
    +
  • Consistency Distillation (CD)

    +
      +
    • LPIPS 를 metric function 으로 사용했을때 모델 성능이 가장 좋았고, 이는 LPIPS metric 이 CIFAR-10 와 같은 natural image 들 간의 유사도를 측정하는데 특화되어 있기 때문이라고 합니다.

    • +
    • Euler ODE solver 보다 Heun ODE solver 를 사용했을 때, 그리고 \(N = 18\) 로 설정했을때 모델 성능이 가장 좋았습니다. 또한, 동일한 \(N\) 에 대해서 Heun’s second ode solver 를 사용했을때 Euler’s first ode solver 를 사용했을 때보다 모델 성능이 우월한 부분을 확인할 수 있었다고 합니다.

    • +
    +

    이외에도 다른 데이터셋에 hyperparameter tuning 작업을 별도로 진행하였습니다.

    +
  • +
  • Consistency Training (CT)

    +
      +
    • CD 와 동일하게 LPIPS metric function 사용하였고, ODE solver 는 사용하지 않았습니다.

    • +
    • \(N\) 이 작을수록, 모델이 더 빨리 수렴하지만 생성된 이미지 퀄리티는 좋지 않은 부분을 재차 확인할 수 있습니다. (and vice versa)

    • +
    • \(N\) 을 점차적으로 증가시키면서 \(\mu\) 도 변화시켰을때 성능이 가장 좋았습니다.

    • +
    +
  • +
+
+

6.2. Few-Step Image Generation#

+

Distillation

+

논문에서는 Consistency Distillation 모델의 성능을 synthetic data generation 을 필요하지 않는 knowledge distillation 기법 (PD, Salimans & Ho (2022)) 과 다음과 같이 비교합니다.

+
+consistency_models_23 +
+

Fig. 476 Experimental Results - Distillation#

+
+
+

Direct Generation

+

CIFAR-10 데이터셋 기준으로 VAE, normalizing flow 를 비롯한 타 single-step generative model 보다 CT 가 성능이 가장 좋았습니다. 또한, distillation 기법 없이도 Progressive Distillation (PD, Salimans & Ho (2022)) 와 견줄만한 성능을 가진 부분을 확인할 수 있습니다. 마지막으로 동일한 noise 로부터 높은 structural similarity 를 가진 이미지들을 생성함으로써 self-consistency 성질도 확인할 수 있었다고 합니다.

+
+consistency_models_24 +
+

Fig. 477 Experimental Results - Direct Generation#

+
+
+
+
+
+

6.3. Zero-Shot Image Editing#

+

Diffusion model 과 유사하게 consistency model 도 multistep sampling 알고리즘을 수정함으로써 zero shot image editing 이 가능합니다. 해당 사진은 LSUN Bedroom 데이터셋에 colorization, super-resolution, stroke-guided image editing task 를 적용한 결과입니다.

+
+consistency_models_25 +
+

Fig. 478 Pseudocode for Zero-Shot Image Editing#

+
+
+
+consistency_models_26 +
+

Fig. 479 Zero-Shot Image Editing Results#

+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/cycleGAN.html b/docs/review/cycleGAN.html old mode 100644 new mode 100755 index b8b5a49d..330a3b0d --- a/docs/review/cycleGAN.html +++ b/docs/review/cycleGAN.html @@ -1,949 +1,968 @@ - - - - - - - - - - - - CycleGAN — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

CycleGAN#

-
-

Abstract#

-
    -
  • Image-to-image translation 은 한 이미지 도메인을 다른 이미지 도메인으로 변환시키는 computer vision 의 한 task 입니다.

  • -
  • Image-to-image translation 은 보통 input과 output이 짝이 지어진 상태에서 학습하지만 짝이 지어진 학습 데이터를 얻는 것이 어렵습니다. 따라서 CycleGAN 논문에서는 짝지어진 예시 없이 \(X\) 라는 domain 으로부터 얻은 이미지를 target domain \(Y\) 로 바꾸는 방법을 제안합니다. 이 연구는 Adversarial loss 를 활용해, \(G(x)\) 로부터 생성된 이미지 데이터의 분포와 \(Y\) 로부터의 이미지 데이터의 분포가 구분이 불가능하도록 함수 \(G: X -> Y\) 를 학습시키는 것을 목표로 합니다. 더불어, \(X -> Y\) 로의 mapping 에 제약을 가해서 원하는 이미지를 강제하기 위해 \(F: Y -> X\) 와 같은 역방향 매핑을 함께 진행합니다. 즉, \(F(G(x))\)\(X\) 와 유사해지도록 강제하는 cycle consistency loss 를 도입했습니다.

  • -
  • 결과적으로 collection style transfer, object transfiguration, season transfer, photo enhancement 등의 task 에서 이미지 pair 가 존재하지 않는 상태에서 우수한 결과를 보여줬다고 합니다.

  • -
-
- -
-

Background#

-
-

Image-to-Image Translation#

-
-https://phillipi.github.io/pix2pix/images/teaser_v3.png -
-

Fig. 44 image-to-image translation#

-
-
-

Image-to-image translation 은 input image 를 다른 스타일, 속성, 구조 등을 가진 output image 로 변환하는 task 입니다. 예를 들어 사진을 그림으로 변환한다거나, 낮에 찍은 사진을 밤에 찍은 것 처럼 변환하는 것을 말합니다. 흔히 translation 은 input 과 output 로 짝이 지어진 데이터를 바탕으로 학습이 이루어져 있었는데요. 짝이 지어진 사진 데이터를 얻는 것은 어렵고 값이 비싼 일이 됩니다.

-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhMGUZ%2Fbtr7HimHXN5%2FHvjTh02iCzP5Sgk8UYkKO0%2Fimg.png -
-

Fig. 45 paired and unpaired data#

-
-
-

이 논문에서는 input image와 output image가 일대일로 짝지어지지 않은 상태에서 하나의 image 모음의 특성을 캡쳐하고, 이러한 특성을 다른 image 모음으로 변환할 수 있는 방법을 제시합니다. -GAN은 domain \(X\) 에 이미지 한 세트, domain \(Y\) 에 이미지 한 세트가 제공되고, model 의 output 과 \(Y\) 가 discriminator 에 의해 구별할 수 없도록 모델 \(G: X -> Y\) 를 학습합니다. 하지만, 이것이 개별 입력 \(x\) 와 출력 \(y\) 가 무조건 유의미하게 쌍을 이룬다는 것을 뜻하지는 않습니다. \(G\) 가 생성할 수 있는 image 에는 무한한 경우의 수가 있기 때문에 종종 mode collapse 현상이 일어나기도 합니다.

-
-
-

Mode Collapse#

-
-https://1.bp.blogspot.com/-oDCR5UnEIl4/WZkIId-rYCI/AAAAAAAAAJk/PoLvou4JLNIxn5U-OmPFZ_heyxVQGbMNQCEwYBhgL/s1600/14.png -
-

Fig. 46 mode collapsing 출처: http://dl-ai.blogspot.com/2017/08/gan-problems.html#

-
-
-

어떤 input image 든 모두 같은 output image 로 매핑하면서 최적화에 실패하는 현상입니다. 이 현상은 generator 입장에서, discriminator 가 이 사진이 진짜 \(Y\)인지 가짜인 \(\hat{Y}\)인지 구별하는 것을 ‘속이기만’ 하면 되기 때문에 우리의 목적과 전혀 상관이 없는 데이터를 generator 가 만들더라도 문제가 생기지 않아서 발생합니다.

- -

이러한 이슈로 인해 추가 objective function 이 필요해졌습니다. 따라서 translation task 는 영어 -> 프랑스어 -> 영어로 번역했을 때 원래 문장에 다시 도달하는 것처럼, \(X --> Y --> X'\) 로 돌아가는 과정에서 \(X\)\(X'\) 이 최대한 같아야 한다는 의미의 cycle consistency 이라는 속성을 이용합니다. 필요한 목적식을 간단하게 정리하면 다음과 같습니다.

-
    -
  • 정방향, 역방향 adversarial loss: \(X -> Y & Y -> X\)

  • -
  • Cycle consistency loss: \(X \)\approx\( F(G(x))\)

  • -
-
-
-
-

Method#

- - -
-

Overview#

-
-../../_images/fig2.png -
-

Fig. 47 CycleGAN 도식화 자료#

-
-
-
    -
  • 목표: \(X\), \(Y\) 를 mapping 하는 function 을 학습하는 것

  • -
  • 용어 정리

    -
      -
    • data 분포를 \(x ~ p_{data}(x)\), \(y ~ p_{data}(y)\) 로 표기

    • -
    • \(G : X -> Y\), \(F: Y -> X\) 는 generator

    • -
    • \(D_X\), \(D_Y\) 는 discriminator

    • -
    • \(D_X\)\(X\)\(F(y)\) 그리고 \(D_Y\)\(y\)\(G(x)\) 를 구분하고, 다음과 같이 두 개의 목적식으로 학습합니다.

      -
        -
      • adversarial loss: 생성된 이미지의 분포를 대상 domain 의 data distribution 과 일치시키기 위한 것.

      • -
      • cycle consistency loss: 학습된 mapping \(G\)\(F\) 가 서로 모순되는 것을 방지하기 위한 것.

      • -
      -
    • -
    -
  • -
-
-
-

Adversarial Loss#

-

\(G: X -> Y\)\(D_Y\) 에 대한 목적식은 다음과 같습니다.

-
-L_GAN Loss function -
-

Fig. 48 \(\mathcal{L}_{GAN}\) Loss function (source: https://arxiv.org/abs/1703.10593)#

-
-
-

이는 GAN 에서 쓰이는 loss function 를 사용하지만, 차이점이 있다면 \(X -> Y\) 로 갈 때와 \(Y -> X\) 로 갈 때 총 두 개의 수식이 나옵니다. 다시 말해, \(F: Y -> X\)\(D_X\) 에 대해서도 \(F\), \(D_X\) 를 넣은 동일한 수식을 사용합니다.

-
-
-

Cycle Consistency Loss#

-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmq8pC%2Fbtr724Pl3Q2%2FUSK4TDRaUK860iIdvG0vV0%2Fimg.png -
-

Fig. 49 cycle consistency loss function#

-
-
-
    -
  • 앞서 말했듯이, mapping distribution 에 제한을 두어 최대한 우리가 원하는 이미지를 생성하기 위해 사용되는 loss function 입니다.

  • -
  • 예비 실험에서 L1 norm 을 adversarial loss 로 대체해봤는데, 성능 향상을 관찰할 수 없었다고 합니다.

  • -
  • cycle consistency loss 를 통해 유도된 결과는 아래 그림에서 볼 수 있습니다.

  • -
-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzsgD6%2Fbtr8ay8PEBE%2F3mAKd1YSAiCK4ZXeIg84s1%2Fimg.png -
-

Fig. 50 cycle consistency loss result#

-
-
-
-
-

Full Objective#

-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUyaOu%2Fbtr724Pl3Rj%2FigjKaeukv5m8Cbdzulp5jK%2Fimg.png -
-

Fig. 51 full objective function#

-
-
-

이때 consistency loss 앞에 붙은 가중치 \(\lambda\) 는 GAN Loss 와의 상대적 중요도에 따라 결정됩니다.

-
-
-
-

Implementation#

-
-

Network Architecture#

-

Baseline architecture 로서 neural style transfer 와 super-resolution 에 인상적인 결과를 보여준 논문(https://arxiv.org/abs/1603.08155) 에서 사용된 구조를 채택합니다.

-
    -
  • 3 개의 convolutions and several residual blocks,

  • -
  • fractionally-strided convolution with stride 1/2,

  • -
  • feature 를 RGB 로 매핑하는 one convolution layer.

  • -
  • 6 blocks for 128 x 128 image // 9 blocks for 256 x 256 및 고해상도 학습 image.

  • -
  • instance normalization

  • -
-
-
-

Training details#

-

모델 학습을 안정화시키기 위해 아래와 같은 테크닉을 추가로 적용합니다.

-
    -
  • Loss function \(\mathcal{L}_{GAN}\) 에서 nll loss 를 least-squared loss 로 변경

  • -
  • 생성된 이미지 중 가장 최근의 50개를 따로 저장해 discriminator 가 이를 한꺼번에 분류(모델 진동을 최소화하기 위함)

  • -
-
-
-

(참고) least-square loss 추가 설명#

- -

LSGAN 을 참고했으며, 논문에서는 generator 업데이트시 더 안정적인 학습과 quality 높은 결과를 생성한다고 합니다.

-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6JIT8%2Fbtr73nVyIqs%2FKfcPK33U3OY0AjKhjFlUh1%2Fimg.png -
-

Fig. 52 출처: https://velog.io/@sjinu/CycleGAN#

-
-
-

(원래 Discriminator 는 이보다 더 고차원이지만) 간략히 2차원을 표방하면 결정경계를 위와 같이 나타낼 수 있습니다. 윗 쪽이 가짜 영역, 아래 쪽이 진짜 영역입니다 이 때, 아래에 보면 진짜 데이터 샘플과 거리가 먼 가짜 데이터 샘플이 존재합니다. 즉, NLL Loss 를 사용한다면, Generator 의 입장에서는 이미 Discriminator 를 잘 속이고 있기 때문에 학습할 필요가 없게 됩니다. 즉, Vanishing Gradient 현상이 일어나기 때문에, Discriminator 를 잘 속인다는 이유만으로, 안 좋은 샘플을 생성하는 것에 대해 패널티를 줄 수가 없게 됩니다. 이 때, LSGAN 을 사용한다면 실제 데이터 분포와 가짜 데이터 샘플이 거리가 먼 것에 대해서도 패널티를 주게 됩니다.

-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHsUiX%2Fbtr77PQw99h%2F0Er06IYIGYlBGw2rVufXc0%2Fimg.png -
-

Fig. 53 출처: https://velog.io/@sjinu/CycleGAN#

-
-
-

그리고 모든 실험에 대해서 \(\lambda\) 를 10 으로 설정하고, batch size = 1, 그리고 Adam solver 를 사용했습니다. 첫 100 epoch 동안에는 learning rate 를 0.0002 로 설정했고, 다음 100 epoch 마다 0 으로 조금식 수렴하게 scheduling 하였습니다.

-
-
-
-

Evaluation#

-

모델 성능 평가를 위해 아래와 같은 세 개의 지표를 기반으로 기존의 CoGAN, SimGAN, pix2pix baseline 모델과 비교했습니다. 그 외 loss function 에 대한 ablation study 도 수행했습니다.

-
    -
  1. AMT perceptual studies: 참가자들은 실제 사진이미지 vs 가짜 이미지, 또는 지도 이미지 vs 가짜이미지에 노출된 후 진짜라고 생각되는 이미지를 선택하게 합니다.

  2. -
  3. FCN Score: 1번 study 가 테스트에 있어 매우 좋은 기준임에도 불구하고, 이번에는 사람을 대상으로 한 실험이 아닌 양적인 기준을 사용합니다. 우선적으로 FCN 모델을 통해 생성된 사진에 대한 레이블 맵을 예측합니다. 이 레이블 맵은 아래에서 설명하는 standard semantic segmentation metric 을 사용하여 input ground truth label 과 비교할 수 있습니다. “도로 상의 자동차”라는 label 에서 사진 이미지를 생성하면, 생성된 이미지에 적용된 FCN 이 “도로 상의 자동차”를 감지하면 성공한 것입니다.

  4. -
  5. Semantic segmentation metric: pixel 당 정확도, class 당 정확도, 그리고 IoU(Intersection-Over-Union) 를 포함하는 cityscapes benchmark 의 표준 metric 를 사용합니다.

  6. -
-
-

Comparison against baselines#

-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZUe4E%2Fbtr8eXUQ6ou%2FikWglP8dEglGUny4dRkMjK%2Fimg.png -
-

Fig. 54 Comparison aginst baselines#

-
-
-

타 baseline 모델보다 성능이 좋을 뿐만 아니라, fully supervised 모델인 pix2pix 와 비슷한 품질의 translation 성능을 보여줍니다.

-
    -
  • AMT Score *

  • -
-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1Zhnx%2Fbtr8eWhk9ID%2FtauuT1N0W2qxRekj3IAnc1%2Fimg.png -
-

Fig. 55 AMT score#

-
-
-

Table 1 은 AMT perceptual realism task 에 대한 성능을 나타냅니다. CycleGAN 의 지도에서 항공 사진, 그리고 항공 사진에서 지도 translation 결과에서 약 1/4의 참가자를 속일 수 있었던 반면에 그 외 모든 baseline 모델은 참가자를 거의 속일 수 없었습니다.

-
    -
  • FCN Score *

  • -
-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqzYO1%2Fbtr728xs5iD%2FN5NDNYwUYLnEZfnOVYONM0%2Fimg.png -
-

Fig. 56 FCN scores#

-
-
-

Table 2, Table 3 는 각각 도시 풍경에 대한 label -> photo, 그리고 photo -> label translation task 의 성능을 보여줍니다. 두 경우 모두 CycleGAN 이 baseline 들의 성능을 능가합니다.

-
-
-

Ablation Study - Analysis of the loss function#

-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjQ9QQ%2Fbtr79farEX8%2FkQ6SWARw9QK9jqRqHlZoi1%2Fimg.png -
-

Fig. 57 Analysis of loss function#

-
-
-

GAN 과 cycle consistency loss 의 중요성을 보여주는 ablation study 입니다. GAN loss 그리고 cycle consistency loss 를 각각 제거하면 성능이 크게 저하되는 부분을 확인할 수 있습니다. 또한 한쪽 방향에 대해서만 GAN + forward cycle 만 돌렸을 때와 GAN + backward cycle 만 돌렸을 때 학습의 불안정성을 보이고, mode collapse 를 유발하는 것을 확인할 수 있었다고 합니다.

-
-
-

Image reconstruction quality#

-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyy7lt%2Fbtr73PdbuJp%2F5bmDtKSlQJJnd5yKvPgfB1%2Fimg.png -
-

Fig. 58 Results on Cycle Consistency#

-
-
-

Reconctructed 된 이미지 예시들입니다. 지도 -> 항공 사진과 같이 하나의 도메인이 훨씬 더 다양한 정보를 나타내는 경우에도 재구성된 이미지가 훈련 및 테스트 시 모두 원래 입력 \(x\) 에 가깝게 복원되는 경우가 많았습니다.

-
-
-

Additional results on paired datasets#

-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqNrhb%2Fbtr72YaInQa%2Fk8b4K99KrAsD9C0SHINtt1%2Fimg.png -
-

Fig. 59 Additional results on paired datasets#

-
-
-

Figure 8 은 CMP Facade Database 의 건축 레이블 <-> 사진, 그리고 UT Zapoos50K dataset 의 edge <-> 신발 을 비롯하여 pix2pix 에 사용된 paired dataset 에 대한 몇 가지 예시 결과를 보여줍니다. CycleGAN 이 생성한 이미지 품질이 fully supervised 된 pix2pix 에 대응하는 성능을 보여주는 것을 확인할 수 있습니다.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - : shallow depth of field: 얕은 초점. 초점이 맞은 대상과 배경이 흐릿하게 보이는 효과. 인물 사진 / 작품 사진에 활용. 구목하고자 하는 대상을 강조하기 위해 활용. --> - 따라서 source domain은 스마트폰의 **작은 조리개로 깊은 초점** \--> target은 **조리개가 커서 얕은 초점**.--> - - -
-
-
-

Limitations and Discusssion#

-
-https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJc1k5%2Fbtr76zUPUWj%2F27Mk0oQ5VanEHANWWmaseK%2Fimg.png -
-

Fig. 60 Limitations and Discussion#

-
-
-

이 방법은 많은 경우에 흥미로운 결과를 얻을 수 있지만, 결과가 균일하게 좋은 것은 아니었습니다.

-
    -
  1. 개 <-> 고양이 translation task 와 같은 경우는 input image 에서 최소한의 변화만 주어, 사람이 보았을 때 실제로 변화가 안되는 경우도 있었고, 형체가 애매해진 경우도 있었습니다. 이를 보았을 때, geometry 가 반영되는 눈, 코, 입 등의 세부적인 구조에 대한 정확히 구현하는데 한계가 있어 보입니다.

  2. -
  3. 말 <–> 얼룩말 translation 예제의 경우, 말은 사람이 타는 모습이 많았는데 얼룩말의 경우는 사람이 타는 사진이 없다보니, 사람 뿐만 아니라 배경도 얼룩 그림을 그리거나 단순히 얼룩말에서 노랗게 칠한 경우가 존재합니다.

  4. -
  5. 때때로 photo -> image translation task 에서 나무와 건물의 label 을 바꾸는 경우도 있었습니다.
    -이러한 모호성을 해결하려면 weak semantic supervision 이 필요할 수도 있을 것 같습니다.

  6. -
-

그럼에도 불구하고 해당 논문은 완전히 paired 되지 않은 “unsupervised” setting 에서도 image translation task 의 한계를 늘리는데 기여합니다.

-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + CycleGAN — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

CycleGAN#

+
+

Abstract#

+
    +
  • Image-to-image translation 은 한 이미지 도메인을 다른 이미지 도메인으로 변환시키는 computer vision 의 한 task 입니다.

  • +
  • Image-to-image translation 은 보통 input과 output이 짝이 지어진 상태에서 학습하지만 짝이 지어진 학습 데이터를 얻는 것이 어렵습니다. 따라서 CycleGAN 논문에서는 짝지어진 예시 없이 \(X\) 라는 domain 으로부터 얻은 이미지를 target domain \(Y\) 로 바꾸는 방법을 제안합니다. 이 연구는 Adversarial loss 를 활용해, \(G(x)\) 로부터 생성된 이미지 데이터의 분포와 \(Y\) 로부터의 이미지 데이터의 분포가 구분이 불가능하도록 함수 \(G: X -> Y\) 를 학습시키는 것을 목표로 합니다. 더불어, \(X -> Y\) 로의 mapping 에 제약을 가해서 원하는 이미지를 강제하기 위해 \(F: Y -> X\) 와 같은 역방향 매핑을 함께 진행합니다. 즉, \(F(G(x))\)\(X\) 와 유사해지도록 강제하는 cycle consistency loss 를 도입했습니다.

  • +
  • 결과적으로 collection style transfer, object transfiguration, season transfer, photo enhancement 등의 task 에서 이미지 pair 가 존재하지 않는 상태에서 우수한 결과를 보여줬다고 합니다.

  • +
+
+ +
+

Background#

+
+

Image-to-Image Translation#

+
+https://phillipi.github.io/pix2pix/images/teaser_v3.png +
+

Fig. 44 image-to-image translation#

+
+
+

Image-to-image translation 은 input image 를 다른 스타일, 속성, 구조 등을 가진 output image 로 변환하는 task 입니다. 예를 들어 사진을 그림으로 변환한다거나, 낮에 찍은 사진을 밤에 찍은 것 처럼 변환하는 것을 말합니다. 흔히 translation 은 input 과 output 로 짝이 지어진 데이터를 바탕으로 학습이 이루어져 있었는데요. 짝이 지어진 사진 데이터를 얻는 것은 어렵고 값이 비싼 일이 됩니다.

+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhMGUZ%2Fbtr7HimHXN5%2FHvjTh02iCzP5Sgk8UYkKO0%2Fimg.png +
+

Fig. 45 paired and unpaired data#

+
+
+

이 논문에서는 input image와 output image가 일대일로 짝지어지지 않은 상태에서 하나의 image 모음의 특성을 캡쳐하고, 이러한 특성을 다른 image 모음으로 변환할 수 있는 방법을 제시합니다. +GAN은 domain \(X\) 에 이미지 한 세트, domain \(Y\) 에 이미지 한 세트가 제공되고, model 의 output 과 \(Y\) 가 discriminator 에 의해 구별할 수 없도록 모델 \(G: X -> Y\) 를 학습합니다. 하지만, 이것이 개별 입력 \(x\) 와 출력 \(y\) 가 무조건 유의미하게 쌍을 이룬다는 것을 뜻하지는 않습니다. \(G\) 가 생성할 수 있는 image 에는 무한한 경우의 수가 있기 때문에 종종 mode collapse 현상이 일어나기도 합니다.

+
+
+

Mode Collapse#

+
+https://1.bp.blogspot.com/-oDCR5UnEIl4/WZkIId-rYCI/AAAAAAAAAJk/PoLvou4JLNIxn5U-OmPFZ_heyxVQGbMNQCEwYBhgL/s1600/14.png +
+

Fig. 46 mode collapsing 출처: http://dl-ai.blogspot.com/2017/08/gan-problems.html#

+
+
+

어떤 input image 든 모두 같은 output image 로 매핑하면서 최적화에 실패하는 현상입니다. 이 현상은 generator 입장에서, discriminator 가 이 사진이 진짜 \(Y\)인지 가짜인 \(\hat{Y}\)인지 구별하는 것을 ‘속이기만’ 하면 되기 때문에 우리의 목적과 전혀 상관이 없는 데이터를 generator 가 만들더라도 문제가 생기지 않아서 발생합니다.

+ +

이러한 이슈로 인해 추가 objective function 이 필요해졌습니다. 따라서 translation task 는 영어 -> 프랑스어 -> 영어로 번역했을 때 원래 문장에 다시 도달하는 것처럼, \(X --> Y --> X'\) 로 돌아가는 과정에서 \(X\)\(X'\) 이 최대한 같아야 한다는 의미의 cycle consistency 이라는 속성을 이용합니다. 필요한 목적식을 간단하게 정리하면 다음과 같습니다.

+
    +
  • 정방향, 역방향 adversarial loss: \(X -> Y & Y -> X\)

  • +
  • Cycle consistency loss: \(X \)\approx\( F(G(x))\)

  • +
+
+
+
+

Method#

+ + +
+

Overview#

+
+../../_images/fig2.png +
+

Fig. 47 CycleGAN 도식화 자료#

+
+
+
    +
  • 목표: \(X\), \(Y\) 를 mapping 하는 function 을 학습하는 것

  • +
  • 용어 정리

    +
      +
    • data 분포를 \(x ~ p_{data}(x)\), \(y ~ p_{data}(y)\) 로 표기

    • +
    • \(G : X -> Y\), \(F: Y -> X\) 는 generator

    • +
    • \(D_X\), \(D_Y\) 는 discriminator

    • +
    • \(D_X\)\(X\)\(F(y)\) 그리고 \(D_Y\)\(y\)\(G(x)\) 를 구분하고, 다음과 같이 두 개의 목적식으로 학습합니다.

      +
        +
      • adversarial loss: 생성된 이미지의 분포를 대상 domain 의 data distribution 과 일치시키기 위한 것.

      • +
      • cycle consistency loss: 학습된 mapping \(G\)\(F\) 가 서로 모순되는 것을 방지하기 위한 것.

      • +
      +
    • +
    +
  • +
+
+
+

Adversarial Loss#

+

\(G: X -> Y\)\(D_Y\) 에 대한 목적식은 다음과 같습니다.

+
+L_GAN Loss function +
+

Fig. 48 \(\mathcal{L}_{GAN}\) Loss function (source: https://arxiv.org/abs/1703.10593)#

+
+
+

이는 GAN 에서 쓰이는 loss function 를 사용하지만, 차이점이 있다면 \(X -> Y\) 로 갈 때와 \(Y -> X\) 로 갈 때 총 두 개의 수식이 나옵니다. 다시 말해, \(F: Y -> X\)\(D_X\) 에 대해서도 \(F\), \(D_X\) 를 넣은 동일한 수식을 사용합니다.

+
+
+

Cycle Consistency Loss#

+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmq8pC%2Fbtr724Pl3Q2%2FUSK4TDRaUK860iIdvG0vV0%2Fimg.png +
+

Fig. 49 cycle consistency loss function#

+
+
+
    +
  • 앞서 말했듯이, mapping distribution 에 제한을 두어 최대한 우리가 원하는 이미지를 생성하기 위해 사용되는 loss function 입니다.

  • +
  • 예비 실험에서 L1 norm 을 adversarial loss 로 대체해봤는데, 성능 향상을 관찰할 수 없었다고 합니다.

  • +
  • cycle consistency loss 를 통해 유도된 결과는 아래 그림에서 볼 수 있습니다.

  • +
+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzsgD6%2Fbtr8ay8PEBE%2F3mAKd1YSAiCK4ZXeIg84s1%2Fimg.png +
+

Fig. 50 cycle consistency loss result#

+
+
+
+
+

Full Objective#

+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUyaOu%2Fbtr724Pl3Rj%2FigjKaeukv5m8Cbdzulp5jK%2Fimg.png +
+

Fig. 51 full objective function#

+
+
+

이때 consistency loss 앞에 붙은 가중치 \(\lambda\) 는 GAN Loss 와의 상대적 중요도에 따라 결정됩니다.

+
+
+
+

Implementation#

+
+

Network Architecture#

+

Baseline architecture 로서 neural style transfer 와 super-resolution 에 인상적인 결과를 보여준 논문(https://arxiv.org/abs/1603.08155) 에서 사용된 구조를 채택합니다.

+
    +
  • 3 개의 convolutions and several residual blocks,

  • +
  • fractionally-strided convolution with stride 1/2,

  • +
  • feature 를 RGB 로 매핑하는 one convolution layer.

  • +
  • 6 blocks for 128 x 128 image // 9 blocks for 256 x 256 및 고해상도 학습 image.

  • +
  • instance normalization

  • +
+
+
+

Training details#

+

모델 학습을 안정화시키기 위해 아래와 같은 테크닉을 추가로 적용합니다.

+
    +
  • Loss function \(\mathcal{L}_{GAN}\) 에서 nll loss 를 least-squared loss 로 변경

  • +
  • 생성된 이미지 중 가장 최근의 50개를 따로 저장해 discriminator 가 이를 한꺼번에 분류(모델 진동을 최소화하기 위함)

  • +
+
+
+

(참고) least-square loss 추가 설명#

+ +

LSGAN 을 참고했으며, 논문에서는 generator 업데이트시 더 안정적인 학습과 quality 높은 결과를 생성한다고 합니다.

+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6JIT8%2Fbtr73nVyIqs%2FKfcPK33U3OY0AjKhjFlUh1%2Fimg.png +
+

Fig. 52 출처: https://velog.io/@sjinu/CycleGAN#

+
+
+

(원래 Discriminator 는 이보다 더 고차원이지만) 간략히 2차원을 표방하면 결정경계를 위와 같이 나타낼 수 있습니다. 윗 쪽이 가짜 영역, 아래 쪽이 진짜 영역입니다 이 때, 아래에 보면 진짜 데이터 샘플과 거리가 먼 가짜 데이터 샘플이 존재합니다. 즉, NLL Loss 를 사용한다면, Generator 의 입장에서는 이미 Discriminator 를 잘 속이고 있기 때문에 학습할 필요가 없게 됩니다. 즉, Vanishing Gradient 현상이 일어나기 때문에, Discriminator 를 잘 속인다는 이유만으로, 안 좋은 샘플을 생성하는 것에 대해 패널티를 줄 수가 없게 됩니다. 이 때, LSGAN 을 사용한다면 실제 데이터 분포와 가짜 데이터 샘플이 거리가 먼 것에 대해서도 패널티를 주게 됩니다.

+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHsUiX%2Fbtr77PQw99h%2F0Er06IYIGYlBGw2rVufXc0%2Fimg.png +
+

Fig. 53 출처: https://velog.io/@sjinu/CycleGAN#

+
+
+

그리고 모든 실험에 대해서 \(\lambda\) 를 10 으로 설정하고, batch size = 1, 그리고 Adam solver 를 사용했습니다. 첫 100 epoch 동안에는 learning rate 를 0.0002 로 설정했고, 다음 100 epoch 마다 0 으로 조금식 수렴하게 scheduling 하였습니다.

+
+
+
+

Evaluation#

+

모델 성능 평가를 위해 아래와 같은 세 개의 지표를 기반으로 기존의 CoGAN, SimGAN, pix2pix baseline 모델과 비교했습니다. 그 외 loss function 에 대한 ablation study 도 수행했습니다.

+
    +
  1. AMT perceptual studies: 참가자들은 실제 사진이미지 vs 가짜 이미지, 또는 지도 이미지 vs 가짜이미지에 노출된 후 진짜라고 생각되는 이미지를 선택하게 합니다.

  2. +
  3. FCN Score: 1번 study 가 테스트에 있어 매우 좋은 기준임에도 불구하고, 이번에는 사람을 대상으로 한 실험이 아닌 양적인 기준을 사용합니다. 우선적으로 FCN 모델을 통해 생성된 사진에 대한 레이블 맵을 예측합니다. 이 레이블 맵은 아래에서 설명하는 standard semantic segmentation metric 을 사용하여 input ground truth label 과 비교할 수 있습니다. “도로 상의 자동차”라는 label 에서 사진 이미지를 생성하면, 생성된 이미지에 적용된 FCN 이 “도로 상의 자동차”를 감지하면 성공한 것입니다.

  4. +
  5. Semantic segmentation metric: pixel 당 정확도, class 당 정확도, 그리고 IoU(Intersection-Over-Union) 를 포함하는 cityscapes benchmark 의 표준 metric 를 사용합니다.

  6. +
+
+

Comparison against baselines#

+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZUe4E%2Fbtr8eXUQ6ou%2FikWglP8dEglGUny4dRkMjK%2Fimg.png +
+

Fig. 54 Comparison aginst baselines#

+
+
+

타 baseline 모델보다 성능이 좋을 뿐만 아니라, fully supervised 모델인 pix2pix 와 비슷한 품질의 translation 성능을 보여줍니다.

+
    +
  • AMT Score *

  • +
+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1Zhnx%2Fbtr8eWhk9ID%2FtauuT1N0W2qxRekj3IAnc1%2Fimg.png +
+

Fig. 55 AMT score#

+
+
+

Table 1 은 AMT perceptual realism task 에 대한 성능을 나타냅니다. CycleGAN 의 지도에서 항공 사진, 그리고 항공 사진에서 지도 translation 결과에서 약 1/4의 참가자를 속일 수 있었던 반면에 그 외 모든 baseline 모델은 참가자를 거의 속일 수 없었습니다.

+
    +
  • FCN Score *

  • +
+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqzYO1%2Fbtr728xs5iD%2FN5NDNYwUYLnEZfnOVYONM0%2Fimg.png +
+

Fig. 56 FCN scores#

+
+
+

Table 2, Table 3 는 각각 도시 풍경에 대한 label -> photo, 그리고 photo -> label translation task 의 성능을 보여줍니다. 두 경우 모두 CycleGAN 이 baseline 들의 성능을 능가합니다.

+
+
+

Ablation Study - Analysis of the loss function#

+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjQ9QQ%2Fbtr79farEX8%2FkQ6SWARw9QK9jqRqHlZoi1%2Fimg.png +
+

Fig. 57 Analysis of loss function#

+
+
+

GAN 과 cycle consistency loss 의 중요성을 보여주는 ablation study 입니다. GAN loss 그리고 cycle consistency loss 를 각각 제거하면 성능이 크게 저하되는 부분을 확인할 수 있습니다. 또한 한쪽 방향에 대해서만 GAN + forward cycle 만 돌렸을 때와 GAN + backward cycle 만 돌렸을 때 학습의 불안정성을 보이고, mode collapse 를 유발하는 것을 확인할 수 있었다고 합니다.

+
+
+

Image reconstruction quality#

+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyy7lt%2Fbtr73PdbuJp%2F5bmDtKSlQJJnd5yKvPgfB1%2Fimg.png +
+

Fig. 58 Results on Cycle Consistency#

+
+
+

Reconctructed 된 이미지 예시들입니다. 지도 -> 항공 사진과 같이 하나의 도메인이 훨씬 더 다양한 정보를 나타내는 경우에도 재구성된 이미지가 훈련 및 테스트 시 모두 원래 입력 \(x\) 에 가깝게 복원되는 경우가 많았습니다.

+
+
+

Additional results on paired datasets#

+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqNrhb%2Fbtr72YaInQa%2Fk8b4K99KrAsD9C0SHINtt1%2Fimg.png +
+

Fig. 59 Additional results on paired datasets#

+
+
+

Figure 8 은 CMP Facade Database 의 건축 레이블 <-> 사진, 그리고 UT Zapoos50K dataset 의 edge <-> 신발 을 비롯하여 pix2pix 에 사용된 paired dataset 에 대한 몇 가지 예시 결과를 보여줍니다. CycleGAN 이 생성한 이미지 품질이 fully supervised 된 pix2pix 에 대응하는 성능을 보여주는 것을 확인할 수 있습니다.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + : shallow depth of field: 얕은 초점. 초점이 맞은 대상과 배경이 흐릿하게 보이는 효과. 인물 사진 / 작품 사진에 활용. 구목하고자 하는 대상을 강조하기 위해 활용. --> + 따라서 source domain은 스마트폰의 **작은 조리개로 깊은 초점** \--> target은 **조리개가 커서 얕은 초점**.--> + + +
+
+
+

Limitations and Discusssion#

+
+https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJc1k5%2Fbtr76zUPUWj%2F27Mk0oQ5VanEHANWWmaseK%2Fimg.png +
+

Fig. 60 Limitations and Discussion#

+
+
+

이 방법은 많은 경우에 흥미로운 결과를 얻을 수 있지만, 결과가 균일하게 좋은 것은 아니었습니다.

+
    +
  1. 개 <-> 고양이 translation task 와 같은 경우는 input image 에서 최소한의 변화만 주어, 사람이 보았을 때 실제로 변화가 안되는 경우도 있었고, 형체가 애매해진 경우도 있었습니다. 이를 보았을 때, geometry 가 반영되는 눈, 코, 입 등의 세부적인 구조에 대한 정확히 구현하는데 한계가 있어 보입니다.

  2. +
  3. 말 <–> 얼룩말 translation 예제의 경우, 말은 사람이 타는 모습이 많았는데 얼룩말의 경우는 사람이 타는 사진이 없다보니, 사람 뿐만 아니라 배경도 얼룩 그림을 그리거나 단순히 얼룩말에서 노랗게 칠한 경우가 존재합니다.

  4. +
  5. 때때로 photo -> image translation task 에서 나무와 건물의 label 을 바꾸는 경우도 있었습니다.
    +이러한 모호성을 해결하려면 weak semantic supervision 이 필요할 수도 있을 것 같습니다.

  6. +
+

그럼에도 불구하고 해당 논문은 완전히 paired 되지 않은 “unsupervised” setting 에서도 image translation task 의 한계를 늘리는데 기여합니다.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/dalle.html b/docs/review/dalle.html old mode 100644 new mode 100755 index c0caff0e..c3ba8dad --- a/docs/review/dalle.html +++ b/docs/review/dalle.html @@ -1,888 +1,907 @@ - - - - - - - - - - - - DALL-E — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

DALL-E#

-
-

1. Introduction#

-
    -
  • GPT-3 기반 모델이며 120억개 parameter 수와 2.5억 데이터 (text,image) set으로 학습

  • -
  • Autoregressive 한 모델링을 통하여 image와 text를 이용하여 text-to-image generation task를 수행

  • -
  • 2021년 기준 zero-shot SOTA performance 달성

  • -
  • 아래 그림과 같이 text input에 따라 diverse한 이미지 생성

  • -
-
-fig1 -
-

Fig. 85 Images generated using DALL-E#

-
-
-
-fig2 -
-

Fig. 86 Images generated using DALL-E#

-
-
-
-
-

2. Background#

-
    -
  • GPT-3와 VQ-VAE를 활용하여 나온 논문.

  • -
  • VQ-VAE를 먼저 학습하고, Autoregressive Transformer을 순차적으로 학습하여 zero-shot architecture을 구축.

  • -
-
-

GPT-3#

-
    -
  • Autoregressive Language Model며 few-shot learning을 통해 fine-tuning 없이 높은 성능을 냄 *(fine-tuning 을 할 수는 있지만 본 논문에서는 task-agnostic performance 에 중점을 맞춰 Few shot을 함)

  • -
  • GPT-3 는 transformer에서 decoder 부분만 사용 (GPT-2 와 유사한 구조를 가지고 있음 )

  • -
  • 약 1750억 parameter 개수의 모델

  • -
-
-fig3 -
-

Fig. 87 Transformer 아키텍쳐 \ (source: https://arxiv.org/pdf/2005.14165.pdf)#

-
-
-
-GPT-3 GIF -
-

Fig. 88 GPT 3 Animation \ (source: https://jalammar.github.io/how-gpt3-works-visualizations-animations/)#

-
-
-
-
-

VQ-VAE#

-
    -
  • Encoder에서 나온 output은 discrete 하며 posterior 과 prior 이 categorical distribution을 갖는다고 가정함.

  • -
  • CNN (encoder) 을 거친 각 D차원의 위치에 \(H \times W\) 그리드로 이미지를 나누고 embedding space (Codebook) 에서 \(𝑒_1\)부터 \(𝑒_𝑘\) 중에서 가까운 1개 embedding code로 변환.

  • -
  • Quantization: Encoding output \(z_{e}(x)\) representation 과 유사한 codebook embedding \(e_j\) 를 찾아서 \(k\) 값을 부여함.

  • -
-
-fig5 -
-

Fig. 89 VQ-VAE 아키텍쳐, Loss 함수 \ (source: https://velog.io/@p2yeong/Understanding-VQ-VAE-DALL-E-Explained-Pt.-1)#

-
-
-
-fig6 -
-

Fig. 90 Quantization of VQ-VAE#

-
-
-
-
-
-

3. Methodology#

-
-
-

Limitation of Previous Works#

-
    -
  1. Memory/Bottleneck Issue

  2. -
-
    -
  • 각 Image에서 나오는 pixel을 직접적으로 image token을 사용하면 고화질 이미지일수록 너무 많은 메모리량이 필요해서 “비효율적”

  • -
-
    -
  1. Short-range dependence modeling between pixels

  2. -
-
    -
  • Model들 중 Likelihood function을 objective function으로 사용하면 short-range dependency를 우선적으로 볼 것이며 low-frequency 보다 high-frequency detail에 더욱 집중하게 됨.

  • -
  • Low frequency 는 visually recognizable해서 시각적으로 더 도움이 되는 부분

  • -
-

이 2가지 문제점을 극복하고자 Two-stage training process 제안

-
-
-

DALL-E Overview#

-
-

Stage 1: Training VQ-VAE#

-
    -
  • Discrete VAE를 이용하여 \(256 \times 256\) RGB image \rightarrow \(32 \times 32\) 이미지 토큰으로 압축

  • -
  • 각 이미지 토큰은 8,192개의 code 값 중에 하나 배정

  • -
  • 이미지의 quality 손실 없이 \(8 \times 8 \times 3\) 배 만큼 context size를 적게 만들 수 있음.

  • -
-
-
-

Stage 2: Training an Autoregressive Transformer#

-
    -
  • 최대 256 BPE-Encoded text tokens들과 1024 image tokens (\(32 \times 32\)) 를 연속적으로 입력함 (concatenate)

  • -
  • Text token과 Image Tokens 들의 joint distribution (결합 분포)를 모델링하여 autoregressive transformer을 학습

  • -
-
-
-
-

DALL-E Pipeline 예시#

-
-fig7 -
-

Fig. 91 DALL-E 시각화 \ (source:https://jiho-ml.com/weekly-nlp-40/)#

-
-
-
-fig8 -
-

Fig. 92 DALL-E 파이프라인 \ (source:https://www.youtube.com/watch?v=CQoM0r2kMvI&t=1729s)#

-
-
-
-
-

Methodology Details#

-
-

DALL-E Equations#

-
-fig9 -
-

Fig. 93 equation 1#

-
-
-
-fig10 -
-

Fig. 94 equation 2: Maximizing ELBO#

-
-
-

x: images, y: captions , z: encoded RGB image tokens

-

𝑞Φ (red) : input image에서 dVAE encoder에서 생성한 32 x 32 image token를 예측

-

𝑝𝜃 (blue): image token에서 dVAE decoder에서 생성한 RGB image를 예측

-

𝑝ψ (purple): transformer 모델로 모델링한 text와 image token들의 결합 분포 (joint distribution)

-
-
-

DALL-E 학습과정 Stage 1: Learning the VIsual Codebook#

-
    -
  • Transformer을 고정하고 dVAE encoder & decoder (𝑞_Φ , 𝑝_𝜃) 을 학습함

    -
      -
    • 즉, ELB (Evidence Lower Bound를 maximize 함)

    • -
    • K = 8,192 codebook (embedding space)로 설정

    • -
    -
  • -
  • ELB를 optimize 하기 위해서는 discrete distribution을 continuous를 바꿔야 함

    -
      -
    • 학습시에는 결국, argmax를 사용해서 codebook vector 인덱스를 선택하여 계산하면 Reparameterization gradient를 연산 X

    • -
    • argmax 대신 gumbel softmax를 사용하여 해결

    • -
    • 평가를 진행할 때에는 \(z = codebook[\underset{i}{argmax}[g_i+log(q(e_i|x))]]\)

    • -
    -
  • -
  • Gumbel Softmax Relaxation를 사용하여 해결! \(q_\phi \rightarrow q_{\phi}^{\tau}\), temperature \(\tau \rightarrow 0\), relaxation을 tight하게 잡아줌.

  • -
-
-
-

DALL-E 학습과정 Stage 2: Learning the Prior#

-
    -
  • Transformer을 고정하고 dVAE encoder & decoder (\(q_{phi}\) , \(p_{\theta}\)) transformer의 prior distribution \(p_{\psi}\)를 학습함.

  • -
  • 이때, \(p_{\psi}\)의 ELB를 maximize 하며 120억개의 parameter를 가진 sparse transformer 구조를 사용함

  • -
  • Image token은 dVAE Encoder logit에서 Argmax sampling을 통해 생성

  • -
  • Text token은 소문자화 후 16,384 개의 vocabulary를 BPE-encoding 통해 한번에 최대 256 token을 활용

  • -
-
-fig11 -
-

Fig. 95 Text-to-text attention: causal attention mask -Image-to-image attention: row/column/convolutional attention mask 적용#

-
-
-
-
-
-

Results#

-
    -
  • 추론 시에는 text에 대하여 N개의 이미지를 생성.

  • -
  • Best of N개는 N개 생성 후 best를 골라서 선택 함.

  • -
  • 우수한 이미지를 고르기 위해 CLIP (Contrastive Language-Image Pretraining, 2021) 논문에서 제시한 text 와 k 번째로 similarity 점수가 높은 이미지를 선택함 (k=1)

  • -
-
-fig12 -
-

Fig. 96 DALL-E 결과물. Best를 고를때 N 수가 증가할수록 주어진 text prompt랑 더 유사한 결과물이 나옴.#

-
-
-
    -
  • 생성한 512개 이미지 중 CLIP 알고리즘을 통해 similarity score이 제일 높은 이미지를 뽑음.

  • -
  • Ours (DALL-E) vs 다른 baseline method 와 비교 시 text에 더욱 알맞은 이미지를 생성한 것을 확인 할 수 있음.

  • -
-
-fig13 -
-

Fig. 97 선택하는 이미지 개수에 따른 성능 향상#

-
-
-
    -
  • DF-GAN 이랑 비교해서 MS-COCO dataset에 대하여 정성적 평가를 진행.

  • -
  • Best-of-Five votes 중에 DF-GAN보다 매번 압도적인 차이로 투표 수를 받았음.

  • -
-
-fig14 -
-

Fig. 98 DF-GAN 이랑 Qualitative Results 비교#

-
-
-
    -
  • FID (Frechet Inception Distance)는 값이 낮을수록 좋으며 / IS (Inception Score)는 높을수록 좋음

  • -
  • MS-COCO 랑 CUB (새 특화 데이터셋) 기준, DALL-E는 MS-COCO에서는 뛰어난 성능을 보여줬음.

  • -
  • CUB에서는 SOTA를 찍지 못하였고 Inception score에서는 낮은 점수를 기록함.

  • -
  • 저자들은 Fine-tuning 으로 CUB에 성능 계선을 할 수 있다고 생각함.

  • -
-
-fig15 -
-

Fig. 99 MS-COCO 와 CUB dataset에서 FID/IS 결과값 비교#

-
-
-
-
-

Conclusion#

-
    -
  • GPT-3의 확장 모델로 120억개의 parameter과 autoregressive Transformer (Decoder only) 기반 모델링을 통해 text-to-image generation task를 뛰어나게 해결함.

  • -
  • Zero-shot learning에서 다른 모델보다 훌륭한 일반화 성능을 보임

  • -
  • 정량적 / 정성적 평가에서 준수한 성능을 보이고 있으며 다양한 이미지 생성이 가능함.

  • -
-

** Limitations: **

-
    -
  • 생성하고 싶은 이미지에 다양한 객체가 포함되면 어려움을 겪음

  • -
  • (b)에 보면 고슴도치가 2마리거나 강아지와 고슴도치 둘다 크리스마스 스웨터를 입고 있음.

  • -
  • CUB dataset 처럼 다소 아쉬운 성능을 보인 데이터셋이 있지만 fine-tuning으로 해결

  • -
-
-fig16 -
-

Fig. 100 Limitation을 보여주는 결과물.#

-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + DALL-E — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

DALL-E#

+
+

1. Introduction#

+
    +
  • GPT-3 기반 모델이며 120억개 parameter 수와 2.5억 데이터 (text,image) set으로 학습

  • +
  • Autoregressive 한 모델링을 통하여 image와 text를 이용하여 text-to-image generation task를 수행

  • +
  • 2021년 기준 zero-shot SOTA performance 달성

  • +
  • 아래 그림과 같이 text input에 따라 diverse한 이미지 생성

  • +
+
+fig1 +
+

Fig. 85 Images generated using DALL-E#

+
+
+
+fig2 +
+

Fig. 86 Images generated using DALL-E#

+
+
+
+
+

2. Background#

+
    +
  • GPT-3와 VQ-VAE를 활용하여 나온 논문.

  • +
  • VQ-VAE를 먼저 학습하고, Autoregressive Transformer을 순차적으로 학습하여 zero-shot architecture을 구축.

  • +
+
+

GPT-3#

+
    +
  • Autoregressive Language Model며 few-shot learning을 통해 fine-tuning 없이 높은 성능을 냄 *(fine-tuning 을 할 수는 있지만 본 논문에서는 task-agnostic performance 에 중점을 맞춰 Few shot을 함)

  • +
  • GPT-3 는 transformer에서 decoder 부분만 사용 (GPT-2 와 유사한 구조를 가지고 있음 )

  • +
  • 약 1750억 parameter 개수의 모델

  • +
+
+fig3 +
+

Fig. 87 Transformer 아키텍쳐 \ (source: https://arxiv.org/pdf/2005.14165.pdf)#

+
+
+
+GPT-3 GIF +
+

Fig. 88 GPT 3 Animation \ (source: https://jalammar.github.io/how-gpt3-works-visualizations-animations/)#

+
+
+
+
+

VQ-VAE#

+
    +
  • Encoder에서 나온 output은 discrete 하며 posterior 과 prior 이 categorical distribution을 갖는다고 가정함.

  • +
  • CNN (encoder) 을 거친 각 D차원의 위치에 \(H \times W\) 그리드로 이미지를 나누고 embedding space (Codebook) 에서 \(𝑒_1\)부터 \(𝑒_𝑘\) 중에서 가까운 1개 embedding code로 변환.

  • +
  • Quantization: Encoding output \(z_{e}(x)\) representation 과 유사한 codebook embedding \(e_j\) 를 찾아서 \(k\) 값을 부여함.

  • +
+
+fig5 +
+

Fig. 89 VQ-VAE 아키텍쳐, Loss 함수 \ (source: https://velog.io/@p2yeong/Understanding-VQ-VAE-DALL-E-Explained-Pt.-1)#

+
+
+
+fig6 +
+

Fig. 90 Quantization of VQ-VAE#

+
+
+
+
+
+

3. Methodology#

+
+
+

Limitation of Previous Works#

+
    +
  1. Memory/Bottleneck Issue

  2. +
+
    +
  • 각 Image에서 나오는 pixel을 직접적으로 image token을 사용하면 고화질 이미지일수록 너무 많은 메모리량이 필요해서 “비효율적”

  • +
+
    +
  1. Short-range dependence modeling between pixels

  2. +
+
    +
  • Model들 중 Likelihood function을 objective function으로 사용하면 short-range dependency를 우선적으로 볼 것이며 low-frequency 보다 high-frequency detail에 더욱 집중하게 됨.

  • +
  • Low frequency 는 visually recognizable해서 시각적으로 더 도움이 되는 부분

  • +
+

이 2가지 문제점을 극복하고자 Two-stage training process 제안

+
+
+

DALL-E Overview#

+
+

Stage 1: Training VQ-VAE#

+
    +
  • Discrete VAE를 이용하여 \(256 \times 256\) RGB image \rightarrow \(32 \times 32\) 이미지 토큰으로 압축

  • +
  • 각 이미지 토큰은 8,192개의 code 값 중에 하나 배정

  • +
  • 이미지의 quality 손실 없이 \(8 \times 8 \times 3\) 배 만큼 context size를 적게 만들 수 있음.

  • +
+
+
+

Stage 2: Training an Autoregressive Transformer#

+
    +
  • 최대 256 BPE-Encoded text tokens들과 1024 image tokens (\(32 \times 32\)) 를 연속적으로 입력함 (concatenate)

  • +
  • Text token과 Image Tokens 들의 joint distribution (결합 분포)를 모델링하여 autoregressive transformer을 학습

  • +
+
+
+
+

DALL-E Pipeline 예시#

+
+fig7 +
+

Fig. 91 DALL-E 시각화 \ (source:https://jiho-ml.com/weekly-nlp-40/)#

+
+
+
+fig8 +
+

Fig. 92 DALL-E 파이프라인 \ (source:https://www.youtube.com/watch?v=CQoM0r2kMvI&t=1729s)#

+
+
+
+
+

Methodology Details#

+
+

DALL-E Equations#

+
+fig9 +
+

Fig. 93 equation 1#

+
+
+
+fig10 +
+

Fig. 94 equation 2: Maximizing ELBO#

+
+
+

x: images, y: captions , z: encoded RGB image tokens

+

𝑞Φ (red) : input image에서 dVAE encoder에서 생성한 32 x 32 image token를 예측

+

𝑝𝜃 (blue): image token에서 dVAE decoder에서 생성한 RGB image를 예측

+

𝑝ψ (purple): transformer 모델로 모델링한 text와 image token들의 결합 분포 (joint distribution)

+
+
+

DALL-E 학습과정 Stage 1: Learning the VIsual Codebook#

+
    +
  • Transformer을 고정하고 dVAE encoder & decoder (𝑞_Φ , 𝑝_𝜃) 을 학습함

    +
      +
    • 즉, ELB (Evidence Lower Bound를 maximize 함)

    • +
    • K = 8,192 codebook (embedding space)로 설정

    • +
    +
  • +
  • ELB를 optimize 하기 위해서는 discrete distribution을 continuous를 바꿔야 함

    +
      +
    • 학습시에는 결국, argmax를 사용해서 codebook vector 인덱스를 선택하여 계산하면 Reparameterization gradient를 연산 X

    • +
    • argmax 대신 gumbel softmax를 사용하여 해결

    • +
    • 평가를 진행할 때에는 \(z = codebook[\underset{i}{argmax}[g_i+log(q(e_i|x))]]\)

    • +
    +
  • +
  • Gumbel Softmax Relaxation를 사용하여 해결! \(q_\phi \rightarrow q_{\phi}^{\tau}\), temperature \(\tau \rightarrow 0\), relaxation을 tight하게 잡아줌.

  • +
+
+
+

DALL-E 학습과정 Stage 2: Learning the Prior#

+
    +
  • Transformer을 고정하고 dVAE encoder & decoder (\(q_{phi}\) , \(p_{\theta}\)) transformer의 prior distribution \(p_{\psi}\)를 학습함.

  • +
  • 이때, \(p_{\psi}\)의 ELB를 maximize 하며 120억개의 parameter를 가진 sparse transformer 구조를 사용함

  • +
  • Image token은 dVAE Encoder logit에서 Argmax sampling을 통해 생성

  • +
  • Text token은 소문자화 후 16,384 개의 vocabulary를 BPE-encoding 통해 한번에 최대 256 token을 활용

  • +
+
+fig11 +
+

Fig. 95 Text-to-text attention: causal attention mask +Image-to-image attention: row/column/convolutional attention mask 적용#

+
+
+
+
+
+

Results#

+
    +
  • 추론 시에는 text에 대하여 N개의 이미지를 생성.

  • +
  • Best of N개는 N개 생성 후 best를 골라서 선택 함.

  • +
  • 우수한 이미지를 고르기 위해 CLIP (Contrastive Language-Image Pretraining, 2021) 논문에서 제시한 text 와 k 번째로 similarity 점수가 높은 이미지를 선택함 (k=1)

  • +
+
+fig12 +
+

Fig. 96 DALL-E 결과물. Best를 고를때 N 수가 증가할수록 주어진 text prompt랑 더 유사한 결과물이 나옴.#

+
+
+
    +
  • 생성한 512개 이미지 중 CLIP 알고리즘을 통해 similarity score이 제일 높은 이미지를 뽑음.

  • +
  • Ours (DALL-E) vs 다른 baseline method 와 비교 시 text에 더욱 알맞은 이미지를 생성한 것을 확인 할 수 있음.

  • +
+
+fig13 +
+

Fig. 97 선택하는 이미지 개수에 따른 성능 향상#

+
+
+
    +
  • DF-GAN 이랑 비교해서 MS-COCO dataset에 대하여 정성적 평가를 진행.

  • +
  • Best-of-Five votes 중에 DF-GAN보다 매번 압도적인 차이로 투표 수를 받았음.

  • +
+
+fig14 +
+

Fig. 98 DF-GAN 이랑 Qualitative Results 비교#

+
+
+
    +
  • FID (Frechet Inception Distance)는 값이 낮을수록 좋으며 / IS (Inception Score)는 높을수록 좋음

  • +
  • MS-COCO 랑 CUB (새 특화 데이터셋) 기준, DALL-E는 MS-COCO에서는 뛰어난 성능을 보여줬음.

  • +
  • CUB에서는 SOTA를 찍지 못하였고 Inception score에서는 낮은 점수를 기록함.

  • +
  • 저자들은 Fine-tuning 으로 CUB에 성능 계선을 할 수 있다고 생각함.

  • +
+
+fig15 +
+

Fig. 99 MS-COCO 와 CUB dataset에서 FID/IS 결과값 비교#

+
+
+
+
+

Conclusion#

+
    +
  • GPT-3의 확장 모델로 120억개의 parameter과 autoregressive Transformer (Decoder only) 기반 모델링을 통해 text-to-image generation task를 뛰어나게 해결함.

  • +
  • Zero-shot learning에서 다른 모델보다 훌륭한 일반화 성능을 보임

  • +
  • 정량적 / 정성적 평가에서 준수한 성능을 보이고 있으며 다양한 이미지 생성이 가능함.

  • +
+

** Limitations: **

+
    +
  • 생성하고 싶은 이미지에 다양한 객체가 포함되면 어려움을 겪음

  • +
  • (b)에 보면 고슴도치가 2마리거나 강아지와 고슴도치 둘다 크리스마스 스웨터를 입고 있음.

  • +
  • CUB dataset 처럼 다소 아쉬운 성능을 보인 데이터셋이 있지만 fine-tuning으로 해결

  • +
+
+fig16 +
+

Fig. 100 Limitation을 보여주는 결과물.#

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/diffusion_beats_GANs.html b/docs/review/diffusion_beats_GANs.html old mode 100644 new mode 100755 index 46cae73b..eecd418d --- a/docs/review/diffusion_beats_GANs.html +++ b/docs/review/diffusion_beats_GANs.html @@ -1,896 +1,915 @@ - - - - - - - - - - - - Diffusion Models Beat GANs on Image Synthesis — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: Diffusion Models Beat GANs on Image Synthesis (NeurIPS 2021)

  • -
  • Reference

    - -
  • -
  • Author: Donggeun Sean Ko

  • -
  • Last updated on May. 17, 2023

  • -
-
-
-

Diffusion Models Beat GANs on Image Synthesis#

-
-

Abstract#

-
    -
  • Diffusion 모델들은 기존 unconditional 이미지 생성 모델들의 SOTA를 뛰어넘음.

  • -
  • Conditional image synthesis 부분에서도 classifier guidance를 활용해 diffusion model을 활용하여 좋은 성능을 보여준다고 주장함.

  • -
  • Classifier guidance를 활용해 diversity와 fidelity의 trade-off에 대해서도 분석

  • -
-
-
-

1. Introduction#

-
    -
  • Diffusion 모델들은 likelihood-based model들이며 고화질 이미지를 생성해내는데에 성공 했음.

  • -
  • 하지만, FID 수치는 BigGAN-deep에 비해 낮으며, 개선사항이 필요함.

  • -
  • 두가지 contribution을 통해 Diffusion Model들의 성능을 끌어올리며 FID 결과 수치를 낮추겠다고 주장.

    -
      -
    • 모델 아키텍쳐 개선

    • -
    • Classifier Guidance

    • -
    -
  • -
-
-
-

2. Background#

-
    -
  • DDPM, DDIM, Improved DDPM은 이전에 설명되있으므로, 각 background 논문들의 핵심 부분만 설명하겠습니다.

  • -
  • -
-
-

DDPM#

-
    -
  • \(p_\theta(x_{t-1}|x_t)\)\(q(x_{t-1}|x_t)\)의 근사값이라고 가정하며 계산한다. -- \(p_\theta(x_{t-1}|x_t)\)를 학습하여 \(p_\theta(x_{t-1}|x_t) \approx\) \(q(x_{t-1}|x_t)\)를 만든다.

  • -
  • \(\epsilon_\theta(x_t,t)\) 을 모델링하여 noise를 예측한다.

  • -
  • 공분산 \(\Sigma_\theta(X_t,t)\)은 학습 불가능한 매개변수로 설정되며 constant 값을 가진다.

  • -
  • 아래와 같이 \(L_{simple}\) 을 새로운 Loss function으로 제안한다.

  • -
-
-ddpm_pipeline -
-

Fig. 69 DDPM Pipeline#

-
-
-
-ddpm_eq -
-

Fig. 70 DDPM Equation#

-
-
-
-
-

Improved DDPM#

-
-improved_ddpm_pic -
-

Fig. 71 Improved DDPM scheduling comparison with DDPM (Linear vs Cosine)#

-
-
-
    -
  • 더 적은 diffusion step으로 샘플링 함.

  • -
  • Competitive log-likelihood 지표 성능 개선 (전 DDPM에선 log-likelihood 지표가 상대적으로 GAN 모델의 비해 낮았다)

  • -
  • 전 DDPM 논문에서는 linear scheduling을 사용했지만, 본 논문에서는 cosine scheduling을 사용해서 성능 향상을 했다고 주장했다.

  • -
  • 분산 \(\Sigma_\theta(X_t,t)\)을 학습에도 활용

  • -
  • \(L_{hybrid}\)라는 새로운 loss 함수 제시

  • -
-
-improved_ddpm_eq -
-

Fig. 72 Improved DDPM Equation#

-
-
-
-
-

DDIM#

-
-ddim_pipe -
-

Fig. 73 DDIM Pipeline#

-
-
-
    -
  • Markovian Chain Process를 끊고 Non-Markovian 형태로 Deterministic 하게 수식을 바꿈

  • -
  • DDPM 보다 더 적은 iteration으로 image synthesis 가능

  • -
-
-ddim_pic -
-

Fig. 74 DDIM Sampling Equation#

-
-
-
-
-
-

3. Architectural Improvements#

-
    -
  • DDPM에서 사용한 architecture을 그대로 채택했지만, 다양한 ablation 및 parameter을 변경하여 제일 높은 성능이 나오는 architecture을 설명 및 채택함

  • -
  • 모델 크기를 일정하게 가져가면서 Depth vs Width 증가 보기

  • -
  • Attention head 수 증가 시켜보기

  • -
  • 각 Attention head에 resolution 을 8x8, 16x16, 32x32 로 실험 해보기

  • -
  • 일반 ResNet Residual Block이 아닌 BigGAN의 residual block을 채택하여 upsampling / downsampling 사용 해보기

  • -
  • Residual Connection을 1/√2 로 rescaling 해보기

  • -
-
-architect_1 -
-

Fig. 75 Table 1: Ablation of various architecture changes#

-
-
-
-architect_2 -
-

Fig. 76 Table 2: Ablation of various attention configurations. Attention head 가 32일때 FID 값이 제일 낮다 (좋다)#

-
-
-

** 3-1. Best Architecture **

-
    -
  • Channel 수 160

  • -
  • Depth 2

  • -
  • number of Attention Head = 4

  • -
  • Attention Resolution을 32, 16, 8 로 block마다 줄이기

  • -
  • BigGAN residual block 채택

  • -
  • Rescaling X

  • -
  • 위와 같은 parameter를 통해 제일 좋은 FID 결과가 나옴

  • -
-
-architect_3 -
-

Fig. 77 Table 3: 다양한 parameter 튜닝을 통한 제일 좋은 FID 성능 테이블#

-
-
-
-
-

4. Adaptive Group Normalization#

-
    -
  • 본 저자들은 AdaIN이랑 비슷한 방식으로 연산하는 AdaGN 이라는 것을 소개했다. (원래 있는 방법론인지는 모르겠다…)

  • -
  • Group Normalization을 adpative하게 하는 방법으로 Group Normalization 후에 residual block에 time step embedding과 class embedding을 AdaIN 방식으로 곱하고 더함

  • -
-

Equation

-
-\[AdaIN(x,y) = \sigma(y)(\frac{x-\mu(x)}{\sigma(x)})+\mu(y)\]
-
-\[AdaGN(h,y) = y_s + GroupNorm(h) + y_b\]
-

where \(h =\) residual block and \(y = [y_s,y_b]\) time-step embedding and class embedding’s linear projection respectively

-

4-1 AdaGN의 성능

-
-adagn_table -
-

Fig. 78 AdaGN과 Additon+GroupNorm 비교 테이블. DDPM에서 사용한 normalization보다 더 좋은 성능을 보여주고 있음.#

-
-
-
    -
  • 기존 DDPM은 Addition + GroupNorm layer을 사용했는데, AdaGN 을 사용하는 것이 FID가 더 낮게 (즉 더 좋은 성능) 나온 것을 볼 수 있다

  • -
-
-
-

5. Classifier Guidance#

-
    -
  • 본 논문의 주 contribution 중 하나가 classifier guidance를 사용했다는 점이다.

  • -
  • unconditional de-noising process에서 label y를 condition으로 줌으로써 conditional de-noising process로 진행

  • -
-

Equation -$\(p_{\theta, \phi }(x_t|x_{t+1},y) = Zp_\theta(x_t|x_{t+1})p_\phi(y|x_t)\)$

-
    -
  • Z 는 normalizing을 위한 상수 이다

  • -
-

5-1 Classifier Guidance 유도

-

\(log_\phi p(y|x_t)\)\(\Sigma^-1\) 에 비해 곡률이 낮으며, 이 가정을 따라, diffusion step이 무한으로 갈 시, \(||\Sigma^ || \rightarrow0\) 이므로,\(log_\phi p(y|x_t)\)가 테일러 급수를 활용하여 식을 \(x_t = \mu\) 로 재전개 할 수 있다.

-
    -
  • classifier의 gradient를 활용해서 학습을 같이 해준다.

  • -
  • 식 유도는 아래와 같다. 본문의 (3) ~ (10) 번식이므로 본 논문을 참고하면 좋다.

  • -
-
-class_eq1 -
-

Fig. 79 Classifier Guidance 유도 식 1,2#

-
-
-
-classifier_2 -
-

Fig. 80 Classifier Guidance 유도 식 3~7#

-
-
-
-
-

6. Algorithm#

-
-algorithm -
-

Fig. 81 Algorithm 1 & 2 sampling method. Algorithm 1은 일반적인 DDPM 기준, Algorithm 2는 DDIM 기준 guidance 한 sampling 방법#

-
-
-
    -
  • Algorithm 1 은 일반 DDPM에서 샘플링 하는 방법이다. 똑같이 Gaussian distribution에서 샘플링 할 시, classifier의 gradient를 활용하여 \(x_{t-1}\)를 sample한다.

  • -
  • Algorithm 2 는 DDIM에서 샘플링 하는 방법이다. \(\epsilon\) 모델에서 나오는 output과 classifier의 gradient의 joint distribution 값을 빼 score을 구한다.

  • -
  • DDIM은 Deterministic하기때문에 모든 시점의 값을 모두 계산할 필요 없이 subset의 시점만으로 sampling이 가능하다.

  • -
  • 이 Accelerating method는 약간의 quality 저하가 있지만 Computational efficiency를 충분히 증가시킬 수 있다.

  • -
  • DDIM 방식의 재학습 없이 DDPM의 training에 DDIM의 sampling이 가능하다.

  • -
-
-
-

7. Impact of parameter s in classifier guidance#

-
-class_guidance_vis -
-

Fig. 82 Classifier Guidance scaling의 영향 시각화#

-
-
-
    -
  • classifier guidance 앞에 hyperparameter \bf{s} 의 값에 따라 classifier가 줄 수 있는 scaling이 다르다.

  • -
  • scale을 1.0으로 주면 웰시코기라는 class의 scale 영향을 덜 받아 “웰시코기스러운” 강아지가 생성이 많이 되지는 않는다.

  • -
  • scale을 10.0으로 주면 웰시코기 class라는 scaling의 영향을 많이 받아 웰시코기 분위기의 강아지의 이미지가 더 많이 생성 되는 것을 볼 수 있다.

  • -
  • epsilon이라는 모델이 결국 scale에 따라 gradient의 영향을 얼마나 많이 받는지 sampling할 때 볼 수 있다.

  • -
-
-
-

8. Results#

-
-plot result -
-

Fig. 83 Fidelity vs Diversity Trade-off 결과#

-
-
-
    -
  • gradient scale이 높을수록 recall은 낮지만, precision은 높다. 즉 trade-off 가 생기는데, recall이 낮을수록 diveristy가 낮다는 의미이고, precision이 높을수록 fidelity가 높다는 뜻이다.

  • -
  • scale을 높일수록 다양한 이미지가 생성되는 것이 아닌, classifier가 준 label쪽으로 guide가 생기므로 일정한 class의 사진이 나온다.

  • -
  • FID와 sFID는 diversity와 fidelity의 trade-off로 도출되는 값이므로, 최고의 값은 중간 지점에서 나왔다.

  • -
-

8-1. Result Table

-
    -
  • ADM은 Ablated Diffusion Model의 약자이며, ADM-G는 Ablated Diffusion Model with Guidance의 약자이다.

  • -
  • Guidance를 주었을 시 제일 좋은 FID값이 나왔으며, Precision이 높을수록, Recall이 낮게 나왔다 (and vice versa).

  • -
-
-
-

8-2. Image Synthesis Results#

-
-img_results -
-

Fig. 84 Generated Images (Left: BigGAN, Center: DMs, Right: Train Dataset)#

-
-
-
    -
  • 두번쨰 플라밍고 생성된 사진을 볼때, BigGAN은 이미지간들의 diversity가 없다. 학습된 플라밍고가 다수 플라밍고 시 비슷한 느낌의 이미지만 뽑아낸다.

  • -
  • 반면, Diffusion model with guidance를 사용했을 시, 다채로운 플라밍고 사진을 볼 수 있다. 한마리만 있는 플라밍고 사진도 뽑아 낼 수 있다.

  • -
-
-
-

9. Limitation and Future Work#

-

Limitation 1

-
    -
  • Diffusion 모델들은 GAN보다 샘플링 시간이 아직 느리다.

  • -
-

Future Work 1

-
    -
  • DDIM의 sampling process를 distillation 해서 빠르게 하는 법을 고려

  • -
-

Limitation 2

-
    -
  • Classifier guidance는 classification function의 gradient를 사용함으로써, label이 없는 data에는 확장이 불가능하다.

  • -
-

Future Work 2

-
    -
  • Unlabeled sample을 clustering 하는 방법을 통해 방법론을 expand 하려 한다.

  • -
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Diffusion Models Beat GANs on Image Synthesis — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: Diffusion Models Beat GANs on Image Synthesis (NeurIPS 2021)

  • +
  • Reference

    + +
  • +
  • Author: Donggeun Sean Ko

  • +
  • Last updated on May. 17, 2023

  • +
+
+
+

Diffusion Models Beat GANs on Image Synthesis#

+
+

Abstract#

+
    +
  • Diffusion 모델들은 기존 unconditional 이미지 생성 모델들의 SOTA를 뛰어넘음.

  • +
  • Conditional image synthesis 부분에서도 classifier guidance를 활용해 diffusion model을 활용하여 좋은 성능을 보여준다고 주장함.

  • +
  • Classifier guidance를 활용해 diversity와 fidelity의 trade-off에 대해서도 분석

  • +
+
+
+

1. Introduction#

+
    +
  • Diffusion 모델들은 likelihood-based model들이며 고화질 이미지를 생성해내는데에 성공 했음.

  • +
  • 하지만, FID 수치는 BigGAN-deep에 비해 낮으며, 개선사항이 필요함.

  • +
  • 두가지 contribution을 통해 Diffusion Model들의 성능을 끌어올리며 FID 결과 수치를 낮추겠다고 주장.

    +
      +
    • 모델 아키텍쳐 개선

    • +
    • Classifier Guidance

    • +
    +
  • +
+
+
+

2. Background#

+
    +
  • DDPM, DDIM, Improved DDPM은 이전에 설명되있으므로, 각 background 논문들의 핵심 부분만 설명하겠습니다.

  • +
  • +
+
+

DDPM#

+
    +
  • \(p_\theta(x_{t-1}|x_t)\)\(q(x_{t-1}|x_t)\)의 근사값이라고 가정하며 계산한다. +- \(p_\theta(x_{t-1}|x_t)\)를 학습하여 \(p_\theta(x_{t-1}|x_t) \approx\) \(q(x_{t-1}|x_t)\)를 만든다.

  • +
  • \(\epsilon_\theta(x_t,t)\) 을 모델링하여 noise를 예측한다.

  • +
  • 공분산 \(\Sigma_\theta(X_t,t)\)은 학습 불가능한 매개변수로 설정되며 constant 값을 가진다.

  • +
  • 아래와 같이 \(L_{simple}\) 을 새로운 Loss function으로 제안한다.

  • +
+
+ddpm_pipeline +
+

Fig. 69 DDPM Pipeline#

+
+
+
+ddpm_eq +
+

Fig. 70 DDPM Equation#

+
+
+
+
+

Improved DDPM#

+
+improved_ddpm_pic +
+

Fig. 71 Improved DDPM scheduling comparison with DDPM (Linear vs Cosine)#

+
+
+
    +
  • 더 적은 diffusion step으로 샘플링 함.

  • +
  • Competitive log-likelihood 지표 성능 개선 (전 DDPM에선 log-likelihood 지표가 상대적으로 GAN 모델의 비해 낮았다)

  • +
  • 전 DDPM 논문에서는 linear scheduling을 사용했지만, 본 논문에서는 cosine scheduling을 사용해서 성능 향상을 했다고 주장했다.

  • +
  • 분산 \(\Sigma_\theta(X_t,t)\)을 학습에도 활용

  • +
  • \(L_{hybrid}\)라는 새로운 loss 함수 제시

  • +
+
+improved_ddpm_eq +
+

Fig. 72 Improved DDPM Equation#

+
+
+
+
+

DDIM#

+
+ddim_pipe +
+

Fig. 73 DDIM Pipeline#

+
+
+
    +
  • Markovian Chain Process를 끊고 Non-Markovian 형태로 Deterministic 하게 수식을 바꿈

  • +
  • DDPM 보다 더 적은 iteration으로 image synthesis 가능

  • +
+
+ddim_pic +
+

Fig. 74 DDIM Sampling Equation#

+
+
+
+
+
+

3. Architectural Improvements#

+
    +
  • DDPM에서 사용한 architecture을 그대로 채택했지만, 다양한 ablation 및 parameter을 변경하여 제일 높은 성능이 나오는 architecture을 설명 및 채택함

  • +
  • 모델 크기를 일정하게 가져가면서 Depth vs Width 증가 보기

  • +
  • Attention head 수 증가 시켜보기

  • +
  • 각 Attention head에 resolution 을 8x8, 16x16, 32x32 로 실험 해보기

  • +
  • 일반 ResNet Residual Block이 아닌 BigGAN의 residual block을 채택하여 upsampling / downsampling 사용 해보기

  • +
  • Residual Connection을 1/√2 로 rescaling 해보기

  • +
+
+architect_1 +
+

Fig. 75 Table 1: Ablation of various architecture changes#

+
+
+
+architect_2 +
+

Fig. 76 Table 2: Ablation of various attention configurations. Attention head 가 32일때 FID 값이 제일 낮다 (좋다)#

+
+
+

** 3-1. Best Architecture **

+
    +
  • Channel 수 160

  • +
  • Depth 2

  • +
  • number of Attention Head = 4

  • +
  • Attention Resolution을 32, 16, 8 로 block마다 줄이기

  • +
  • BigGAN residual block 채택

  • +
  • Rescaling X

  • +
  • 위와 같은 parameter를 통해 제일 좋은 FID 결과가 나옴

  • +
+
+architect_3 +
+

Fig. 77 Table 3: 다양한 parameter 튜닝을 통한 제일 좋은 FID 성능 테이블#

+
+
+
+
+

4. Adaptive Group Normalization#

+
    +
  • 본 저자들은 AdaIN이랑 비슷한 방식으로 연산하는 AdaGN 이라는 것을 소개했다. (원래 있는 방법론인지는 모르겠다…)

  • +
  • Group Normalization을 adpative하게 하는 방법으로 Group Normalization 후에 residual block에 time step embedding과 class embedding을 AdaIN 방식으로 곱하고 더함

  • +
+

Equation

+
+\[AdaIN(x,y) = \sigma(y)(\frac{x-\mu(x)}{\sigma(x)})+\mu(y)\]
+
+\[AdaGN(h,y) = y_s + GroupNorm(h) + y_b\]
+

where \(h =\) residual block and \(y = [y_s,y_b]\) time-step embedding and class embedding’s linear projection respectively

+

4-1 AdaGN의 성능

+
+adagn_table +
+

Fig. 78 AdaGN과 Additon+GroupNorm 비교 테이블. DDPM에서 사용한 normalization보다 더 좋은 성능을 보여주고 있음.#

+
+
+
    +
  • 기존 DDPM은 Addition + GroupNorm layer을 사용했는데, AdaGN 을 사용하는 것이 FID가 더 낮게 (즉 더 좋은 성능) 나온 것을 볼 수 있다

  • +
+
+
+

5. Classifier Guidance#

+
    +
  • 본 논문의 주 contribution 중 하나가 classifier guidance를 사용했다는 점이다.

  • +
  • unconditional de-noising process에서 label y를 condition으로 줌으로써 conditional de-noising process로 진행

  • +
+

Equation +$\(p_{\theta, \phi }(x_t|x_{t+1},y) = Zp_\theta(x_t|x_{t+1})p_\phi(y|x_t)\)$

+
    +
  • Z 는 normalizing을 위한 상수 이다

  • +
+

5-1 Classifier Guidance 유도

+

\(log_\phi p(y|x_t)\)\(\Sigma^-1\) 에 비해 곡률이 낮으며, 이 가정을 따라, diffusion step이 무한으로 갈 시, \(||\Sigma^ || \rightarrow0\) 이므로,\(log_\phi p(y|x_t)\)가 테일러 급수를 활용하여 식을 \(x_t = \mu\) 로 재전개 할 수 있다.

+
    +
  • classifier의 gradient를 활용해서 학습을 같이 해준다.

  • +
  • 식 유도는 아래와 같다. 본문의 (3) ~ (10) 번식이므로 본 논문을 참고하면 좋다.

  • +
+
+class_eq1 +
+

Fig. 79 Classifier Guidance 유도 식 1,2#

+
+
+
+classifier_2 +
+

Fig. 80 Classifier Guidance 유도 식 3~7#

+
+
+
+
+

6. Algorithm#

+
+algorithm +
+

Fig. 81 Algorithm 1 & 2 sampling method. Algorithm 1은 일반적인 DDPM 기준, Algorithm 2는 DDIM 기준 guidance 한 sampling 방법#

+
+
+
    +
  • Algorithm 1 은 일반 DDPM에서 샘플링 하는 방법이다. 똑같이 Gaussian distribution에서 샘플링 할 시, classifier의 gradient를 활용하여 \(x_{t-1}\)를 sample한다.

  • +
  • Algorithm 2 는 DDIM에서 샘플링 하는 방법이다. \(\epsilon\) 모델에서 나오는 output과 classifier의 gradient의 joint distribution 값을 빼 score을 구한다.

  • +
  • DDIM은 Deterministic하기때문에 모든 시점의 값을 모두 계산할 필요 없이 subset의 시점만으로 sampling이 가능하다.

  • +
  • 이 Accelerating method는 약간의 quality 저하가 있지만 Computational efficiency를 충분히 증가시킬 수 있다.

  • +
  • DDIM 방식의 재학습 없이 DDPM의 training에 DDIM의 sampling이 가능하다.

  • +
+
+
+

7. Impact of parameter s in classifier guidance#

+
+class_guidance_vis +
+

Fig. 82 Classifier Guidance scaling의 영향 시각화#

+
+
+
    +
  • classifier guidance 앞에 hyperparameter \bf{s} 의 값에 따라 classifier가 줄 수 있는 scaling이 다르다.

  • +
  • scale을 1.0으로 주면 웰시코기라는 class의 scale 영향을 덜 받아 “웰시코기스러운” 강아지가 생성이 많이 되지는 않는다.

  • +
  • scale을 10.0으로 주면 웰시코기 class라는 scaling의 영향을 많이 받아 웰시코기 분위기의 강아지의 이미지가 더 많이 생성 되는 것을 볼 수 있다.

  • +
  • epsilon이라는 모델이 결국 scale에 따라 gradient의 영향을 얼마나 많이 받는지 sampling할 때 볼 수 있다.

  • +
+
+
+

8. Results#

+
+plot result +
+

Fig. 83 Fidelity vs Diversity Trade-off 결과#

+
+
+
    +
  • gradient scale이 높을수록 recall은 낮지만, precision은 높다. 즉 trade-off 가 생기는데, recall이 낮을수록 diveristy가 낮다는 의미이고, precision이 높을수록 fidelity가 높다는 뜻이다.

  • +
  • scale을 높일수록 다양한 이미지가 생성되는 것이 아닌, classifier가 준 label쪽으로 guide가 생기므로 일정한 class의 사진이 나온다.

  • +
  • FID와 sFID는 diversity와 fidelity의 trade-off로 도출되는 값이므로, 최고의 값은 중간 지점에서 나왔다.

  • +
+

8-1. Result Table

+
    +
  • ADM은 Ablated Diffusion Model의 약자이며, ADM-G는 Ablated Diffusion Model with Guidance의 약자이다.

  • +
  • Guidance를 주었을 시 제일 좋은 FID값이 나왔으며, Precision이 높을수록, Recall이 낮게 나왔다 (and vice versa).

  • +
+
+
+

8-2. Image Synthesis Results#

+
+img_results +
+

Fig. 84 Generated Images (Left: BigGAN, Center: DMs, Right: Train Dataset)#

+
+
+
    +
  • 두번쨰 플라밍고 생성된 사진을 볼때, BigGAN은 이미지간들의 diversity가 없다. 학습된 플라밍고가 다수 플라밍고 시 비슷한 느낌의 이미지만 뽑아낸다.

  • +
  • 반면, Diffusion model with guidance를 사용했을 시, 다채로운 플라밍고 사진을 볼 수 있다. 한마리만 있는 플라밍고 사진도 뽑아 낼 수 있다.

  • +
+
+
+

9. Limitation and Future Work#

+

Limitation 1

+
    +
  • Diffusion 모델들은 GAN보다 샘플링 시간이 아직 느리다.

  • +
+

Future Work 1

+
    +
  • DDIM의 sampling process를 distillation 해서 빠르게 하는 법을 고려

  • +
+

Limitation 2

+
    +
  • Classifier guidance는 classification function의 gradient를 사용함으로써, label이 없는 data에는 확장이 불가능하다.

  • +
+

Future Work 2

+
    +
  • Unlabeled sample을 clustering 하는 방법을 통해 방법론을 expand 하려 한다.

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/dreambooth.html b/docs/review/dreambooth.html old mode 100644 new mode 100755 index 4fe65c76..e53e55d7 --- a/docs/review/dreambooth.html +++ b/docs/review/dreambooth.html @@ -1,855 +1,874 @@ - - - - - - - - - - - - DreamBooth — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

DreamBooth#

-
-

Introduction#

-

최근에 DALL-E2, Imagen, Stable Diffusion 등 다양한 text-to-image generation 모델들이 등장하였지만, 어떠한 동일한 subject 에 대해서 다른 context 에 적용하는 부분에서 부족한 면들을 보여주고 있습니다. DreamBooth 논문은 이러한 문제점을 개선하기 위해 text-to-image 모델을 fine-tuning 하는 기법으로 소개되었고, 단 3-5장의 이미지를 학습하면 되며 이를 NVIDIA A100 으로 학습하는데 5분 정도밖에 소요되지 않는다고 합니다.

-
-dreambooth_01 -
-

Fig. 130 Subject-Driven Generation#

-
-
-

DreamBooth 가 무엇인지 자세히 알아보기 전에 text-to-image diffusion model 에 대해 다시 한번 개념 정리를 해볼 필요가 있습니다.

-
-
-

Text-to-Image Diffusion Models#

-

사전학습된 text-to-image diffusion model \(\hat{x}_{\theta}\) 는 input 으로 원본 이미지 \(x\), 그리고 text prompt \(P\) 와 text-encoder \(\Gamma\) 로부터 나오는 conditioning vector \(c = \Gamma(P)\) 를 입력받아서 이미지 \(x_{gen} = \hat{x}_{\theta}(\epsilon, c)\) 를 생성하게 됩니다. 학습 시, mean squared loss 를 사용하고 이를 수식적으로 표현하면 다음과 같습니다.

-
-\[ -\mathbb{E}_{x,c,\epsilon,t}[w_t || \hat{x}_{\theta}(\alpha_tx + \sigma_{t}\epsilon, c) - x ||_{2}^{2}] -\]
-

이때, DreamBooth 에서는 text encoder 를 CLIP text embedding 과 사전학습된 T5-XXL 모델 중 T5-XXL 모델을 사용했다고 합니다. 그리고 DreamBooth 로 fine-tuning 할때, diffusion process 에서 사용되는 U-net (때로는 text encoder 도 포함) 은 learnable 한 parameter 로 설정하고 생성된 latent vector 로부터 새로운 이미지를 생성하는 Decoder 의 파라미터 값은 고정시킨다고 합니다.

-

앞써 설명드렸던 내용들을 해당 implementation code 에서 확인할 수 있습니다.

-
    -
  • code

    -
    # https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py
    -text_encoder_cls = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision)
    -
    -# Load scheduler and models
    -noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
    -text_encoder = text_encoder_cls.from_pretrained(
    -    args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision
    -)
    -vae = AutoencoderKL.from_pretrained(args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision)
    -unet = UNet2DConditionModel.from_pretrained(
    -    args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision
    -)
    -
    -
    -
  • -
  • training code

    -
    # https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py
    -for epoch in range(first_epoch, args.num_train_epochs):
    -        unet.train()
    -        if args.train_text_encoder:
    -            text_encoder.train()
    -        for step, batch in enumerate(train_dataloader):
    -            # Skip steps until we reach the resumed step
    -            if args.resume_from_checkpoint and epoch == first_epoch and step < resume_step:
    -                if step % args.gradient_accumulation_steps == 0:
    -                    progress_bar.update(1)
    -                continue
    -
    -            with accelerator.accumulate(unet):
    -                # Convert images to latent space
    -                latents = vae.encode(batch["pixel_values"].to(dtype=weight_dtype)).latent_dist.sample()
    -                latents = latents * vae.config.scaling_factor
    -
    -                # Sample noise that we'll add to the latents
    -                if args.offset_noise:
    -                    noise = torch.randn_like(latents) + 0.1 * torch.randn(
    -                        latents.shape[0], latents.shape[1], 1, 1, device=latents.device
    -                    )
    -                else:
    -                    noise = torch.randn_like(latents)
    -                bsz = latents.shape[0]
    -                # Sample a random timestep for each image
    -                timesteps = torch.randint(0, noise_scheduler.config.num_train_timesteps, (bsz,), device=latents.device)
    -                timesteps = timesteps.long()
    -
    -                # Add noise to the latents according to the noise magnitude at each timestep
    -                # (this is the forward diffusion process)
    -                noisy_latents = noise_scheduler.add_noise(latents, noise, timesteps)
    -
    -                # Get the text embedding for conditioning
    -                encoder_hidden_states = text_encoder(batch["input_ids"])[0]
    -
    -                # Predict the noise residual
    -                model_pred = unet(noisy_latents, timesteps, encoder_hidden_states).sample
    -
    -                # Get the target for loss depending on the prediction type
    -                if noise_scheduler.config.prediction_type == "epsilon":
    -                    target = noise
    -                elif noise_scheduler.config.prediction_type == "v_prediction":
    -                    target = noise_scheduler.get_velocity(latents, noise, timesteps)
    -                else:
    -                    raise ValueError(f"Unknown prediction type {noise_scheduler.config.prediction_type}")
    -
    -                if args.with_prior_preservation:
    -                    # Chunk the noise and model_pred into two parts and compute the loss on each part separately.
    -                    model_pred, model_pred_prior = torch.chunk(model_pred, 2, dim=0)
    -                    target, target_prior = torch.chunk(target, 2, dim=0)
    -
    -                    # Compute instance loss
    -                    loss = F.mse_loss(model_pred.float(), target.float(), reduction="mean")
    -
    -                    # Compute prior loss
    -                    prior_loss = F.mse_loss(model_pred_prior.float(), target_prior.float(), reduction="mean")
    -
    -                    # Add the prior loss to the instance loss.
    -                    loss = loss + args.prior_loss_weight * prior_loss
    -                else:
    -                    loss = F.mse_loss(model_pred.float(), target.float(), reduction="mean")
    -
    -                accelerator.backward(loss)
    -                if accelerator.sync_gradients:
    -                    params_to_clip = (
    -                        itertools.chain(unet.parameters(), text_encoder.parameters())
    -                        if args.train_text_encoder
    -                        else unet.parameters()
    -                    )
    -                    accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm)
    -                optimizer.step()
    -                lr_scheduler.step()
    -                optimizer.zero_grad(set_to_none=args.set_grads_to_none)
    -
    -
    -
  • -
-
-
-

Fine-tuning#

-

DreamBooth 에서 pre-trained 된 text-to-image generation 모델을 fine-tuning 할 때 “a [unique identifier] [class noun]” 그리고 “a [class noun]” 형태의 두 가지 text prompt 를 사용합니다. 이때, unique identifier 에 유지하고자 하는 대상에 대한 정보를 담는 것을 목표로 하기 때문에 사전 정보가 없는 rare token 을 사용하는 것이 중요하다고 합니다. 논문에서는 3개 이하의 Unicode character 혹은 T5-XXL tokenizer 를 랜덤하게 샘플링해서 token 을 생성하고 이를 기반으로 unique identifier 를 정의합니다.

-

또한, 논문에서 Language Drift 그리고 Reduced Output Diversity 두 가지 문제점을 해결하기 위해 Class-specific Prior Preservation Loss 를 소개합니다. 이를 활용하여 모델을 fine-tuning 하는 방법은 다음과 같습니다.

-
-dreambooth_02 -
-

Fig. 131 Fine-tuning#

-
-
-

우선, Gaussian 노이즈 이미지와 “A V [class noun]” 형태의 text prompt 를 사전학습된 text-to-image diffusion 모델에 입력하여 이미지를 생성한 후, 원본 이미지와의 Reconstruction Loss 를 계산합니다. 그리고 비슷한 과정으로 Gaussian 노이즈 이미지와 “A [class noun]” 형태의 text prompt 를 학습하고자 하는 모델, 그리고 freeze 시킨 또 다른 pre-trained diffusion 모델에 각각 입력하여 이미지를 생성한 후 Class-Specific Prior Preservation Loss 를 계산합니다. 이에 대한 training objective 를 수식적으로 표현하면 다음과 같습니다.

-
-\[ -\mathbb{E}_{x,c,\epsilon,\epsilon^{'},t}[w_t || \hat{x}_{\theta}(\alpha_tx + \sigma_t\epsilon, c) - x ||_{2}^{2} + \lambda w_{t^{'}} || \hat{x}_{\theta}(\alpha_{t^{'}} x_{pr} + \sigma_{t^{'}}\epsilon^{'}, c_{pr}) - x_{pr} ||_{2}^{2}] -\]
-

Class-Specific Prior Preservation Loss 를 추가함으로써 class prior 에 대한 정보를 유지하게 되고, 이로써 동일한 class 에 대해 더 다양한 이미지들을 생성할 수 있는 부분을 아래 그림에서 확인할 수 있습니다.

-
-dreambooth_03 -
-

Fig. 132 Encouraging diversity with prior-preservation loss#

-
-
-
-
-

Experiments#

-

DreamBooth 논문에서 세 가지의 모델 평가 metric 을 소개합니다. 첫번째로는 subject fidelity 를 측정하는 CLIP-I, DINO 그리고 prompt fidelity 를 측정하는 CLIP-T metric 을 사용합니다. 이때, DINO metric 이 동일한 class 를 가진 subject 에 대해서 다른 embedding 이 생성되기 때문에 CLIP-I 보다 더 선호된다고 합니다. 더 자세하게는 각 metric 은 다음과 같이 계산됩니다.

-
    -
  • CLIP-I := 생성된 이미지와 실제 이미지의 CLIP embedding 의 평균 pairwise cosine similarity

  • -
  • DINO := 생성된 이미지와 실제 이미지의 ViT-S/16 DINO embedding 의 평균 pairwise cosine similarity

  • -
  • CLIP-T := 입력 prompt 와 생성된 이미지의 CLIP embedding 의 평균 pairwise cosine similarity

  • -
-

Textual Inversion 과 비교했을때, 세 개의 metric 에서 모두 DreamBooth 가 더 좋은 성능을 보여주는 것을 확인할 수 있습니다.

-
-dreambooth_04 -
-

Fig. 133 Comparison of models#

-
-
-
-
-

Ablation Studies#

-

Prior Preservation Loss (PPL) 과 Class-Prior 에 대한 Ablation Studies 결과도 논문에서 공유합니다. PPL 가 적용됨으로써 앞써 소개드렸던 Language Drift 그리고 Reduced Output Diversity 문제점을 PRES 그리고 DIV metric 을 통해 해결되는 것을 보여줍니다. 또한, Class-Prior Ablation 에서 다음과 같은 세 가지 prompt 를 사용하여 fine-tuning 했을 때, 해당 subject 에 맞는 class noun 을 prompt 에 입력했을때가 가장 좋은 성능을 보여준다고 설명합니다.

-
    -
  • “no class noun”

  • -
  • “a randomly sampled incorrect class noun” (e.g., “can” for a backpack)

  • -
  • “correct class noun”

  • -
-
-
-

Applications#

-

논문에서 DreamBooth 를 활용한 여러 application 도 소개합니다.

-
-dreambooth_05 -
-

Fig. 134 Applications of DreamBooth#

-
-
-
    -
  1. Recontextualization

  2. -
-
    -
  • Prompt: “a [V] [class noun] [context description]”

  • -
  • 다음과 같은 prompt 입력 시, 사전에 보지 못했던 새로운 pose 나 articulation 을 잘 표현하는 부분을 확인할 수 있습니다.

  • -
-
-dreambooth_06 -
-

Fig. 135 Recontextualization#

-
-
-
    -
  1. Art Renditions

  2. -
-
    -
  • Prompt: “a painting of a [V] [class noun] in the style of [famous painter]” or “a statue of a [V] [class noun] in the style of [famous sculptor]”

  • -
  • Style Transfer 와 다르게 동일한 구조를 유지한 채 style 만 바꾸는 것이 아니라 다양한 pose 형태도 생성 가능합니다.

  • -
-
    -
  1. Novel View Synthesis

  2. -
-
    -
  • 동일한 subject 에 대해 다양한 각도에서 보는 이미지 생성도 가능합니다.

  • -
-
    -
  1. Property Modification

  2. -
-
    -
  • Prompt: “a cross of a [V] dog and a [target species]”

  • -
  • 사전 학습한 subject 의 고유 feature 들이 다른 target species 에서도 반영이 되는 부분을 확인할 수 있습니다.

  • -
-
-
-

Limitations#

-

하지만 DreamBooth 모델에 다음과 같은 한계점도 존재합니다.

-
-dreambooth_07 -
-

Fig. 136 Limitations of DreamBooth#

-
-
-
    -
  • Incorrect context synthesis := 대표적으로 training set 에 자주 나타나지 않는 subject, prompt, context 에 대해서 낮은 성능을 보여줍니다.

  • -
  • Context-appearance entanglement := 유지하고자 하는 대상의 appearance (e.g, color) 가 prompted context 에 의해 달라지는 현상

  • -
  • Overfitting := 사전학습된 데이터와 유사한 prompt 입력 시, overfitting 현상 발생

  • -
-

마지막으로 subject 대상에 따라 모델 성능(fidelity)이 차이를 보인다고 합니다.

-
-
-

Appendix#

-

마지막으로, 논문 본문에 소개되고 있지는 않지만 Appendix 부문에서도 흥미로운 결과들을 확인할 수 있습니다. Figure 20 은 fine tuning 하는 이미지 개수에 따른 DreamBooth 학습결과를 보여주는데, 단 한 장만으로도 identity 의 전반적인 특징을 잘 담는 것을 확인할 수 있습니다. Figure 18 은 만화 캐릭터의 identity 를 유지한 상태로 다양한 만화 사진들을 모델이 생성하는 사례들을 보여줍니다.

-
-dreambooth_08 -
-

Fig. 137 Appendix-1#

-
-
-
-dreambooth_09 -
-

Fig. 138 Appendix-2#

-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + DreamBooth — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

DreamBooth#

+
+

Introduction#

+

최근에 DALL-E2, Imagen, Stable Diffusion 등 다양한 text-to-image generation 모델들이 등장하였지만, 어떠한 동일한 subject 에 대해서 다른 context 에 적용하는 부분에서 부족한 면들을 보여주고 있습니다. DreamBooth 논문은 이러한 문제점을 개선하기 위해 text-to-image 모델을 fine-tuning 하는 기법으로 소개되었고, 단 3-5장의 이미지를 학습하면 되며 이를 NVIDIA A100 으로 학습하는데 5분 정도밖에 소요되지 않는다고 합니다.

+
+dreambooth_01 +
+

Fig. 130 Subject-Driven Generation#

+
+
+

DreamBooth 가 무엇인지 자세히 알아보기 전에 text-to-image diffusion model 에 대해 다시 한번 개념 정리를 해볼 필요가 있습니다.

+
+
+

Text-to-Image Diffusion Models#

+

사전학습된 text-to-image diffusion model \(\hat{x}_{\theta}\) 는 input 으로 원본 이미지 \(x\), 그리고 text prompt \(P\) 와 text-encoder \(\Gamma\) 로부터 나오는 conditioning vector \(c = \Gamma(P)\) 를 입력받아서 이미지 \(x_{gen} = \hat{x}_{\theta}(\epsilon, c)\) 를 생성하게 됩니다. 학습 시, mean squared loss 를 사용하고 이를 수식적으로 표현하면 다음과 같습니다.

+
+\[ +\mathbb{E}_{x,c,\epsilon,t}[w_t || \hat{x}_{\theta}(\alpha_tx + \sigma_{t}\epsilon, c) - x ||_{2}^{2}] +\]
+

이때, DreamBooth 에서는 text encoder 를 CLIP text embedding 과 사전학습된 T5-XXL 모델 중 T5-XXL 모델을 사용했다고 합니다. 그리고 DreamBooth 로 fine-tuning 할때, diffusion process 에서 사용되는 U-net (때로는 text encoder 도 포함) 은 learnable 한 parameter 로 설정하고 생성된 latent vector 로부터 새로운 이미지를 생성하는 Decoder 의 파라미터 값은 고정시킨다고 합니다.

+

앞써 설명드렸던 내용들을 해당 implementation code 에서 확인할 수 있습니다.

+
    +
  • code

    +
    # https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py
    +text_encoder_cls = import_model_class_from_model_name_or_path(args.pretrained_model_name_or_path, args.revision)
    +
    +# Load scheduler and models
    +noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
    +text_encoder = text_encoder_cls.from_pretrained(
    +    args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision
    +)
    +vae = AutoencoderKL.from_pretrained(args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision)
    +unet = UNet2DConditionModel.from_pretrained(
    +    args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision
    +)
    +
    +
    +
  • +
  • training code

    +
    # https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py
    +for epoch in range(first_epoch, args.num_train_epochs):
    +        unet.train()
    +        if args.train_text_encoder:
    +            text_encoder.train()
    +        for step, batch in enumerate(train_dataloader):
    +            # Skip steps until we reach the resumed step
    +            if args.resume_from_checkpoint and epoch == first_epoch and step < resume_step:
    +                if step % args.gradient_accumulation_steps == 0:
    +                    progress_bar.update(1)
    +                continue
    +
    +            with accelerator.accumulate(unet):
    +                # Convert images to latent space
    +                latents = vae.encode(batch["pixel_values"].to(dtype=weight_dtype)).latent_dist.sample()
    +                latents = latents * vae.config.scaling_factor
    +
    +                # Sample noise that we'll add to the latents
    +                if args.offset_noise:
    +                    noise = torch.randn_like(latents) + 0.1 * torch.randn(
    +                        latents.shape[0], latents.shape[1], 1, 1, device=latents.device
    +                    )
    +                else:
    +                    noise = torch.randn_like(latents)
    +                bsz = latents.shape[0]
    +                # Sample a random timestep for each image
    +                timesteps = torch.randint(0, noise_scheduler.config.num_train_timesteps, (bsz,), device=latents.device)
    +                timesteps = timesteps.long()
    +
    +                # Add noise to the latents according to the noise magnitude at each timestep
    +                # (this is the forward diffusion process)
    +                noisy_latents = noise_scheduler.add_noise(latents, noise, timesteps)
    +
    +                # Get the text embedding for conditioning
    +                encoder_hidden_states = text_encoder(batch["input_ids"])[0]
    +
    +                # Predict the noise residual
    +                model_pred = unet(noisy_latents, timesteps, encoder_hidden_states).sample
    +
    +                # Get the target for loss depending on the prediction type
    +                if noise_scheduler.config.prediction_type == "epsilon":
    +                    target = noise
    +                elif noise_scheduler.config.prediction_type == "v_prediction":
    +                    target = noise_scheduler.get_velocity(latents, noise, timesteps)
    +                else:
    +                    raise ValueError(f"Unknown prediction type {noise_scheduler.config.prediction_type}")
    +
    +                if args.with_prior_preservation:
    +                    # Chunk the noise and model_pred into two parts and compute the loss on each part separately.
    +                    model_pred, model_pred_prior = torch.chunk(model_pred, 2, dim=0)
    +                    target, target_prior = torch.chunk(target, 2, dim=0)
    +
    +                    # Compute instance loss
    +                    loss = F.mse_loss(model_pred.float(), target.float(), reduction="mean")
    +
    +                    # Compute prior loss
    +                    prior_loss = F.mse_loss(model_pred_prior.float(), target_prior.float(), reduction="mean")
    +
    +                    # Add the prior loss to the instance loss.
    +                    loss = loss + args.prior_loss_weight * prior_loss
    +                else:
    +                    loss = F.mse_loss(model_pred.float(), target.float(), reduction="mean")
    +
    +                accelerator.backward(loss)
    +                if accelerator.sync_gradients:
    +                    params_to_clip = (
    +                        itertools.chain(unet.parameters(), text_encoder.parameters())
    +                        if args.train_text_encoder
    +                        else unet.parameters()
    +                    )
    +                    accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm)
    +                optimizer.step()
    +                lr_scheduler.step()
    +                optimizer.zero_grad(set_to_none=args.set_grads_to_none)
    +
    +
    +
  • +
+
+
+

Fine-tuning#

+

DreamBooth 에서 pre-trained 된 text-to-image generation 모델을 fine-tuning 할 때 “a [unique identifier] [class noun]” 그리고 “a [class noun]” 형태의 두 가지 text prompt 를 사용합니다. 이때, unique identifier 에 유지하고자 하는 대상에 대한 정보를 담는 것을 목표로 하기 때문에 사전 정보가 없는 rare token 을 사용하는 것이 중요하다고 합니다. 논문에서는 3개 이하의 Unicode character 혹은 T5-XXL tokenizer 를 랜덤하게 샘플링해서 token 을 생성하고 이를 기반으로 unique identifier 를 정의합니다.

+

또한, 논문에서 Language Drift 그리고 Reduced Output Diversity 두 가지 문제점을 해결하기 위해 Class-specific Prior Preservation Loss 를 소개합니다. 이를 활용하여 모델을 fine-tuning 하는 방법은 다음과 같습니다.

+
+dreambooth_02 +
+

Fig. 131 Fine-tuning#

+
+
+

우선, Gaussian 노이즈 이미지와 “A V [class noun]” 형태의 text prompt 를 사전학습된 text-to-image diffusion 모델에 입력하여 이미지를 생성한 후, 원본 이미지와의 Reconstruction Loss 를 계산합니다. 그리고 비슷한 과정으로 Gaussian 노이즈 이미지와 “A [class noun]” 형태의 text prompt 를 학습하고자 하는 모델, 그리고 freeze 시킨 또 다른 pre-trained diffusion 모델에 각각 입력하여 이미지를 생성한 후 Class-Specific Prior Preservation Loss 를 계산합니다. 이에 대한 training objective 를 수식적으로 표현하면 다음과 같습니다.

+
+\[ +\mathbb{E}_{x,c,\epsilon,\epsilon^{'},t}[w_t || \hat{x}_{\theta}(\alpha_tx + \sigma_t\epsilon, c) - x ||_{2}^{2} + \lambda w_{t^{'}} || \hat{x}_{\theta}(\alpha_{t^{'}} x_{pr} + \sigma_{t^{'}}\epsilon^{'}, c_{pr}) - x_{pr} ||_{2}^{2}] +\]
+

Class-Specific Prior Preservation Loss 를 추가함으로써 class prior 에 대한 정보를 유지하게 되고, 이로써 동일한 class 에 대해 더 다양한 이미지들을 생성할 수 있는 부분을 아래 그림에서 확인할 수 있습니다.

+
+dreambooth_03 +
+

Fig. 132 Encouraging diversity with prior-preservation loss#

+
+
+
+
+

Experiments#

+

DreamBooth 논문에서 세 가지의 모델 평가 metric 을 소개합니다. 첫번째로는 subject fidelity 를 측정하는 CLIP-I, DINO 그리고 prompt fidelity 를 측정하는 CLIP-T metric 을 사용합니다. 이때, DINO metric 이 동일한 class 를 가진 subject 에 대해서 다른 embedding 이 생성되기 때문에 CLIP-I 보다 더 선호된다고 합니다. 더 자세하게는 각 metric 은 다음과 같이 계산됩니다.

+
    +
  • CLIP-I := 생성된 이미지와 실제 이미지의 CLIP embedding 의 평균 pairwise cosine similarity

  • +
  • DINO := 생성된 이미지와 실제 이미지의 ViT-S/16 DINO embedding 의 평균 pairwise cosine similarity

  • +
  • CLIP-T := 입력 prompt 와 생성된 이미지의 CLIP embedding 의 평균 pairwise cosine similarity

  • +
+

Textual Inversion 과 비교했을때, 세 개의 metric 에서 모두 DreamBooth 가 더 좋은 성능을 보여주는 것을 확인할 수 있습니다.

+
+dreambooth_04 +
+

Fig. 133 Comparison of models#

+
+
+
+
+

Ablation Studies#

+

Prior Preservation Loss (PPL) 과 Class-Prior 에 대한 Ablation Studies 결과도 논문에서 공유합니다. PPL 가 적용됨으로써 앞써 소개드렸던 Language Drift 그리고 Reduced Output Diversity 문제점을 PRES 그리고 DIV metric 을 통해 해결되는 것을 보여줍니다. 또한, Class-Prior Ablation 에서 다음과 같은 세 가지 prompt 를 사용하여 fine-tuning 했을 때, 해당 subject 에 맞는 class noun 을 prompt 에 입력했을때가 가장 좋은 성능을 보여준다고 설명합니다.

+
    +
  • “no class noun”

  • +
  • “a randomly sampled incorrect class noun” (e.g., “can” for a backpack)

  • +
  • “correct class noun”

  • +
+
+
+

Applications#

+

논문에서 DreamBooth 를 활용한 여러 application 도 소개합니다.

+
+dreambooth_05 +
+

Fig. 134 Applications of DreamBooth#

+
+
+
    +
  1. Recontextualization

  2. +
+
    +
  • Prompt: “a [V] [class noun] [context description]”

  • +
  • 다음과 같은 prompt 입력 시, 사전에 보지 못했던 새로운 pose 나 articulation 을 잘 표현하는 부분을 확인할 수 있습니다.

  • +
+
+dreambooth_06 +
+

Fig. 135 Recontextualization#

+
+
+
    +
  1. Art Renditions

  2. +
+
    +
  • Prompt: “a painting of a [V] [class noun] in the style of [famous painter]” or “a statue of a [V] [class noun] in the style of [famous sculptor]”

  • +
  • Style Transfer 와 다르게 동일한 구조를 유지한 채 style 만 바꾸는 것이 아니라 다양한 pose 형태도 생성 가능합니다.

  • +
+
    +
  1. Novel View Synthesis

  2. +
+
    +
  • 동일한 subject 에 대해 다양한 각도에서 보는 이미지 생성도 가능합니다.

  • +
+
    +
  1. Property Modification

  2. +
+
    +
  • Prompt: “a cross of a [V] dog and a [target species]”

  • +
  • 사전 학습한 subject 의 고유 feature 들이 다른 target species 에서도 반영이 되는 부분을 확인할 수 있습니다.

  • +
+
+
+

Limitations#

+

하지만 DreamBooth 모델에 다음과 같은 한계점도 존재합니다.

+
+dreambooth_07 +
+

Fig. 136 Limitations of DreamBooth#

+
+
+
    +
  • Incorrect context synthesis := 대표적으로 training set 에 자주 나타나지 않는 subject, prompt, context 에 대해서 낮은 성능을 보여줍니다.

  • +
  • Context-appearance entanglement := 유지하고자 하는 대상의 appearance (e.g, color) 가 prompted context 에 의해 달라지는 현상

  • +
  • Overfitting := 사전학습된 데이터와 유사한 prompt 입력 시, overfitting 현상 발생

  • +
+

마지막으로 subject 대상에 따라 모델 성능(fidelity)이 차이를 보인다고 합니다.

+
+
+

Appendix#

+

마지막으로, 논문 본문에 소개되고 있지는 않지만 Appendix 부문에서도 흥미로운 결과들을 확인할 수 있습니다. Figure 20 은 fine tuning 하는 이미지 개수에 따른 DreamBooth 학습결과를 보여주는데, 단 한 장만으로도 identity 의 전반적인 특징을 잘 담는 것을 확인할 수 있습니다. Figure 18 은 만화 캐릭터의 identity 를 유지한 상태로 다양한 만화 사진들을 모델이 생성하는 사례들을 보여줍니다.

+
+dreambooth_08 +
+

Fig. 137 Appendix-1#

+
+
+
+dreambooth_09 +
+

Fig. 138 Appendix-2#

+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/gan.html b/docs/review/gan.html old mode 100644 new mode 100755 index 996d1432..bbd2f65c --- a/docs/review/gan.html +++ b/docs/review/gan.html @@ -1,824 +1,843 @@ - - - - - - - - - - - - GAN — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

GAN

- -
- -
-
- - - - -
- -
-

Information

- -
-
-

GAN#

-
-

Introduction#

-

생성형 모델은 크게 생성하고자 하는 데이터의 explicit density 와 implicit density 를 계산하는 방식으로 나뉩니다. Explicit density 를 계산한다는 것은 데이터 분포를 명확하게 사전에 정의하고 모델을 학습하는 것을 의미합니다. 이때, 데이터의 분포를 직접적인 계산이 가능한 tractable density 로 추정하는 방법과 근사화시켜 approximate density 로 추정하는 방법으로 나뉩니다.

-
    -
  • Tractable density: AutoRegressive 하게 구하는 방식이 있습니다. AutoRegressive 모델을 사용하여 이전 단계의 데이터를 활용하여 모델을 학습하고, 대표적인 모델로는 PixelCNN, PixelRNN 등이 있습니다.

  • -
  • Approximate density: 대표적으로 score-based model, Boltzmann Machine 등이 있습니다.

    -
      -
    • Score-based model - 모델 파라미터의 gradient 가 아닌 데이터의 gradient 활용하여 모델을 학습하는 방식으로, energy-based model 에서 MLE 에 사용하는 확률분포를 정규화하는 term 을 따로 계산하지 않아도 되는 장점이 있습니다.

    • -
    • Boltzmann Machine : 완전그래프 구조로 학습하는 생성형 모델입니다. 모델을 학습하는 과정에서 확률 분포의 학습이 어려워(계산량이 많아서 어려움) Markov chain 을 활용하여 학습합니다. 또한, 완전그래프이기 때문에 노드가 늘어날수록 간선, 파라미터 등이 급증하는 문제가 있어 Restricted Boltzmann Machine(RBM) 이 제안되기도 했습니다.

    • -
    -
  • -
-

반면에 데이터의 분포를 명확히 정의하지 않고 implicit 하게 모델을 학습하는 방식도 존재합니다. 대표적으로는 Ian Goodfellow 가 2014년에 발표한 GAN 모델이 있습니다. GAN 은 최근에 Diffusion Model 이 소개되기 전까지 몇 년 동안 이미지 생성 분야에서 대표적인 모델로 자리잡았었습니다. GAN 은 VAE 와 달리 marginal likelihood \(p_{\theta}(x)\) 를 직접 구하지 않고, Adversarial Process 를 통해 implicit 하게 샘플링을 해서 분포를 구하게 됩니다.

-
-gan_01 -
-

Fig. 8 Taxonomy of Generative Models#

-
-
-

아래 그림과 같이 GAN 은 크게 잠재변수 \(z\) 로부터 가짜 데이터를 생성하는 Generator 와 그로부터 생성된 데이터와 실제 training 데이터를 구분하는 Discriminator 로 구성이 되어 있습니다. 다시 말해서 Discriminator 는 실제 데이터가 들어오면 1, 그리고 가짜로 생성된 데이터가 들어오면 0 을 출력하는 binary classification task 를 진행합니다.

-
-gan_03 -
-

Fig. 9 Generative Adversarial Network(GAN) Architecture#

-
-
-

Generator 와 Discriminator 구현 코드도 같이 살펴보겠습니다.

-
    -
  • Generator 구현 code

    -
    class Generator(nn.Module):
    -    def __init__(self):
    -        super(Generator, self).__init__()
    -
    -        def block(in_feat, out_feat, normalize=True):
    -            layers = [nn.Linear(in_feat, out_feat)]
    -            if normalize:
    -                layers.append(nn.BatchNorm1d(out_feat, 0.8))
    -            layers.append(nn.LeakyReLU(0.2, inplace=True))
    -            return layers
    -
    -        self.model = nn.Sequential(
    -            *block(opt.latent_dim, 128, normalize=False),
    -            *block(128, 256),
    -            *block(256, 512),
    -            *block(512, 1024),
    -            nn.Linear(1024, int(np.prod(img_shape))),
    -            nn.Tanh()
    -        )
    -
    -    def forward(self, z):
    -        img = self.model(z)
    -        img = img.view(img.size(0), *img_shape)
    -        return img
    -
    -
    -
  • -
  • Discriminator 구현 code

    -
    class Discriminator(nn.Module):
    -    def __init__(self):
    -        super(Discriminator, self).__init__()
    -
    -        self.model = nn.Sequential(
    -            nn.Linear(int(np.prod(img_shape)), 512),
    -            nn.LeakyReLU(0.2, inplace=True),
    -            nn.Linear(512, 256),
    -            nn.LeakyReLU(0.2, inplace=True),
    -            nn.Linear(256, 1),
    -            nn.Sigmoid(),
    -        )
    -
    -    def forward(self, img):
    -        img_flat = img.view(img.size(0), -1)
    -        validity = self.model(img_flat)
    -
    -        return validity
    -
    -
    -
  • -
-
-
-

Training Procedure#

-

GAN 을 학습할 시, D를 먼저 최적화하는 k 단계G를 최적화하는 한 단계를 번갈아 수행합니다. 그리고 이때 쓰이는 손실함수(loss function)은 다음과 같습니다.

-
-\[ -\min_G \max_D V(D,G) = \mathbb{E}\_{x \sim p_{data}(x)}[logD(x)] + \mathbb{E}\_{z \sim p_z(z)}[\log(1-D(G(z))] -\]
-

논문에서 제시한 학습 알고리즘과 실제 implementation code 를 비교해보겠습니다.

-
-gan_02 -
-

Fig. 10 Generative Adversarial Network(GAN) Training Procedure#

-
-
-
    -
  • GAN 학습 code

    -
    # ----------
    -#  Training
    -# ----------
    -
    -for epoch in range(opt.n_epochs):
    -    for i, (imgs, _) in enumerate(dataloader):
    -
    -        # Adversarial ground truths
    -        valid = Variable(Tensor(imgs.size(0), 1).fill_(1.0), requires_grad=False)
    -        fake = Variable(Tensor(imgs.size(0), 1).fill_(0.0), requires_grad=False)
    -
    -        # Configure input
    -        real_imgs = Variable(imgs.type(Tensor))
    -
    -        # -----------------
    -        #  Train Generator
    -        # -----------------
    -
    -        optimizer_G.zero_grad()
    -
    -        # Sample noise as generator input
    -        z = Variable(Tensor(np.random.normal(0, 1, (imgs.shape[0], opt.latent_dim))))
    -
    -        # Generate a batch of images
    -        gen_imgs = generator(z)
    -
    -        # Loss measures generator's ability to fool the discriminator
    -        g_loss = adversarial_loss(discriminator(gen_imgs), valid)
    -
    -        g_loss.backward()
    -        optimizer_G.step()
    -
    -        # ---------------------
    -        #  Train Discriminator
    -        # ---------------------
    -
    -        optimizer_D.zero_grad()
    -
    -        # Measure discriminator's ability to classify real from generated samples
    -        real_loss = adversarial_loss(discriminator(real_imgs), valid)
    -        fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake)
    -        d_loss = (real_loss + fake_loss) / 2
    -
    -        d_loss.backward()
    -        optimizer_D.step()
    -
    -        print(
    -            "[Epoch %d/%d] [Batch %d/%d] [D loss: %f] [G loss: %f]"
    -            % (epoch, opt.n_epochs, i, len(dataloader), d_loss.item(), g_loss.item())
    -        )
    -
    -        batches_done = epoch * len(dataloader) + i
    -        if batches_done % opt.sample_interval == 0:
    -            save_image(gen_imgs.data[:25], "images/%d.png" % batches_done, nrow=5, normalize=True)
    -
    -
    -
  • -
-

이렇게 Discriminator 와 Generator 는 각각 \(V(D,G)\) 가 최대화하고 최소화하는 방향으로 stochastic gradient descent 를 진행하게 됩니다. 하지만 아래 그림처럼 실제로 Generator를 학습할 때, 초반에 \(D(G(z)) \approx 0\) 일 경우 학습하지 못하는 상황이 발생합니다. 이 때, \(\log(1-D(G(z))\) 를 최소화하지 않고 \(\log(D(G(z))\) 를 최대화하는 방향으로 Generator 를 학습하는 기법도 있습니다.

-
-gan_04 -
-

Fig. 11 Alternative to Vanishing Gradient when Training the Generator#

-
-
-

이렇게 학습함으로써 최적화된 solution 에서는 Generator 가 training 데이터 분포를 완벽히 복원하고 Discriminator 는 binary classification 확률을 언제나 1/2 로 내뱉게 됩니다.

-
-

Theoretical Results#

-

Proposition 1. 고정된 Generator 에 대해서, 최적화된 Discriminator 는 다음과 같습니다.

-
-\[ -D_{G}^*(x) = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)} -\]
-

이를 증명하자면, Discriminator 에 대한 손실함수를 다음과 같이 쓸 수 있고 \(D = D_{G}^*(x)\) 가 이를 최대화하는 solution 입니다.

-
-\[ -V(D,G) = \int_x p_{data}(x) \log(D(x)) dx+ \int_z p_{z}(z) \log(1-D(g(z)) dz -\]
-
-\[ -= \int_x p_{data}(x) \log(D(x)) + p_{g}(x) \log(1-D(x)) dx -\]
-

Proposition 2. 최적화된 Discriminator 에 대해 \(\max_D V(D,G)\) 를 최소화하는 Generator 는 \(p_g = p_{data}\) 일때 성립하고 이때 \(D = D_{G}^*(x) = 1/2\) 입니다.

-

이를 증명하자면, 최적화된 Discriminator 에 대한 손실함수는 다음과 같고

-
-\[ -V(D^{\ast},G) = \mathbb{E}\_{x \sim p_{data}(x)} [ \log D^{\ast}(x) ] + \mathbb{E}\_{x \sim p_g(x)} [ \log(1-D^{\ast}(x) ] -\]
-
-\[ -= \int_x p_{data}(x) \log(\frac{p_{data}(x)}{p_{data}(x) + p_g(x)}) + \int_x p_{g}(x) \log(\frac{p_{g}(x)}{p_{data}(x) + p_g(x)})\ dx -\]
-
-\[ -= -\log(4)\ + KL(p_{data}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) + KL(p_{g}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) -\]
-

\(KL(p_{data}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) + KL(p_{g}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) = 2\ \cdot\ JSD(p_{data}\ ||\ p_{g})\) 의 최솟값은 0 이고 이는 \(p_g = p_{data}\) 일때 성립합니다.

-
-
-
-

Experiments#

-

논문에서 MNIST, the Toronto Face Database(TFD), 그리고 CIFAR-10 dataset 로 모델 실험 및 성능 평가했습니다. 평가시에는 \(p_g\) 로부터 Parzen density estimation을 거쳐 계산한 log likelihood estimate 로 모델 성능 평가를 진행했습니다. 아래 표를 보면 실험 방법 중 GAN이 제일 결과가 좋은 것을 볼 수 있습니다.

-
-gan_05 -
-

Fig. 12 Experimental Results#

-
-
-
-
-

Summary#

-

VAE는 새로운 데이터를 잘 생성하지만 생성된 이미지가 흐릿하다는 단점을 지니고 있습니다. 반면에 GAN 은 high quality image 를 잘 생성하지만 unstable 한 convergence 를 가지고 있습니다. 그래서 실제로 VAE 는 Encoder 를 활용한 차원축소로 많이 활용되고 이미지 데이터를 생성하는데는 GAN 이 많이 활용되었다고 합니다.

-
-
- - - - -
- - - - - - -
- - - -
- - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + GAN — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

GAN

+ +
+ +
+
+ + + + +
+ +
+

Information

+ +
+
+

GAN#

+
+

Introduction#

+

생성형 모델은 크게 생성하고자 하는 데이터의 explicit density 와 implicit density 를 계산하는 방식으로 나뉩니다. Explicit density 를 계산한다는 것은 데이터 분포를 명확하게 사전에 정의하고 모델을 학습하는 것을 의미합니다. 이때, 데이터의 분포를 직접적인 계산이 가능한 tractable density 로 추정하는 방법과 근사화시켜 approximate density 로 추정하는 방법으로 나뉩니다.

+
    +
  • Tractable density: AutoRegressive 하게 구하는 방식이 있습니다. AutoRegressive 모델을 사용하여 이전 단계의 데이터를 활용하여 모델을 학습하고, 대표적인 모델로는 PixelCNN, PixelRNN 등이 있습니다.

  • +
  • Approximate density: 대표적으로 score-based model, Boltzmann Machine 등이 있습니다.

    +
      +
    • Score-based model - 모델 파라미터의 gradient 가 아닌 데이터의 gradient 활용하여 모델을 학습하는 방식으로, energy-based model 에서 MLE 에 사용하는 확률분포를 정규화하는 term 을 따로 계산하지 않아도 되는 장점이 있습니다.

    • +
    • Boltzmann Machine : 완전그래프 구조로 학습하는 생성형 모델입니다. 모델을 학습하는 과정에서 확률 분포의 학습이 어려워(계산량이 많아서 어려움) Markov chain 을 활용하여 학습합니다. 또한, 완전그래프이기 때문에 노드가 늘어날수록 간선, 파라미터 등이 급증하는 문제가 있어 Restricted Boltzmann Machine(RBM) 이 제안되기도 했습니다.

    • +
    +
  • +
+

반면에 데이터의 분포를 명확히 정의하지 않고 implicit 하게 모델을 학습하는 방식도 존재합니다. 대표적으로는 Ian Goodfellow 가 2014년에 발표한 GAN 모델이 있습니다. GAN 은 최근에 Diffusion Model 이 소개되기 전까지 몇 년 동안 이미지 생성 분야에서 대표적인 모델로 자리잡았었습니다. GAN 은 VAE 와 달리 marginal likelihood \(p_{\theta}(x)\) 를 직접 구하지 않고, Adversarial Process 를 통해 implicit 하게 샘플링을 해서 분포를 구하게 됩니다.

+
+gan_01 +
+

Fig. 8 Taxonomy of Generative Models#

+
+
+

아래 그림과 같이 GAN 은 크게 잠재변수 \(z\) 로부터 가짜 데이터를 생성하는 Generator 와 그로부터 생성된 데이터와 실제 training 데이터를 구분하는 Discriminator 로 구성이 되어 있습니다. 다시 말해서 Discriminator 는 실제 데이터가 들어오면 1, 그리고 가짜로 생성된 데이터가 들어오면 0 을 출력하는 binary classification task 를 진행합니다.

+
+gan_03 +
+

Fig. 9 Generative Adversarial Network(GAN) Architecture#

+
+
+

Generator 와 Discriminator 구현 코드도 같이 살펴보겠습니다.

+
    +
  • Generator 구현 code

    +
    class Generator(nn.Module):
    +    def __init__(self):
    +        super(Generator, self).__init__()
    +
    +        def block(in_feat, out_feat, normalize=True):
    +            layers = [nn.Linear(in_feat, out_feat)]
    +            if normalize:
    +                layers.append(nn.BatchNorm1d(out_feat, 0.8))
    +            layers.append(nn.LeakyReLU(0.2, inplace=True))
    +            return layers
    +
    +        self.model = nn.Sequential(
    +            *block(opt.latent_dim, 128, normalize=False),
    +            *block(128, 256),
    +            *block(256, 512),
    +            *block(512, 1024),
    +            nn.Linear(1024, int(np.prod(img_shape))),
    +            nn.Tanh()
    +        )
    +
    +    def forward(self, z):
    +        img = self.model(z)
    +        img = img.view(img.size(0), *img_shape)
    +        return img
    +
    +
    +
  • +
  • Discriminator 구현 code

    +
    class Discriminator(nn.Module):
    +    def __init__(self):
    +        super(Discriminator, self).__init__()
    +
    +        self.model = nn.Sequential(
    +            nn.Linear(int(np.prod(img_shape)), 512),
    +            nn.LeakyReLU(0.2, inplace=True),
    +            nn.Linear(512, 256),
    +            nn.LeakyReLU(0.2, inplace=True),
    +            nn.Linear(256, 1),
    +            nn.Sigmoid(),
    +        )
    +
    +    def forward(self, img):
    +        img_flat = img.view(img.size(0), -1)
    +        validity = self.model(img_flat)
    +
    +        return validity
    +
    +
    +
  • +
+
+
+

Training Procedure#

+

GAN 을 학습할 시, D를 먼저 최적화하는 k 단계G를 최적화하는 한 단계를 번갈아 수행합니다. 그리고 이때 쓰이는 손실함수(loss function)은 다음과 같습니다.

+
+\[ +\min_G \max_D V(D,G) = \mathbb{E}\_{x \sim p_{data}(x)}[logD(x)] + \mathbb{E}\_{z \sim p_z(z)}[\log(1-D(G(z))] +\]
+

논문에서 제시한 학습 알고리즘과 실제 implementation code 를 비교해보겠습니다.

+
+gan_02 +
+

Fig. 10 Generative Adversarial Network(GAN) Training Procedure#

+
+
+
    +
  • GAN 학습 code

    +
    # ----------
    +#  Training
    +# ----------
    +
    +for epoch in range(opt.n_epochs):
    +    for i, (imgs, _) in enumerate(dataloader):
    +
    +        # Adversarial ground truths
    +        valid = Variable(Tensor(imgs.size(0), 1).fill_(1.0), requires_grad=False)
    +        fake = Variable(Tensor(imgs.size(0), 1).fill_(0.0), requires_grad=False)
    +
    +        # Configure input
    +        real_imgs = Variable(imgs.type(Tensor))
    +
    +        # -----------------
    +        #  Train Generator
    +        # -----------------
    +
    +        optimizer_G.zero_grad()
    +
    +        # Sample noise as generator input
    +        z = Variable(Tensor(np.random.normal(0, 1, (imgs.shape[0], opt.latent_dim))))
    +
    +        # Generate a batch of images
    +        gen_imgs = generator(z)
    +
    +        # Loss measures generator's ability to fool the discriminator
    +        g_loss = adversarial_loss(discriminator(gen_imgs), valid)
    +
    +        g_loss.backward()
    +        optimizer_G.step()
    +
    +        # ---------------------
    +        #  Train Discriminator
    +        # ---------------------
    +
    +        optimizer_D.zero_grad()
    +
    +        # Measure discriminator's ability to classify real from generated samples
    +        real_loss = adversarial_loss(discriminator(real_imgs), valid)
    +        fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake)
    +        d_loss = (real_loss + fake_loss) / 2
    +
    +        d_loss.backward()
    +        optimizer_D.step()
    +
    +        print(
    +            "[Epoch %d/%d] [Batch %d/%d] [D loss: %f] [G loss: %f]"
    +            % (epoch, opt.n_epochs, i, len(dataloader), d_loss.item(), g_loss.item())
    +        )
    +
    +        batches_done = epoch * len(dataloader) + i
    +        if batches_done % opt.sample_interval == 0:
    +            save_image(gen_imgs.data[:25], "images/%d.png" % batches_done, nrow=5, normalize=True)
    +
    +
    +
  • +
+

이렇게 Discriminator 와 Generator 는 각각 \(V(D,G)\) 가 최대화하고 최소화하는 방향으로 stochastic gradient descent 를 진행하게 됩니다. 하지만 아래 그림처럼 실제로 Generator를 학습할 때, 초반에 \(D(G(z)) \approx 0\) 일 경우 학습하지 못하는 상황이 발생합니다. 이 때, \(\log(1-D(G(z))\) 를 최소화하지 않고 \(\log(D(G(z))\) 를 최대화하는 방향으로 Generator 를 학습하는 기법도 있습니다.

+
+gan_04 +
+

Fig. 11 Alternative to Vanishing Gradient when Training the Generator#

+
+
+

이렇게 학습함으로써 최적화된 solution 에서는 Generator 가 training 데이터 분포를 완벽히 복원하고 Discriminator 는 binary classification 확률을 언제나 1/2 로 내뱉게 됩니다.

+
+

Theoretical Results#

+

Proposition 1. 고정된 Generator 에 대해서, 최적화된 Discriminator 는 다음과 같습니다.

+
+\[ +D_{G}^*(x) = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)} +\]
+

이를 증명하자면, Discriminator 에 대한 손실함수를 다음과 같이 쓸 수 있고 \(D = D_{G}^*(x)\) 가 이를 최대화하는 solution 입니다.

+
+\[ +V(D,G) = \int_x p_{data}(x) \log(D(x)) dx+ \int_z p_{z}(z) \log(1-D(g(z)) dz +\]
+
+\[ += \int_x p_{data}(x) \log(D(x)) + p_{g}(x) \log(1-D(x)) dx +\]
+

Proposition 2. 최적화된 Discriminator 에 대해 \(\max_D V(D,G)\) 를 최소화하는 Generator 는 \(p_g = p_{data}\) 일때 성립하고 이때 \(D = D_{G}^*(x) = 1/2\) 입니다.

+

이를 증명하자면, 최적화된 Discriminator 에 대한 손실함수는 다음과 같고

+
+\[ +V(D^{\ast},G) = \mathbb{E}\_{x \sim p_{data}(x)} [ \log D^{\ast}(x) ] + \mathbb{E}\_{x \sim p_g(x)} [ \log(1-D^{\ast}(x) ] +\]
+
+\[ += \int_x p_{data}(x) \log(\frac{p_{data}(x)}{p_{data}(x) + p_g(x)}) + \int_x p_{g}(x) \log(\frac{p_{g}(x)}{p_{data}(x) + p_g(x)})\ dx +\]
+
+\[ += -\log(4)\ + KL(p_{data}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) + KL(p_{g}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) +\]
+

\(KL(p_{data}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) + KL(p_{g}(x)\ ||\ \frac{p_{data}+p_{g}}{2}) = 2\ \cdot\ JSD(p_{data}\ ||\ p_{g})\) 의 최솟값은 0 이고 이는 \(p_g = p_{data}\) 일때 성립합니다.

+
+
+
+

Experiments#

+

논문에서 MNIST, the Toronto Face Database(TFD), 그리고 CIFAR-10 dataset 로 모델 실험 및 성능 평가했습니다. 평가시에는 \(p_g\) 로부터 Parzen density estimation을 거쳐 계산한 log likelihood estimate 로 모델 성능 평가를 진행했습니다. 아래 표를 보면 실험 방법 중 GAN이 제일 결과가 좋은 것을 볼 수 있습니다.

+
+gan_05 +
+

Fig. 12 Experimental Results#

+
+
+
+
+

Summary#

+

VAE는 새로운 데이터를 잘 생성하지만 생성된 이미지가 흐릿하다는 단점을 지니고 있습니다. 반면에 GAN 은 high quality image 를 잘 생성하지만 unstable 한 convergence 를 가지고 있습니다. 그래서 실제로 VAE 는 Encoder 를 활용한 차원축소로 많이 활용되고 이미지 데이터를 생성하는데는 GAN 이 많이 활용되었다고 합니다.

+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/imagen.html b/docs/review/imagen.html old mode 100644 new mode 100755 index 53b6a472..c628e091 --- a/docs/review/imagen.html +++ b/docs/review/imagen.html @@ -1,836 +1,855 @@ - - - - - - - - - - - - Imagen — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

-
    -
  • Title: Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding (NeurIPS 2022)

  • -
  • Reference

    - -
  • -
  • Author: Donggeun Sean Ko

  • -
  • Last updated on Sep. 13, 2023

  • -
-
-
-

Imagen#

-
-

Introduction#

-
    -
  • Multi-modal learning, 특히 text-to-image generation 에서 contrastive learning이 최근에 많은 주목을 받고 있음.

  • -
  • Contrastive learning 과 더불어 large language model (LLM) 들과 diffusion model 들을 사용하여 독창적인 image 생성도 가능함

  • -
  • 텍스트 전용 말뭉치 (text corpus)로 학습된 LLM들의 text embedding들은 text-to-image 합성에 매우 효과적이라고 함.

  • -
  • Classifier-free guidance 사용하여, 더 높은 충실도 (fidelity)의 이미지를 생성하는 새로운 샘플링 기술을 사용함.

  • -
-
-imagen_1 -
-

Fig. 211 Concept of Contrastive Learning#

-
-
-
-
-

Contributions#

-
    -
  1. Pretrained Frozen text encoder (T5-XXL) 이 text-to-image generation task 에 매우 좋은 성능을 보여줌.

  2. -
  3. Pretrained Text Encoder 사이즈를 fine-tuning하는 것이 diffusion model size fine tuning 하는 것보다 더 중요하다는 것을 실험적으로 증명함

  4. -
  5. Dynamic Thresholding 이라는 새로운 diffusion sampling technique (thresholding diffusion sampler) 을 제시하여 high guidance weight을 leverage 할 수 있게 만들어 더욱 “현실적인” 이미지 생성을 할 수 있음

  6. -
  7. Efficient U-Net이라는 기존 Palette 나 DDIM에서 사용하는 U-Net 구조보다 computational, memory efficient 한 U-Net 구조를 제시함

  8. -
  9. COCO FID 점수 7.27 SOTA 점수를 달성함

  10. -
  11. DrawBench라는 새로운 text-to-image generation evaluation용 benchmark dataset을 제시함

  12. -
-
-
-

Methodology#

-
-

Pretrained T5-XXL + Cascaded Diffusion Model#

-
    -
  • Pretrained Text Encoder 중 T5-XXL (구글 모델) 사용

  • -
  • 학습 시 pretrained text encoder을 Freeze 해놓음

  • -
  • Text-to-Image Diffusion Model (Improved DDPM 아키텍쳐) 사용해 64x64 image 생성

  • -
  • 2가지 SR model (Efficient U-Net)을 사용해서 64 → 256 → 1024 로 upsampling

  • -
-
-imagen_2 -
-

Fig. 212 Imagen overall pipeline#

-
-
-
-
-

Classifier-Free Guidance#

-
    -
  • Classifier-free guidance 이란 auxiliary classifier의 효과 없이 classifier guidance 효과를 얻는 방법

  • -
  • 아래의 그림처럼 guidance가 없을 시 image generation이 일정하지 않음. 즉, label/class 의 영향을 못받아서, 생성이 일정하지 않음.

  • -
  • guidance를 줄 시, 생성된 이미지의 class나 object이 일정하고 무엇을 생성하는것인지 좀 더 자세하게 알 수 있음.

  • -
-
-imagen_3 -
-

Fig. 213 Comparison between when guidance is not used (left) vs when guidance is used with parameter, w=3 (right)#

-
-
-
-
-

Large guidance weight sampler#

-
    -
  • Guide의 가중치 w 를 높이면 train-test 불일치가 생긴다.

  • -
  • 이로 인해, 높은 가중치의 이미지는 훈련 데이터 범위 안에 없어 [-1,1], classifier-free guidance가 평균과 분산을 이동시켜 이미지가 아예 “빗나가” 이상한 이미지를 생성하게 된다

  • -
-
-
-

Static Thresholding#

-
    -
  • x-prediction 을 [-1,1]로 clipping 한다. 여전히 saturation 이 되고 fidelity가 덜한 이미지가 생성 됌

  • -
  • 문제를 해결하고자 dynamic thresholding 을 제시함

  • -
-
-imagen_5 -
-

Fig. 214 Graphical visualization of static thresholding#

-
-
-
-
-

Dynamic Thresholding#

-
    -
  • 특정 백분위수 절대 픽셀 값을 s 라고 지정하고 s > 1 이면, 임계값을 [-s,s]로 지정한 다음 s로 나눈다.

  • -
  • 예시: 90% 지점의 픽셀 값이 3 이면 [-3,3]으로 clipping 한 후 3으로 나눠서 [-1,1] 로 normalize 함.

  • -
  • Thresholding 의 차이는 아래 결과 비교 이미지로 확인 할 수 있다.

  • -
-
-imagen_6 -
-

Fig. 215 Graphical visualization of dynamic thresholding#

-
-
-
-imagen_7 -
-

Fig. 216 Comparison among no thresholding, static thresholding and dynamic thresholding, respectively#

-
-
-
-
-

Super Resolution Models#

-
    -
  • Efficient U-Net이라는 새로운 모델을 만들어, 기존 U-Net에서 여러가지 modification을 하였다고 주장 (그렇지만 EffU-Net은 의료쪽으로 이름이 이미 있는걸로 아는데…)

  • -
  • Removed self-attention layer

  • -
  • Keep the text cross-attention layer

  • -
  • Skip connection scaling을 1/(√2)로 하여 convergence 를 더 빠르게 함

  • -
  • Lower resolution block에서 residual blocks를 더 추가함

  • -
-
-imagen_8 -
-

Fig. 217 Architecture of Super Resolution Diffusion Model used in Imagen#

-
-
-
-
-

DrawBench#

-
    -
  • Imagen 저자들이 제시한 새로운 벤치마크 데이터셋. 본 데이터셋은 text prompt 와 category label 로 이루어졌다

  • -
  • 깃허브에서 다운 받을 수 있으며, 예시는 아래 그림과 갗다 -11 categories, 200 text prompts -Human evaluation 으로 진행 (25명의 평가자) -Model A에서 생성한 이미지 set vs Model B에서 생성한 이미지 set

  • -
-

평가자는 2가지 질문을 주며 2가지 기준점으로 평가함 -Q1. Which set of images is of higher quality? -Q2. Which set of images better represents the text caption: {text caption}?

-

기준점

-
    -
  • Image Fidelity

  • -
  • Image-text alignment

  • -
-

평가자는 3가지 답변 중 하나를 선택해야함

-
    -
  1. I prefer set A

  2. -
  3. I am Indifferent

  4. -
  5. I prefer set B

  6. -
-
-imagen_9 -
-

Fig. 218 Screenshot of DrawBench dataset#

-
-
-
-
-
-

Results#

-
    -
  • Figure 2 에서는 DrawBench에서 나온 결과를 체리피킹 없이 보여준다.

  • -
  • 아마 저자들은 체리피킹 없이도 좋은 결과를 보여주고, 다양한 카테고리에서도 훌륭한 이미지를 생성 할 수 있다는 주장인 것 같다.

  • -
-
-imagen_10 -
-

Fig. 219 Result of Imagen in DrawBench dataset#

-
-
-
    -
  • Zero-shot 으로 한 FID값이 MS-COCO로 학습한 모델들 FID 보다 높음.

  • -
  • Table 2 에서는 Imagen이 no people (사람이 없는 사진) 에는 photorealism 점수가 올라감 -→ Imagen 은 photorealistic people을 생성하기에 한계가 있음.

  • -
-
-imagen_11 -
-

Fig. 220 Result Table of Imagen#

-
-
-
-

Qualitative Result Table of Imagen from Human Evaluators#

-
    -
  • Human raters (사람 평가자) 들은 T5-XXL로 text encoding 한 text-to-image generation 모델을 CLIP-based 보다 더 선호함

  • -
  • 기본적으로 Imagen 은 다른 text-to-image generation 모델에서 (SOTA 모델인 DALL-E 2) 보다도 human raters 에서 DrawBench 데이터셋에서 좋은 평가를 받음

  • -
-
-imagen_12 -
-

Fig. 221 Qualitative Result Table of Imagen from Human evaulators#

-
-
-
-
-
-

Ablation Study#

-
    -
  • Scaling text encoder size 가 U-Net size scaling 보다 더 중요함

  • -
  • (a)의 text encoder 사이즈의 변화가 FID 및 CLIP score 점수에 더욱 많은 영향을 끼침

  • -
  • Dynamic thresholding 이 performance boost에 더욱 영향을 끼침

  • -
  • Dynamic thresholding을 이용하면 성능을 더욱 끌어 올릴 수 있음

  • -
-
-imagen_13 -
-

Fig. 222 Qualitative Result Table of Imagen from Human evaulators#

-
-
-
-
-

Conclusion#

-
    -
  • Frozen large pretrained language model shows better performance over text-image paired multimodal encoders such as CLIP in text-to-image generation task

  • -
  • Efficient U-Net significantly improves performance time

  • -
  • Dynamic thresholding allows usage of much higher guidance weights with better fidelity of generated images

  • -
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Imagen — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+
    +
  • Title: Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding (NeurIPS 2022)

  • +
  • Reference

    + +
  • +
  • Author: Donggeun Sean Ko

  • +
  • Last updated on Sep. 13, 2023

  • +
+
+
+

Imagen#

+
+

Introduction#

+
    +
  • Multi-modal learning, 특히 text-to-image generation 에서 contrastive learning이 최근에 많은 주목을 받고 있음.

  • +
  • Contrastive learning 과 더불어 large language model (LLM) 들과 diffusion model 들을 사용하여 독창적인 image 생성도 가능함

  • +
  • 텍스트 전용 말뭉치 (text corpus)로 학습된 LLM들의 text embedding들은 text-to-image 합성에 매우 효과적이라고 함.

  • +
  • Classifier-free guidance 사용하여, 더 높은 충실도 (fidelity)의 이미지를 생성하는 새로운 샘플링 기술을 사용함.

  • +
+
+imagen_1 +
+

Fig. 211 Concept of Contrastive Learning#

+
+
+
+
+

Contributions#

+
    +
  1. Pretrained Frozen text encoder (T5-XXL) 이 text-to-image generation task 에 매우 좋은 성능을 보여줌.

  2. +
  3. Pretrained Text Encoder 사이즈를 fine-tuning하는 것이 diffusion model size fine tuning 하는 것보다 더 중요하다는 것을 실험적으로 증명함

  4. +
  5. Dynamic Thresholding 이라는 새로운 diffusion sampling technique (thresholding diffusion sampler) 을 제시하여 high guidance weight을 leverage 할 수 있게 만들어 더욱 “현실적인” 이미지 생성을 할 수 있음

  6. +
  7. Efficient U-Net이라는 기존 Palette 나 DDIM에서 사용하는 U-Net 구조보다 computational, memory efficient 한 U-Net 구조를 제시함

  8. +
  9. COCO FID 점수 7.27 SOTA 점수를 달성함

  10. +
  11. DrawBench라는 새로운 text-to-image generation evaluation용 benchmark dataset을 제시함

  12. +
+
+
+

Methodology#

+
+

Pretrained T5-XXL + Cascaded Diffusion Model#

+
    +
  • Pretrained Text Encoder 중 T5-XXL (구글 모델) 사용

  • +
  • 학습 시 pretrained text encoder을 Freeze 해놓음

  • +
  • Text-to-Image Diffusion Model (Improved DDPM 아키텍쳐) 사용해 64x64 image 생성

  • +
  • 2가지 SR model (Efficient U-Net)을 사용해서 64 → 256 → 1024 로 upsampling

  • +
+
+imagen_2 +
+

Fig. 212 Imagen overall pipeline#

+
+
+
+
+

Classifier-Free Guidance#

+
    +
  • Classifier-free guidance 이란 auxiliary classifier의 효과 없이 classifier guidance 효과를 얻는 방법

  • +
  • 아래의 그림처럼 guidance가 없을 시 image generation이 일정하지 않음. 즉, label/class 의 영향을 못받아서, 생성이 일정하지 않음.

  • +
  • guidance를 줄 시, 생성된 이미지의 class나 object이 일정하고 무엇을 생성하는것인지 좀 더 자세하게 알 수 있음.

  • +
+
+imagen_3 +
+

Fig. 213 Comparison between when guidance is not used (left) vs when guidance is used with parameter, w=3 (right)#

+
+
+
+
+

Large guidance weight sampler#

+
    +
  • Guide의 가중치 w 를 높이면 train-test 불일치가 생긴다.

  • +
  • 이로 인해, 높은 가중치의 이미지는 훈련 데이터 범위 안에 없어 [-1,1], classifier-free guidance가 평균과 분산을 이동시켜 이미지가 아예 “빗나가” 이상한 이미지를 생성하게 된다

  • +
+
+
+

Static Thresholding#

+
    +
  • x-prediction 을 [-1,1]로 clipping 한다. 여전히 saturation 이 되고 fidelity가 덜한 이미지가 생성 됌

  • +
  • 문제를 해결하고자 dynamic thresholding 을 제시함

  • +
+
+imagen_5 +
+

Fig. 214 Graphical visualization of static thresholding#

+
+
+
+
+

Dynamic Thresholding#

+
    +
  • 특정 백분위수 절대 픽셀 값을 s 라고 지정하고 s > 1 이면, 임계값을 [-s,s]로 지정한 다음 s로 나눈다.

  • +
  • 예시: 90% 지점의 픽셀 값이 3 이면 [-3,3]으로 clipping 한 후 3으로 나눠서 [-1,1] 로 normalize 함.

  • +
  • Thresholding 의 차이는 아래 결과 비교 이미지로 확인 할 수 있다.

  • +
+
+imagen_6 +
+

Fig. 215 Graphical visualization of dynamic thresholding#

+
+
+
+imagen_7 +
+

Fig. 216 Comparison among no thresholding, static thresholding and dynamic thresholding, respectively#

+
+
+
+
+

Super Resolution Models#

+
    +
  • Efficient U-Net이라는 새로운 모델을 만들어, 기존 U-Net에서 여러가지 modification을 하였다고 주장 (그렇지만 EffU-Net은 의료쪽으로 이름이 이미 있는걸로 아는데…)

  • +
  • Removed self-attention layer

  • +
  • Keep the text cross-attention layer

  • +
  • Skip connection scaling을 1/(√2)로 하여 convergence 를 더 빠르게 함

  • +
  • Lower resolution block에서 residual blocks를 더 추가함

  • +
+
+imagen_8 +
+

Fig. 217 Architecture of Super Resolution Diffusion Model used in Imagen#

+
+
+
+
+

DrawBench#

+
    +
  • Imagen 저자들이 제시한 새로운 벤치마크 데이터셋. 본 데이터셋은 text prompt 와 category label 로 이루어졌다

  • +
  • 깃허브에서 다운 받을 수 있으며, 예시는 아래 그림과 갗다 +11 categories, 200 text prompts +Human evaluation 으로 진행 (25명의 평가자) +Model A에서 생성한 이미지 set vs Model B에서 생성한 이미지 set

  • +
+

평가자는 2가지 질문을 주며 2가지 기준점으로 평가함 +Q1. Which set of images is of higher quality? +Q2. Which set of images better represents the text caption: {text caption}?

+

기준점

+
    +
  • Image Fidelity

  • +
  • Image-text alignment

  • +
+

평가자는 3가지 답변 중 하나를 선택해야함

+
    +
  1. I prefer set A

  2. +
  3. I am Indifferent

  4. +
  5. I prefer set B

  6. +
+
+imagen_9 +
+

Fig. 218 Screenshot of DrawBench dataset#

+
+
+
+
+
+

Results#

+
    +
  • Figure 2 에서는 DrawBench에서 나온 결과를 체리피킹 없이 보여준다.

  • +
  • 아마 저자들은 체리피킹 없이도 좋은 결과를 보여주고, 다양한 카테고리에서도 훌륭한 이미지를 생성 할 수 있다는 주장인 것 같다.

  • +
+
+imagen_10 +
+

Fig. 219 Result of Imagen in DrawBench dataset#

+
+
+
    +
  • Zero-shot 으로 한 FID값이 MS-COCO로 학습한 모델들 FID 보다 높음.

  • +
  • Table 2 에서는 Imagen이 no people (사람이 없는 사진) 에는 photorealism 점수가 올라감 +→ Imagen 은 photorealistic people을 생성하기에 한계가 있음.

  • +
+
+imagen_11 +
+

Fig. 220 Result Table of Imagen#

+
+
+
+

Qualitative Result Table of Imagen from Human Evaluators#

+
    +
  • Human raters (사람 평가자) 들은 T5-XXL로 text encoding 한 text-to-image generation 모델을 CLIP-based 보다 더 선호함

  • +
  • 기본적으로 Imagen 은 다른 text-to-image generation 모델에서 (SOTA 모델인 DALL-E 2) 보다도 human raters 에서 DrawBench 데이터셋에서 좋은 평가를 받음

  • +
+
+imagen_12 +
+

Fig. 221 Qualitative Result Table of Imagen from Human evaulators#

+
+
+
+
+
+

Ablation Study#

+
    +
  • Scaling text encoder size 가 U-Net size scaling 보다 더 중요함

  • +
  • (a)의 text encoder 사이즈의 변화가 FID 및 CLIP score 점수에 더욱 많은 영향을 끼침

  • +
  • Dynamic thresholding 이 performance boost에 더욱 영향을 끼침

  • +
  • Dynamic thresholding을 이용하면 성능을 더욱 끌어 올릴 수 있음

  • +
+
+imagen_13 +
+

Fig. 222 Qualitative Result Table of Imagen from Human evaulators#

+
+
+
+
+

Conclusion#

+
    +
  • Frozen large pretrained language model shows better performance over text-image paired multimodal encoders such as CLIP in text-to-image generation task

  • +
  • Efficient U-Net significantly improves performance time

  • +
  • Dynamic thresholding allows usage of much higher guidance weights with better fidelity of generated images

  • +
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/imagen_editor.html b/docs/review/imagen_editor.html old mode 100644 new mode 100755 index ff269302..d99a8bc6 --- a/docs/review/imagen_editor.html +++ b/docs/review/imagen_editor.html @@ -1,625 +1,643 @@ - - - - - - - - - - - - Imagen Editor — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

Imagen Editor

- -
-
- -
-
-
- - - - -
- -
-

Information

-
    -
  • Title: Imagen Editor and EditBench: Advancing and Evaluating Text-Guided Image Inpainting (CVPR 2023)

  • -
  • Reference

    - -
  • -
  • Author: Sangwoo Jo

  • -
  • Last updated on Sep. 06, 2023

  • -
-
-
-

Imagen Editor#

-

이번 시간에는 Google Research 에서 소개하는 Imagen 모델 기반의 text-guided image inpainting 모델 Imagen Editor 와 text-guided impainting 의 평가기법 EditBench 에 대해 알아볼 예정입니다.

-

Text-guided image inpainting 에서 기존에는 mask 영역을 random 하게 지정하여 학습을 진행했습니다. 이는 입력된 text prompt 와 무관한 영역을 masking 하게 됨으로써 모델이 prompt 를 참조하지 않고 오로지 image content 만으로 학습하게 되는 현상이 발생합니다. Imagen Editor 는 이를 해결하기 위해 Object Masking 기법을 소개합니다. Prompt 에 해당하는 객체 전체를 masking 함으로써 모델이 text prompt 를 더 참조할 수 있도록 유도하는 것이 목표입니다. SSD MobileNet v2 모델을 Object Detector 로 사용함으로써 모델 성능이 크게 개선되는 부분을 확인할 수 있었다고 합니다.

-
-imagen_editor_01 -
-

Fig. 223 Effect of Object Masking#

-
-
-

Imagen Editor 에서 또 다른 특징은 Imagen 모델 기반의 cascaded diffusion model architecture 를 지니고 있다는 점입니다. 이때, SR3, Palette, GLIDE 와 유사하게 이미지와 mask 가 Encoder 를 거친 후, diffusion latent 와 concatenate 하면서 conditioning input 으로 들어가게 되며, 모두 1024x1024 해상도를 가진다고 합니다. 따라서, base diffusion 64x64 모델 그리고 64x64 → 256x256 super resolution 모델에 입력 시, downsampling 작업 후 모델 input 으로 입력합니다. 또한, conditioning 이미지와 mask 없을 시 Imagen 모델을 사용하는 것과 동일한 효과를 내기 위해, 새로 추가되는 input channel weights 는 0으로 초기화해서 학습을 진행했다고 소개합니다.

-
-imagen_editor_02 -
-

Fig. 224 Imagen Editor Architecture#

-
-
-

Imagen 에서 소개되었던 Classifier-Free Guidance 를 동일하게 사용하고, 이때 guidance weight 를 1부터 30 까지 범위 내에서 변화시키는 oscillating guidance 기법을 적용함으로써 생성된 이미지 퀄리티 및 text-image alignment 가 상승되는 효과를 볼 수 있었다고 합니다.

-

논문에서는 Imagen Editor 와 같은 text-guided image inpainting 모델들을 평가할 수 있는 새로운 benchmark EditBench 를 제시합니다. 240개의 (image, mask) 쌍으로 데이터셋이 구축되어있고, 각 쌍마다 3가지의 prompt 로 생성된 이미지로 사람이 모델 성능을 측정하게 됩니다. Automatic Evaluation Metric 으로는 CLIPScore, 그리고 CLIP-R-Prec 를 사용했습니다.

-

EditBench 이미지 데이터셋의 절반은 open source 로 공개된 computer vision 데이터셋으로부터 수집되었고, 나머지 절반은 text-to-image 모델로 생성해서 구축했습니다. 이때, attribute-object-scene 의 요소들을 모두 갖추도록 이미지들을 수집 및 생성했습니다.

-
    -
  • Attributes (material, color, shape, size, count)

  • -
  • Objects (common, rare, text rendering)

  • -
  • Scenes (indoor, outdoor, realistic, paintings)

  • -
-

예를 들어서, ‘a=metal|o=cat|s=outdoor’ 요소들을 포함하는 문구를 ‘a metal cat standing in the middle of a farm field’ 처럼 생성하는 것입니다. 앞써 언급한 3가지 prompt 는 해당사진처럼 Mask-Simple, Mask-Rich, 그리고 Full 로 정의합니다.

-
-imagen_editor_03 -
-

Fig. 225 EditBench example#

-
-
-

데이터셋 구축시, mask 크기도 다양하게 설정하여 mask 크기에 따른 모델 성능도 확인할 수 있었습니다. 성능을 측정해본 결과, Object masking 으로 학습한 모델이 random masking 으로 학습한 모델보다 small/medium masks 에서 성능적으로 월등히 좋다는 것을 확인할 수 있습니다.

-
-imagen_editor_04 -
-

Fig. 226 Human Evaluations on EditBench#

-
-
-

또한, object-rendering 에 비해 text-rendering 성능이 저하되는 부분을 확인할 수 있고, material/color/size 속성보다 count/size 속성에 더 취약한 부분도 확인할 수 있었습니다.

-
-imagen_editor_05 -
-

Fig. 227 Imagen Editor failure cases by attribute#

-
-
-

마지막으로, 동일한 prompt 에 대해 Stable Diffusion, DALL-E2, Imagen Editor 모델로 inpainting 한 결과를 비교한 예시 사진입니다.

-
-imagen_editor_06 -
-

Fig. 228 Example model outputs for Mask-Simple vs MaskRich prompts#

-
-
-
- - - - -
- - - - - - -
- - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Imagen Editor — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Imagen Editor

+ +
+
+ +
+
+
+ + + + +
+ +
+

Information

+
    +
  • Title: Imagen Editor and EditBench: Advancing and Evaluating Text-Guided Image Inpainting (CVPR 2023)

  • +
  • Reference

    + +
  • +
  • Author: Sangwoo Jo

  • +
  • Last updated on Sep. 06, 2023

  • +
+
+
+

Imagen Editor#

+

이번 시간에는 Google Research 에서 소개하는 Imagen 모델 기반의 text-guided image inpainting 모델 Imagen Editor 와 text-guided impainting 의 평가기법 EditBench 에 대해 알아볼 예정입니다.

+

Text-guided image inpainting 에서 기존에는 mask 영역을 random 하게 지정하여 학습을 진행했습니다. 이는 입력된 text prompt 와 무관한 영역을 masking 하게 됨으로써 모델이 prompt 를 참조하지 않고 오로지 image content 만으로 학습하게 되는 현상이 발생합니다. Imagen Editor 는 이를 해결하기 위해 Object Masking 기법을 소개합니다. Prompt 에 해당하는 객체 전체를 masking 함으로써 모델이 text prompt 를 더 참조할 수 있도록 유도하는 것이 목표입니다. SSD MobileNet v2 모델을 Object Detector 로 사용함으로써 모델 성능이 크게 개선되는 부분을 확인할 수 있었다고 합니다.

+
+imagen_editor_01 +
+

Fig. 223 Effect of Object Masking#

+
+
+

Imagen Editor 에서 또 다른 특징은 Imagen 모델 기반의 cascaded diffusion model architecture 를 지니고 있다는 점입니다. 이때, SR3, Palette, GLIDE 와 유사하게 이미지와 mask 가 Encoder 를 거친 후, diffusion latent 와 concatenate 하면서 conditioning input 으로 들어가게 되며, 모두 1024x1024 해상도를 가진다고 합니다. 따라서, base diffusion 64x64 모델 그리고 64x64 → 256x256 super resolution 모델에 입력 시, downsampling 작업 후 모델 input 으로 입력합니다. 또한, conditioning 이미지와 mask 없을 시 Imagen 모델을 사용하는 것과 동일한 효과를 내기 위해, 새로 추가되는 input channel weights 는 0으로 초기화해서 학습을 진행했다고 소개합니다.

+
+imagen_editor_02 +
+

Fig. 224 Imagen Editor Architecture#

+
+
+

Imagen 에서 소개되었던 Classifier-Free Guidance 를 동일하게 사용하고, 이때 guidance weight 를 1부터 30 까지 범위 내에서 변화시키는 oscillating guidance 기법을 적용함으로써 생성된 이미지 퀄리티 및 text-image alignment 가 상승되는 효과를 볼 수 있었다고 합니다.

+

논문에서는 Imagen Editor 와 같은 text-guided image inpainting 모델들을 평가할 수 있는 새로운 benchmark EditBench 를 제시합니다. 240개의 (image, mask) 쌍으로 데이터셋이 구축되어있고, 각 쌍마다 3가지의 prompt 로 생성된 이미지로 사람이 모델 성능을 측정하게 됩니다. Automatic Evaluation Metric 으로는 CLIPScore, 그리고 CLIP-R-Prec 를 사용했습니다.

+

EditBench 이미지 데이터셋의 절반은 open source 로 공개된 computer vision 데이터셋으로부터 수집되었고, 나머지 절반은 text-to-image 모델로 생성해서 구축했습니다. 이때, attribute-object-scene 의 요소들을 모두 갖추도록 이미지들을 수집 및 생성했습니다.

+
    +
  • Attributes (material, color, shape, size, count)

  • +
  • Objects (common, rare, text rendering)

  • +
  • Scenes (indoor, outdoor, realistic, paintings)

  • +
+

예를 들어서, ‘a=metal|o=cat|s=outdoor’ 요소들을 포함하는 문구를 ‘a metal cat standing in the middle of a farm field’ 처럼 생성하는 것입니다. 앞써 언급한 3가지 prompt 는 해당사진처럼 Mask-Simple, Mask-Rich, 그리고 Full 로 정의합니다.

+
+imagen_editor_03 +
+

Fig. 225 EditBench example#

+
+
+

데이터셋 구축시, mask 크기도 다양하게 설정하여 mask 크기에 따른 모델 성능도 확인할 수 있었습니다. 성능을 측정해본 결과, Object masking 으로 학습한 모델이 random masking 으로 학습한 모델보다 small/medium masks 에서 성능적으로 월등히 좋다는 것을 확인할 수 있습니다.

+
+imagen_editor_04 +
+

Fig. 226 Human Evaluations on EditBench#

+
+
+

또한, object-rendering 에 비해 text-rendering 성능이 저하되는 부분을 확인할 수 있고, material/color/size 속성보다 count/size 속성에 더 취약한 부분도 확인할 수 있었습니다.

+
+imagen_editor_05 +
+

Fig. 227 Imagen Editor failure cases by attribute#

+
+
+

마지막으로, 동일한 prompt 에 대해 Stable Diffusion, DALL-E2, Imagen Editor 모델로 inpainting 한 결과를 비교한 예시 사진입니다.

+
+imagen_editor_06 +
+

Fig. 228 Example model outputs for Mask-Simple vs MaskRich prompts#

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/latent_consistency_models.html b/docs/review/latent_consistency_models.html old mode 100644 new mode 100755 index d2f09611..ce6d3c7d --- a/docs/review/latent_consistency_models.html +++ b/docs/review/latent_consistency_models.html @@ -1,939 +1,958 @@ - - - - - - - - - - - - Latent Consistency Models — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

Latent Consistency Models#

-
-

1. Introduction#

-

Diffusion model은 다양한 분야에서 주목할만한 성과를 거두었지만 매우 느린 sampling 속도를 가지기 때문에 실시간 사용이 불가능하다. 이 같은 단점을 극복하기 위해 sampling 속도를 향상시키는 다양한 accelerating 방법이 제안되었다:

-

 

-
    -
  1. ODE solver의 성능개선을 통해 10~20 step만으로도 좋은 성능을 가지는 방법.

    - -
  2. -
  3. 사전 학습된 Diffusion model을 몇 step만으로도 추론할수 있도록 distillation하는 방법.

    - -
  4. -
-

이중 특히 Consistency Models은 ODE-trajectory에 대한 일관성을 갖도록 하는 모델로서, single step만으로도 이미지를 생성할 수 있기 때문에 반복적인 계산이 필요하지 않다. 그러나 이 모델 또한 2가지의 단점을 가지고 있다:

-

 

-
    -
  1. Pixel space의 Flow-based Model이기 때문에 high-resolution 이미지 생성에 적합하지 않음.

  2. -
  3. Conditional(Classifer-free Guidance)한 이미지 생성을 고려하지 않아 text2img에 적합하지 않음.

  4. -
-
-

본 논문의 제안점은 다음 3가지다:

-

 

-
    -
  • 빠르고 high-resolution 이미지를 생성하기 위한 Latent Consistency Models(LCMs)를 제안한다. LCMs은 영상의 latent space에 Consistency Models 개념을 적용해 매우 적은 step 만으로도 고품질의 이미지를 생성할 수 있다.

  • -
  • guided consistency distillation을 통해 Stable Diffusion을 매우 적은 step(1~4)으로 sampling 할 수 있는 방법을 제공한다. Skipping-Step이라는 테크닉을 통해 학습을 가속화 한다. 2, 4 step Model의 경우 학습에 A100 GPU 32시간 밖에 걸리지 않으며 LAION-5B-Aesthetics dataset에서 SOTA의 성능을 달성했다.

  • -
  • LCMs에 대한 새로운 fine-tuning 방식인 Latent Consistency Fine-tuning을 통해 빠른 추론 속도를 유지하면서도 Custom Dataset에 효율적으로 적용할 수 있다.

  • -
-

 

-
-ldm_01 -
-

Fig. 480 768x768 Resolution image in 1~4 steps.#

-
-
-
-
-

2. Preliminaries#

-
-

Diffusion Models#

-

Diffusion Models 혹은 Score-based Models는 데이터에 점진적으로 Gaussian noise를 주입하고 reverse denoise process로 noise를 제거하여 데이터를 sampling하는 기법이다. 반면 forwad process는 원본 데이터 분포인 \(p_{data}(x)\)를 주변 확률분포인 \(q_{t}(x_{t})\)로 변환한다:

-
-\[ -q_{0t}(x_{t}|x_{0})=\mathcal{N}(x_t|\alpha(t)x_0,\sigma^2(t)I) -\]
-

여기서 \(\alpha(t)\)\(\sigma(t)\)는 noise scheduler를 의미한다. 연속적인 timestep의 관점에서 이를 확률미분방정식(Stochastic Differential Equation, SDE)으로 나타낼 수 있는데, 다음과 같다:

-
-\[ -f(t)=\frac{d\log{\alpha(t)}}{dt}, g^2(t)=\frac{d\sigma^2(t)}{dt}-2\frac{d\log{\alpha(t)}}{dt}\sigma^2(t). \tag{1} -\]
-

또한 주변 확률분포 \(q_t(x)\)는 **Ptobability Flow ODE(PF-ODE)**라는 상미분방정식(Ordinary Differential Equation, ODE)을 만족하는데 다음과 같다:

-
-\[ -\frac{dx_t}{dt}=f(x)x_t-\frac{1}{2}g^2(t)\nabla_x\log{q_t(x_t)}, \ x_T \sim q_T(x_T). \tag{2} -\]
-

이때 Diffusion model은 \(-\nabla\log{q_t(x_t)}\)(score function)를 예측하는 noise 예측 모델(\(\epsilon_\theta(x_t,t)\))을 학습시킨다. 학습된 모델은 score function의 근사치를 예측하고 sampling하는데 이를 empirical PF-ODE라 한다 (경험적 PF-ODE):

-
-\[ -\frac{dx_t}{dt}=f(t)x_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(x_t,t), \ x_T \sim \mathcal{N}(0, \tilde{\sigma}^2I). \tag{3} -\]
-

Classifier-Free Guidance (CFG)는 sampling의 퀄리티를 높이기 위해 GLIDE, Stable Diffusion, DALL\(\cdot\)E2, Imagen 등 다양한 conditional model에서 사용되었다. CFG의 scale \(\omega\)가 주어졌을 때 원본 noise prediction은 conditional, unconditional noise prediction을 선형적으로 혼합하여 대체된다:

-
-\[ -\tilde{\epsilon}_\theta(z_t,\omega, c,t)=(1+\omega)\epsilon_\theta(z_t, c,t)-\omega\epsilon_\theta(z, \emptyset, t). -\]
-

 

-
-
-

Consistency Models#

-

Consistenct Model(CM)은 몇 step 혹은 한번의 step 만으로 데이터를 생성할 수 있는 모델이다. CM의 핵심은 PF-ODE의 궤적에 어떤 point와 PF-ODE의 solution에 대해 mapping되는 function (\(f:(x_t, t) \mapsto x_\epsilon\))을 추정하는 것이다.

-
-ldm_02 -
-

Fig. 481 Consistency Models (CM).#

-
-
-

\(\epsilon\)은 고정된 매우 작은 양수값을 가지며 CM의 function은 자기 자신에 대한 self-consistency를 만족해야한다. 즉 어떠한 time step에 대해서도 \(x_\epsilon\)을 sampling 할 수 있어야 한다.

-
-\[ -f(x_t,t)=f(x_{t'},t'), \forall t,t' \in [\epsilon, T]. \tag{4} -\]
-

\(f_\theta(x, \epsilon)=x\)를 만족하는 모델 \(f_\theta\)는 다음과 같이 정리할 수 있다:

-
-\[ -f_\theta(x,t)=c_{skip}(t)x+c_{out}(t)F_\theta(x,t). \tag{5} -\]
-

\(c_{skip}(t)\)\(c_{out}(t)\)는 미분 가능한 함수이며 \(c_{skip}=1, c_{out}=0\)이기 때문에 \(f_\theta(x, \epsilon)=x\)를 만족한다. \(\theta\)는 학습 가능한 파라미터로 \(F_\theta\)는 심층 신경망을 의미한다.

-

 

-

CM은 pre-trained 모델에 대한 Distillation 방식과 scratch부터 학습하는 방식이 있는데 주로 Distillation 방식을 사용한다. Distillation 방식은 parameter \(\theta^-\)\(\theta\)를 통해 학습하며 모델에 대한 self-consistency를 위해 다음과 같이 손실함수를 구성한다:

-
-\[ -\mathcal{L}(\theta,\theta^-;\Phi)=\mathbb{E}_{x,t}\bigg[d\bigg(f_\theta(x_{t_{n+1}, t_{n+1}}), f_{\theta^-}(\hat{x}^\phi_{t_n}, t_n)\bigg)\bigg]. \tag{6} -\]
-

이 때 \(\theta^-\)\(\theta\)에 대한 지수평균이동(Exponential Moving Average, EMA)이며 \(\theta^- \leftarrow \mu\theta^-+(1-\mu)\theta\)이다. \(d(\cdot, \cdot)\)은 두 sample 사이의 거리를 측정하는 지표이다. \(\hat{x}^{\phi}_{t_n}\)\(x_{t_{n+1}}\)에 대한 \(x_{t_n}\)을 추정한 값으로 다음과 같다:

-
-\[ -\hat{x}^\phi_{t_n} \leftarrow x_{t_{n+1}}+(t_{n}-t_{n+1})\Phi(x_{t_{n+1}}, t_{n+1};\phi). \tag{7} -\]
-

\(\Phi\)는 PF-ODE에 사용되는 ODE Solver로 EulerHeun Method등의 수치적인 ODE solver를 사용할 수 있다. 즉 Consistency Distillation은 ODE Solver로 예측한 \(\hat{x}^{\phi}_{t_n}\)\(x_{t_{n+1}}\)을 입력으로 \(f_{\theta^-}\)\(f_\theta\)예측한 값의 Consistency를 비교하는 방식으로 Distillation을 수행한다.

-
-
-
-

3. Latent Consistency Models#

-

CM의 한계:

-
    -
  • ImageNet 64x64, LSUN 256x256 영상에 대한 Generation만 수행

    -
      -
    • High Resolution의 잠재성이 아직 탐구되지 않았음.

    • -
    • Classifier-free Guidance(CFG) 등을 사용하지 않음.

    • -
    -
  • -
-

Latent Consistency Models(LCMs)는 CM의 잠재력을 충분히 발휘하여 좀더 도전적인 task를 수행한다.

-
-

3.1 Consistency Distillation in the Latent Space#

-

본 논문에서는 pre-trained 된 Stable Diffusion에 Consistency Distillation을 적용한 Latent Consistency Distillation (LCD)을 제안한다. LCMs는 LDM(SD)을 기반으로 설계되었기 때문에 \(z=\varepsilon(x)\)를 통해 \(x\)를 latent vector로 임베딩하고 \(\hat{x}=\mathcal{D}(z)\)를 통해 원본 영상으로 복원한다. latent space 상에서 연산이 이뤄지기 때문에 Computation Cost를 크게 줄일 수 있어 high-resolution 영상을 laptop GPU에서 생성할 수도 있다.

-

condition을 추가한 PF-ODE의 reverse process는 다음과 같이 정의된다:

-
-\[ -\frac{dz_t}{dt}=f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,c,t), \ z_T\sim\mathcal{N}(0,\tilde{\sigma}^2I). \tag{8} -\]
-

\(z_t\)는 t step의 image latents, \(\epsilon_\theta(z_t,c,t)\)는 noise 예측 모델, c는 text와 같은 conditional prompt를 의미한다. PF-ODE상에서 모든 t step에 대해 consistency function \(f_\theta :(z_t,c,t) \mapsto z_0\)이기 때문에 이를 수식으로 정리하자면 다음과 같이 나타낼 수 있다 (\(\hat{\epsilon}_\theta\)는 noise prediction model.):

-
-\[ -f_\theta(z,c,t)=c_{skip}(t)z+c_{out}(t)\bigg( \frac{z-\sigma_t\hat{\epsilon}_\theta(z,c,t)}{\alpha_t} \bigg). \ (\epsilon-Prediction) \tag{9} -\]
-

수식을 살펴보면 ddpm 등의 reparameterization trick인 \(x_t := \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon\)을 변형하여 식에 대입한 것을 알 수 있음. (\(x\)\(z\)로 치환)

-
-\[ -x_0 = \frac{x_t-\sqrt{1-\bar{\alpha}_t}\epsilon}{\sqrt{\bar{\alpha}_t}}, \ \hat{z}_0 = \frac{z_t-\sigma(t)\hat{\epsilon}_{\theta}(z,c,t)}{\alpha(t)}. -\]
-

CM과 마찬가지로 \(c_{skip}(0)=1, c_{out}(0)=0\)이고 \(\hat{\epsilon}_{\theta}(z,c,t)\)는 teacher diffusion model과 유사한 noise 예측 모델 parameter이다. \(f_\theta\)\(\epsilon-Prediction\) 외에도 \(x-Prediction\)이나 \(v-Prediction\)을 사용할 수도 있다. (\(x-Prediction\)은 DDPM, \(v-prediction\)은 PD에서 나온 개념)

-
-\[ -\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,n}\bigg[ d(f_\theta(z_{t_{n+1}},c,t_{n+1}), f_{\theta^-}(\hat{z}^\psi_{t_n},c,t_n)) \bigg]. \tag{10} -\]
-

\(\psi(z_t,t,x,c)\)는 ODE solver이며 특정한 time step \(t \sim s\) 사이에 대한 Eq. 8의 우항을 근사한 값이다. ODE Solver이기 때문에 DDIM, DPM-Solver, DPM-Solver++ 등을 사용할 수 있다. 또한 \(\psi\)는 학습 및 Distillation시에만 사용한다. 이때 \(t_n\)은 EDM을 토대로 CM에서 나오는 값이다. 기존 timestep \([t, T]\)에 대한 하위 간격으로 \(t_1=\epsilon<t_2<\cdots<t_N=T\)인 어떠한간격을 의미한다. \(t_i\)는 다음과 같이 나타낼 수 있다:

-
-\[ -t_i=(\epsilon^{1 / \rho} +\frac{i-1}{N-1}(T^{1 / \rho}-\epsilon^{1 / \rho}))^\rho, \rho=7 -\]
-

Eq, 8을 \(t_{n+1} \sim t_n\)까지 t에 대해 적분 했을 때 다음과 같은 수식을 얻을 수 있다:

-
-\[ -\hat{z}_{t_n}^\psi-z_{t_{n+1}}=\int^{t_n}_{t_{n+1}}{\bigg( f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,c,t) \bigg)}dt \approx \psi(z_{t_{n+1}}, t_{n+1},c). \tag{11} -\]
-
-
-

3.2 One-Stage Guided Distillation by solving augmented PF-ODE#

-

Clasifier-free Guidance(CFG)는 high-quality의 conditional 이미지 생성을 가능하게 했다. 다만 CFG는 2개의 Diffusion Model을 훈련해야하기 때문에 효율적이지 못하며, LCMs와 같은 few-step sampling method에 사용하기 힘들다. 따라서 이를 해결하기 위해 본 논문에서는 CFG를 Distillation 과정에서 통합하였다.

-

Guided-Distill의 경우 two-stage Distillation을 통해 few-step sampling에 CFG를 통합하였으나 학습시간이 길고 2단계를 거치며 손실이 누적되기 때문에 최적의 성능을 내기 힘들다.

-
-ldm_03 -
-

Fig. 482 2 Stage Distillation.#

-
-
-

t이에 반해 LCMs는 augmented PF-ODE를 해결하는 방식으로 one-stage의 guided Distillation을 제안했다. 일단 CFG에 대한 reverse diffusion process는 다음과 같다:

-
-\[ -\tilde{\epsilon}_{\theta}(z_t,\omega,c,t):=(1+\omega)\epsilon_\theta(z_t,c,t)-\omega\epsilon_\theta(z_t,\varnothing,t). \tag{12} -\]
-

CFG는 conditional noise 예측값과 unconditional noise 예측값을 선형 결합하여 사용한다. 즉 noise 값이 \(\omega\)에 따라 변형되므로 augmented PF-ODE라고 한다. augmented PF-ODE는 다음과 같이 나타낼 수 있다:

-
-\[ -\frac{dz_t}{dt}=f(t)z_t+\frac{g^2(t)}{2\sigma_t}\tilde{\epsilon}_\theta(z_t,\omega,c,t), \ z_T\sim\mathcal{N}(0,\tilde{\sigma}^2I). \tag{13} -\]
-

consistency function도 \(\omega\)를 변수로 받아오기 때문에 \(f_\theta:(z_t,\omega,c,t)\mapsto z_0\)로 다시 정의된다. Consistency Distillation Loss 또한 다음과 같이 나타낼 수 있다:

-
-\[ -\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,\omega,n}\bigg[ d\bigg( f_\theta(z_{t_{n+1}},\omega,c,t_{n+1}), f_{\theta^-}(\hat{z}_{t_n}^{\psi,\omega},\omega,c,t_n) \bigg) \bigg] \tag{14} -\]
-

\(\omega\)\(n\)는 각각 \([\omega_{min}, \omega_{max}]\), \(\{1,…,N-1\}\)에서 sampling된다. \(\hat{z}^{\psi, \omega}_{t_n}\)는 이전과 마찬가지로 CFG가 추가된 ODE-Solver를 사용하여 근사한 값을 의미한다. 이때 사용되는 새로운 noise 예측모델 \(\tilde{\epsilon}_\theta(z_t,\omega,c,t)\)는 Eq. 11처럼 \(t_{n+1} \sim t_n\)까지 t에 대해 적분 했을 때 다음과 같이 나타낼 수 있다:

-
-\[ -\hat{z}^{\psi, \omega}_{t_n}-z_{t_n+1}=\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\tilde{\epsilon}_\theta(z_t,\omega,c,t)\bigg)dt -\]
-
-\[ -=(1+\omega)\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,c,t)\bigg)dt -\]
-
-\[ --\omega\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,\varnothing,t)\bigg)dt -\]
-
-\[ -\approx(1+\omega)\psi(z_{t_{n+1}}, t_{n+1},t_n,c)-\omega\psi(z_{t_{n+1}}, t_{n+1},t_n,\varnothing). \tag{15} -\]
-

마찬가지로 PF-ODE Solver \(\psi(\cdot,\cdot,\cdot,\cdot)\)에는 DDIM, DPM-Solver, DPM-Solver++ 등을 사용할 수 있다.

-
-
-

3.3 Accelerating Distillation with Skipping Time Steps#

-

Stable Diffusion 등 보통의 Diffusion Model들은 매우 큰 step을 전체 time step으로 잡고 학습한다. 그러나 이같이 촘촘한 time step은 각 \(t_n\)\(t_{n+1}\)의 변화량을 감소시키기 때문에 자연스럽게 Consistency Distillation Loss도 작아지게 된다. Loss가 작아지면 학습의 수렴속도도 느려지게 된다. 따라서 LCMs는 학습 수렴의 속도를 높이기 위해 time step을 수천에서 수십으로 크기 단축시키는 SKIPPING-STEP 방법을 제안하였다.

-

기존 CMs 모델의 경우 time scheduler로 EDM을 사용하고 ODE-Solver로 Euler 방법이나 Heun 방법을 사용한다. 그러나 LCMs는 Eq. 8을 통해 DDIM, DPM-Solver, DPM-Solver++와 같은 효율적인 solver도 효과적으로 데이터를 생성할 수 있다는 것을 증명했다. 따라서 SKIPPING-STEP 방법은 \(t_{n+1} → t_n\) 사이의 Consistency를 비교하는것이 아니라 특정 k-step만큼 거리가 있는 time step에 대한 Consistency를 비교한다. (\(t_{n+k}→t_n\))

-

이때 \(k\)값의 크기는 trade-off 관계를 가진다. 너무작으면 (\(k=1\)) 기존과 같이 느린 수렴속도를 갖게되며, 너무 큰 값일 때는 ODE solver 를 통해 근사할 때 오차가 매우 커질수 있다. 논문의 저자는 \(k=20\)을 사용해 time step을 수천에서 수십으로 대폭 줄여 학습을 Accelerating 할 수 있었다. Eq. 14에 k값을 추가해 SKIPPING-STEP을 표현할 수 있다.

-
-\[ -\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,\omega,n}\bigg[ d\bigg( f_\theta(z_{t_{n+k}},\omega,c,t_{n+k}), f_{\theta^-}(\hat{z}_{t_n}^{\psi,\omega},\omega,c,t_n) \bigg) \bigg]. \tag{16} -\]
-

\(\hat{z}^{\psi, \omega}_{t_n}\)에 대한 수식도 다음과 같이 변경할 수 있다.

-
-\[ -\hat{z}^{\psi, \omega}_{t_n} \leftarrow z_{t_{n+k}}+(1+\omega)\psi(z_{t_{n+k}}, t_{n+k},t_n,c)-\omega\psi(z_{t_{n+k}}, t_{n+k},t_n,\varnothing). \tag{17} -\]
-
-
-
-

3.4 Latent Consistency Fine-tuning for customized dataset#

-

Stable Diffusion과 같은 Foundation 생성 모델은 거의 대부분의 text-to-image Generation task에서 잘 되지만 가끔 downstream task를 위해 Cunstom dataset에 대한 fine-tuning이 필요할 때가 있다. Latent Consistency Fine-tuning(LCF)는 Custom Dataset도 teacher model에 대한 종속없이 few-step inference를 성공적으로 할수 있도록 한다. 따라서 LCM은 기존의 Diffusion model에 대한 추가적인 fine tuning 방법론 없이도 Custom Dataset을 바로바로 학습하여 사용할수 있다.

-

따로 추가적인 fine-tuning 방법이 있는것은 아니고 Consisteny Distillation 시 pre-trained 된 LDM을 사용하여 EMA를 통해 Distillation을 하기 때문에 Dataset을 Custom Dataset으로 사용하기만하면 된다. 즉 pre-trained Diffuson model → Custom Dataset fine-tuning → few step inference를 위한 Consistency Distillation을 할 필요 없이 바로학습이 가능하다는 의미이다.

-
-
-

4. Experiments#

-
-

4.1 Text-To-Image Generation#

-

3가지 데이터셋에 대한 평가를 진행했다. (LAION-5B, LAION-Aesthetics-6+(12M), LAION-Aesthetics-6.5+(650k)) 앞서말한것처럼 하나의 Resolution이 아닌 512x512, 768x768의 high resolution을 생성했다. 512 size는 \(\epsilon\)-prediction, 768 size는 \(v\)-prediction을 사용했고 ODE-Solver로는 DDIM을 사용했다. 앞서말한것처럼 SKIPPING-STEP은 20의 값을 가진다.

-
-ldm_04 -
-

Fig. 483 Quantitative results at 512 x 512 & 768 x 768 resolution.#

-
-
-
-ldm_05 -
-

Fig. 484 Qualitative results on LAION-Aesthetic-6.5+ Dataset. (2,4 steps)#

-
-
-

DDIM, DPM-Solver, DPM-Solver++, Guided-Distill 4가지 모델에 대해 LCM과 성능비교를 했는데 이때 Guided-Distill은 오픈소스 코드가 없기 때문에 논문의 내용과 동일하게 Implementation 해서 성능을 비교하였다. LCM은 같은 메모리 Cost 대비 더 빠르게 수렴하고 더 좋은 품질의 영상을 생성하였다. 특히 Guided-Distill은 2 stage Distillation이지만 LCM은 1 Stage만 사용해도 이같은 성능을 보여줬다.

-
-
-

4.2 Abulation Study#

-
-

ODE Solvers & Skipping-Step Schedule#

-

augmented PF-ODE를 푸는 solver들(DDIM, DPM, DPM++)을 LCM에 사용할 때 성능 비교와 SKIPPING-STEP schedule의 \(k\)값에 따른 성능 변화를 비교하였다. 모든 모델은 2,000 iteration에서의 4-step inference로 고정해서 비교했다.

-
-ldm_06 -
-

Fig. 485 Different ODE solvers and skipping step k.#

-
-
-

Skipping step의 경우 \(k\) 값을 올렸을 때 훨씬더 빠르게 수렴하며 때때로 더 좋은 FID 값을 보여주었다. 또한 DPM과 DPM++은 \(k\)가 50일 때 DDIM보다 더 좋은 성능을 보였다. 이는 \(k\) 값이 클수록 더 큰 ODE approximation error를 가지는 DDIM에 비해 오차가 적기 때문이다.

-

\(k=20\)일 때, 3가지 모델 모두 좋은 성능이 보였다.

-
-
-

The Effect of Guidance Scale \(\omega\)#

-

일반적으로 \(\omega\)값이 클수록 CLIP score 같은 품질의 지표는 좋아지지만 작을수록 다양성이 떨어져 FID Score가 떨어진다. 즉 \(\omega\)의 크기는 Quality와 Diversity에 대한 trade-off가 있다.

-
-ldm_07 -
-

Fig. 486 Different classifier-free guidance scales \(\omega\).#

-
-
-

그래프를 보면 2~8 step inference는 성능에 큰 차이를 가지지는 않는것으로 확인된다. 그러나 1 step inference는 아직 개선의 여지가 있는것을 확인할 수 있다.

-
-ldm_08 -
-

Fig. 487 Different classifier-free guidance scales \(\omega\).#

-
-
-

\(\omega\)에 따른 실제 생성 이미지를 비교해 봤을 때 생성 영상의 Quality 차이가 확연하게 들어난다. 즉 Distillation 시에도 CFG를 적용하는 것이 성능을 크게 개선할 수 있다는 것을 증명한다.

-
-
-
-

4.3 Downstream Consistency Fine-tuning Results#

-

포켓몬 데이터셋과 심슨 데이터셋에 LCF를 적용했을 때를 비교하였다. 90%는 학습 데이터로, 10%는 검증 데이터로 사용했다. 완벽하진 않지만 Custom Dataset의 style을 잘 catch한 모습을 보여준다.

-
-ldm_09 -
-

Fig. 488 Latent Consistency Fine-tuning(LCF) on two customized dataset.. \(\omega\).#

-
-
-
-
-
-
-

Conclusion#

-

LCM은 Consistency Distillation을 Latent 상에 적용하여 고화질의 영상을 매우 적은 time step으로 inference 할 수 있도록 한 모델이다. 즉 성능 좋고 고해상도의 영상을 few-step으로 가능하게 만들었다. 특히 Custom Dataset에도 Distillation을 적용했을 때 적은 time step으로도 어느정도의 style을 간단하게 학습하는 결과를 보여주었다.

-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Latent Consistency Models — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

Latent Consistency Models#

+
+

1. Introduction#

+

Diffusion model은 다양한 분야에서 주목할만한 성과를 거두었지만 매우 느린 sampling 속도를 가지기 때문에 실시간 사용이 불가능하다. 이 같은 단점을 극복하기 위해 sampling 속도를 향상시키는 다양한 accelerating 방법이 제안되었다:

+

 

+
    +
  1. ODE solver의 성능개선을 통해 10~20 step만으로도 좋은 성능을 가지는 방법.

    + +
  2. +
  3. 사전 학습된 Diffusion model을 몇 step만으로도 추론할수 있도록 distillation하는 방법.

    + +
  4. +
+

이중 특히 Consistency Models은 ODE-trajectory에 대한 일관성을 갖도록 하는 모델로서, single step만으로도 이미지를 생성할 수 있기 때문에 반복적인 계산이 필요하지 않다. 그러나 이 모델 또한 2가지의 단점을 가지고 있다:

+

 

+
    +
  1. Pixel space의 Flow-based Model이기 때문에 high-resolution 이미지 생성에 적합하지 않음.

  2. +
  3. Conditional(Classifer-free Guidance)한 이미지 생성을 고려하지 않아 text2img에 적합하지 않음.

  4. +
+
+

본 논문의 제안점은 다음 3가지다:

+

 

+
    +
  • 빠르고 high-resolution 이미지를 생성하기 위한 Latent Consistency Models(LCMs)를 제안한다. LCMs은 영상의 latent space에 Consistency Models 개념을 적용해 매우 적은 step 만으로도 고품질의 이미지를 생성할 수 있다.

  • +
  • guided consistency distillation을 통해 Stable Diffusion을 매우 적은 step(1~4)으로 sampling 할 수 있는 방법을 제공한다. Skipping-Step이라는 테크닉을 통해 학습을 가속화 한다. 2, 4 step Model의 경우 학습에 A100 GPU 32시간 밖에 걸리지 않으며 LAION-5B-Aesthetics dataset에서 SOTA의 성능을 달성했다.

  • +
  • LCMs에 대한 새로운 fine-tuning 방식인 Latent Consistency Fine-tuning을 통해 빠른 추론 속도를 유지하면서도 Custom Dataset에 효율적으로 적용할 수 있다.

  • +
+

 

+
+ldm_01 +
+

Fig. 480 768x768 Resolution image in 1~4 steps.#

+
+
+
+
+

2. Preliminaries#

+
+

Diffusion Models#

+

Diffusion Models 혹은 Score-based Models는 데이터에 점진적으로 Gaussian noise를 주입하고 reverse denoise process로 noise를 제거하여 데이터를 sampling하는 기법이다. 반면 forwad process는 원본 데이터 분포인 \(p_{data}(x)\)를 주변 확률분포인 \(q_{t}(x_{t})\)로 변환한다:

+
+\[ +q_{0t}(x_{t}|x_{0})=\mathcal{N}(x_t|\alpha(t)x_0,\sigma^2(t)I) +\]
+

여기서 \(\alpha(t)\)\(\sigma(t)\)는 noise scheduler를 의미한다. 연속적인 timestep의 관점에서 이를 확률미분방정식(Stochastic Differential Equation, SDE)으로 나타낼 수 있는데, 다음과 같다:

+
+\[ +f(t)=\frac{d\log{\alpha(t)}}{dt}, g^2(t)=\frac{d\sigma^2(t)}{dt}-2\frac{d\log{\alpha(t)}}{dt}\sigma^2(t). \tag{1} +\]
+

또한 주변 확률분포 \(q_t(x)\)는 **Ptobability Flow ODE(PF-ODE)**라는 상미분방정식(Ordinary Differential Equation, ODE)을 만족하는데 다음과 같다:

+
+\[ +\frac{dx_t}{dt}=f(x)x_t-\frac{1}{2}g^2(t)\nabla_x\log{q_t(x_t)}, \ x_T \sim q_T(x_T). \tag{2} +\]
+

이때 Diffusion model은 \(-\nabla\log{q_t(x_t)}\)(score function)를 예측하는 noise 예측 모델(\(\epsilon_\theta(x_t,t)\))을 학습시킨다. 학습된 모델은 score function의 근사치를 예측하고 sampling하는데 이를 empirical PF-ODE라 한다 (경험적 PF-ODE):

+
+\[ +\frac{dx_t}{dt}=f(t)x_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(x_t,t), \ x_T \sim \mathcal{N}(0, \tilde{\sigma}^2I). \tag{3} +\]
+

Classifier-Free Guidance (CFG)는 sampling의 퀄리티를 높이기 위해 GLIDE, Stable Diffusion, DALL\(\cdot\)E2, Imagen 등 다양한 conditional model에서 사용되었다. CFG의 scale \(\omega\)가 주어졌을 때 원본 noise prediction은 conditional, unconditional noise prediction을 선형적으로 혼합하여 대체된다:

+
+\[ +\tilde{\epsilon}_\theta(z_t,\omega, c,t)=(1+\omega)\epsilon_\theta(z_t, c,t)-\omega\epsilon_\theta(z, \emptyset, t). +\]
+

 

+
+
+

Consistency Models#

+

Consistenct Model(CM)은 몇 step 혹은 한번의 step 만으로 데이터를 생성할 수 있는 모델이다. CM의 핵심은 PF-ODE의 궤적에 어떤 point와 PF-ODE의 solution에 대해 mapping되는 function (\(f:(x_t, t) \mapsto x_\epsilon\))을 추정하는 것이다.

+
+ldm_02 +
+

Fig. 481 Consistency Models (CM).#

+
+
+

\(\epsilon\)은 고정된 매우 작은 양수값을 가지며 CM의 function은 자기 자신에 대한 self-consistency를 만족해야한다. 즉 어떠한 time step에 대해서도 \(x_\epsilon\)을 sampling 할 수 있어야 한다.

+
+\[ +f(x_t,t)=f(x_{t'},t'), \forall t,t' \in [\epsilon, T]. \tag{4} +\]
+

\(f_\theta(x, \epsilon)=x\)를 만족하는 모델 \(f_\theta\)는 다음과 같이 정리할 수 있다:

+
+\[ +f_\theta(x,t)=c_{skip}(t)x+c_{out}(t)F_\theta(x,t). \tag{5} +\]
+

\(c_{skip}(t)\)\(c_{out}(t)\)는 미분 가능한 함수이며 \(c_{skip}=1, c_{out}=0\)이기 때문에 \(f_\theta(x, \epsilon)=x\)를 만족한다. \(\theta\)는 학습 가능한 파라미터로 \(F_\theta\)는 심층 신경망을 의미한다.

+

 

+

CM은 pre-trained 모델에 대한 Distillation 방식과 scratch부터 학습하는 방식이 있는데 주로 Distillation 방식을 사용한다. Distillation 방식은 parameter \(\theta^-\)\(\theta\)를 통해 학습하며 모델에 대한 self-consistency를 위해 다음과 같이 손실함수를 구성한다:

+
+\[ +\mathcal{L}(\theta,\theta^-;\Phi)=\mathbb{E}_{x,t}\bigg[d\bigg(f_\theta(x_{t_{n+1}, t_{n+1}}), f_{\theta^-}(\hat{x}^\phi_{t_n}, t_n)\bigg)\bigg]. \tag{6} +\]
+

이 때 \(\theta^-\)\(\theta\)에 대한 지수평균이동(Exponential Moving Average, EMA)이며 \(\theta^- \leftarrow \mu\theta^-+(1-\mu)\theta\)이다. \(d(\cdot, \cdot)\)은 두 sample 사이의 거리를 측정하는 지표이다. \(\hat{x}^{\phi}_{t_n}\)\(x_{t_{n+1}}\)에 대한 \(x_{t_n}\)을 추정한 값으로 다음과 같다:

+
+\[ +\hat{x}^\phi_{t_n} \leftarrow x_{t_{n+1}}+(t_{n}-t_{n+1})\Phi(x_{t_{n+1}}, t_{n+1};\phi). \tag{7} +\]
+

\(\Phi\)는 PF-ODE에 사용되는 ODE Solver로 EulerHeun Method등의 수치적인 ODE solver를 사용할 수 있다. 즉 Consistency Distillation은 ODE Solver로 예측한 \(\hat{x}^{\phi}_{t_n}\)\(x_{t_{n+1}}\)을 입력으로 \(f_{\theta^-}\)\(f_\theta\)예측한 값의 Consistency를 비교하는 방식으로 Distillation을 수행한다.

+
+
+
+

3. Latent Consistency Models#

+

CM의 한계:

+
    +
  • ImageNet 64x64, LSUN 256x256 영상에 대한 Generation만 수행

    +
      +
    • High Resolution의 잠재성이 아직 탐구되지 않았음.

    • +
    • Classifier-free Guidance(CFG) 등을 사용하지 않음.

    • +
    +
  • +
+

Latent Consistency Models(LCMs)는 CM의 잠재력을 충분히 발휘하여 좀더 도전적인 task를 수행한다.

+
+

3.1 Consistency Distillation in the Latent Space#

+

본 논문에서는 pre-trained 된 Stable Diffusion에 Consistency Distillation을 적용한 Latent Consistency Distillation (LCD)을 제안한다. LCMs는 LDM(SD)을 기반으로 설계되었기 때문에 \(z=\varepsilon(x)\)를 통해 \(x\)를 latent vector로 임베딩하고 \(\hat{x}=\mathcal{D}(z)\)를 통해 원본 영상으로 복원한다. latent space 상에서 연산이 이뤄지기 때문에 Computation Cost를 크게 줄일 수 있어 high-resolution 영상을 laptop GPU에서 생성할 수도 있다.

+

condition을 추가한 PF-ODE의 reverse process는 다음과 같이 정의된다:

+
+\[ +\frac{dz_t}{dt}=f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,c,t), \ z_T\sim\mathcal{N}(0,\tilde{\sigma}^2I). \tag{8} +\]
+

\(z_t\)는 t step의 image latents, \(\epsilon_\theta(z_t,c,t)\)는 noise 예측 모델, c는 text와 같은 conditional prompt를 의미한다. PF-ODE상에서 모든 t step에 대해 consistency function \(f_\theta :(z_t,c,t) \mapsto z_0\)이기 때문에 이를 수식으로 정리하자면 다음과 같이 나타낼 수 있다 (\(\hat{\epsilon}_\theta\)는 noise prediction model.):

+
+\[ +f_\theta(z,c,t)=c_{skip}(t)z+c_{out}(t)\bigg( \frac{z-\sigma_t\hat{\epsilon}_\theta(z,c,t)}{\alpha_t} \bigg). \ (\epsilon-Prediction) \tag{9} +\]
+

수식을 살펴보면 ddpm 등의 reparameterization trick인 \(x_t := \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1-\bar{\alpha}_t}\epsilon\)을 변형하여 식에 대입한 것을 알 수 있음. (\(x\)\(z\)로 치환)

+
+\[ +x_0 = \frac{x_t-\sqrt{1-\bar{\alpha}_t}\epsilon}{\sqrt{\bar{\alpha}_t}}, \ \hat{z}_0 = \frac{z_t-\sigma(t)\hat{\epsilon}_{\theta}(z,c,t)}{\alpha(t)}. +\]
+

CM과 마찬가지로 \(c_{skip}(0)=1, c_{out}(0)=0\)이고 \(\hat{\epsilon}_{\theta}(z,c,t)\)는 teacher diffusion model과 유사한 noise 예측 모델 parameter이다. \(f_\theta\)\(\epsilon-Prediction\) 외에도 \(x-Prediction\)이나 \(v-Prediction\)을 사용할 수도 있다. (\(x-Prediction\)은 DDPM, \(v-prediction\)은 PD에서 나온 개념)

+
+\[ +\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,n}\bigg[ d(f_\theta(z_{t_{n+1}},c,t_{n+1}), f_{\theta^-}(\hat{z}^\psi_{t_n},c,t_n)) \bigg]. \tag{10} +\]
+

\(\psi(z_t,t,x,c)\)는 ODE solver이며 특정한 time step \(t \sim s\) 사이에 대한 Eq. 8의 우항을 근사한 값이다. ODE Solver이기 때문에 DDIM, DPM-Solver, DPM-Solver++ 등을 사용할 수 있다. 또한 \(\psi\)는 학습 및 Distillation시에만 사용한다. 이때 \(t_n\)은 EDM을 토대로 CM에서 나오는 값이다. 기존 timestep \([t, T]\)에 대한 하위 간격으로 \(t_1=\epsilon<t_2<\cdots<t_N=T\)인 어떠한간격을 의미한다. \(t_i\)는 다음과 같이 나타낼 수 있다:

+
+\[ +t_i=(\epsilon^{1 / \rho} +\frac{i-1}{N-1}(T^{1 / \rho}-\epsilon^{1 / \rho}))^\rho, \rho=7 +\]
+

Eq, 8을 \(t_{n+1} \sim t_n\)까지 t에 대해 적분 했을 때 다음과 같은 수식을 얻을 수 있다:

+
+\[ +\hat{z}_{t_n}^\psi-z_{t_{n+1}}=\int^{t_n}_{t_{n+1}}{\bigg( f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,c,t) \bigg)}dt \approx \psi(z_{t_{n+1}}, t_{n+1},c). \tag{11} +\]
+
+
+

3.2 One-Stage Guided Distillation by solving augmented PF-ODE#

+

Clasifier-free Guidance(CFG)는 high-quality의 conditional 이미지 생성을 가능하게 했다. 다만 CFG는 2개의 Diffusion Model을 훈련해야하기 때문에 효율적이지 못하며, LCMs와 같은 few-step sampling method에 사용하기 힘들다. 따라서 이를 해결하기 위해 본 논문에서는 CFG를 Distillation 과정에서 통합하였다.

+

Guided-Distill의 경우 two-stage Distillation을 통해 few-step sampling에 CFG를 통합하였으나 학습시간이 길고 2단계를 거치며 손실이 누적되기 때문에 최적의 성능을 내기 힘들다.

+
+ldm_03 +
+

Fig. 482 2 Stage Distillation.#

+
+
+

t이에 반해 LCMs는 augmented PF-ODE를 해결하는 방식으로 one-stage의 guided Distillation을 제안했다. 일단 CFG에 대한 reverse diffusion process는 다음과 같다:

+
+\[ +\tilde{\epsilon}_{\theta}(z_t,\omega,c,t):=(1+\omega)\epsilon_\theta(z_t,c,t)-\omega\epsilon_\theta(z_t,\varnothing,t). \tag{12} +\]
+

CFG는 conditional noise 예측값과 unconditional noise 예측값을 선형 결합하여 사용한다. 즉 noise 값이 \(\omega\)에 따라 변형되므로 augmented PF-ODE라고 한다. augmented PF-ODE는 다음과 같이 나타낼 수 있다:

+
+\[ +\frac{dz_t}{dt}=f(t)z_t+\frac{g^2(t)}{2\sigma_t}\tilde{\epsilon}_\theta(z_t,\omega,c,t), \ z_T\sim\mathcal{N}(0,\tilde{\sigma}^2I). \tag{13} +\]
+

consistency function도 \(\omega\)를 변수로 받아오기 때문에 \(f_\theta:(z_t,\omega,c,t)\mapsto z_0\)로 다시 정의된다. Consistency Distillation Loss 또한 다음과 같이 나타낼 수 있다:

+
+\[ +\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,\omega,n}\bigg[ d\bigg( f_\theta(z_{t_{n+1}},\omega,c,t_{n+1}), f_{\theta^-}(\hat{z}_{t_n}^{\psi,\omega},\omega,c,t_n) \bigg) \bigg] \tag{14} +\]
+

\(\omega\)\(n\)는 각각 \([\omega_{min}, \omega_{max}]\), \(\{1,…,N-1\}\)에서 sampling된다. \(\hat{z}^{\psi, \omega}_{t_n}\)는 이전과 마찬가지로 CFG가 추가된 ODE-Solver를 사용하여 근사한 값을 의미한다. 이때 사용되는 새로운 noise 예측모델 \(\tilde{\epsilon}_\theta(z_t,\omega,c,t)\)는 Eq. 11처럼 \(t_{n+1} \sim t_n\)까지 t에 대해 적분 했을 때 다음과 같이 나타낼 수 있다:

+
+\[ +\hat{z}^{\psi, \omega}_{t_n}-z_{t_n+1}=\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\tilde{\epsilon}_\theta(z_t,\omega,c,t)\bigg)dt +\]
+
+\[ +=(1+\omega)\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,c,t)\bigg)dt +\]
+
+\[ +-\omega\int^{t_n}_{t_{n+1}}\bigg(f(t)z_t+\frac{g^2(t)}{2\sigma_t}\epsilon_\theta(z_t,\varnothing,t)\bigg)dt +\]
+
+\[ +\approx(1+\omega)\psi(z_{t_{n+1}}, t_{n+1},t_n,c)-\omega\psi(z_{t_{n+1}}, t_{n+1},t_n,\varnothing). \tag{15} +\]
+

마찬가지로 PF-ODE Solver \(\psi(\cdot,\cdot,\cdot,\cdot)\)에는 DDIM, DPM-Solver, DPM-Solver++ 등을 사용할 수 있다.

+
+
+

3.3 Accelerating Distillation with Skipping Time Steps#

+

Stable Diffusion 등 보통의 Diffusion Model들은 매우 큰 step을 전체 time step으로 잡고 학습한다. 그러나 이같이 촘촘한 time step은 각 \(t_n\)\(t_{n+1}\)의 변화량을 감소시키기 때문에 자연스럽게 Consistency Distillation Loss도 작아지게 된다. Loss가 작아지면 학습의 수렴속도도 느려지게 된다. 따라서 LCMs는 학습 수렴의 속도를 높이기 위해 time step을 수천에서 수십으로 크기 단축시키는 SKIPPING-STEP 방법을 제안하였다.

+

기존 CMs 모델의 경우 time scheduler로 EDM을 사용하고 ODE-Solver로 Euler 방법이나 Heun 방법을 사용한다. 그러나 LCMs는 Eq. 8을 통해 DDIM, DPM-Solver, DPM-Solver++와 같은 효율적인 solver도 효과적으로 데이터를 생성할 수 있다는 것을 증명했다. 따라서 SKIPPING-STEP 방법은 \(t_{n+1} → t_n\) 사이의 Consistency를 비교하는것이 아니라 특정 k-step만큼 거리가 있는 time step에 대한 Consistency를 비교한다. (\(t_{n+k}→t_n\))

+

이때 \(k\)값의 크기는 trade-off 관계를 가진다. 너무작으면 (\(k=1\)) 기존과 같이 느린 수렴속도를 갖게되며, 너무 큰 값일 때는 ODE solver 를 통해 근사할 때 오차가 매우 커질수 있다. 논문의 저자는 \(k=20\)을 사용해 time step을 수천에서 수십으로 대폭 줄여 학습을 Accelerating 할 수 있었다. Eq. 14에 k값을 추가해 SKIPPING-STEP을 표현할 수 있다.

+
+\[ +\mathcal{L_{CD}}(\theta,\theta^-;\psi)=\mathbb{E}_{z,c,\omega,n}\bigg[ d\bigg( f_\theta(z_{t_{n+k}},\omega,c,t_{n+k}), f_{\theta^-}(\hat{z}_{t_n}^{\psi,\omega},\omega,c,t_n) \bigg) \bigg]. \tag{16} +\]
+

\(\hat{z}^{\psi, \omega}_{t_n}\)에 대한 수식도 다음과 같이 변경할 수 있다.

+
+\[ +\hat{z}^{\psi, \omega}_{t_n} \leftarrow z_{t_{n+k}}+(1+\omega)\psi(z_{t_{n+k}}, t_{n+k},t_n,c)-\omega\psi(z_{t_{n+k}}, t_{n+k},t_n,\varnothing). \tag{17} +\]
+
+
+
+

3.4 Latent Consistency Fine-tuning for customized dataset#

+

Stable Diffusion과 같은 Foundation 생성 모델은 거의 대부분의 text-to-image Generation task에서 잘 되지만 가끔 downstream task를 위해 Cunstom dataset에 대한 fine-tuning이 필요할 때가 있다. Latent Consistency Fine-tuning(LCF)는 Custom Dataset도 teacher model에 대한 종속없이 few-step inference를 성공적으로 할수 있도록 한다. 따라서 LCM은 기존의 Diffusion model에 대한 추가적인 fine tuning 방법론 없이도 Custom Dataset을 바로바로 학습하여 사용할수 있다.

+

따로 추가적인 fine-tuning 방법이 있는것은 아니고 Consisteny Distillation 시 pre-trained 된 LDM을 사용하여 EMA를 통해 Distillation을 하기 때문에 Dataset을 Custom Dataset으로 사용하기만하면 된다. 즉 pre-trained Diffuson model → Custom Dataset fine-tuning → few step inference를 위한 Consistency Distillation을 할 필요 없이 바로학습이 가능하다는 의미이다.

+
+
+

4. Experiments#

+
+

4.1 Text-To-Image Generation#

+

3가지 데이터셋에 대한 평가를 진행했다. (LAION-5B, LAION-Aesthetics-6+(12M), LAION-Aesthetics-6.5+(650k)) 앞서말한것처럼 하나의 Resolution이 아닌 512x512, 768x768의 high resolution을 생성했다. 512 size는 \(\epsilon\)-prediction, 768 size는 \(v\)-prediction을 사용했고 ODE-Solver로는 DDIM을 사용했다. 앞서말한것처럼 SKIPPING-STEP은 20의 값을 가진다.

+
+ldm_04 +
+

Fig. 483 Quantitative results at 512 x 512 & 768 x 768 resolution.#

+
+
+
+ldm_05 +
+

Fig. 484 Qualitative results on LAION-Aesthetic-6.5+ Dataset. (2,4 steps)#

+
+
+

DDIM, DPM-Solver, DPM-Solver++, Guided-Distill 4가지 모델에 대해 LCM과 성능비교를 했는데 이때 Guided-Distill은 오픈소스 코드가 없기 때문에 논문의 내용과 동일하게 Implementation 해서 성능을 비교하였다. LCM은 같은 메모리 Cost 대비 더 빠르게 수렴하고 더 좋은 품질의 영상을 생성하였다. 특히 Guided-Distill은 2 stage Distillation이지만 LCM은 1 Stage만 사용해도 이같은 성능을 보여줬다.

+
+
+

4.2 Abulation Study#

+
+

ODE Solvers & Skipping-Step Schedule#

+

augmented PF-ODE를 푸는 solver들(DDIM, DPM, DPM++)을 LCM에 사용할 때 성능 비교와 SKIPPING-STEP schedule의 \(k\)값에 따른 성능 변화를 비교하였다. 모든 모델은 2,000 iteration에서의 4-step inference로 고정해서 비교했다.

+
+ldm_06 +
+

Fig. 485 Different ODE solvers and skipping step k.#

+
+
+

Skipping step의 경우 \(k\) 값을 올렸을 때 훨씬더 빠르게 수렴하며 때때로 더 좋은 FID 값을 보여주었다. 또한 DPM과 DPM++은 \(k\)가 50일 때 DDIM보다 더 좋은 성능을 보였다. 이는 \(k\) 값이 클수록 더 큰 ODE approximation error를 가지는 DDIM에 비해 오차가 적기 때문이다.

+

\(k=20\)일 때, 3가지 모델 모두 좋은 성능이 보였다.

+
+
+

The Effect of Guidance Scale \(\omega\)#

+

일반적으로 \(\omega\)값이 클수록 CLIP score 같은 품질의 지표는 좋아지지만 작을수록 다양성이 떨어져 FID Score가 떨어진다. 즉 \(\omega\)의 크기는 Quality와 Diversity에 대한 trade-off가 있다.

+
+ldm_07 +
+

Fig. 486 Different classifier-free guidance scales \(\omega\).#

+
+
+

그래프를 보면 2~8 step inference는 성능에 큰 차이를 가지지는 않는것으로 확인된다. 그러나 1 step inference는 아직 개선의 여지가 있는것을 확인할 수 있다.

+
+ldm_08 +
+

Fig. 487 Different classifier-free guidance scales \(\omega\).#

+
+
+

\(\omega\)에 따른 실제 생성 이미지를 비교해 봤을 때 생성 영상의 Quality 차이가 확연하게 들어난다. 즉 Distillation 시에도 CFG를 적용하는 것이 성능을 크게 개선할 수 있다는 것을 증명한다.

+
+
+
+

4.3 Downstream Consistency Fine-tuning Results#

+

포켓몬 데이터셋과 심슨 데이터셋에 LCF를 적용했을 때를 비교하였다. 90%는 학습 데이터로, 10%는 검증 데이터로 사용했다. 완벽하진 않지만 Custom Dataset의 style을 잘 catch한 모습을 보여준다.

+
+ldm_09 +
+

Fig. 488 Latent Consistency Fine-tuning(LCF) on two customized dataset.. \(\omega\).#

+
+
+
+
+
+
+

Conclusion#

+

LCM은 Consistency Distillation을 Latent 상에 적용하여 고화질의 영상을 매우 적은 time step으로 inference 할 수 있도록 한 모델이다. 즉 성능 좋고 고해상도의 영상을 few-step으로 가능하게 만들었다. 특히 Custom Dataset에도 Distillation을 적용했을 때 적은 time step으로도 어느정도의 style을 간단하게 학습하는 결과를 보여주었다.

+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/progressive_distillation.html b/docs/review/progressive_distillation.html old mode 100644 new mode 100755 index 57f4b99b..f6b9c9d8 --- a/docs/review/progressive_distillation.html +++ b/docs/review/progressive_distillation.html @@ -1,841 +1,860 @@ - - - - - - - - - - - - Progressive Distillation for Fast Sampling of Diffusion Models — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

Progressive Distillation for Fast Sampling of Diffusion Models#

-
-

1. Introduction#

-

Diffusion model 이 ImageNet generation task 에서 기존 BigGAN-deep 그리고 VQ-VAE-2 모델보다 FID/CAS score 기준으로 더 좋은 성능을 보여주며 많은 각광을 받고 있습니다. 그러나 sampling 속도가 느리다는 치명적인 단점을 가지고 있습니다.

-

이를 해결하기 위해, 논문에서는 Progressive Distillation 기법을 소개하게 됩니다. 간략히 설명하자면 사전학습된 \(N\)-step DDIM 모델을 \(N/2\)-step student 모델에 distillation 하는 과정을 반복하여 최종적으로 4 steps 만으로도 state-of-the-art 모델을 수천번의 sampling steps 를 거쳐 생성한 이미지들과 유사한 모델 성능을 보여준다고 합니다.

-
-
-

2. Background - Diffusion model in continuous time#

-
-

2.1. Definition#

-

Continuous 한 time domain 에서의 diffusion model 을 다음과 같은 요소들로 정의합니다.

-
    -
  • Training data \(x \sim p(x)\)

  • -
  • Latent variables \(z = \{z_t | t \in [0,1]\}\)

  • -
-

여기서 \(z_t\) 는 differentiable 한 noise schedule functions \(\alpha_t, \sigma_t\) 로 값이 정의되고, 이 함수들은 log signal-to-noise-ratio \(\lambda_t = \log[\alpha_t^2/\sigma_t^2]\) 가 monotonically decreasing 하도록 설정됩니다. 그리고 이들을 기반으로 다음과 같은 Markovian forward process 를 정의합니다.

-
-progressive_distillation_01 -
-

Fig. 374 Markovian Forward Process#

-
-
-

where \(0 \leq s < t \leq 1\) and \(\sigma_{t|s}^2 = (1-e^{\lambda_t - \lambda_s}) \sigma_t^2\)

-
-
-

2.2. Objective#

-

Diffusion model 의 objective 는 \(\hat{x}_{\theta}(z_t)\) 모델에서 \(z_t \sim q(z_t | x)\)\(\lambda_t\) 를 입력받아 다음과 같이 Mean Squared Error Loss 를 최소화하는 방향으로 원본 이미지 \(x\) 를 예측하는 것입니다. 이때, \(w(\lambda_t)\)weighting function 이라 부릅니다.

-
-progressive_distillation_02 -
-

Fig. 375 Objective#

-
-
-

where \(t \sim U[0,1]\)

-
-
-

2.3. Sampling#

-

Diffusion model 에서 sampling 하는 방식은 다양하게 존재합니다.

-
-

2.3.1. Ancestral Sampling - DDPM#

-

첫번째로는 DDPM 논문에서 소개하는 discrete time ancestral sampling 방식입니다. 위에 소개했던 notation 기준으로 reverse process 를 다음과 같이 수식적으로 표현 가능합니다.

-
-\[ -q(z_s | z_t,x) = N(z_s | \hat{\mu}_{s|t}(z_t,x), \tilde{\sigma}_{s|t}^2I) -\]
-
-progressive_distillation_03 -
-

Fig. 376 Reverse Process#

-
-
-

이를 기반으로 \(z_1 \sim N(0,I)\) 로부터 다음과 같은 ancestral sampler 를 정의하게 됩니다. 이때, \(\gamma\) 는 sampling 시 얼마나 많은 noise 를 추가할지 설정하는 hyperparameter 입니다.

-
-progressive_distillation_04 -
-

Fig. 377 Ancestral Sampler#

-
-
-
-
-

2.3.2. Probability Flow ODE#

-

반면에, Song et al. (2021c) 에서 forward diffusion process 를 SDE 로 표현할 수 있고, 이를 통한 sampling process 를 probabiility flow ODE 로 표현해서 구할 수 있다고 제시합니다.

-
-progressive_distillation_05 -
-

Fig. 378 Probability flow ODE#

-
-
-

이때, \(f(z_t,t) = \frac{d \log \alpha_t}{dt}z_t, g^2(t) = \frac{dσ_t^2}{dt} − 2 \frac{d\log \alpha_t}{dt}\sigma_t^2, \text{and}\) \(\nabla_z \log \hat{p}_{\theta}(z_t) = \frac{\alpha_t\hat{x}_{\theta}(z_t) -z_t}{\sigma_t^2}\) 로 정의합니다.

-

다시 말해 \(z_1 \sim N(0,I)\) 로부터 이미지 \(x\) 를 생성하는 task 를 위와 같이 ODE solver 문제로 해석할 수 있고, Euler rule 이나 Runge-Kutta method 등의 전통적인 ODE integrator 보다 DDIM sampler 를 적용했을때 성능이 가장 좋다고 논문에서 제시합니다. 아래 사진은 다양한 Probabiltity Flow ODE solver 들의 128x128 ImageNet 데이터셋 FID 성능을 비교한 결과입니다.

-
-progressive_distillation_06 -
-

Fig. 379 FID scores on 128 × 128 ImageNet for various probability flow ODE integrators#

-
-
-

참고로 DDIM sampler 를 ODE solver 문제로 해석하면 다음과 같이 표현할 수 있고, 이 수식은 앞으로 자주 보게 될 예정입니다.

-
-progressive_distillation_07 -
-

Fig. 380 DDIM sampler#

-
-
-
-
-
-
-

3. Progressive Distillation#

-

Diffusion model 을 더 효율적으로 sampling 하기 위해 소개한 progressive distillation 기법은 다음과 같은 절차로 진행됩니다.

-
-progressive_distillation_08 -
-

Fig. 381 Progressive Distillation#

-
-
-
    -
  1. Standard diffusion training 기법으로 Teacher Diffusion Model 학습

  2. -
  3. Student Model 정의 - Teacher Model 로부터 모델 구조 및 parameter 복사

  4. -
  5. Student Model 학습

    -
      -
    1. 이때, original data \(x\) 대신에 \(\tilde{x}\) 를 target 로 student model 을 학습합니다. \(\tilde{x}\) 에 대한 공식은 아래 pseudocode 에 소개되는데, 이는 one-step student sample \(\tilde{z}_{t''}\) 과 two-step teacher sample \(z_{t''}\) 를 일치시키기 위해 나온 공식입니다.

    2. -
    3. 2 DDIM steps of teacher model 결과와 1 DDIM step of student model 결과를 일치시키는 것이 핵심입니다. 여기서 \(z_t\) 에서 \(z_{t-1/N}\) 로 넘어가는 과정을 1 DDIM step 라 정의하고, \(N\) 은 총 진행되는 student sampling steps 입니다.

    4. -
    5. 기존 denoising model 학습 시, \(x\)\(z_t\) 에 대해 deterministic 하지 않기 때문에 (다른 \(x\) 값들에 대해 동일한 \(z_t\) 생성 가능) 모델은 사실상 \(x\) 가 아닌 weighted average of possible \(x\) values 를 예측하는 모델이라고 합니다. 따라서, \(z_t\)에 대해 deterministic 한 \(\tilde{x}(z_t)\) 를 예측하도록 학습한 student model 은 teacher model 보다 더 sharp 한 prediction 을 할 수 있다고 주장합니다.

    6. -
    -
  6. -
  7. Student Model 이 새로운 Teacher Model 이 되고 sampling steps \(N\)\(N/2\) 로 줄어드는 이 과정을 계속 반복

  8. -
-

이에 대한 pseudocode 도 확인해보겠습니다.

-
    -
  • PseudoCode

    -
    -progressive_distillation_09 -
    -

    Fig. 382 Pseudocode for Progresssive Distillation#

    -
    -
    -
  • -
-
-
-

4. Diffusion Model Parameterization and Training Loss#

-

이제 denoising model \(\hat{x}_{\theta}\) 와 reconstruction loss weight \(w(\lambda_t)\) 에 대한 설정값에 대해 자세히 알아보겠습니다. 우선, 논문에서는 일반성을 잃지 않고 (without loss of generalization) variance-preserving diffusion process (i.e., \(\alpha_t^2 + \sigma_t^2 = 1\) ) 라는 가정을 하게 됩니다. 더 자세하게는 cosine schedule \(\alpha_t = cos(0.5\pi t)\) 를 사용합니다.

-

DDPM 을 비롯한 대다수의 논문에서 이미지 \(x\) 가 아닌 noise \(\epsilon\) 를 예측하는 denoising model \(\hat{\epsilon}_{\theta}(z_t)\) 를 정의합니다. \(\epsilon\)-space 에 정의된 손실함수에 \(\hat{x_{\theta}}(z_t) = \frac{1}{\alpha_t}(z_t - \sigma_t \hat{\epsilon}_{\theta}(z_t))\) 식을 대입해보겠습니다.

-
-progressive_distillation_10 -
-

Fig. 383 Training loss on \(\epsilon\)-space and \(x\)-space#

-
-
-

따라서, 이는 이미지 \(x\) domain 에서 weighted reconstruction loss 를 적용하는 것과 동일하며 이때 weighting function \(w(\lambda_t) = exp(\lambda_t), \lambda_t = \log[\alpha_t^2/\sigma_t^2]\) 로 정의할 수 있습니다. 그러나 이러한 standard training procedure 는 progressive distillation 에 적합하지 않다고 주장합니다.

-

Standard diffusion training 기법에서는 다양한 범위 내에서의 signal-to-noise ratio \(\alpha_t^2/\sigma_t^2\) 에서 모델이 학습되지만, distillation 이 진행될수록 이 signal-to-noise ratio 가 감소한다는 단점을 확인하게 됩니다. 더 자세히 설명하자면, \(t\) 가 증가할수록 signal-to-noise-ratio \(\alpha_t^2/\sigma_t^2\) 는 0 에 가까워지게 되고, \(\hat{x_{\theta}}(z_t) = \frac{1}{\alpha_t}(z_t - \sigma_t \hat{\epsilon}_{\theta}(z_t))\) 에서 \(\alpha_t \rightarrow 0\) 이므로 \(\hat{\epsilon}_{\theta}(z_t)\) 에 대한 \(x\)-prediction 변화량이 점차적으로 커지게 됩니다. 이는 여러번의 training step 을 거칠 때 상관없지만, sampling steps 가 줄어들수록 치명적이게 됩니다. 최종적으로 sampling steps=1 일 때까지 progressively distillation 을 적용하면 모델의 입력으로는 단순한 pure noise \(\epsilon\) (i.e., \(\alpha_t = 0, \sigma_t = 1\) ) 이 들어가게 되고, \(\epsilon\)-prediction 과 \(x\)-prediction 의 상관관계가 완전히 사라지게 됩니다. 이는 위 loss function 에서 weighting function \(w(\lambda_t) = 0\) 인 부분에서 확인할 수 있습니다.

-

그래서 논문에서는 다음과 같은 세가지 방법으로 stable 한 \(\hat{x}_{\theta}(z_t)\) prediction 을 구할 수 있는 방법들을 제시합니다.

-
-progressive_distillation_11 -
-

Fig. 384 Different parameterizations#

-
-
-

Weighting function \(w(\lambda_t)\) 도 두 가지 방안으로 실험했습니다. 이는 signal-to-noise ratio 가 0 으로 수렴하는 현상을 방지하도록 설정되었다고 합니다.

-
-progressive_distillation_12 -
-

Fig. 385 Different loss weighting functions#

-
-
-
-progressive_distillation_13 -
-

Fig. 386 Visualization of different loss weighting functions#

-
-
-
-
-

5. Experiments#

-

논문에서 32x32 부터 128x128 까지 다양한 resolution 에서 모델 성능을 확인했습니다. 또한, cosine schedule \(\alpha_t = cos(0.5 \pi t)\) 그리고 DDPM 에서 소개한 U-Net 아키텍쳐를 사용했으며 부가적으로 Nichol & Dhariwal (2021), Song et al. (2021c) 에서 사용된 BigGAN-style up/downsampling 기법을 활용했습니다.

-
-

5.1. Model Parametrization and Training Loss#

-

아래 지표는 unconditional CIFAR-10 데이터셋에 앞써 소개드린 \(\epsilon\)-prediction 외에 다른 세 가지 parametrization 기법들로 original diffusion model 의 FID 와 Inception Score 성능을 확인해본 결과입니다.

-
-progressive_distillation_14 -
-

Fig. 387 Ablation Study on Parameterizations and Loss Weightings#

-
-
-

성능을 비교해본 결과 \(v\)-prediction/\(x\)-prediction 과 Truncated SNR loss function 을 사용했을때 성능이 가장 좋은 부분을 확인할 수 있습니다. 또한, \(\epsilon\)-prediction 과 Truncated SNR loss function 의 조합을 사용하여 학습 시, unstable 한 convergence 를 보이는 현상도 볼 수 있습니다.

-

위 실험결과를 바탕으로 progressive distillation 진행시 CIFAR-10 데이터셋에는 \(x\)-prediction, 그 외 데이터셋에서는 \((x,\epsilon)\)-prediction 을 사용했다고 합니다. 더 자세한 hyperparameter setting 은 Appendix E 참조하시면 됩니다.

-
-
-

5.2. Progressive Distillation#

-

논문에서 CIFAR-10, 64x64 downsampled ImageNet, 128 × 128 LSUN bedrooms, 그리고 128 × 128 LSUN Church-Outdoor 데이터셋에 progressive distillation 을 적용하여 모델 성능을 측정합니다. CIFAR-10 데이터셋 기준으로 teacher model 로부터 progressive distillation 진행 시 8192 steps 부터 시작하였고 batch size=128 로 설정하였습니다. 그 외 resolution 이 큰 데이터셋에 대해서는 1024 steps 부터 시작하고 batch size=2048 로 실험을 진행했습니다. 또한, 매 iteration 마다 \(10^{-4}\) 에서 \(0\) 으로 learning rate 를 linearly anneal 했다고 합니다.

-

FID 성능을 확인해본 결과, 실험을 진행한 모든 4개의 데이터셋에 대해 progressive distillation 을 통해 4-8 sampling steps 만 진행해도 undistilled DDIM 그리고 stochastic sampler 에 준하는 성능을 보여주는 것을 확인할 수 있습니다. 4 sampling steps 까지 progressive distillation 진행하면서 발생하는 computational cost 가 baseline 모델 학습하는 것과 비슷한 부분을 생각했을때 엄청난 장점이라고 생각합니다.

-
-progressive_distillation_15 -
-

Fig. 388 Comparison between Distilled, DDIM, and Stochastic Sampler#

-
-
-

추가적으로 CIFAR-10 데이터셋에서 타 fast sampling method 들과 FID 성능을 비교해본 결과입니다.

-
-progressive_distillation_16 -
-

Fig. 389 Comparison of fast sampling results#

-
-
-

그리고 64x64 ImageNet 데이터셋에 distilled 모델로 생성한 예시 이미지들입니다. 동일한 seed 에 대해서 input noise 로부터 output image 까지 mapping 이 잘되는 부분을 확인할 수 있습니다.

-
-progressive_distillation_17 -
-

Fig. 390 Random samples from distilled 64 × 64 ImageNet models#

-
-
-

마지막으로 distillation scheduling 에 대한 ablation study 도 논문에서 진행했습니다. 첫번째 ablation study 로는 매 distillation iteration 마다 parameter update 횟수를 \(50k\) 에서 \(25k, 10k, 5k\) 로 점차 줄이면서 FID 성능을 비교해보고, 두번째 ablation study 로는 매 distillation iteration 마다 sampling step 을 2배 대신에 4배씩 줄여가면서 student model 을 학습하여 성능을 비교합니다. 그 결과 parameter update 횟수를 현저히 줄임에도 불구하고 FID 성능이 크게 줄지 않는 반면, 각 iteration 마다 sampling step 을 4배씩 줄이는 학습방식으로는 모델 성능이 좋지 못한 부분을 확인할 수 있습니다.

-
-progressive_distillation_18 -
-

Fig. 391 Ablation study on fast sampling schedule#

-
-
-

동일하게 CIFAR-10 외 ImageNet 그리고 LSUN 데이터셋에서 fast sampling schedule 을 적용한 성능 결과도 공유합니다.

-
-progressive_distillation_18 -
-

Fig. 392 50k updates vs 10k updates on ImageNet/LSUN datasets#

-
-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Progressive Distillation for Fast Sampling of Diffusion Models — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

Progressive Distillation for Fast Sampling of Diffusion Models#

+
+

1. Introduction#

+

Diffusion model 이 ImageNet generation task 에서 기존 BigGAN-deep 그리고 VQ-VAE-2 모델보다 FID/CAS score 기준으로 더 좋은 성능을 보여주며 많은 각광을 받고 있습니다. 그러나 sampling 속도가 느리다는 치명적인 단점을 가지고 있습니다.

+

이를 해결하기 위해, 논문에서는 Progressive Distillation 기법을 소개하게 됩니다. 간략히 설명하자면 사전학습된 \(N\)-step DDIM 모델을 \(N/2\)-step student 모델에 distillation 하는 과정을 반복하여 최종적으로 4 steps 만으로도 state-of-the-art 모델을 수천번의 sampling steps 를 거쳐 생성한 이미지들과 유사한 모델 성능을 보여준다고 합니다.

+
+
+

2. Background - Diffusion model in continuous time#

+
+

2.1. Definition#

+

Continuous 한 time domain 에서의 diffusion model 을 다음과 같은 요소들로 정의합니다.

+
    +
  • Training data \(x \sim p(x)\)

  • +
  • Latent variables \(z = \{z_t | t \in [0,1]\}\)

  • +
+

여기서 \(z_t\) 는 differentiable 한 noise schedule functions \(\alpha_t, \sigma_t\) 로 값이 정의되고, 이 함수들은 log signal-to-noise-ratio \(\lambda_t = \log[\alpha_t^2/\sigma_t^2]\) 가 monotonically decreasing 하도록 설정됩니다. 그리고 이들을 기반으로 다음과 같은 Markovian forward process 를 정의합니다.

+
+progressive_distillation_01 +
+

Fig. 374 Markovian Forward Process#

+
+
+

where \(0 \leq s < t \leq 1\) and \(\sigma_{t|s}^2 = (1-e^{\lambda_t - \lambda_s}) \sigma_t^2\)

+
+
+

2.2. Objective#

+

Diffusion model 의 objective 는 \(\hat{x}_{\theta}(z_t)\) 모델에서 \(z_t \sim q(z_t | x)\)\(\lambda_t\) 를 입력받아 다음과 같이 Mean Squared Error Loss 를 최소화하는 방향으로 원본 이미지 \(x\) 를 예측하는 것입니다. 이때, \(w(\lambda_t)\)weighting function 이라 부릅니다.

+
+progressive_distillation_02 +
+

Fig. 375 Objective#

+
+
+

where \(t \sim U[0,1]\)

+
+
+

2.3. Sampling#

+

Diffusion model 에서 sampling 하는 방식은 다양하게 존재합니다.

+
+

2.3.1. Ancestral Sampling - DDPM#

+

첫번째로는 DDPM 논문에서 소개하는 discrete time ancestral sampling 방식입니다. 위에 소개했던 notation 기준으로 reverse process 를 다음과 같이 수식적으로 표현 가능합니다.

+
+\[ +q(z_s | z_t,x) = N(z_s | \hat{\mu}_{s|t}(z_t,x), \tilde{\sigma}_{s|t}^2I) +\]
+
+progressive_distillation_03 +
+

Fig. 376 Reverse Process#

+
+
+

이를 기반으로 \(z_1 \sim N(0,I)\) 로부터 다음과 같은 ancestral sampler 를 정의하게 됩니다. 이때, \(\gamma\) 는 sampling 시 얼마나 많은 noise 를 추가할지 설정하는 hyperparameter 입니다.

+
+progressive_distillation_04 +
+

Fig. 377 Ancestral Sampler#

+
+
+
+
+

2.3.2. Probability Flow ODE#

+

반면에, Song et al. (2021c) 에서 forward diffusion process 를 SDE 로 표현할 수 있고, 이를 통한 sampling process 를 probabiility flow ODE 로 표현해서 구할 수 있다고 제시합니다.

+
+progressive_distillation_05 +
+

Fig. 378 Probability flow ODE#

+
+
+

이때, \(f(z_t,t) = \frac{d \log \alpha_t}{dt}z_t, g^2(t) = \frac{dσ_t^2}{dt} − 2 \frac{d\log \alpha_t}{dt}\sigma_t^2, \text{and}\) \(\nabla_z \log \hat{p}_{\theta}(z_t) = \frac{\alpha_t\hat{x}_{\theta}(z_t) -z_t}{\sigma_t^2}\) 로 정의합니다.

+

다시 말해 \(z_1 \sim N(0,I)\) 로부터 이미지 \(x\) 를 생성하는 task 를 위와 같이 ODE solver 문제로 해석할 수 있고, Euler rule 이나 Runge-Kutta method 등의 전통적인 ODE integrator 보다 DDIM sampler 를 적용했을때 성능이 가장 좋다고 논문에서 제시합니다. 아래 사진은 다양한 Probabiltity Flow ODE solver 들의 128x128 ImageNet 데이터셋 FID 성능을 비교한 결과입니다.

+
+progressive_distillation_06 +
+

Fig. 379 FID scores on 128 × 128 ImageNet for various probability flow ODE integrators#

+
+
+

참고로 DDIM sampler 를 ODE solver 문제로 해석하면 다음과 같이 표현할 수 있고, 이 수식은 앞으로 자주 보게 될 예정입니다.

+
+progressive_distillation_07 +
+

Fig. 380 DDIM sampler#

+
+
+
+
+
+
+

3. Progressive Distillation#

+

Diffusion model 을 더 효율적으로 sampling 하기 위해 소개한 progressive distillation 기법은 다음과 같은 절차로 진행됩니다.

+
+progressive_distillation_08 +
+

Fig. 381 Progressive Distillation#

+
+
+
    +
  1. Standard diffusion training 기법으로 Teacher Diffusion Model 학습

  2. +
  3. Student Model 정의 - Teacher Model 로부터 모델 구조 및 parameter 복사

  4. +
  5. Student Model 학습

    +
      +
    1. 이때, original data \(x\) 대신에 \(\tilde{x}\) 를 target 로 student model 을 학습합니다. \(\tilde{x}\) 에 대한 공식은 아래 pseudocode 에 소개되는데, 이는 one-step student sample \(\tilde{z}_{t''}\) 과 two-step teacher sample \(z_{t''}\) 를 일치시키기 위해 나온 공식입니다.

    2. +
    3. 2 DDIM steps of teacher model 결과와 1 DDIM step of student model 결과를 일치시키는 것이 핵심입니다. 여기서 \(z_t\) 에서 \(z_{t-1/N}\) 로 넘어가는 과정을 1 DDIM step 라 정의하고, \(N\) 은 총 진행되는 student sampling steps 입니다.

    4. +
    5. 기존 denoising model 학습 시, \(x\)\(z_t\) 에 대해 deterministic 하지 않기 때문에 (다른 \(x\) 값들에 대해 동일한 \(z_t\) 생성 가능) 모델은 사실상 \(x\) 가 아닌 weighted average of possible \(x\) values 를 예측하는 모델이라고 합니다. 따라서, \(z_t\)에 대해 deterministic 한 \(\tilde{x}(z_t)\) 를 예측하도록 학습한 student model 은 teacher model 보다 더 sharp 한 prediction 을 할 수 있다고 주장합니다.

    6. +
    +
  6. +
  7. Student Model 이 새로운 Teacher Model 이 되고 sampling steps \(N\)\(N/2\) 로 줄어드는 이 과정을 계속 반복

  8. +
+

이에 대한 pseudocode 도 확인해보겠습니다.

+
    +
  • PseudoCode

    +
    +progressive_distillation_09 +
    +

    Fig. 382 Pseudocode for Progresssive Distillation#

    +
    +
    +
  • +
+
+
+

4. Diffusion Model Parameterization and Training Loss#

+

이제 denoising model \(\hat{x}_{\theta}\) 와 reconstruction loss weight \(w(\lambda_t)\) 에 대한 설정값에 대해 자세히 알아보겠습니다. 우선, 논문에서는 일반성을 잃지 않고 (without loss of generalization) variance-preserving diffusion process (i.e., \(\alpha_t^2 + \sigma_t^2 = 1\) ) 라는 가정을 하게 됩니다. 더 자세하게는 cosine schedule \(\alpha_t = cos(0.5\pi t)\) 를 사용합니다.

+

DDPM 을 비롯한 대다수의 논문에서 이미지 \(x\) 가 아닌 noise \(\epsilon\) 를 예측하는 denoising model \(\hat{\epsilon}_{\theta}(z_t)\) 를 정의합니다. \(\epsilon\)-space 에 정의된 손실함수에 \(\hat{x_{\theta}}(z_t) = \frac{1}{\alpha_t}(z_t - \sigma_t \hat{\epsilon}_{\theta}(z_t))\) 식을 대입해보겠습니다.

+
+progressive_distillation_10 +
+

Fig. 383 Training loss on \(\epsilon\)-space and \(x\)-space#

+
+
+

따라서, 이는 이미지 \(x\) domain 에서 weighted reconstruction loss 를 적용하는 것과 동일하며 이때 weighting function \(w(\lambda_t) = exp(\lambda_t), \lambda_t = \log[\alpha_t^2/\sigma_t^2]\) 로 정의할 수 있습니다. 그러나 이러한 standard training procedure 는 progressive distillation 에 적합하지 않다고 주장합니다.

+

Standard diffusion training 기법에서는 다양한 범위 내에서의 signal-to-noise ratio \(\alpha_t^2/\sigma_t^2\) 에서 모델이 학습되지만, distillation 이 진행될수록 이 signal-to-noise ratio 가 감소한다는 단점을 확인하게 됩니다. 더 자세히 설명하자면, \(t\) 가 증가할수록 signal-to-noise-ratio \(\alpha_t^2/\sigma_t^2\) 는 0 에 가까워지게 되고, \(\hat{x_{\theta}}(z_t) = \frac{1}{\alpha_t}(z_t - \sigma_t \hat{\epsilon}_{\theta}(z_t))\) 에서 \(\alpha_t \rightarrow 0\) 이므로 \(\hat{\epsilon}_{\theta}(z_t)\) 에 대한 \(x\)-prediction 변화량이 점차적으로 커지게 됩니다. 이는 여러번의 training step 을 거칠 때 상관없지만, sampling steps 가 줄어들수록 치명적이게 됩니다. 최종적으로 sampling steps=1 일 때까지 progressively distillation 을 적용하면 모델의 입력으로는 단순한 pure noise \(\epsilon\) (i.e., \(\alpha_t = 0, \sigma_t = 1\) ) 이 들어가게 되고, \(\epsilon\)-prediction 과 \(x\)-prediction 의 상관관계가 완전히 사라지게 됩니다. 이는 위 loss function 에서 weighting function \(w(\lambda_t) = 0\) 인 부분에서 확인할 수 있습니다.

+

그래서 논문에서는 다음과 같은 세가지 방법으로 stable 한 \(\hat{x}_{\theta}(z_t)\) prediction 을 구할 수 있는 방법들을 제시합니다.

+
+progressive_distillation_11 +
+

Fig. 384 Different parameterizations#

+
+
+

Weighting function \(w(\lambda_t)\) 도 두 가지 방안으로 실험했습니다. 이는 signal-to-noise ratio 가 0 으로 수렴하는 현상을 방지하도록 설정되었다고 합니다.

+
+progressive_distillation_12 +
+

Fig. 385 Different loss weighting functions#

+
+
+
+progressive_distillation_13 +
+

Fig. 386 Visualization of different loss weighting functions#

+
+
+
+
+

5. Experiments#

+

논문에서 32x32 부터 128x128 까지 다양한 resolution 에서 모델 성능을 확인했습니다. 또한, cosine schedule \(\alpha_t = cos(0.5 \pi t)\) 그리고 DDPM 에서 소개한 U-Net 아키텍쳐를 사용했으며 부가적으로 Nichol & Dhariwal (2021), Song et al. (2021c) 에서 사용된 BigGAN-style up/downsampling 기법을 활용했습니다.

+
+

5.1. Model Parametrization and Training Loss#

+

아래 지표는 unconditional CIFAR-10 데이터셋에 앞써 소개드린 \(\epsilon\)-prediction 외에 다른 세 가지 parametrization 기법들로 original diffusion model 의 FID 와 Inception Score 성능을 확인해본 결과입니다.

+
+progressive_distillation_14 +
+

Fig. 387 Ablation Study on Parameterizations and Loss Weightings#

+
+
+

성능을 비교해본 결과 \(v\)-prediction/\(x\)-prediction 과 Truncated SNR loss function 을 사용했을때 성능이 가장 좋은 부분을 확인할 수 있습니다. 또한, \(\epsilon\)-prediction 과 Truncated SNR loss function 의 조합을 사용하여 학습 시, unstable 한 convergence 를 보이는 현상도 볼 수 있습니다.

+

위 실험결과를 바탕으로 progressive distillation 진행시 CIFAR-10 데이터셋에는 \(x\)-prediction, 그 외 데이터셋에서는 \((x,\epsilon)\)-prediction 을 사용했다고 합니다. 더 자세한 hyperparameter setting 은 Appendix E 참조하시면 됩니다.

+
+
+

5.2. Progressive Distillation#

+

논문에서 CIFAR-10, 64x64 downsampled ImageNet, 128 × 128 LSUN bedrooms, 그리고 128 × 128 LSUN Church-Outdoor 데이터셋에 progressive distillation 을 적용하여 모델 성능을 측정합니다. CIFAR-10 데이터셋 기준으로 teacher model 로부터 progressive distillation 진행 시 8192 steps 부터 시작하였고 batch size=128 로 설정하였습니다. 그 외 resolution 이 큰 데이터셋에 대해서는 1024 steps 부터 시작하고 batch size=2048 로 실험을 진행했습니다. 또한, 매 iteration 마다 \(10^{-4}\) 에서 \(0\) 으로 learning rate 를 linearly anneal 했다고 합니다.

+

FID 성능을 확인해본 결과, 실험을 진행한 모든 4개의 데이터셋에 대해 progressive distillation 을 통해 4-8 sampling steps 만 진행해도 undistilled DDIM 그리고 stochastic sampler 에 준하는 성능을 보여주는 것을 확인할 수 있습니다. 4 sampling steps 까지 progressive distillation 진행하면서 발생하는 computational cost 가 baseline 모델 학습하는 것과 비슷한 부분을 생각했을때 엄청난 장점이라고 생각합니다.

+
+progressive_distillation_15 +
+

Fig. 388 Comparison between Distilled, DDIM, and Stochastic Sampler#

+
+
+

추가적으로 CIFAR-10 데이터셋에서 타 fast sampling method 들과 FID 성능을 비교해본 결과입니다.

+
+progressive_distillation_16 +
+

Fig. 389 Comparison of fast sampling results#

+
+
+

그리고 64x64 ImageNet 데이터셋에 distilled 모델로 생성한 예시 이미지들입니다. 동일한 seed 에 대해서 input noise 로부터 output image 까지 mapping 이 잘되는 부분을 확인할 수 있습니다.

+
+progressive_distillation_17 +
+

Fig. 390 Random samples from distilled 64 × 64 ImageNet models#

+
+
+

마지막으로 distillation scheduling 에 대한 ablation study 도 논문에서 진행했습니다. 첫번째 ablation study 로는 매 distillation iteration 마다 parameter update 횟수를 \(50k\) 에서 \(25k, 10k, 5k\) 로 점차 줄이면서 FID 성능을 비교해보고, 두번째 ablation study 로는 매 distillation iteration 마다 sampling step 을 2배 대신에 4배씩 줄여가면서 student model 을 학습하여 성능을 비교합니다. 그 결과 parameter update 횟수를 현저히 줄임에도 불구하고 FID 성능이 크게 줄지 않는 반면, 각 iteration 마다 sampling step 을 4배씩 줄이는 학습방식으로는 모델 성능이 좋지 못한 부분을 확인할 수 있습니다.

+
+progressive_distillation_18 +
+

Fig. 391 Ablation study on fast sampling schedule#

+
+
+

동일하게 CIFAR-10 외 ImageNet 그리고 LSUN 데이터셋에서 fast sampling schedule 을 적용한 성능 결과도 공유합니다.

+
+progressive_distillation_18 +
+

Fig. 392 50k updates vs 10k updates on ImageNet/LSUN datasets#

+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/t2i_adapter.html b/docs/review/t2i_adapter.html old mode 100644 new mode 100755 index 3dadde95..9fe182d9 --- a/docs/review/t2i_adapter.html +++ b/docs/review/t2i_adapter.html @@ -1,985 +1,1004 @@ - - - - - - - - - - - - T2I-Adapter — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

T2I-Adapter#

-
-

Introduction#

-

이번 시간에는 Tencent ARC Lab 에서 소개하는 T2I-Adapter 모델에 대해 알아볼 예정입니다.

-

Stable Diffusion 을 비롯한 기존의 T2I 모델들이 난해한 prompt (e.g., “A car with flying wings” & “Iron Man with bunny ears”) 을 입력받을 시, 생성되는 이미지 퀄리티가 저하되는 부분을 확인할 수 있는데요. 논문에서는 T2I 모델이 low level (e.g., textures), middle level (e.g., edges), 그리고 high level (e.g., semantics) 에 대한 정보들을 implicit 하게 가지고 있지만, 이를 표현하기 위해서는 text prompt 만으로는 한계가 있고 보다 세밀한 controlling (e.g., color, structure) 이 필요하다고 서술합니다. 즉, T2I 모델의 internal knowledge 와 external guidance 의 alignment 에 대한 추가적인 학습이 필요하다고 주장합니다.

-
-t2i_adapter_01 -
-

Fig. 250 Effect of External Guidance#

-
-
-

논문에서는 이를 해결하기 위해 T2I-Adapter 모델을 소개하고 다음과 같이 5가지 장점이 있다고 합니다.

-
-t2i_adapter_02 -
-

Fig. 251 Various Guidance of T2I-Adapter#

-
-
-
    -
  • Plug-and-play : 기존의 T2I 모델의 generalization ability 유지

  • -
  • Simple and small : ~77M parameters and ~300M storage

    -
    -t2i_adapter_03 -
    -

    Fig. 252 ControlNet vs T2I-Adapter#

    -
    -
    -
      -
    • ControlNet 같은 경우에 reverse diffusion process 에서 ControlNet 과 Unet 모두 연산작업이 실행됩니다. 이때 ControlNet 은 Unet Encoder 의 구조를 그대로 가져오기 때문에 parameter size 및 storage 용량이 크고, 이는 이미지 생성하는데 큰 bottleneck 이 됩니다.

    • -
    -
  • -
  • Flexible : 다양한 adapter (e.g., color, structure) 학습 가능

  • -
  • Composable : Multiple adapter 적용 가능

  • -
  • Generalizable : 동일한 구조를 가진 다른 T2I 모델에 동일한 adapter 적용 가능

  • -
-
-
-

Method#

-
-

3.1. Preliminary: Stable Diffusion#

-

T2I-Adapter 의 기반이 되는 T2I 모델 Stable Diffusion 모델은 기본적으로 two-stage model 이고, autoencoder 와 Unet denoiser 로 구성되어 있습니다. Autoencoder 를 통해 이미지를 latent space 로 바꾸고 다시 복원하는 역할을 하고, Unet denoiser 는 diffusion process 를 통해 다음과 같은 손실함수를 최소화하는 방향으로 학습하게 됩니다.

-
-\[ -L = \mathbb{E}_{Z_{t}, C, \epsilon, t}(||\epsilon-\epsilon_{\theta}(Z_t, C)||_2^2) -\]
-
    -
  • \(Z_t = \sqrt{\bar{\alpha}_t}Z_0 + \sqrt{1-\bar{\alpha}_t}\epsilon, \epsilon \sim N(0,I)\) := noised feature map at step t

  • -
  • \(C\) := conditional information

  • -
  • \(\epsilon_{\theta}\) := UNet denoiser

  • -
-

Inference 시에는 random Gaussian distribution 을 따르는 \(Z_T\), 그리고 text prompt 를 CLIP text encoder 에 입력함으로써 생성한 token \(y\) 를 cross attention 을 통해 Unet denoiser \(\epsilon_{\theta}\) 에 입력합니다. 최종적으로, diffusion process 로부터 생성된 denoise 된 latent feature 를 decoder 를 통해 최종 이미지를 생성하게 됩니다. 자세한 cross attention 하는 방식은 다음과 같습니다.

-
-t2i_adapter_04 -
-

Fig. 253 Cross Attention#

-
-
-
    -
  • \(W_Q, W_K, W_V\) := learnable projection matrices

  • -
  • \(\phi(\cdot), \tau(\cdot)\) := learnable embeddings

  • -
-
-
-

3.2. Overview of T2I-Adapter#

-

논문에서는 다음과 같은 형태로 pre-trained 된 Stable Diffusion 을 비롯한 T2I 모델에 Adapter 를 추가하는 방식을 소개합니다. Adapter 의 자세한 구조는 다음과 같습니다.

-
-t2i_adapter_05 -
-

Fig. 254 Overview of T2I-Adapter#

-
-
-
-
-

3.3. Adapter Design#

-
-t2i_adapter_06 -
-

Fig. 255 Adapter Design#

-
-
-

Conditional input 은 512x512 의 크기를 가지며, 이는 pixel unshuffle downsampling 을 통해 64x64 이미지로 변환이 되어 1개의 convolution layer 와 2개의 residual block 으로 구성된 scale 을 4번 통과하게 됩니다. 이때, 각 scale 을 거치고 나온 condition feature 를 \(F_c^k\) 라 정의합니다.

-

최종적으로 multi-scale condition feature \(F_c = \{F_c^1, F_c^2, F_c^3, F_c^4\}\) 가 생성되고, 이는 Unet encoder 에서의 intermediate feature \(F_{enc} = \{F_{enc}^1, F_{enc}^2, F_{enc}^3, F_{enc}^4\}\) 와 더해지게 됩니다. 이때, dimension 크기는 동일하도록 설정했기 때문에 덧셈 연산하는데 문제 없습니다.

-
-t2i_adapter_07 -
-

Fig. 256 Multi-Scale Condition Feature#

-
-
-

해당 implementation code 도 살펴보겠습니다.

-
    -
  • T2I-Adapter module code

    -
    class FullAdapter(nn.Module):
    -    def __init__(
    -        self,
    -        in_channels: int = 3,
    -        channels: List[int] = [320, 640, 1280, 1280],
    -        num_res_blocks: int = 2,
    -        downscale_factor: int = 8,
    -    ):
    -        super().__init__()
    -
    -        in_channels = in_channels * downscale_factor**2
    -
    -        self.unshuffle = nn.PixelUnshuffle(downscale_factor)
    -        self.conv_in = nn.Conv2d(in_channels, channels[0], kernel_size=3, padding=1)
    -
    -        self.body = nn.ModuleList(
    -            [
    -                AdapterBlock(channels[0], channels[0], num_res_blocks),
    -                *[
    -                    AdapterBlock(channels[i - 1], channels[i], num_res_blocks, down=True)
    -                    for i in range(1, len(channels))
    -                ],
    -            ]
    -        )
    -
    -        self.total_downscale_factor = downscale_factor * 2 ** (len(channels) - 1)
    -
    -    def forward(self, x: torch.Tensor) -> List[torch.Tensor]:
    -        x = self.unshuffle(x)
    -        x = self.conv_in(x)
    -
    -        features = []
    -
    -        for block in self.body:
    -            x = block(x)
    -            features.append(x)
    -
    -        return features
    -
    -
    -
    class AdapterBlock(nn.Module):
    -    def __init__(self, in_channels, out_channels, num_res_blocks, down=False):
    -        super().__init__()
    -
    -        self.downsample = None
    -        if down:
    -            self.downsample = Downsample2D(in_channels)
    -
    -        self.in_conv = None
    -        if in_channels != out_channels:
    -            self.in_conv = nn.Conv2d(in_channels, out_channels, kernel_size=1)
    -
    -        self.resnets = nn.Sequential(
    -            *[AdapterResnetBlock(out_channels) for _ in range(num_res_blocks)],
    -        )
    -
    -    def forward(self, x):
    -        if self.downsample is not None:
    -            x = self.downsample(x)
    -
    -        if self.in_conv is not None:
    -            x = self.in_conv(x)
    -
    -        x = self.resnets(x)
    -
    -        return x
    -
    -class AdapterResnetBlock(nn.Module):
    -    def __init__(self, channels):
    -        super().__init__()
    -        self.block1 = nn.Conv2d(channels, channels, kernel_size=3, padding=1)
    -        self.act = nn.ReLU()
    -        self.block2 = nn.Conv2d(channels, channels, kernel_size=1)
    -
    -    def forward(self, x):
    -        h = x
    -        h = self.block1(h)
    -        h = self.act(h)
    -        h = self.block2(h)
    -
    -        return h + x
    -
    -
    -
  • -
  • SD + T2I-Adapter implementation code

    -
    # 7. Denoising loop
    -adapter_state = self.adapter(adapter_input)
    -for k, v in enumerate(adapter_state):
    -    adapter_state[k] = v * adapter_conditioning_scale
    -if num_images_per_prompt > 1:
    -    for k, v in enumerate(adapter_state):
    -        adapter_state[k] = v.repeat(num_images_per_prompt, 1, 1, 1)
    -if do_classifier_free_guidance:
    -    for k, v in enumerate(adapter_state):
    -        adapter_state[k] = torch.cat([v] * 2, dim=0)
    -
    -num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order
    -with self.progress_bar(total=num_inference_steps) as progress_bar:
    -    for i, t in enumerate(timesteps):
    -        # expand the latents if we are doing classifier free guidance
    -        latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents
    -        latent_model_input = self.scheduler.scale_model_input(latent_model_input, t)
    -
    -        # predict the noise residual
    -        noise_pred = self.unet(
    -            latent_model_input,
    -            t,
    -            encoder_hidden_states=prompt_embeds,
    -            cross_attention_kwargs=cross_attention_kwargs,
    -            down_block_additional_residuals=[state.clone() for state in adapter_state],
    -        ).sample
    -
    -        # perform guidance
    -        if do_classifier_free_guidance:
    -            noise_pred_uncond, noise_pred_text = noise_pred.chunk(2)
    -            noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)
    -
    -        # compute the previous noisy sample x_t -> x_t-1
    -        latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).prev_sample
    -
    -
    -
  • -
-

Adapter 종류로는 크게 structure 에 대한 conditioning 과 color 에 대한 conditioning 으로 분류할 수 있습니다. Structure controlling 으로는 대표적으로 sketch, depth map, semantic segmentation map, keypose 등이 있습니다. Color map 은 이미지를 우선적으로 high bicubic downsampling 을 통해 semantic 및 structural 한 정보를 제외시키고, nearest upsampling 기법으로 다시 원본 이미지 크기로 복원하는 작업을 통해 생성합니다.

-

앞써 설명한 부분처럼 추가 학습 없이 여러 adapter 로 conditioning 할 수도 있습니다. Multi-adapter 로 controlling 할 시, 다음과 같이 각 adapter 로부터 나온 condition feature 에 weight \(w_k\) 를 부여해 최종 condition feature 를 정의하게 됩니다.

-
-t2i_adapter_08 -
-

Fig. 257 Multi-Adapter Conditioning#

-
-
-
-
-

3.4. Model Optimization#

-

모델 학습 시, SD 파라미터는 고정시킨 상태로 T2I-Adapter 파라미터만 학습합니다. 이때, T2-Adapter 손실함수는 SD 학습 시와 유사하게 다음과 같이 정의합니다.

-
-\[ -L_{AD} = \mathbb{E}_{Z_{0}, t, F_c, \epsilon \sim N(0,I)}[||\epsilon-\epsilon_{\theta}(Z_t, t, \tau(y), F_c)||_2^2] -\]
-

where \(t \sim U(0,T)\)

-

Non-uniform time step sampling during training

-

Diffusion 모델 학습 시와 동일하게, time embedding 을 adapter 에 input 으로 넣으면서 성능 개선 효과가 있는 것을 확인했지만 매 time step \(t\) 마다 \(F_c\) 를 conditioning 하는 것은 computationally expensive 합니다.

-

따라서, 논문에서는 DDIM inference sampling 을 크게 3가지 stage (i.e., beginning, middle, late stage) 로 분류하는 방법을 소개합니다. 실험해본 결과, middle 그리고 late stage 에 적용하는 것보다 beginning stage 에서 guidance 를 주는 효과가 더 크다고 합니다.

-
-t2i_adapter_09 -
-

Fig. 258 DDIM Inference Sampling Stages#

-
-
-

따라서, 최대한 time step \(t\) 가 early sampling stage 에 포함되도록 다음 수식처럼 non-uniformly 하게 sampling 작업을 진행했고, 이에 대한 결과도 공유합니다.

-
-\[ -t = (1-(t/T)^3) \times T, t \in U(0,T) -\]
-
-t2i_adapter_10 -
-

Fig. 259 Effect of Cubic Sampling#

-
-
-
-
-
-

Experiment#

-
-

4.1. Implementation Details#

-

T2I-Adapter 학습 시, hyperparameter 및 데이터셋 구축 상세사항은 다음과 같습니다.

-
    -
  • Hyperparameters

    -
      -
    • 10 epochs

    • -
    • Batch size = 8

    • -
    • Learning rate = \(1 \times 10^{-5}\)

    • -
    • Adam optimizer

    • -
    • 4X NVIDIA Tesla 32G-V100 GPUs (3 days)

    • -
    -
  • -
  • 실험별 데이터셋 구축

    -
      -
    • Sketch Map

      -
        -
      • COCO17 데이터셋 - 164K images

      • -
      • PiDiNet 를 활용해 sketch map 생성

      • -
      -
    • -
    • Semantic segmentation map

      -
        -
      • COCO-Stuff 데이터셋 - 164K images

      • -
      -
    • -
    • Keypoints & Color & Depth maps

      -
        -
      • LAION-AESTHETICS 데이터셋로부터 600K images-text pairs 추출

      • -
      • MM-Pose, MiDaS 모델로 각각 Keypoint, Depth map 생성

      • -
      -
    • -
    -
  • -
-
-
-

4.2. Comparison#

-

기존 SOTA 모델들과 정량적인 수치로 비교하는데 FID 와 CLIP Score 를 사용하였고, 하단 사진처럼 기존 GAN-based 그리고 diffusion-based method 모델들보다 성능이 좋습니다.

-
-t2i_adapter_11 -
-

Fig. 260 Qualitative Comparison#

-
-
-
-t2i_adapter_12 -
-

Fig. 261 Quantitative Comparisoin#

-
-
-
-
-

4.3. Applications#

-

해당 예시들은 다양한 single adapter controlling 에 대한 결과들을 보여줍니다. 특히 인상적인 부분은 sketch 로 controlling 시, sketch 가 정확하지 않아도 이미지 생성에 robust 한 성능을 보여주는 것을 확인할 수 있습니다.

-
-t2i_adapter_13 -
-

Fig. 262 Visualization of Single-Adapter Controlling#

-
-
-

또한, image editing 도 가능합니다. SD inpainting mode 로 특정 지역을 masking 한 후, T2I-Adapter 를 통해 image editing 을 한 예시 사진입니다. Adapter 없이, SD inpainting 만으로는 성능이 좋지 못하다고 합니다.

-
-t2i_adapter_14 -
-

Fig. 263 Image Editing with T2I-Adapter#

-
-
-

아래 예시는 multiple adapter 를 적용한 것로 위에서부터 아래로 각각 depth + keypose 그리고 sketch + color map 을 conditioning 한 결과입니다.

-
-t2i_adapter_15 -
-

Fig. 264 Composable Controlling#

-
-
-

마지막으로, 장점들 중 하나로 명시되었던 generalization ability 를 보여준 사례입니다. 학습 완료한 Adapter 를 동일한 구조를 가진 T2I 모델에 적용 가능한 것을 확인할 수 있습니다.

-
-t2i_adapter_16 -
-

Fig. 265 Generalizable Controlling#

-
-
-
-
-

4.4. Ablation Study#

-

논문에서는 guidance mode, 그리고 complexity 에 대한 ablation study 를 진행했습니다.

-

SD 모델은 encoder 그리고 decoder 에 각각 4개의 scale (i.e., 64×64, 32×32, 16×16, 8×8) 을 가지고 있는데, 하단 table 처럼 각각 다른 scale 에 adapter guidance 를 적용하면서 FID 성능을 비교했습니다. Scale Number 가 4보다 작을 경우, large scale 에 순차적으로 guidance 를 적용했습니다. 그 결과, Unet encoder 에만 4 scales 모두 guidance 를 적용하는 것이 성능이 제일 좋다고 합니다.

-
-t2i_adapter_17 -
-

Fig. 266 Guidance Mode#

-
-
-

또한, condition map 는 비교적 sparse 하기 때문에 더 경량화된 adapter 를 사용해도 성능이 좋은 부분을 하단 예시처럼 확인할 수 있었다고 합니다. 더 자세하게는, adapter block 의 intermediate channel 숫자를 바꿔가며 adapter-small, adapter-tiny 모델을 각각 x4, x8 compression 작업을 진행했습니다.

-
-t2i_adapter_18 -
-

Fig. 267 Complexity Ablation#

-
-
-
-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + T2I-Adapter — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

T2I-Adapter#

+
+

Introduction#

+

이번 시간에는 Tencent ARC Lab 에서 소개하는 T2I-Adapter 모델에 대해 알아볼 예정입니다.

+

Stable Diffusion 을 비롯한 기존의 T2I 모델들이 난해한 prompt (e.g., “A car with flying wings” & “Iron Man with bunny ears”) 을 입력받을 시, 생성되는 이미지 퀄리티가 저하되는 부분을 확인할 수 있는데요. 논문에서는 T2I 모델이 low level (e.g., textures), middle level (e.g., edges), 그리고 high level (e.g., semantics) 에 대한 정보들을 implicit 하게 가지고 있지만, 이를 표현하기 위해서는 text prompt 만으로는 한계가 있고 보다 세밀한 controlling (e.g., color, structure) 이 필요하다고 서술합니다. 즉, T2I 모델의 internal knowledge 와 external guidance 의 alignment 에 대한 추가적인 학습이 필요하다고 주장합니다.

+
+t2i_adapter_01 +
+

Fig. 250 Effect of External Guidance#

+
+
+

논문에서는 이를 해결하기 위해 T2I-Adapter 모델을 소개하고 다음과 같이 5가지 장점이 있다고 합니다.

+
+t2i_adapter_02 +
+

Fig. 251 Various Guidance of T2I-Adapter#

+
+
+
    +
  • Plug-and-play : 기존의 T2I 모델의 generalization ability 유지

  • +
  • Simple and small : ~77M parameters and ~300M storage

    +
    +t2i_adapter_03 +
    +

    Fig. 252 ControlNet vs T2I-Adapter#

    +
    +
    +
      +
    • ControlNet 같은 경우에 reverse diffusion process 에서 ControlNet 과 Unet 모두 연산작업이 실행됩니다. 이때 ControlNet 은 Unet Encoder 의 구조를 그대로 가져오기 때문에 parameter size 및 storage 용량이 크고, 이는 이미지 생성하는데 큰 bottleneck 이 됩니다.

    • +
    +
  • +
  • Flexible : 다양한 adapter (e.g., color, structure) 학습 가능

  • +
  • Composable : Multiple adapter 적용 가능

  • +
  • Generalizable : 동일한 구조를 가진 다른 T2I 모델에 동일한 adapter 적용 가능

  • +
+
+
+

Method#

+
+

3.1. Preliminary: Stable Diffusion#

+

T2I-Adapter 의 기반이 되는 T2I 모델 Stable Diffusion 모델은 기본적으로 two-stage model 이고, autoencoder 와 Unet denoiser 로 구성되어 있습니다. Autoencoder 를 통해 이미지를 latent space 로 바꾸고 다시 복원하는 역할을 하고, Unet denoiser 는 diffusion process 를 통해 다음과 같은 손실함수를 최소화하는 방향으로 학습하게 됩니다.

+
+\[ +L = \mathbb{E}_{Z_{t}, C, \epsilon, t}(||\epsilon-\epsilon_{\theta}(Z_t, C)||_2^2) +\]
+
    +
  • \(Z_t = \sqrt{\bar{\alpha}_t}Z_0 + \sqrt{1-\bar{\alpha}_t}\epsilon, \epsilon \sim N(0,I)\) := noised feature map at step t

  • +
  • \(C\) := conditional information

  • +
  • \(\epsilon_{\theta}\) := UNet denoiser

  • +
+

Inference 시에는 random Gaussian distribution 을 따르는 \(Z_T\), 그리고 text prompt 를 CLIP text encoder 에 입력함으로써 생성한 token \(y\) 를 cross attention 을 통해 Unet denoiser \(\epsilon_{\theta}\) 에 입력합니다. 최종적으로, diffusion process 로부터 생성된 denoise 된 latent feature 를 decoder 를 통해 최종 이미지를 생성하게 됩니다. 자세한 cross attention 하는 방식은 다음과 같습니다.

+
+t2i_adapter_04 +
+

Fig. 253 Cross Attention#

+
+
+
    +
  • \(W_Q, W_K, W_V\) := learnable projection matrices

  • +
  • \(\phi(\cdot), \tau(\cdot)\) := learnable embeddings

  • +
+
+
+

3.2. Overview of T2I-Adapter#

+

논문에서는 다음과 같은 형태로 pre-trained 된 Stable Diffusion 을 비롯한 T2I 모델에 Adapter 를 추가하는 방식을 소개합니다. Adapter 의 자세한 구조는 다음과 같습니다.

+
+t2i_adapter_05 +
+

Fig. 254 Overview of T2I-Adapter#

+
+
+
+
+

3.3. Adapter Design#

+
+t2i_adapter_06 +
+

Fig. 255 Adapter Design#

+
+
+

Conditional input 은 512x512 의 크기를 가지며, 이는 pixel unshuffle downsampling 을 통해 64x64 이미지로 변환이 되어 1개의 convolution layer 와 2개의 residual block 으로 구성된 scale 을 4번 통과하게 됩니다. 이때, 각 scale 을 거치고 나온 condition feature 를 \(F_c^k\) 라 정의합니다.

+

최종적으로 multi-scale condition feature \(F_c = \{F_c^1, F_c^2, F_c^3, F_c^4\}\) 가 생성되고, 이는 Unet encoder 에서의 intermediate feature \(F_{enc} = \{F_{enc}^1, F_{enc}^2, F_{enc}^3, F_{enc}^4\}\) 와 더해지게 됩니다. 이때, dimension 크기는 동일하도록 설정했기 때문에 덧셈 연산하는데 문제 없습니다.

+
+t2i_adapter_07 +
+

Fig. 256 Multi-Scale Condition Feature#

+
+
+

해당 implementation code 도 살펴보겠습니다.

+
    +
  • T2I-Adapter module code

    +
    class FullAdapter(nn.Module):
    +    def __init__(
    +        self,
    +        in_channels: int = 3,
    +        channels: List[int] = [320, 640, 1280, 1280],
    +        num_res_blocks: int = 2,
    +        downscale_factor: int = 8,
    +    ):
    +        super().__init__()
    +
    +        in_channels = in_channels * downscale_factor**2
    +
    +        self.unshuffle = nn.PixelUnshuffle(downscale_factor)
    +        self.conv_in = nn.Conv2d(in_channels, channels[0], kernel_size=3, padding=1)
    +
    +        self.body = nn.ModuleList(
    +            [
    +                AdapterBlock(channels[0], channels[0], num_res_blocks),
    +                *[
    +                    AdapterBlock(channels[i - 1], channels[i], num_res_blocks, down=True)
    +                    for i in range(1, len(channels))
    +                ],
    +            ]
    +        )
    +
    +        self.total_downscale_factor = downscale_factor * 2 ** (len(channels) - 1)
    +
    +    def forward(self, x: torch.Tensor) -> List[torch.Tensor]:
    +        x = self.unshuffle(x)
    +        x = self.conv_in(x)
    +
    +        features = []
    +
    +        for block in self.body:
    +            x = block(x)
    +            features.append(x)
    +
    +        return features
    +
    +
    +
    class AdapterBlock(nn.Module):
    +    def __init__(self, in_channels, out_channels, num_res_blocks, down=False):
    +        super().__init__()
    +
    +        self.downsample = None
    +        if down:
    +            self.downsample = Downsample2D(in_channels)
    +
    +        self.in_conv = None
    +        if in_channels != out_channels:
    +            self.in_conv = nn.Conv2d(in_channels, out_channels, kernel_size=1)
    +
    +        self.resnets = nn.Sequential(
    +            *[AdapterResnetBlock(out_channels) for _ in range(num_res_blocks)],
    +        )
    +
    +    def forward(self, x):
    +        if self.downsample is not None:
    +            x = self.downsample(x)
    +
    +        if self.in_conv is not None:
    +            x = self.in_conv(x)
    +
    +        x = self.resnets(x)
    +
    +        return x
    +
    +class AdapterResnetBlock(nn.Module):
    +    def __init__(self, channels):
    +        super().__init__()
    +        self.block1 = nn.Conv2d(channels, channels, kernel_size=3, padding=1)
    +        self.act = nn.ReLU()
    +        self.block2 = nn.Conv2d(channels, channels, kernel_size=1)
    +
    +    def forward(self, x):
    +        h = x
    +        h = self.block1(h)
    +        h = self.act(h)
    +        h = self.block2(h)
    +
    +        return h + x
    +
    +
    +
  • +
  • SD + T2I-Adapter implementation code

    +
    # 7. Denoising loop
    +adapter_state = self.adapter(adapter_input)
    +for k, v in enumerate(adapter_state):
    +    adapter_state[k] = v * adapter_conditioning_scale
    +if num_images_per_prompt > 1:
    +    for k, v in enumerate(adapter_state):
    +        adapter_state[k] = v.repeat(num_images_per_prompt, 1, 1, 1)
    +if do_classifier_free_guidance:
    +    for k, v in enumerate(adapter_state):
    +        adapter_state[k] = torch.cat([v] * 2, dim=0)
    +
    +num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order
    +with self.progress_bar(total=num_inference_steps) as progress_bar:
    +    for i, t in enumerate(timesteps):
    +        # expand the latents if we are doing classifier free guidance
    +        latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents
    +        latent_model_input = self.scheduler.scale_model_input(latent_model_input, t)
    +
    +        # predict the noise residual
    +        noise_pred = self.unet(
    +            latent_model_input,
    +            t,
    +            encoder_hidden_states=prompt_embeds,
    +            cross_attention_kwargs=cross_attention_kwargs,
    +            down_block_additional_residuals=[state.clone() for state in adapter_state],
    +        ).sample
    +
    +        # perform guidance
    +        if do_classifier_free_guidance:
    +            noise_pred_uncond, noise_pred_text = noise_pred.chunk(2)
    +            noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)
    +
    +        # compute the previous noisy sample x_t -> x_t-1
    +        latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).prev_sample
    +
    +
    +
  • +
+

Adapter 종류로는 크게 structure 에 대한 conditioning 과 color 에 대한 conditioning 으로 분류할 수 있습니다. Structure controlling 으로는 대표적으로 sketch, depth map, semantic segmentation map, keypose 등이 있습니다. Color map 은 이미지를 우선적으로 high bicubic downsampling 을 통해 semantic 및 structural 한 정보를 제외시키고, nearest upsampling 기법으로 다시 원본 이미지 크기로 복원하는 작업을 통해 생성합니다.

+

앞써 설명한 부분처럼 추가 학습 없이 여러 adapter 로 conditioning 할 수도 있습니다. Multi-adapter 로 controlling 할 시, 다음과 같이 각 adapter 로부터 나온 condition feature 에 weight \(w_k\) 를 부여해 최종 condition feature 를 정의하게 됩니다.

+
+t2i_adapter_08 +
+

Fig. 257 Multi-Adapter Conditioning#

+
+
+
+
+

3.4. Model Optimization#

+

모델 학습 시, SD 파라미터는 고정시킨 상태로 T2I-Adapter 파라미터만 학습합니다. 이때, T2-Adapter 손실함수는 SD 학습 시와 유사하게 다음과 같이 정의합니다.

+
+\[ +L_{AD} = \mathbb{E}_{Z_{0}, t, F_c, \epsilon \sim N(0,I)}[||\epsilon-\epsilon_{\theta}(Z_t, t, \tau(y), F_c)||_2^2] +\]
+

where \(t \sim U(0,T)\)

+

Non-uniform time step sampling during training

+

Diffusion 모델 학습 시와 동일하게, time embedding 을 adapter 에 input 으로 넣으면서 성능 개선 효과가 있는 것을 확인했지만 매 time step \(t\) 마다 \(F_c\) 를 conditioning 하는 것은 computationally expensive 합니다.

+

따라서, 논문에서는 DDIM inference sampling 을 크게 3가지 stage (i.e., beginning, middle, late stage) 로 분류하는 방법을 소개합니다. 실험해본 결과, middle 그리고 late stage 에 적용하는 것보다 beginning stage 에서 guidance 를 주는 효과가 더 크다고 합니다.

+
+t2i_adapter_09 +
+

Fig. 258 DDIM Inference Sampling Stages#

+
+
+

따라서, 최대한 time step \(t\) 가 early sampling stage 에 포함되도록 다음 수식처럼 non-uniformly 하게 sampling 작업을 진행했고, 이에 대한 결과도 공유합니다.

+
+\[ +t = (1-(t/T)^3) \times T, t \in U(0,T) +\]
+
+t2i_adapter_10 +
+

Fig. 259 Effect of Cubic Sampling#

+
+
+
+
+
+

Experiment#

+
+

4.1. Implementation Details#

+

T2I-Adapter 학습 시, hyperparameter 및 데이터셋 구축 상세사항은 다음과 같습니다.

+
    +
  • Hyperparameters

    +
      +
    • 10 epochs

    • +
    • Batch size = 8

    • +
    • Learning rate = \(1 \times 10^{-5}\)

    • +
    • Adam optimizer

    • +
    • 4X NVIDIA Tesla 32G-V100 GPUs (3 days)

    • +
    +
  • +
  • 실험별 데이터셋 구축

    +
      +
    • Sketch Map

      +
        +
      • COCO17 데이터셋 - 164K images

      • +
      • PiDiNet 를 활용해 sketch map 생성

      • +
      +
    • +
    • Semantic segmentation map

      +
        +
      • COCO-Stuff 데이터셋 - 164K images

      • +
      +
    • +
    • Keypoints & Color & Depth maps

      +
        +
      • LAION-AESTHETICS 데이터셋로부터 600K images-text pairs 추출

      • +
      • MM-Pose, MiDaS 모델로 각각 Keypoint, Depth map 생성

      • +
      +
    • +
    +
  • +
+
+
+

4.2. Comparison#

+

기존 SOTA 모델들과 정량적인 수치로 비교하는데 FID 와 CLIP Score 를 사용하였고, 하단 사진처럼 기존 GAN-based 그리고 diffusion-based method 모델들보다 성능이 좋습니다.

+
+t2i_adapter_11 +
+

Fig. 260 Qualitative Comparison#

+
+
+
+t2i_adapter_12 +
+

Fig. 261 Quantitative Comparisoin#

+
+
+
+
+

4.3. Applications#

+

해당 예시들은 다양한 single adapter controlling 에 대한 결과들을 보여줍니다. 특히 인상적인 부분은 sketch 로 controlling 시, sketch 가 정확하지 않아도 이미지 생성에 robust 한 성능을 보여주는 것을 확인할 수 있습니다.

+
+t2i_adapter_13 +
+

Fig. 262 Visualization of Single-Adapter Controlling#

+
+
+

또한, image editing 도 가능합니다. SD inpainting mode 로 특정 지역을 masking 한 후, T2I-Adapter 를 통해 image editing 을 한 예시 사진입니다. Adapter 없이, SD inpainting 만으로는 성능이 좋지 못하다고 합니다.

+
+t2i_adapter_14 +
+

Fig. 263 Image Editing with T2I-Adapter#

+
+
+

아래 예시는 multiple adapter 를 적용한 것로 위에서부터 아래로 각각 depth + keypose 그리고 sketch + color map 을 conditioning 한 결과입니다.

+
+t2i_adapter_15 +
+

Fig. 264 Composable Controlling#

+
+
+

마지막으로, 장점들 중 하나로 명시되었던 generalization ability 를 보여준 사례입니다. 학습 완료한 Adapter 를 동일한 구조를 가진 T2I 모델에 적용 가능한 것을 확인할 수 있습니다.

+
+t2i_adapter_16 +
+

Fig. 265 Generalizable Controlling#

+
+
+
+
+

4.4. Ablation Study#

+

논문에서는 guidance mode, 그리고 complexity 에 대한 ablation study 를 진행했습니다.

+

SD 모델은 encoder 그리고 decoder 에 각각 4개의 scale (i.e., 64×64, 32×32, 16×16, 8×8) 을 가지고 있는데, 하단 table 처럼 각각 다른 scale 에 adapter guidance 를 적용하면서 FID 성능을 비교했습니다. Scale Number 가 4보다 작을 경우, large scale 에 순차적으로 guidance 를 적용했습니다. 그 결과, Unet encoder 에만 4 scales 모두 guidance 를 적용하는 것이 성능이 제일 좋다고 합니다.

+
+t2i_adapter_17 +
+

Fig. 266 Guidance Mode#

+
+
+

또한, condition map 는 비교적 sparse 하기 때문에 더 경량화된 adapter 를 사용해도 성능이 좋은 부분을 하단 예시처럼 확인할 수 있었다고 합니다. 더 자세하게는, adapter block 의 intermediate channel 숫자를 바꿔가며 adapter-small, adapter-tiny 모델을 각각 x4, x8 compression 작업을 진행했습니다.

+
+t2i_adapter_18 +
+

Fig. 267 Complexity Ablation#

+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/docs/review/vae.html b/docs/review/vae.html old mode 100644 new mode 100755 index d3f9f568..4150ec68 --- a/docs/review/vae.html +++ b/docs/review/vae.html @@ -1,761 +1,780 @@ - - - - - - - - - - - - VAE — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - - - - - - -
- -
-

Information

- -
-
-

VAE#

-
-

Introduction#

-

논문의 Introduction 에 다음과 같은 문구가 적혀있는데요.

-
-

“Variational Bayesian (VB) approach involves the optimization of an approximation to the intractable posterior”

-
-

이처럼 Variational Autoencoder 는 논문에서 제시하는 Auto-Encoding Variational Bayes(AEVB) 알고리즘 중 하나로, intractable 한 posterior 분포를 다루기 쉬운 뉴럴 네트워크로 근사함으로써 Variational Inference 를 하게 됩니다.

-

이가 의미하는 바가 무엇인지 한번 살펴보도록 하겠습니다.

-
-
-

Intractability#

-

Variational Autoencoder(VAE) 는 크게 Encoder 와 Decoder 부분으로 이루어져 있습니다. 더 자세하게는, Encoder는 입력 데이터 \(x\) 를 받아서 잠재변수(Latent Variable) \(z\) 를 만들어내고, Decoder 는 잠재변수 \(z\) 를 활용해서 다시 \(x\) 를 복원하게 됩니다.

-
-vae_01 -
-

Fig. 1 Variational Autoencoder(VAE) Architecture#

-
-
-

Variational Autoencoder (VAE) 는 AutoEncoder 와 달리 확률 분포를 이용해 어떤 새로운 데이터를 생성하는 Decoder 부분에 초점을 둡니다. 이때 논문에서 다음과 같은 assumption 들을 내립니다. 첫번째로 \(p_{\theta}(z)\)\(p_{\theta}(x|z)\) 는 parametric 한 distribution 을 가지고 있고, 이는 \(\theta\)\(z\) 에 대해 differentiable 하다는 가정을 내립니다. 이 때, 대표적으로 \(p_{\theta}(z)\) 는 Gaussian distribution 을 따르고 \(p_{\theta}(x|z)\) 는 생성하고자 하는 데이터 성질에 따라 Bernoulli 혹은 Gaussian distribution 을 따르도록 정의합니다. 그리고 \(p_{\theta}(x|z)\) 의 파라미터 \(p\) 혹은 \((\mu, \sigma)\) 는 아래 그림과 같이 뉴럴 네트워크로 구성된 Decoder 로부터 계산이 됩니다.

-
-vae_07 -
-

Fig. 2 Overview of Bernoulli(left) and Gaussian(right) Decoder#

-
-
-

이를 기반으로 우리는 ML/MAP estimation 을 통해 marginal likelihood \(p_{\theta}(x)\) 를 최대화시키는 파라미터 \(\theta\) 를 구하는 것이 목적입니다. 하지만, \(p_{\theta}(x) = \int p_{\theta}(z)p_{\theta}(x|z) \ dz\) 는 intractable 하기 때문에 \(p_{\theta}(z|x)\) 를 계산하기 위한 Encoder 가 등장하게 됩니다.

-
-\[ -p_{\theta}(x) = p_{\theta}(x|z)p_{\theta}(z)/p_{\theta}(z|x) -\]
-

여기서 \(p_{\theta}(z|x)\) 역시 intractable 하기 때문에 이를 잘 근사화하는 뉴럴 네트워크 \(q_{\phi}(z|x)\) 를 정의하게 되고, 이러한 과정을 변분추론(Variational Inference) 라고 합니다. 아래는 Encoder 와 Decoder 를 함께 도식화한 그림입니다. 정리하자면, MLP Encoder 를 통해 계산된 \(\mu\)\(\sigma\) 로 잠재변수 \(z\) 를 생성하게 되고, 이를 기반으로 Decoder 는 원본 이미지와 유사한 데이터를 생성하게 됩니다.

-
-vae_08 -
-

Fig. 3 Overview of Gaussian Encoder and Decoder#

-
-
-

해당 implementation code 도 확인해보겠습니다.

-
    -
  • Encoder 구현 code

    -
    
    -class Encoder(nn.Module):
    -    def __init__(self):
    -        super(Encoder,self).__init__()
    -        self.fc1_1 = nn.Linear(784, hidden_size)
    -        self.fc1_2 = nn.Linear(784, hidden_size)
    -        self.relu = nn.ReLU()
    -                        
    -    def encode(self,x):
    -        x = x.view(batch_size,-1)
    -        mu = self.relu(self.fc1_1(x))
    -        log_var = self.relu(self.fc1_2(x))
    -                
    -        return mu,log_var
    -    
    -    def reparametrize(self, mu, logvar):
    -        std = logvar.mul(0.5).exp_()
    -        
    -        eps = torch.FloatTensor(std.size()).normal_()
    -        eps = Variable(eps).cuda()
    -        
    -        return eps.mul(std).add_(mu)
    -    
    -    def forward(self,x):
    -        mu, logvar = self.encode(x)
    -        reparam = self.reparametrize(mu,logvar)
    -        
    -        return mu,logvar,reparam
    -
    -
    -
  • -
  • Decoder 구현 code

    -
    class Decoder(nn.Module):
    -    def __init__(self):
    -        super(Decoder,self).__init__()
    -        self.fc1 = nn.Linear(hidden_size, 784)
    -        self.sigmoid = nn.Sigmoid()
    -    
    -    def forward(self,x):
    -        out = self.fc1(x)
    -        out = self.sigmoid(out)
    -        out = out.view(batch_size,28,28,1)
    -        
    -        return out
    -
    -
    -
  • -
-
-
-

SGVB(Stochastic Gradient Variational Bayes)#

-

이로써 우리는 marginal likelihood \(p_{\theta}(x)\) 를 최대화시키는 파라미터 \((\theta, \phi)\) 를 찾으면 되고, 이에 대한 lower bound 를 수식적으로 표현하면 손실함수(loss function) 를 다음과 같이 Reconstruction Error 와 Regularization term 로 분할할 수 있습니다.

-
-\[ -L(\theta, \phi;x_i) = \arg \min_{\theta, \phi} \sum_{i} -\mathbb{E}\_{q_{\phi}(z|x_i)}[\log(p(x_i|g_{\theta}(z))] + KL(q_{\phi}(z|x_i)||p(z)) -\]
-

Reconstruction Error 는 Decoder 에서 생성하는 데이터가 최대한 원본 데이터와 유사하도록 하는 term 이고, Regularization 은 Encoder 에서 만드는 잠재변수의 분포가 저희가 부여한 prior distribution 이랑 가깝도록 설정하는 term 입니다. 이때, Reconstruction Error 는 다음과 같은 Monte Carlo Estimator \(\tilde{\mathcal{L}}^{B}\) 로 근사값을 구할 수 있고, 하나의 sample 을 계산하는 것도 연산량이 많으므로 논문에서는 sample size \(L\) 을 1 로 설정합니다.

-
-\[ \tilde{\mathcal{L}}^{B}(\theta, \phi; x^{(i)})=-D_{KL}(q_{\phi}(z|x^{(i)})||p_{\theta}(z))+\frac{1}{L}\sum^{L}_{l=1} \log p\_\theta (x^{(i)}|z^{(i,l)})) \]
-

Lower bound 에 대한 수식을 변환하여 수식 전체에 대한 Monte Carlo Estimator \(\tilde{\mathcal{L}}^{A}\) 로도 근사값을 구할 수 있는데 이는 평균적으로 \(\tilde{\mathcal{L}}^{B}\) 에 비해 variance 가 높다고 합니다.

-
-\[ \tilde{\mathcal{L}}^{A}(\theta,\phi;x^{(i)})=\frac{1}{L}\sum^{L}_{l=1}\log p_{\theta}(x^{(i)},z^{(i,l)})-\log q_{\phi}(z^{(i,l)}|x^{(i)}) \]
-
-
-

Reparameterization Trick#

-

논문에서는 모델 학습 시 backpropagation 을 원활히 사용할 수 있도록 reparameterization trick 을 소개합니다. 잠재변수 \(z\) 를 Encoder 에서 나온 \(\mu\)\(\sigma\) 로 직접 샘플링하지 않고, backpropagation 이 가능하도록 Gaussian noise 를 우선적으로 샘플링하고 해당 \(\mu\)\(\sigma\) 를 각각 더하고 곱하게 됩니다. 이는 \(q_{\phi}(z|x)\) 이 Gaussian distribution 을 따른다고 설정했을 때이고, \(q_{\phi}(z|x)\) 에 대해 다른 분포를 가정하여 그에 따른 다른 reparameterization trick 을 시도할 수 있다고 논문에 명시되어 있습니다.

-

하단에는 Gaussian 분포에 대한 reparameterization trick 를 도식화한 그림입니다. 왼쪽에는 reparameterization trick이 적용되지 않은 경우로 \(\mu\)\(\sigma\) 값이 고정되어 있어도 \(\mathcal{N}(\mu,\sigma^2)\) 에서 샘플링하므로 \(z\) 는 랜덤한 값이 되고 loss function 을 \(\mu\)\(\sigma\) 에 대해 미분할 수 없어 backpropagation 을 적용하기가 어렵습니다. 반면에, 오른쪽처럼 reparameterization trick 을 적용하면, \(z\) 가 deterministic 한 형태로 정의되고 \(\mu\)\(\sigma\) 에 대한 변수로도 미분이 가능해지기 때문에 backpropagation 을 활용하여 모델을 학습시킬 수 있습니다.

-
-vae_05 -
-

Fig. 4 Overview of Reparameterization Trick#

-
-
-
-
-

Training Algorithm#

-

모델을 학습하는 전체적인 과정은 아래와 같습니다.

-
-vae_09 -
-

Fig. 5 Overview of Training Algorithm#

-
-
-
-
-

Experiments#

-

논문에서는 MNIST 와 Frey Face 데이터셋에 대해 AEVB(Auto-Encoder variational Bayesian)와 wake-sleep 알고리즘를 적용해서 비교합니다. 여기서 Frey Face 데이터셋은 continuous 하므로 Gaussian Decoder 를 사용합니다. 실험결과는 아래 그림과 같습니다.

-
-vae_10 -
-

Fig. 6 Experimental Results - Likelihood lower bound#

-
-
-

해당 그림처럼 lower bound 를 최적화하는데 AEVB 알고리즘이 더 빠르게 수렴하며 모든 실험에서 성능적으로도 더 나은 부분을 확인할 수 있습니다.

-
-vae_11 -
-

Fig. 7 Experimental Results - Marginal likelihood#

-
-
-

또한, latent variable \(z\) 의 차원이 작으면 marginal likelihood 를 직접 Monte Carlo EM 을 할용하여 구할 수 있는데, 이에 대한 결과도 논문에서 보여줍니다. Monte Carlo EM 의 경우 학습 데이터가 많으면 수렴이 되지 않는 부분을 확인할 수 있습니다.

-
-
-

Summary#

-

AutoEncoder 는 latent space 에 하나의 값으로 지정해줬다면, VAE 는 평균 그리고 분산 파라미터들과 Gaussian 분포를 가진 샘플을 통해 잠재변수를 생성합니다. 그리고 VAE 를 실제로 사용해보면 생성된 데이터 image quality 가 낮다는 단점을 가지고 있다고 합니다.

-
-
- - - - -
- - - - - - -
- - - - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + VAE — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

Information

+ +
+
+

VAE#

+
+

Introduction#

+

논문의 Introduction 에 다음과 같은 문구가 적혀있는데요.

+
+

“Variational Bayesian (VB) approach involves the optimization of an approximation to the intractable posterior”

+
+

이처럼 Variational Autoencoder 는 논문에서 제시하는 Auto-Encoding Variational Bayes(AEVB) 알고리즘 중 하나로, intractable 한 posterior 분포를 다루기 쉬운 뉴럴 네트워크로 근사함으로써 Variational Inference 를 하게 됩니다.

+

이가 의미하는 바가 무엇인지 한번 살펴보도록 하겠습니다.

+
+
+

Intractability#

+

Variational Autoencoder(VAE) 는 크게 Encoder 와 Decoder 부분으로 이루어져 있습니다. 더 자세하게는, Encoder는 입력 데이터 \(x\) 를 받아서 잠재변수(Latent Variable) \(z\) 를 만들어내고, Decoder 는 잠재변수 \(z\) 를 활용해서 다시 \(x\) 를 복원하게 됩니다.

+
+vae_01 +
+

Fig. 1 Variational Autoencoder(VAE) Architecture#

+
+
+

Variational Autoencoder (VAE) 는 AutoEncoder 와 달리 확률 분포를 이용해 어떤 새로운 데이터를 생성하는 Decoder 부분에 초점을 둡니다. 이때 논문에서 다음과 같은 assumption 들을 내립니다. 첫번째로 \(p_{\theta}(z)\)\(p_{\theta}(x|z)\) 는 parametric 한 distribution 을 가지고 있고, 이는 \(\theta\)\(z\) 에 대해 differentiable 하다는 가정을 내립니다. 이 때, 대표적으로 \(p_{\theta}(z)\) 는 Gaussian distribution 을 따르고 \(p_{\theta}(x|z)\) 는 생성하고자 하는 데이터 성질에 따라 Bernoulli 혹은 Gaussian distribution 을 따르도록 정의합니다. 그리고 \(p_{\theta}(x|z)\) 의 파라미터 \(p\) 혹은 \((\mu, \sigma)\) 는 아래 그림과 같이 뉴럴 네트워크로 구성된 Decoder 로부터 계산이 됩니다.

+
+vae_07 +
+

Fig. 2 Overview of Bernoulli(left) and Gaussian(right) Decoder#

+
+
+

이를 기반으로 우리는 ML/MAP estimation 을 통해 marginal likelihood \(p_{\theta}(x)\) 를 최대화시키는 파라미터 \(\theta\) 를 구하는 것이 목적입니다. 하지만, \(p_{\theta}(x) = \int p_{\theta}(z)p_{\theta}(x|z) \ dz\) 는 intractable 하기 때문에 \(p_{\theta}(z|x)\) 를 계산하기 위한 Encoder 가 등장하게 됩니다.

+
+\[ +p_{\theta}(x) = p_{\theta}(x|z)p_{\theta}(z)/p_{\theta}(z|x) +\]
+

여기서 \(p_{\theta}(z|x)\) 역시 intractable 하기 때문에 이를 잘 근사화하는 뉴럴 네트워크 \(q_{\phi}(z|x)\) 를 정의하게 되고, 이러한 과정을 변분추론(Variational Inference) 라고 합니다. 아래는 Encoder 와 Decoder 를 함께 도식화한 그림입니다. 정리하자면, MLP Encoder 를 통해 계산된 \(\mu\)\(\sigma\) 로 잠재변수 \(z\) 를 생성하게 되고, 이를 기반으로 Decoder 는 원본 이미지와 유사한 데이터를 생성하게 됩니다.

+
+vae_08 +
+

Fig. 3 Overview of Gaussian Encoder and Decoder#

+
+
+

해당 implementation code 도 확인해보겠습니다.

+
    +
  • Encoder 구현 code

    +
    
    +class Encoder(nn.Module):
    +    def __init__(self):
    +        super(Encoder,self).__init__()
    +        self.fc1_1 = nn.Linear(784, hidden_size)
    +        self.fc1_2 = nn.Linear(784, hidden_size)
    +        self.relu = nn.ReLU()
    +                        
    +    def encode(self,x):
    +        x = x.view(batch_size,-1)
    +        mu = self.relu(self.fc1_1(x))
    +        log_var = self.relu(self.fc1_2(x))
    +                
    +        return mu,log_var
    +    
    +    def reparametrize(self, mu, logvar):
    +        std = logvar.mul(0.5).exp_()
    +        
    +        eps = torch.FloatTensor(std.size()).normal_()
    +        eps = Variable(eps).cuda()
    +        
    +        return eps.mul(std).add_(mu)
    +    
    +    def forward(self,x):
    +        mu, logvar = self.encode(x)
    +        reparam = self.reparametrize(mu,logvar)
    +        
    +        return mu,logvar,reparam
    +
    +
    +
  • +
  • Decoder 구현 code

    +
    class Decoder(nn.Module):
    +    def __init__(self):
    +        super(Decoder,self).__init__()
    +        self.fc1 = nn.Linear(hidden_size, 784)
    +        self.sigmoid = nn.Sigmoid()
    +    
    +    def forward(self,x):
    +        out = self.fc1(x)
    +        out = self.sigmoid(out)
    +        out = out.view(batch_size,28,28,1)
    +        
    +        return out
    +
    +
    +
  • +
+
+
+

SGVB(Stochastic Gradient Variational Bayes)#

+

이로써 우리는 marginal likelihood \(p_{\theta}(x)\) 를 최대화시키는 파라미터 \((\theta, \phi)\) 를 찾으면 되고, 이에 대한 lower bound 를 수식적으로 표현하면 손실함수(loss function) 를 다음과 같이 Reconstruction Error 와 Regularization term 로 분할할 수 있습니다.

+
+\[ +L(\theta, \phi;x_i) = \arg \min_{\theta, \phi} \sum_{i} -\mathbb{E}\_{q_{\phi}(z|x_i)}[\log(p(x_i|g_{\theta}(z))] + KL(q_{\phi}(z|x_i)||p(z)) +\]
+

Reconstruction Error 는 Decoder 에서 생성하는 데이터가 최대한 원본 데이터와 유사하도록 하는 term 이고, Regularization 은 Encoder 에서 만드는 잠재변수의 분포가 저희가 부여한 prior distribution 이랑 가깝도록 설정하는 term 입니다. 이때, Reconstruction Error 는 다음과 같은 Monte Carlo Estimator \(\tilde{\mathcal{L}}^{B}\) 로 근사값을 구할 수 있고, 하나의 sample 을 계산하는 것도 연산량이 많으므로 논문에서는 sample size \(L\) 을 1 로 설정합니다.

+
+\[ \tilde{\mathcal{L}}^{B}(\theta, \phi; x^{(i)})=-D_{KL}(q_{\phi}(z|x^{(i)})||p_{\theta}(z))+\frac{1}{L}\sum^{L}_{l=1} \log p\_\theta (x^{(i)}|z^{(i,l)})) \]
+

Lower bound 에 대한 수식을 변환하여 수식 전체에 대한 Monte Carlo Estimator \(\tilde{\mathcal{L}}^{A}\) 로도 근사값을 구할 수 있는데 이는 평균적으로 \(\tilde{\mathcal{L}}^{B}\) 에 비해 variance 가 높다고 합니다.

+
+\[ \tilde{\mathcal{L}}^{A}(\theta,\phi;x^{(i)})=\frac{1}{L}\sum^{L}_{l=1}\log p_{\theta}(x^{(i)},z^{(i,l)})-\log q_{\phi}(z^{(i,l)}|x^{(i)}) \]
+
+
+

Reparameterization Trick#

+

논문에서는 모델 학습 시 backpropagation 을 원활히 사용할 수 있도록 reparameterization trick 을 소개합니다. 잠재변수 \(z\) 를 Encoder 에서 나온 \(\mu\)\(\sigma\) 로 직접 샘플링하지 않고, backpropagation 이 가능하도록 Gaussian noise 를 우선적으로 샘플링하고 해당 \(\mu\)\(\sigma\) 를 각각 더하고 곱하게 됩니다. 이는 \(q_{\phi}(z|x)\) 이 Gaussian distribution 을 따른다고 설정했을 때이고, \(q_{\phi}(z|x)\) 에 대해 다른 분포를 가정하여 그에 따른 다른 reparameterization trick 을 시도할 수 있다고 논문에 명시되어 있습니다.

+

하단에는 Gaussian 분포에 대한 reparameterization trick 를 도식화한 그림입니다. 왼쪽에는 reparameterization trick이 적용되지 않은 경우로 \(\mu\)\(\sigma\) 값이 고정되어 있어도 \(\mathcal{N}(\mu,\sigma^2)\) 에서 샘플링하므로 \(z\) 는 랜덤한 값이 되고 loss function 을 \(\mu\)\(\sigma\) 에 대해 미분할 수 없어 backpropagation 을 적용하기가 어렵습니다. 반면에, 오른쪽처럼 reparameterization trick 을 적용하면, \(z\) 가 deterministic 한 형태로 정의되고 \(\mu\)\(\sigma\) 에 대한 변수로도 미분이 가능해지기 때문에 backpropagation 을 활용하여 모델을 학습시킬 수 있습니다.

+
+vae_05 +
+

Fig. 4 Overview of Reparameterization Trick#

+
+
+
+
+

Training Algorithm#

+

모델을 학습하는 전체적인 과정은 아래와 같습니다.

+
+vae_09 +
+

Fig. 5 Overview of Training Algorithm#

+
+
+
+
+

Experiments#

+

논문에서는 MNIST 와 Frey Face 데이터셋에 대해 AEVB(Auto-Encoder variational Bayesian)와 wake-sleep 알고리즘를 적용해서 비교합니다. 여기서 Frey Face 데이터셋은 continuous 하므로 Gaussian Decoder 를 사용합니다. 실험결과는 아래 그림과 같습니다.

+
+vae_10 +
+

Fig. 6 Experimental Results - Likelihood lower bound#

+
+
+

해당 그림처럼 lower bound 를 최적화하는데 AEVB 알고리즘이 더 빠르게 수렴하며 모든 실험에서 성능적으로도 더 나은 부분을 확인할 수 있습니다.

+
+vae_11 +
+

Fig. 7 Experimental Results - Marginal likelihood#

+
+
+

또한, latent variable \(z\) 의 차원이 작으면 marginal likelihood 를 직접 Monte Carlo EM 을 할용하여 구할 수 있는데, 이에 대한 결과도 논문에서 보여줍니다. Monte Carlo EM 의 경우 학습 데이터가 많으면 수렴이 되지 않는 부분을 확인할 수 있습니다.

+
+
+

Summary#

+

AutoEncoder 는 latent space 에 하나의 값으로 지정해줬다면, VAE 는 평균 그리고 분산 파라미터들과 Gaussian 분포를 가진 샘플을 통해 잠재변수를 생성합니다. 그리고 VAE 를 실제로 사용해보면 생성된 데이터 image quality 가 낮다는 단점을 가지고 있다고 합니다.

+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/genindex.html b/genindex.html old mode 100644 new mode 100755 index df068879..a34cea42 --- a/genindex.html +++ b/genindex.html @@ -1,476 +1,496 @@ - - - - - - - - - - - Index — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

- -
-
- -
-
-
- - - - -
- - -

Index

- -
- -
- - -
- - - - -
- -
- -
-
-
- -
- -
- -
- - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + Index — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ + +

Index

+ +
+ +
+ + +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/index.html b/index.html old mode 100644 new mode 100755 index de49afb2..4ade9deb --- a/index.html +++ b/index.html @@ -1,2 +1,2 @@ - - + + diff --git a/intro.html b/intro.html old mode 100644 new mode 100755 index fbb905d7..04b9d4b2 --- a/intro.html +++ b/intro.html @@ -1,633 +1,657 @@ - - - - - - - - - - - - Welcome to PseudoDiffusers!! — Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
- - - -
-

Welcome to PseudoDiffusers!!

- -
-
- -
-

Contents

-
- -
-
-
- - - - -
- -
-

Welcome to PseudoDiffusers!!#

-
-

About Us#

-

This is the repository of PseudoDiffusers team.

-

Our aim is to review papers and code related to computer vision generation models, approach them theoretically, and conduct various experiments by fine-tuning diffusion based models.

-

About Us - PseudoLab

-

About Us - PseudoDiffusers

-

참여 방법: 매주 수요일 오후 9시, 가짜연구소 Discord Room-DH 로 입장!

-
-
-

Publications#

-

DiffInject: Revisiting Debias via Synthetic Data Generation using Diffusion-based Style Injection
-Donggeun Ko*, Sangwoo Jo*, Dongjun Lee, Namjun Park, Jaekwang KIM
-CVPR 2024 Workshop
-PDF

-
-
-

Tech Blog Contents#

-
    -
  • Preliminary Works

  • -
  • Image Generation

  • -
  • Video Generation

  • -
  • Experiments

  • -
-
-
-

Contributors#

- -
-
-
-
-
-
-
-
-
-
- - - - -
- - - - - - -
- - - -
- - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + + + Welcome to PseudoDiffusers!! — Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Welcome to PseudoDiffusers!!

+ +
+
+ +
+

Contents

+
+ +
+
+
+ + + + +
+ +
+

Welcome to PseudoDiffusers!!#

+
+

About Us#

+

This is the repository of PseudoDiffusers team.

+

Our aim is to review papers and code related to computer vision generation models, approach them theoretically, and conduct various experiments by fine-tuning diffusion based models.

+

About Us - PseudoLab

+

About Us - PseudoDiffusers

+

참여 방법: 매주 수요일 오후 9시, 가짜연구소 Discord Room-DH 로 입장!

+
+
+

Publications#

+

DiffInject: Revisiting Debias via Synthetic Data Generation using Diffusion-based Style Injection
+Donggeun Ko*, Sangwoo Jo*, Dongjun Lee, Namjun Park, Jaekwang KIM
+CVPR 2024 Workshop
+PDF

+
+
+

Tech Blog Contents#

+
    +
  • Preliminary Works

  • +
  • Image Generation

  • +
  • Video Generation

  • +
  • 3D Generation

  • +
  • Experiments

  • +
+
+
+

Contributors#

+ +
+
+
+
+
+
+
+
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + +
+ + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/objects.inv b/objects.inv old mode 100644 new mode 100755 index c97c02ec..c1c3a80a Binary files a/objects.inv and b/objects.inv differ diff --git a/search.html b/search.html old mode 100644 new mode 100755 index b3a915e4..07742128 --- a/search.html +++ b/search.html @@ -1,488 +1,508 @@ - - - - - - - - - - Search - Text-to-Image Generation-feat-Diffusion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - -
-
- - - -
- - - -
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - - - - - - - - - - - - - - - - -
- -
- -
-
- - -
-

Search

- - - -
-
- - - - -
- -
- -
-
-
- -
- -
- -
- - - - -
-
- - -
- - -
-
-
- - - - - -
-
- + + + + + + + + + + Search - Text-to-Image Generation-feat-Diffusion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + + + +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + +
+

Search

+ + + +
+
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js old mode 100644 new mode 100755 index 0cded973..17da9ca0 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["docs/experiments/js_exp", "docs/experiments/swjo_exp", "docs/review/A_Study_on_the_Evaluation_of_Generative_Models", "docs/review/Animate_Anyone", "docs/review/BBDM", "docs/review/CM3leon", "docs/review/ConceptLab", "docs/review/ControlNet", "docs/review/CustomDiffusion", "docs/review/DALLE2", "docs/review/DDIM", "docs/review/DDPM", "docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space", "docs/review/DreaMoving", "docs/review/DreamPose", "docs/review/GIGAGAN", "docs/review/GLIDE", "docs/review/HyperDreamBooth", "docs/review/I-DDPM", "docs/review/Latent_Diffusion_Model", "docs/review/LoRA", "docs/review/Make_A_Video", "docs/review/Muse", "docs/review/SDEdit", "docs/review/SDXL", "docs/review/StyO", "docs/review/StyleGAN", "docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification", "docs/review/Textual_Inversion", "docs/review/VideoLDM", "docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier", "docs/review/consistency_models", "docs/review/cycleGAN", "docs/review/dalle", "docs/review/diffusion_beats_GANs", "docs/review/dreambooth", "docs/review/gan", "docs/review/imagen", "docs/review/imagen_editor", "docs/review/latent_consistency_models", "docs/review/progressive_distillation", "docs/review/t2i_adapter", "docs/review/vae", "intro"], "filenames": ["docs/experiments/js_exp.md", "docs/experiments/swjo_exp.md", "docs/review/A_Study_on_the_Evaluation_of_Generative_Models.md", "docs/review/Animate_Anyone.md", "docs/review/BBDM.md", "docs/review/CM3leon.md", "docs/review/ConceptLab.md", "docs/review/ControlNet.md", "docs/review/CustomDiffusion.md", "docs/review/DALLE2.md", "docs/review/DDIM.md", "docs/review/DDPM.md", "docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space.md", "docs/review/DreaMoving.md", "docs/review/DreamPose.md", "docs/review/GIGAGAN.md", "docs/review/GLIDE.md", "docs/review/HyperDreamBooth.md", "docs/review/I-DDPM.md", "docs/review/Latent_Diffusion_Model.md", "docs/review/LoRA.md", "docs/review/Make_A_Video.md", "docs/review/Muse.md", "docs/review/SDEdit.md", "docs/review/SDXL.md", "docs/review/StyO.md", "docs/review/StyleGAN.md", "docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification.md", "docs/review/Textual_Inversion.md", "docs/review/VideoLDM.md", "docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier.md", "docs/review/consistency_models.md", "docs/review/cycleGAN.md", "docs/review/dalle.md", "docs/review/diffusion_beats_GANs.md", "docs/review/dreambooth.md", "docs/review/gan.md", "docs/review/imagen.md", "docs/review/imagen_editor.md", "docs/review/latent_consistency_models.md", "docs/review/progressive_distillation.md", "docs/review/t2i_adapter.md", "docs/review/vae.md", "intro.md"], "titles": ["Synthetic Data with Stable Diffusion for Foliar Disease Classification", "Training DreamBooth on Naver Webtoon Face Dataset", "A Study on the Evaluation of Generative Models", "Animate Anyone", "BBDM", "CM3leon", "ConceptLab", "ControlNet", "Custom Diffusion", "DALL-E 2", "DDIM", "DDPM", "Diffusion Models already have a Semantic Latent Space", "DreaMoving", "DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion", "Scaling up GANs for Text-to-Image Synthesis", "GLIDE", "HyperDreamBooth", "I-DDPM", "Latent Diffusion Model", "LoRA", "Make A Video", "Muse", "SDEdit", "SDXL", "StyO", "StyleGAN", "Synthetic Data from Diffusion Models Improves ImageNet Classification", "Textual Inversion", "VideoLDM", "Your Diffusion Model is Secretly a Zero-Shot Classifier", "Consistency Models", "CycleGAN", "DALL-E", "Diffusion Models Beat GANs on Image Synthesis", "DreamBooth", "GAN", "Imagen", "Imagen Editor", "Latent Consistency Models", "Progressive Distillation for Fast Sampling of Diffusion Models", "T2I-Adapter", "VAE", "Welcome to PseudoDiffusers!!"], "terms": {"titl": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "author": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "jisu": [0, 7, 26, 43], "kim": [0, 4, 7, 9, 26, 30, 43], "last": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "updat": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "jul": [0, 1], "05": [0, 2, 24], "2023": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 37, 38, 40, 41], "\uc0ac\uacfc": 0, "\ub098\ubb34\uc758": 0, "\uc78e\uc5d0": 0, "\uc0dd\uae30\ub294": [0, 27], "\uc9c8\ubcd1\uc744": 0, "\uc774\ubbf8\uc9c0\ub85c": [0, 1, 6, 8, 17, 24, 25, 37, 38, 41], "\ud310\ubcc4\ud558\ub294": 0, "kaggl": 0, "competit": [0, 30, 31, 34], "\ub9c1\ud06c": [0, 7], "\uc5d0\uc11c": [0, 2, 4, 6, 7, 9, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42], "\uc544\uc774\ub514\uc5b4\ub97c": 0, "\uc5bb\uc5b4\uc11c": 0, "\uc9c4\ud589\ud55c": [0, 16, 40], "\ud504\ub85c\uc81d\ud2b8\uc785\ub2c8\ub2e4": 0, "\ud574\ub2f9": [0, 2, 3, 6, 8, 11, 14, 16, 17, 19, 21, 22, 23, 27, 28, 30, 31, 32, 35, 41, 42], "competition\uc740": 0, "\uc0ac\uacfc\ub098\ubb34": 0, "\uac78\ub9b0": 0, "\uc9c8\ubcd1\uc5d0": 0, "\ub530\ub77c": [0, 2, 3, 4, 5, 6, 9, 12, 14, 16, 17, 18, 20, 22, 24, 27, 28, 30, 31, 32, 33, 34, 35, 39, 42], "\uc78e": 0, "\uc774\ubbf8\uc9c0\ub97c": [0, 2, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 37, 39, 41], "4\uac1c\uc758": [0, 9, 21, 28, 40, 41], "class\ub85c": 0, "\ubd84\ub958\ud558\ub294": [0, 16, 41], "task\uc785\ub2c8\ub2e4": 0, "class": [0, 7, 8, 10, 11, 15, 16, 18, 21, 26, 27, 30, 32, 34, 35, 36, 37, 41, 42], "leav": [0, 30], "competition\uc744": 0, "\uc124\uba85\ud55c": [0, 21, 41], "articl": 0, "\uc804\uccb4\uc801\uc778": [0, 9, 12, 26, 31, 42], "accuracy\ub294": 0, "97": [0, 30], "\uc774\uc9c0\ub9cc": 0, "multipl": [0, 15, 22, 41], "class\uc758": [0, 2, 34], "\uacbd\uc6b0": [0, 1, 4, 6, 7, 8, 12, 14, 17, 18, 19, 20, 23, 24, 25, 26, 27, 29, 30, 31, 32, 36, 39, 41, 42], "accuracy\uac00": 0, "51": 0, "\uc5d0": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "\ubd88\uacfc\ud588\ub2e4\uace0": 0, "\uc5b8\uae09\ud569\ub2c8\ub2e4": 0, "\uc774\ubbf8\uc9c0": [0, 2, 3, 5, 6, 7, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], "\uac1c\uc218\uac00": 0, "\ub2e4\ub978": [0, 2, 3, 4, 6, 8, 10, 11, 12, 14, 16, 17, 18, 20, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 40, 41, 42], "class\uc5d0": [0, 12, 16], "\ube44\ud574": [0, 4, 5, 7, 8, 10, 12, 14, 16, 17, 18, 22, 25, 27, 31, 34, 38, 39, 42], "\uc801\uc740": [0, 2, 5, 7, 8, 10, 11, 16, 18, 20, 21, 28, 29, 30, 34, 39], "\uc810\uc5d0": [0, 14], "\uc8fc\ubaa9\ud588\uace0": 0, "diffusion\uc744": [0, 3, 6, 14, 23, 39], "\uc0ac\uc6a9\ud558\uc5ec": [0, 6, 11, 12, 14, 17, 21, 26, 27, 31, 32, 33, 35, 36, 37, 39, 40], "\ud074\ub798\uc2a4\uc758": [0, 6, 27], "\ub370\uc774\ud130": [0, 2, 3, 21, 23, 24, 27, 28, 29, 30, 32, 33, 36, 37, 39, 42], "\uac1c\uc218\ub97c": [0, 11], "\ub298\ub824\uc11c": 0, "classifi": [0, 12, 27, 29, 36, 38, 39, 41], "\ud559\uc2b5\uc5d0": [0, 5, 14, 15, 18, 20, 27, 29, 39], "\uc0ac\uc6a9\ud558\uba74": [0, 18, 22, 28, 29, 33], "\ub354": [0, 1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42], "\uc88b\uc740": [0, 1, 2, 4, 8, 12, 14, 15, 16, 21, 23, 24, 25, 27, 31, 32, 34, 35, 36, 37, 39, 40, 41], "\uc131\ub2a5\uc758": [0, 27], "classifier\ub97c": [0, 12, 14, 16], "\uc5bb\uc744": [0, 6, 12, 24, 27, 28, 30, 31, 32, 39], "\uc218": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "\uc788\uc744": [0, 1, 3, 4, 7, 11, 20, 22, 26, 27, 30, 32], "\uac83\uc73c\ub85c": [0, 14, 16, 20, 21, 27, 28, 29, 30], "\uae30\ub300\ud588\uc2b5\ub2c8\ub2e4": 0, "\ubb38\uc81c": [0, 3, 41], "\uc0c1\ud669\uc744": [0, 31], "\uc7ac\ud604\ud558\uae30": 0, "\uc704\ud574": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 24, 25, 26, 28, 29, 31, 32, 33, 35, 38, 39, 40, 41], "\uae30\uc874": [0, 5, 6, 7, 8, 12, 14, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 31, 34, 37, 39, 40, 41], "\ub370\uc774\ud130\ub85c": [0, 1, 2, 7, 24, 27, 29, 30, 32, 39], "imag": [0, 1, 2, 4, 6, 9, 10, 13, 17, 19, 22, 23, 24, 25, 26, 27, 28, 30, 33, 36, 37, 38, 40, 41, 42, 43], "\ud559\uc2b5\ud558\uc5ec": [0, 33, 34, 39, 40], "baseline\uc73c\ub85c": 0, "\uc7a1\uc558\uc2b5\ub2c8\ub2e4": 0, "\ubaa8\ub378\uc740": [0, 3, 4, 5, 6, 9, 14, 17, 18, 19, 20, 22, 23, 24, 26, 27, 28, 32, 36, 39, 40, 41], "pretrained\ub41c": 0, "resnet18\uc5d0": 0, "linear": [0, 2, 4, 11, 12, 16, 18, 20, 26, 34, 36, 42], "layer\ub97c": [0, 3, 15, 20, 21, 22, 26, 29], "\ubd99\uc5ec\uc11c": 0, "\uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4": [0, 9, 17, 32, 38], "\uc804\uccb4": [0, 3, 4, 6, 7, 8, 12, 14, 16, 17, 18, 21, 29, 39], "7": [0, 1, 2, 3, 4, 5, 10, 11, 18, 23, 31, 37, 39, 41], "class\ubcc4": 0, "healthi": 0, "99": 0, "73": [0, 28], "rust": 0, "scab": 0, "98": 0, "class\ub294": [0, 15], "\uac1c\uc218": 0, "91\uac1c\ub85c": 0, "\ud074\ub798\uc2a4\ub4e4\uc5d0": 0, "\ube44\ud574\uc11c": [0, 9], "\uc801\uc2b5\ub2c8\ub2e4": 0, "imbalance\uac00": 0, "\uc131\ub2a5\uc744": [0, 2, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 18, 19, 20, 21, 22, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41], "\ub0ae\ucd94\ub294": 0, "\uc6d0\uc778\uc77c": [0, 27], "\uac83\uc774\ub77c": [0, 20], "\uac00\uc815\ud558\uace0": [0, 31], "diffusion\uc73c\ub85c": [0, 27], "data\ub97c": [0, 8], "\ucd94\uac00\ub85c": [0, 5, 14, 18, 21, 24, 25, 32], "\uc0dd\uc131\ud574\ubcf4\uae30\ub85c": 0, "\ud588\uc2b5\ub2c8\ub2e4": [0, 1, 9, 26, 27, 36], "\uc608\uc2dc": [0, 3, 5, 14, 21, 32, 37, 38, 40, 41], "pretran": 0, "diffusion\uc758": [0, 15], "\ub300\ud55c": [0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 24, 25, 27, 28, 29, 31, 32, 35, 36, 39, 40, 41, 42], "\uc815\ubcf4\uac00": [0, 9, 14, 17, 25, 29, 35], "\uc5c6\uc5b4\uc11c": [0, 14], "\uc0dd\uc131\ud560": [0, 1, 5, 6, 7, 9, 15, 17, 21, 22, 23, 24, 27, 29, 31, 32, 35, 39], "\uc544\ub798\uc640": [0, 4, 6, 7, 12, 14, 19, 26, 27, 32, 34, 42], "\uac19\uc774": [0, 4, 6, 7, 8, 9, 11, 12, 14, 15, 17, 19, 21, 22, 26, 28, 31, 32, 33, 34, 35, 36, 39, 40, 41, 42], "\uad00\ub828\uc5c6\ub294": 0, "\uc774\ubbf8\uc9c0\uac00": [0, 7, 9, 11, 14, 15, 17, 18, 21, 22, 23, 24, 25, 27, 28, 32, 34, 36, 37], "\uc0dd\uc131\ub429\ub2c8\ub2e4": [0, 6], "prompt": [0, 3, 7, 8, 9, 13, 15, 16, 17, 22, 25, 28, 29, 30, 35, 37, 38, 41], "photo": [0, 1, 4, 6, 8, 28, 32], "\ub530\ub77c\uc11c": [0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 17, 18, 22, 23, 24, 25, 27, 28, 29, 30, 32, 38, 39, 40, 41], "model": [0, 4, 6, 7, 9, 10, 15, 17, 20, 32, 33, 36, 38, 43], "\uc815\ubcf4\ub97c": [0, 3, 7, 9, 11, 12, 14, 17, 21, 22, 25, 27, 28, 29, 32, 35, 41], "\ub123\uc5b4\uc8fc\uae30": 0, "dreambooth": [0, 8, 13, 14], "\ub97c": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "tuning\ud588\uc2b5\ub2c8\ub2e4": 0, "training\uc5d0": [0, 10, 34], "\uc0ac\uc6a9\ud55c": [0, 5, 12, 14, 17, 21, 24, 26, 27, 28, 34], "prompt\ub294": [0, 17], "disea": 0, "leaf": 0, "\uc774\uba70": [0, 4, 28, 31, 39], "\uc0dd\uc131\ud55c": [0, 7, 9, 21, 32, 33, 35, 37, 40, 41], "\uc774\ubbf8\uc9c0\uc758": [0, 1, 2, 7, 8, 9, 11, 14, 15, 25, 26, 27, 28, 32, 33, 35, 37], "\uc608\uc2dc\ub294": [0, 37, 41], "\uac19\uc2b5\ub2c8\ub2e4": [0, 1, 7, 9, 22, 26, 27, 31, 32, 35, 36, 41, 42], "\uc0dd\uc131": [0, 2, 3, 5, 6, 9, 10, 11, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 33, 34, 35, 36, 37, 39, 40, 41], "engineering\uc744": 0, "\uc218\ud589\ud558\ub358": 0, "\uc911": [0, 3, 5, 6, 8, 10, 13, 17, 18, 20, 23, 24, 25, 26, 27, 31, 32, 33, 34, 35, 36, 37, 41, 42], "\uc758\ub3c4\ud558\uc9c0\uc54a\uc740": 0, "\uacb0\uacfc\ub97c": [0, 3, 4, 5, 6, 7, 9, 10, 12, 14, 16, 17, 18, 21, 22, 24, 25, 26, 27, 28, 29, 31, 32, 37, 38, 39, 40], "\ubc1c\uacac\ud588\uc2b5\ub2c8\ub2e4": [0, 1, 9], "\uc544\ub798\ub294": [0, 7, 23, 42], "\uc774\uc5d0": [0, 3, 4, 6, 7, 12, 13, 17, 25, 27, 31, 35, 40, 41, 42], "\uc608\uc2dc\ub85c": [0, 30], "\uc804\uc758": [0, 24], "model\uc758": [0, 2, 3, 7, 8, 11, 12, 17, 18, 20, 27, 28, 34, 39], "\uacb0\uacfc\uc640": [0, 9, 40], "\ube44\uad50\uc785\ub2c8\ub2e4": 0, "\uc0c1\ud6691": 0, "\uc804": [0, 11, 20, 24, 27, 34], "\ud6c4": [0, 1, 2, 4, 5, 9, 11, 12, 13, 14, 16, 20, 22, 23, 24, 29, 31, 32, 33, 35, 37, 38, 41], "\uc0c1\ud6691\uc744": 0, "\ubcf4\uba74": [0, 2, 4, 8, 12, 15, 16, 18, 24, 26, 27, 28, 32, 33, 36, 39], "\ub2f4\uc740": 0, "uniqu": [0, 1, 35], "identifi": [0, 1, 25, 35], "\uac00": [0, 1, 4, 6, 7, 9, 11, 12, 14, 16, 17, 18, 20, 21, 22, 24, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42], "\uc5c6\uc74c\uc5d0\ub3c4": [0, 16], "diseases\uc758": 0, "\uc78e\ub4e4\ub9cc": 0, "\uc774\ub294": [0, 2, 3, 5, 6, 7, 10, 12, 14, 17, 24, 26, 27, 28, 29, 31, 32, 36, 38, 39, 40, 41, 42], "\uac19\uc740": [0, 1, 3, 4, 5, 6, 7, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 28, 30, 31, 32, 34, 35, 38, 39, 40, 41, 42], "\uc18d\ud558\ub294": [0, 6], "\uc774\ubbf8\uc9c0\ub4e4\uc744": [0, 1, 2, 4, 7, 9, 31, 35, 38], "\uc0dd\uc131\ud574\ub0b4\uc9c0": [0, 8], "\ubabb\ud558\uace0": [0, 11], "\uc788\ub2e4\ub294": [0, 16, 17, 20, 26, 28, 31, 37, 38, 39], "\uac83\uc785\ub2c8\ub2e4": [0, 7, 9, 17, 26, 27, 32, 38, 40], "\uc774": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42], "\ud604\uc0c1\uc744": [0, 8, 26, 40], "languag": [0, 5, 8, 9, 20, 21, 27, 28, 33, 35, 37], "drift\ub77c\uace0": 0, "\ud558\uba70": [0, 4, 33], "\ubaa8\ub378\uc774": [0, 1, 3, 5, 6, 7, 8, 10, 11, 14, 15, 17, 21, 22, 24, 25, 26, 27, 29, 31, 34, 35, 36, 38, 40, 41], "leaf\uac00": 0, "\uc544\ub2cc": [0, 1, 4, 6, 7, 10, 12, 14, 20, 28, 32, 34, 36, 39, 40], "\uc77c\ubc18\uc801\uc778": [0, 5, 8, 14, 17, 24, 28, 30, 34], "\uad00\ud55c": [0, 18, 25, 26], "\uc78a\uc5b4\ubc84\ub838\uae30": 0, "\ub54c\ubb38\uc785\ub2c8\ub2e4": 0, "\uc0c1\ud6692": 0, "\uc0c1\ud6692\ub97c": 0, "photo\ub77c\ub294": 0, "prompt\ub9cc": [0, 13, 25], "\uc0ac\uc6a9\ud558\uc600\ub294\ub370\ub3c4": 0, "\uc774\ubbf8\uc9c0\ub4e4\uc5d0": [0, 9], "\ud2b9\uc9d5\ub4e4\uc774": 0, "\ub098\ud0c0\ub0a9\ub2c8\ub2e4": 0, "dreambooth\uc5d0\uc11c\ub294": 0, "drift\ub97c": 0, "prior": [0, 6, 9, 14, 21, 35, 42], "preserv": [0, 35, 40], "loss\ub97c": [0, 5, 11, 12, 15, 22, 28], "\uc0ac\uc6a9\ud574\uc11c": [0, 4, 7, 9, 12, 16, 22, 33, 34, 37], "\ud574\uacb0\ud558\uc600\uc73c\ubbc0\ub85c": 0, "\ubc29\ubc95\uc744": [0, 3, 4, 5, 6, 12, 14, 16, 17, 18, 24, 26, 27, 28, 30, 32, 34, 39, 41], "\ud574\uacb0\ud558\uae30": [0, 4, 6, 12, 20, 24, 28, 29, 31, 35, 38, 39, 40, 41], "train": [0, 2, 4, 9, 10, 12, 14, 15, 17, 18, 20, 25, 26, 28, 29, 30, 34, 35, 37, 39, 41], "prompt\uc5d0\uc11c": 0, "\uc81c\uc678\ud558\uace0": [0, 20, 24], "\ucd5c\ub300\ud55c": [0, 14, 24, 28, 32, 41, 42], "\ub2e8\uc21c\ud55c": [0, 8, 14, 40], "model\uc744": [0, 2, 3, 6, 7, 8, 10, 12, 14, 15, 16, 17, 18, 20, 24, 25, 28, 31, 34, 39], "\ub2e4\uc2dc": [0, 4, 11, 12, 20, 23, 26, 31, 32, 35, 36, 39, 40, 41, 42], "\uacb0\uacfc": [0, 1, 2, 3, 4, 5, 8, 9, 14, 17, 18, 19, 21, 24, 27, 29, 30, 31, 34, 37, 38, 40, 41], "\uc7ac\ud6c8\ub828": 0, "\uc774\ud6c4\uc5d0\ub3c4": 0, "model\ub85c": [0, 2, 16], "\uc0dd\uc131\ud558\uc600\uc744": 0, "\ub54c\uc640": [0, 32], "\ube44\uc2b7\ud55c": [0, 4, 5, 8, 12, 18, 21, 28, 32, 34, 35, 40], "\uc758": [0, 1, 2, 4, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "\uacbd\uc6b0\uc5d0\ub294": [0, 12, 14, 21, 27], "\uc5ec\uc804\ud788": [0, 4, 6, 8, 14, 15, 17, 37], "\uc601\ud5a5\uc744": [0, 2, 3, 5, 6, 11, 12, 18, 25, 26, 27, 34, 37], "\ubc1b\uc740": [0, 28], "\uac83\uac19\uc740": 0, "\uc774\ubbf8\uc9c0\ub4e4\uc774": [0, 4, 7], "photo\uc758": 0, "\uc5ec\ub7ec": [0, 2, 4, 6, 14, 17, 19, 21, 22, 27, 28, 30, 31, 35, 41], "\ub300\uc0c1\ub4e4\uacfc": 0, "\uc0ac\uc6a9\ub418\ub294": [0, 14, 17, 27, 28, 31, 32, 35, 39], "\ud2b9\uc131\uc744": [0, 6, 12, 14, 17, 21, 31, 32], "\uac00\uc9c0\uace0\uc788\uc5b4\uc11c": 0, "\uadf8\ub7f0": [0, 23, 26], "\uac83\uc774\ub77c\ub294": [0, 27], "\uc0dd\uac01\uc774": [0, 27], "\ub4e4\uc5c8\uace0": 0, "\uc774\ub97c": [0, 2, 3, 4, 6, 7, 11, 12, 14, 17, 19, 20, 21, 24, 26, 27, 28, 29, 30, 31, 32, 35, 36, 38, 39, 40, 41, 42], "\uccb4\ud06c\ud574\ubcf4\uae30": 0, "\ud2b9\uc815\ud55c": [0, 9, 26, 28, 30, 39], "photo\uc640": 0, "\uc6a9\ub3c4\ub85c": 0, "prompt\ub4e4\ub85c": 0, "\uc0dd\uc131\ubcf4\uc558\uc2b5\ub2c8\ub2e4": 0, "\ub300\uc0c1": [0, 12, 14, 32], "\uc138\uac00\uc9c0\ub85c\ub294": 0, "cat": [0, 11, 31, 38, 41], "sea": 0, "pirate\uc744": 0, "\uc0ac\uc6a9\ud588\uace0": [0, 5, 16, 24, 39], "\ube44\uc2b7\ud558\uac8c": [0, 4, 28], "\ud14d\uc2a4\ud2b8": [0, 5, 6, 9, 14, 17, 21, 22, 27, 28, 37], "\uc138\uac00\uc9c0\ub294": 0, "illustr": [0, 12], "anim": [0, 33], "wallpaper\ub97c": 0, "\uc774\ubbf8\uc9c0\ub294": [0, 3, 6, 8, 13, 17, 24, 25, 37], "\uae00": 0, "\ub9c8\uc9c0\ub9c9": [0, 2, 3, 4, 11, 13, 16, 26, 27, 31], "\ubd80\ubd84\uc758": [0, 2], "appendix\uc5d0": 0, "\uc788\uc2b5\ub2c8\ub2e4": [0, 1, 6, 7, 9, 17, 26, 27, 31, 32, 35, 36, 38, 40, 41, 42], "\ub300\uc0c1\uc744": [0, 32], "\uc9c0\uce6d\ud558\ub294": 0, "\ud14d\uc2a4\ud2b8\uc758": [0, 21], "\ub300\uc0c1\uc758": [0, 35], "\ud2b9\uc9d5\uc774": 0, "\uc798": [0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 14, 16, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 35, 36, 39, 42], "\ub4dc\ub7ec\ub098\ub294": 0, "\uc0dd\uc131\ub418\uc5c8\uc9c0\ub9cc": 0, "\ub300\uc0c1\uacfc": [0, 17, 32], "\ud568\uaed8": [0, 6, 14, 15, 16, 17, 20, 22, 24, 29, 30, 32, 42], "\uc4f0\uc774\ub294": [0, 2, 27, 32, 36], "\uc78e\uc0ac\uadc0\uc758": 0, "\ud2b9\uc9d5\uc744": [0, 7, 14, 35], "\uac00\uc9c0\ub294": [0, 1, 3, 12, 26, 39], "\uc77c\ubd80": [0, 5, 6, 12, 14, 16, 17, 20, 21, 26], "\uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4": 0, "tuning\ud55c": 0, "400\uc7a5": 0, "\uc0dd\uc131\ud558\uc5ec": [0, 6, 21], "\ud6c8\ub828\ud588\uc2b5\ub2c8\ub2e4": 0, "result_bas": 0, "\ucd94\uac00": [0, 3, 6, 8, 11, 13, 14, 15, 17, 21, 23, 24, 30, 41], "\ud65c\uc6a9\ud55c": [0, 3, 6, 9, 16, 29, 30, 35, 36], "9": [0, 2, 4, 5, 18, 23, 24, 32, 39], "84": 0, "result_now": 0, "kaggle\uc5d0\uc11c": 0, "\uc81c\uacf5\ud558\ub294": [0, 3, 9, 14, 28], "test": [0, 2, 3, 4, 14, 21, 28, 30, 37], "set\uc5d0": [0, 21, 27], "\uc801\uc6a9\ud588\uc744": [0, 31, 39], "\ub54c\ub294": [0, 27, 39], "baseline\uc774": [0, 28], "94": 0, "\uacbd\uc6b0\uac00": [0, 7, 10, 12, 14, 32], "93": 0, "\uc5ec\uc11c": 0, "baseline\ubcf4\ub2e4": 0, "\uc5bb\uc9c0\ub294": 0, "\ubabb": 0, "\ud6c8\ub828": [0, 3, 6, 7, 13, 14, 21, 24, 27, 32, 37], "\uc911\uac04\uc911\uac04\uc5d0": 0, "\uc77c\uc815": [0, 15], "step\ub9c8\ub2e4": 0, "\uc0dd\uc131\ud558\uac8c\ud574\uc11c": 0, "\ud6c8\ub828\uc5d0": [0, 6, 26], "\ubaa8\ub2c8\ud130\ub9c1\uc774": 0, "\uc788\uc73c\uba74": 0, "\uc88b\uaca0\ub2e4\ub294": 0, "\uc0dd\uac01\uc744": 0, "\ud6c8\ub828\uc2dc": 0, "hyperparamet": [0, 10, 13, 17, 25, 31, 34, 40, 41], "tuning\uc744": [0, 7, 17, 20, 27, 28, 39], "\uc880": [0, 7, 9, 25, 37], "\ucca0\uc800\ud558\uac8c": 0, "\ud574\uc57c\uaca0\ub2e4\ub294": 0, "\uc2e4\uc81c\ub85c": [0, 2, 4, 5, 15, 18, 21, 24, 26, 27, 29, 32, 36, 42], "\uc870\uac74\uc744": [0, 6, 14, 17, 28, 31], "\ub9cc\uc871\ud558\ub294\uc9c0": 0, "\uac80\uc218\ud560": 0, "\ubc29\uc548\uc774": 0, "\ud544\uc694\ud569\ub2c8\ub2e4": [0, 31], "\ub0b4\uc5d0\uc11c\ub3c4": 0, "\uce74\ud14c\uace0\ub9ac\ub97c": [0, 6], "\ub098\ub20c": 0, "\uc788\ub2e4\uba74": [0, 9, 11, 21, 30, 32], "\ub098\ub220\uc11c": [0, 12, 37], "\uac01\uac01\uc5d0": [0, 9, 26, 27], "tuning\ud560": [0, 8, 20], "\uc218\ub3c4": [0, 6, 9, 12, 26, 30, 31, 32, 39, 41], "\ud65c\uc6a9\ud574\ubcfc": 0, "submiss": 0, "score\uc5d0\uc11c": [0, 27], "baseline\uc744": 0, "\uc774\uae30\uc9c0": 0, "\ud588\uc9c0\ub9cc": 0, "text": [0, 1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 14, 17, 19, 24, 25, 26, 27, 30, 33, 37, 38, 40, 41], "\uc774\uc6a9\ud55c": [0, 21, 25, 27], "data\uc758": [0, 18, 25], "\uac00\ub2a5\uc131\uc744": [0, 10], "\ubcfc": [0, 1, 4, 6, 9, 12, 14, 17, 24, 26, 27, 28, 32, 33, 34, 36, 38, 40], "\uc788\uc5c8\ub2e4\uace0": [0, 20, 31, 32, 38, 41], "\uc0dd\uac01\ud569\ub2c8\ub2e4": [0, 26, 40], "\uc55e\uc5d0\uc11c": 0, "\uc5b8\uae09\ud55c": [0, 7, 24, 38], "prompt\uc5d0": [0, 8, 16], "\uc608\uc2dc\uc785\ub2c8\ub2e4": [0, 1], "nsfw\ub85c": 0, "\ud310\ub2e8\ub418\uc5b4": 0, "\uac80\uc740\uc0c9\uc73c\ub85c": 0, "\ub098\uc654\uc2b5\ub2c8\ub2e4": [0, 26], "pirat": 0, "wallpap": 0, "sangwoo": [1, 31, 35, 36, 38, 40, 41, 42, 43], "jo": [1, 31, 35, 36, 38, 40, 41, 42, 43], "09": [1, 30, 36], "\uc774\ubc88": [1, 38, 41], "\ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294": [1, 9], "\uc9c1\uc811": [1, 4, 6, 12, 14, 18, 21, 23, 30, 36, 42], "\ud559\uc2b5\ud574\ubcf4\uace0": 1, "\uc2e4\ud5d8\ud55c": [1, 17, 31], "\uacb0\uacfc\ub4e4\uc744": [1, 9, 35, 41], "\uacf5\uc720\ud560\ub824\uace0": 1, "\ud569\ub2c8\ub2e4": [1, 6, 7, 9, 17, 27, 31, 32, 35, 36, 38, 40, 41, 42], "\uc6b0\uc120\uc801\uc73c\ub85c": [1, 31, 32, 33, 41, 42], "\ud559\uc2b5\ub370\uc774\ud130\ub294": 1, "bryandle": 1, "data": [1, 3, 20, 21, 26, 30, 31, 32, 36, 39, 40, 43], "\uacf5\uac1c\ub41c": [1, 20, 38], "yolov5": 1, "\ubaa8\ub378": [1, 3, 4, 5, 6, 8, 9, 10, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "\ubc0f": [1, 5, 6, 9, 12, 14, 17, 20, 21, 24, 27, 28, 32, 34, 36, 37, 38, 39, 40, 41], "waifu2x": 1, "\ud6c4\ucc98\ub9ac": [1, 24], "\uae30\ubc95\uc744": [1, 2, 6, 8, 16, 18, 31, 38, 40], "\ud65c\uc6a9\ud558\uc5ec": [1, 6, 14, 16, 17, 21, 24, 31, 33, 34, 35, 36, 42], "\ud504\ub9ac\ub4dc\ub85c\uc6b0\uc5d0": 1, "\ub4f1\uc7a5\ud558\ub294": 1, "\uc778\ubb3c": [1, 3, 13, 32], "\uc0ac\uc9c4\ub4e4\uc744": [1, 35], "\uc218\uc9d1\ud588\uc2b5\ub2c8\ub2e4": 1, "\ub17c\ubb38\uc5d0\uc11c\ub294": [1, 2, 4, 6, 7, 9, 11, 12, 14, 16, 17, 19, 20, 26, 27, 28, 30, 31, 32, 33, 34, 35, 38, 39, 40, 41, 42], "3": [1, 4, 9, 15, 19, 28, 30, 32, 35, 36, 37, 42], "5": [1, 4, 11, 16, 17, 23, 30, 36, 39, 41, 42], "\uc7a5\uc73c\ub85c": 1, "fine": [1, 3, 7, 9, 12, 13, 17, 20, 22, 25, 26, 28, 33, 37, 43], "tune": [1, 9, 13, 17, 20, 31, 33, 37, 43], "\uac00\ub2a5\ud558\ub2e4\uace0": [1, 26], "\uc81c\uc2dc\ub418\uc5b4\uc788\uc9c0\ub9cc": 1, "\uc0ac\uc9c4": [1, 4, 8, 28, 32, 37], "\ub9ce\uc740": [1, 3, 6, 7, 9, 12, 14, 16, 21, 22, 24, 27, 28, 29, 31, 32, 33, 37, 40], "\ud559\uc2b5\ud558\uba74": [1, 11, 14, 35], "\uc131\ub2a5\uc774": [1, 4, 11, 12, 15, 18, 20, 21, 24, 27, 30, 31, 32, 34, 38, 39, 40, 41], "\uc88b\uc544\uc838\uc11c": 1, "15": [1, 2, 3, 5, 17, 39], "20": [1, 2, 3, 5, 6, 16, 18, 35, 39], "\uc7a5\uc758": [1, 9, 14, 30], "\ud559\uc2b5\ud558\uc600\uc2b5\ub2c8\ub2e4": 1, "\ud559\uc2b5\ud55c": [1, 8, 9, 16, 18, 20, 25, 27, 30, 31, 35, 37, 38, 40], "\uc774\ubbf8\uc9c0\ub4e4": [1, 24], "\uc2e4\ud5d8\ud558\uba74\uc11c": 1, "\ub300\ud45c\uc801\uc73c\ub85c": [1, 31, 35, 36, 41, 42], "\uadf8\ub9ac\uace0": [1, 4, 12, 15, 17, 27, 28, 31, 32, 35, 36, 38, 40, 41, 42], "\ub9c8\uc9c0\ub9c9\uc73c\ub85c": [1, 14, 17, 26, 31, 35, 38, 40, 41], "\ubc18\uc601\ud558\ub294": 1, "\uc815\ub3c4\ub97c": [1, 10, 18], "\uc870\uc808\ud558\ub294": [1, 7, 10, 14, 17, 27], "prior_loss_weight": [1, 35], "\ubc14\uafd4\uac00\uba74\uc11c": 1, "\ud559\uc2b5\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4": 1, "\uc0ac\uc804\ud559\uc2b5\ub41c": [1, 3, 27, 31, 35, 40], "\ubaa8\ub378\ub85c": [1, 3, 8, 14, 15, 17, 26, 27, 33, 36, 38, 40, 41], "\ucc98\uc74c\uc5d0\ub294": [1, 5, 14, 20, 27], "hakurei": 1, "waifu": 1, "diffus": [1, 2, 4, 6, 7, 9, 10, 13, 15, 17, 20, 21, 22, 24, 36, 38, 43], "\ubaa8\ub378\uc744": [1, 2, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22, 23, 24, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 42], "\uc2dc\ub3c4\ud574\ubd24\uc9c0\ub9cc": 1, "\uacb0\uacfc\uac00": [1, 4, 11, 16, 21, 22, 27, 29, 32, 34, 36], "\ub9cc\uc871\uc2a4\ub7fd\uc9c0": 1, "\ubabb\ud574": 1, "runwayml": 1, "stabl": [1, 6, 7, 15, 17, 18, 20, 24, 27, 30, 35, 38, 39, 40], "v1": [1, 13, 17], "\uc791\uc5c5\uc744": [1, 28, 31, 41], "\uc9c4\ud589\ud588\uc2b5\ub2c8\ub2e4": [1, 6, 17, 36, 38, 40, 41], "\uc81c\uc678\ud55c": [1, 2, 3, 31], "\ub3d9\uc77c\ud55c": [1, 3, 5, 6, 14, 17, 18, 21, 22, 24, 27, 30, 31, 32, 35, 38, 40, 41], "configur": [1, 34, 36], "\uc73c\ub85c": [1, 4, 9, 12, 14, 17, 20, 21, 22, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 40, 41], "\uacb0\uacfc\uc785\ub2c8\ub2e4": [1, 19, 27, 31, 40, 41], "model_nam": 1, "instance_prompt": 1, "A": [1, 4, 5, 6, 7, 8, 9, 13, 14, 17, 20, 26, 28, 29, 30, 32, 35, 37, 41, 42], "sk": [1, 25, 28], "girl": 1, "class_prompt": 1, "python3": 1, "train_dreambooth": [1, 35], "py": [1, 30, 35], "pretrained_model_name_or_path": [1, 35], "pretrained_vae_name_or_path": 1, "stabilityai": 1, "sd": [1, 3, 13, 24, 30, 39, 41], "vae": [1, 2, 3, 4, 8, 18, 31, 35, 36, 40], "ft": [1, 14], "mse": [1, 11], "output_dir": 1, "revis": [1, 35], "fp16": 1, "with_prior_preserv": [1, 35], "1": [1, 4, 6, 7, 9, 15, 17, 19, 24, 26, 28, 30, 32, 35, 36, 37, 42], "0": [1, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 19, 21, 22, 23, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 39, 40, 41, 42], "seed": [1, 40], "1337": 1, "resolut": [1, 4, 13, 14, 15, 16, 18, 19, 21, 24, 27, 30, 31, 32, 34, 38, 39, 40], "512": [1, 15, 22, 24, 29, 36, 39], "train_batch_s": 1, "train_text_encod": [1, 35], "mixed_precis": 1, "use_8bit_adam": 1, "gradient_accumulation_step": [1, 35], "gradient_checkpoint": 1, "learning_r": 1, "1e": [1, 3, 13, 14, 25], "6": [1, 2, 3, 4, 5, 8, 22, 23, 24, 25, 30, 32, 39], "lr_schedul": [1, 35], "constant": [1, 15, 18, 34], "lr_warmup_step": 1, "num_class_imag": 1, "200": [1, 4, 24, 37], "sample_batch_s": 1, "4": [1, 4, 9, 15, 19, 26, 30, 36], "max_train_step": 1, "800": 1, "save_interv": 1, "100": [1, 3, 18, 27, 30, 32], "save_sample_prompt": 1, "concepts_list": 1, "json": 1, "w": [1, 2, 3, 4, 7, 8, 11, 15, 19, 20, 21, 26, 29, 33, 37, 40], "o": [1, 2, 15, 21, 25, 38], "\uc544\ub798": [1, 4, 6, 7, 9, 12, 14, 18, 21, 26, 27, 31, 32, 33, 35, 36, 37, 40, 41, 42], "\uadf8\ub9bc\ucc98\ub7fc": [1, 9, 20, 36, 37, 42], "infer": [1, 3, 4, 11, 15, 21, 24, 29, 30, 39, 41, 42], "\uc785\ub825\ud588\uc744": 1, "\ub54c": [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 39, 40, 42], "\uc81c\uc678\ud568\uc73c\ub85c\uc368": 1, "input": [1, 3, 4, 5, 7, 8, 9, 13, 15, 20, 21, 22, 26, 28, 30, 32, 33, 35, 36, 38, 40, 41], "\uac00\uae4c\uc6b4": [1, 5, 6, 15, 28, 33], "\uc6f9\ud230": 1, "\uc788\uc5c8\uc2b5\ub2c8\ub2e4": [1, 6, 7, 9, 17, 27, 32, 38], "\ub610\ud55c": [1, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 16, 17, 19, 20, 21, 24, 27, 29, 31, 32, 35, 36, 38, 39, 40, 41, 42], "\ud551\ud06c\uc0c9": 1, "\uba38\ub9ac\ub97c": 1, "\ud55c": [1, 2, 3, 4, 9, 11, 12, 14, 16, 17, 18, 20, 21, 22, 24, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "\uc774\ubbfc\uc9c0": 1, "\uce90\ub9ad\ud130\ub97c": 1, "\uc5b4\ub290": [1, 26, 27, 28], "\uc815\ub3c4": [1, 5, 10, 18, 20, 26, 27], "\uc0dd\uc131\ud558\ub294": [1, 5, 6, 7, 9, 11, 14, 15, 16, 17, 19, 21, 22, 23, 26, 27, 29, 32, 35, 36, 37, 38, 40, 42], "\ubd80\ubd84\ub3c4": [1, 38], "\ud655\uc778\ud560": [1, 4, 12, 18, 23, 24, 27, 31, 32, 35, 38, 39, 40, 41, 42], "pink": 1, "hair": [1, 25, 26], "With": 1, "without": [1, 20, 21, 25, 26, 40], "\ub3c4": [1, 4, 5, 9, 11, 15, 17, 22, 25, 29, 30, 31, 32, 35, 40, 41, 42], "\uce90\ub9ad\ud130\uc758": [1, 3, 35], "\ubd80\uc790\uc5f0\uc2a4\ub7ec\uc6b4": 1, "\ubd80\ubd84\uc774\ub098": 1, "\uc800\ud574\uc0c1\ub3c4": [1, 3, 21, 22, 29], "\uacbd\uc6b0\ub4e4\uc774": 1, "\uc885\uc885": [1, 14, 32], "\ubc1c\uc0dd\ud588\ub294\ub370": 1, "\ud1b5\ud574": [1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 16, 17, 20, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 35, 36, 39, 40, 41, 42], "\ud004\ub9ac\ud2f0\uc758": [1, 18, 23, 25, 27], "ugli": 1, "disfigur": 1, "deform": 1, "low": [1, 3, 9, 15, 17, 18, 22, 23, 29, 33, 41], "\ub17c\ubb38\uc5d0\uc11c": [1, 3, 4, 7, 14, 16, 19, 26, 27, 30, 31, 33, 35, 36, 40, 42], "\uc81c\uc2dc\ud55c": [1, 8, 9, 12, 16, 23, 30, 33, 36, 37], "\uc678\uc5d0": [1, 40], "style": [1, 4, 9, 15, 17, 25, 28, 32, 35, 40, 43], "\ub77c\ub294": [1, 7, 9, 17, 27, 28, 32, 34, 37, 39, 40], "\ub85c": [1, 4, 5, 6, 7, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "\ud559\uc2b5\uc744": [1, 8, 12, 14, 16, 19, 21, 24, 26, 27, 29, 32, 34, 38, 39], "\uc2dc\ub3c4\ud574\ubcf4\uae30\ub3c4": 1, "\ud2b9\uc815": [1, 2, 6, 8, 9, 10, 11, 14, 16, 17, 18, 20, 24, 25, 27, 28, 32, 37, 39, 41], "\uc5ec\uc790": 1, "\uce90\ub9ad\ud130\uc5d0": [1, 3], "\uc815\ubcf4\ubfd0\ub9cc": 1, "\uc544\ub2c8\ub77c": [1, 4, 6, 8, 9, 11, 14, 16, 20, 22, 24, 26, 29, 32, 35, 39], "\ud504\ub9ac\ub4dc\ub85c\uc6b0": 1, "\uadf8\ub9bc\uccb4": 1, "\uc790\uccb4\ub97c": [1, 4, 9, 18], "\ub2f4\uc544\ub0b4\uae30": 1, "\uc704\ud55c": [1, 2, 3, 4, 5, 6, 9, 12, 13, 14, 17, 18, 19, 20, 21, 22, 24, 27, 28, 32, 34, 39, 42], "\ubaa9\uc801\uc774\uc600\uc2b5\ub2c8\ub2e4": 1, "differ": [1, 3, 9, 20, 26, 39, 40], "\uc2dc": [1, 15, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "\ud504\ub9ac\ub4dc\ub85c\uc6b0\uc758": 1, "\uadf8\ub9bc\uccb4\uac00": [1, 9], "\ubc18\uc601\ub41c": [1, 9], "\ub0a8\uc790\uac00": 1, "\uc0dd\uc131\ub418\ub3c4\ub85d": 1, "boi": 1, "\uc785\ub825\ud588\uc744\ub54c\uc758": 1, "\ud639\uc740": [1, 2, 4, 8, 9, 14, 15, 19, 24, 35, 39, 42], "\uc791\uac00\ub2d8\uc758": 1, "\uc7a5\uba74\ub4e4\ub85c": 1, "\uc804\uccb4\uc801\uc73c\ub85c": [1, 12], "\ud559\uc2b5\ud558\uac8c": [1, 3, 31, 38, 41], "\ub41c\ub2e4\uba74": [1, 24], "\ub2e4\uc591\ud55c": [1, 2, 5, 6, 8, 9, 12, 14, 15, 17, 18, 19, 21, 22, 24, 25, 27, 28, 31, 32, 33, 34, 35, 37, 39, 40, 41], "\uac83": [1, 3, 4, 9, 11, 14, 21, 22, 27, 28, 30, 32, 37], "num_inference_step": [1, 41], "24": [1, 3, 22, 27], "step": [1, 3, 4, 8, 9, 10, 11, 12, 13, 14, 16, 18, 22, 25, 27, 30, 34, 35, 36, 40, 41], "\uc744": [1, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42], "\ub298\ub824\uac00\uba74\uc11c": 1, "\ucd94\ub860\ub41c": 1, "\ud004\ub9ac\ud2f0\uac00": [1, 2, 5, 24, 41], "\uc0c1\uc2b9\ud558\ub294": 1, "\uc2e4\ud5d8\ub3c4": 1, "\uc9c4\ud589\ud588\ub294\ub370": 1, "\uc791\uc744\uc218\ub85d": [1, 27, 31, 39], "\uc640": [1, 4, 5, 6, 8, 9, 10, 11, 12, 14, 16, 17, 18, 19, 20, 21, 22, 25, 26, 28, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42], "\ubb34\uad00\ud55c": [1, 38], "random": [1, 2, 3, 4, 8, 10, 11, 12, 13, 15, 17, 20, 22, 23, 24, 28, 31, 35, 36, 38, 40, 41], "\uc0dd\uc131\ud558\uac8c": [1, 27, 35, 37, 41, 42], "\ub429\ub2c8\ub2e4": [1, 6, 7, 9, 17, 22, 26, 27, 31, 32, 35, 36, 38, 40, 41, 42], "\ucd5c\uc885\uc801\uc73c\ub85c": [1, 26, 27, 31, 40, 41], "num_infer": 1, "\uac12\uc740": [1, 4, 18, 27, 31, 34, 35], "\uac01\uac01": [1, 2, 3, 4, 5, 7, 8, 9, 12, 16, 17, 28, 30, 32, 35, 36, 39, 41, 42], "\uacfc": [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 14, 15, 18, 21, 22, 24, 25, 28, 29, 30, 31, 32, 33, 35, 37, 39, 40, 41], "\uc124\uc815\ud558\uc600\uc2b5\ub2c8\ub2e4": [1, 31, 40], "increas": [1, 9], "number": [1, 31, 34, 41], "guidance_scal": [1, 41], "\uc81c\uc678\ud574\ubcf8": 1, "\uc0dd\uc131\ub41c": [1, 2, 3, 4, 6, 9, 12, 13, 14, 15, 16, 17, 21, 23, 24, 26, 27, 28, 30, 31, 32, 34, 35, 36, 37, 38, 41, 42], "\ub0a8\uc790\uc758": 1, "\uba38\ub9ac\uce74\ub77d\uc774": 1, "\uae38\uc5b4\uc9c0\uace0": 1, "\uc5ec\uc131\uc2a4\ub7ec\uc6b4": 1, "\uc0dd\uae40\uc0c8\ub97c": [1, 28], "\ub180\ub77c\uc6b4": [1, 2, 9, 23, 27], "\uc0ac\uc2e4\ub3c4": 1, "\uadf8": [1, 4, 5, 6, 9, 11, 14, 15, 17, 19, 22, 23, 24, 26, 27, 28, 29, 31, 32, 40, 41], "\uc678": [1, 15, 23, 31, 32, 40], "\ub530\ub978": [1, 3, 7, 9, 18, 27, 30, 33, 35, 38, 39, 42], "\uc7ac\ubbf8\uc788\ub294": 1, "\uc2e4\ud5d8\uacb0\uacfc\ub4e4\uc744": 1, "\uacf5\uc720\ud569\ub2c8\ub2e4": [1, 31, 35, 40, 41], "\uc544\uc9c1": [1, 2, 9, 28, 34, 39], "\uc190\uc758": [1, 3], "\ubaa8\uc591\uc744": [1, 14], "\uc0dd\uc131\ud558\uc9c0": [1, 29], "\ubabb\ud558\ub294": [1, 17, 29, 36], "\uc7ac\ucc28": [1, 31], "climb": 1, "up": [1, 5, 11, 40], "mountain": 1, "paint": [1, 3, 35, 38], "2": [1, 4, 6, 15, 17, 19, 26, 28, 30, 32, 35, 36, 37, 42], "hand": 1, "draw": [1, 25], "\ud558\ub2e8\uc758": [1, 31], "\uc88c\uce21\uacfc": 1, "\uc6b0\uce21": 1, "\uc0ac\uc9c4\uc740": [1, 14, 31, 40], "\uc774\ub77c\ub294": [1, 4, 32, 34, 37, 39], "\ub098\ube44\ub97c": 1, "\uc0dd\uc131\ud558\ub77c\ub294": 1, "\ucd94\ub860\ud574\ubcf8": 1, "\uc218\uc2dd\ud558\ub294": 1, "\uba85\uc0ac\uac00": 1, "\uc774\ub3c4\ub85d": 1, "\uc218\uc815\ud568\uc73c\ub85c\uc368": [1, 18, 31], "butterfli": 1, "\uc0ac\uc9c4\uc744": [1, 4, 14, 32, 34], "\uc0dd\uc131\ud560\ub54c": 1, "\uc870\uae08\uc774\ub098\ub9c8": 1, "\uc6f9\ud230\uc758": 1, "\uadf8\ub9bc\uccb4\ub97c": 1, "\ubc18\uc601\ud560": 1, "\uc788\uc5c8\ub358": [1, 32], "http": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "arxiv": [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "org": [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "pdf": [2, 5, 6, 9, 17, 22, 23, 28, 30, 31, 33, 38, 39, 43], "2206": 2, "10935": 2, "gan": [2, 4, 8, 10, 14, 16, 22, 23, 25, 31, 32, 33, 41], "diffusion\ub4f1": [2, 15], "\ubaa8\ub378\uc758": [2, 3, 4, 5, 7, 8, 9, 14, 15, 16, 17, 18, 20, 21, 22, 24, 25, 26, 27, 28, 31, 34, 39, 40, 41], "\ubc1c\uc804\uc774": 2, "\uc774\uc5b4\uc9c0\uace0\uc788\ub2e4": 2, "\ub2e4\ub9cc": [2, 27, 30, 39], "\uc774\ub7ec\ud55c": [2, 4, 6, 8, 9, 12, 14, 15, 17, 18, 21, 22, 24, 25, 27, 28, 29, 31, 32, 35, 40, 42], "\uc0dd\uc131\ubaa8\ub378\uc744": 2, "\ud3c9\uac00\ud558\ub294": [2, 9, 27], "\ucc99\ub3c4": 2, "\uc120\uc815\uc740": 2, "\uc5b4\ub824\uc6b4": [2, 8, 28], "\ubb38\uc81c\ub85c": [2, 40], "\ub0a8\uc544\uc788\ub2e4": 2, "\uadf8\ub098\ub9c8": 2, "\ub098": [2, 6, 24, 31, 35, 37, 39, 42], "score\ub97c": [2, 12, 16, 27], "\ud3c9\uac00\ud558\uace0\uc788\uc9c0\ub9cc": 2, "metric\ub4e4\ub3c4": 2, "\uc644\uc804\ud558\uc9c0": 2, "\uc54a\uc74c": [2, 3, 8, 11, 21, 28, 37, 39], "\ub17c\ubb38\uc744": [2, 16, 17, 27, 34], "\ud3c9\uac00\uc758": 2, "\uc9c0\ud45c\uc5d0": [2, 27], "\ub300\ud574": [2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 24, 27, 28, 29, 30, 31, 32, 35, 36, 38, 39, 40, 41, 42], "\ud55c\ubc88\ub354": 2, "\uace0\ucc30\ud558\uace0": 2, "\ud604\uc874\ud558\ub294": 2, "metric\uc5d0": 2, "\ubc29\ud5a5\uc744": 2, "\uc81c\uc2dc": [2, 4, 28, 30, 34], "\ucd5c\uadfc": [2, 3, 6, 8, 14, 15, 18, 23, 25], "\ub4f1": [2, 8, 10, 14, 15, 16, 17, 20, 22, 25, 28, 35, 39], "implicit": [2, 10, 14, 36, 41], "model\ub4e4\uc774": [2, 8, 10], "\ub6f0\uc5b4\ub09c": [2, 4, 8, 10, 18, 21, 27, 33], "\ubcf4\uc5ec\uc90c": [2, 3, 28, 37], "\ud558\uc9c0\ub9cc": [2, 4, 6, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 21, 23, 25, 27, 28, 30, 31, 32, 34, 35, 36, 42], "task": [2, 4, 9, 20, 29, 31, 32, 33, 36, 37, 40], "classif": [2, 16, 30, 34, 36, 39], "segment": [2, 32, 41], "\uc640\ub294": [2, 31], "\ub2e4\ub974\uac8c": [2, 10, 12, 17, 24, 27, 35], "metric\uc744": 2, "\uc815\ud558\ub294\uac83\uc740": 2, "challeng": 2, "p": [2, 4, 6, 7, 9, 12, 14, 18, 21, 34, 35, 40, 42], "r": [2, 3, 5, 11, 14, 15, 18, 19, 20, 25, 29, 38], "f1": 2, "iou": [2, 32], "intersect": [2, 32], "over": [2, 4, 20, 32, 37], "union": [2, 32], "featu": 2, "map\uc774\ub098": [2, 14], "classfier": [2, 14], "\uc0ac\uc6a9\ud558\ub294": [2, 3, 5, 7, 9, 11, 14, 15, 26, 34, 35, 36, 37, 38], "score\uac00": [2, 39], "\ucd94\uc138": [2, 8], "\uc704": [2, 3, 4, 6, 7, 9, 11, 12, 15, 17, 18, 20, 21, 25, 27, 28, 30, 31, 40], "metric\uc758": 2, "\ub2e8\uc810": [2, 23], "real": [2, 8, 12, 15, 21, 23, 25, 29, 36], "\ubd84\ud3ec\uc758": [2, 27, 36], "space\uc5d0\uc11c": [2, 3, 6, 12, 14, 19, 28], "\uc218\uce58\uac00": [2, 18], "\uc815\ub9d0": [2, 9, 15], "\uc720\uc758\ubbf8\ud55c": 2, "\uc5f0\uad00\uc774": [2, 26], "\uc788\ub294\uc9c0": [2, 9], "\uc99d\uba85\ub418\uc9c0": [2, 18], "pretrain": [2, 3, 4, 6, 7, 8, 12, 13, 15, 16, 20, 21, 22, 23, 24, 25, 27, 28, 30, 33], "\uac70\ub300\ud55c": 2, "set\uc774": [2, 28], "specif": [2, 8, 14, 26, 35], "feature\uc5d0": [2, 3, 12, 22], "\uc5bc\ub9c8\ub098": [2, 8, 9, 11, 12, 15, 23, 27, 28, 34, 40], "\ubbf8\uce58\ub294\uc9c0": 2, "\uc54c\uc218": 2, "\uc5c6\uc74c": [2, 4, 20], "net": [2, 3, 4, 5, 11, 12, 13, 19, 30, 35, 37, 40], "imagenet": [2, 16, 18, 24, 28, 30, 31, 39, 40], "ddpm": [2, 3, 4, 16, 27, 37, 39], "face": [2, 4, 9, 13, 17, 26, 36, 42], "human": [2, 8, 9, 13, 16, 26, 28, 29, 38], "study\uc758": 2, "\uc9c1\uad00\uc801\uc778": [2, 28], "\ubc29\uc2dd\ub3c4": [2, 16, 36], "\uc788\uc9c0\ub9cc": [2, 10, 14, 15, 16, 32, 33, 34, 41], "time\uacfc": 2, "cost\ub97c": [2, 20, 39], "\ub9e4\uc6b0": [2, 4, 8, 9, 10, 11, 12, 14, 15, 20, 28, 30, 31, 32, 37, 39], "\ud544\uc694\ub85c\ud55c\ub2e4\ub294": 2, "\uc810\uacfc": 2, "diversity\ub294": 2, "\uce21\uc815\ud558\uae30": [2, 9], "\uc5b4\ub835\ub2e4\ub294": 2, "e": [2, 4, 5, 6, 8, 10, 11, 12, 14, 18, 19, 22, 23, 25, 26, 31, 35, 36, 37, 39, 40, 41, 42], "g": [2, 8, 10, 15, 16, 18, 25, 26, 32, 35, 36, 39, 40, 41], "\ud558\ub098\uc758": [2, 4, 8, 11, 14, 15, 20, 21, 22, 25, 26, 28, 32, 39, 42], "\uc774\ubbf8\uc9c0\ub9cc": [2, 5, 34], "\uc0dd\uc131\ud574\ub3c4": 2, "\ubc1b\uc744": [2, 37], "\uc788\uc74c": [2, 4, 8, 11, 15, 18, 20, 21, 22, 27, 28, 33, 34, 37, 39], "gpt": [2, 20], "high": [2, 3, 7, 9, 12, 17, 18, 19, 22, 23, 24, 26, 27, 31, 33, 36, 37, 39, 41], "quality\uc758": [2, 10, 16, 18, 23, 25, 39], "new": [2, 8, 10, 17, 26, 28], "dataset\uc744": [2, 25, 37, 39], "\uc704\uc758": [2, 4, 7, 9, 10, 12, 14, 16, 18, 22, 27, 30, 31, 32], "\ud559\uc2b5\ud558\uace0": [2, 11, 27, 33, 36], "is\ub4f1": 2, "\uce21\uc815": [2, 6, 9, 28], "\uc2e4\uc81c": [2, 4, 6, 9, 12, 14, 17, 20, 21, 22, 23, 27, 28, 32, 35, 36, 39], "revers": [2, 4, 10, 16, 18, 23, 30, 39, 40, 41], "\uac12\uacfc": [2, 10, 15], "\ube44\uad50\ud574\uc11c": [2, 26, 33], "\uc720\ud6a8\uc131\uc744": 2, "\uac80\uc99d": [2, 4, 39], "base": [2, 12, 13, 15, 16, 18, 21, 24, 25, 26, 28, 30, 34, 36, 37, 38, 39, 41, 43], "v3\uacfc": 2, "clip": [2, 3, 5, 6, 8, 9, 13, 15, 17, 21, 22, 24, 28, 29, 30, 33, 35, 37, 38, 39, 41], "\ube44\uad50\ub97c": [2, 14, 16], "v3": 2, "\uc801\ud569\uc131\uc744": 2, "\ub450": [2, 3, 4, 5, 6, 7, 9, 11, 14, 15, 17, 18, 21, 22, 24, 26, 27, 29, 30, 31, 32, 35, 39, 40], "\ud655\ub960\ubd84\ud3ec\uc758": 2, "\uc720\uc0ac\ub3c4\ub97c": [2, 6, 16, 31], "\uce21\uc815\ud558\ub294": [2, 6, 9, 12, 30, 35, 39], "\uc9c0\ud45c": [2, 14, 27, 34], "q": [2, 4, 5, 12, 16, 19, 33, 34, 40], "sum_": [2, 11, 12, 15, 16, 20, 42], "x": [2, 3, 4, 5, 6, 7, 9, 10, 12, 14, 15, 16, 17, 19, 20, 21, 22, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42], "log": [2, 5, 11, 20, 27, 31, 33, 34, 36, 39, 40, 42], "left": [2, 5, 6, 11, 17, 19, 20, 24, 34, 37, 42], "frac": [2, 7, 11, 12, 19, 26, 31, 34, 36, 39, 40, 42], "right": [2, 5, 6, 11, 17, 19, 20, 34, 37, 42], "\ud2b9\uc9d5": [2, 6, 17, 23], "lower": [2, 11, 23, 24, 33, 37, 42], "better": [2, 23, 37], "symmetr": 2, "rkl": 2, "\ub300\ubd80\ubd84": [2, 8, 18, 21, 25, 27], "p\uac00": 2, "true": [2, 9, 10, 11, 20, 21, 36, 41], "distribut": [2, 4, 5, 9, 10, 11, 15, 30, 31, 32, 33, 34, 41, 42], "q\uac00": 2, "estim": [2, 3, 11, 31, 36, 42], "fidelity\uc640": [2, 14, 17], "diversity\ub97c": [2, 17, 25], "fidel": [2, 4, 13, 17, 22, 34, 35, 37], "label\uc758": 2, "\uc608\uce21\ud558\ub294\uc9c0": 2, "divers": [2, 4, 5, 9, 17, 18, 22, 34, 35], "\uace0\ub974\uac8c": 2, "\uc0dd\uc131\ud574\ub0b4\ub294\uc9c0": 2, "exp": [2, 11, 40], "mathbb": [2, 4, 11, 14, 19, 20, 31, 35, 36, 39, 41, 42], "_x": 2, "d_": [2, 4, 11, 15, 17, 20, 36, 42], "y": [2, 4, 6, 7, 9, 10, 11, 12, 20, 21, 26, 32, 33, 34, 41], "higher": [2, 37], "\uc774\ubbf8\uc9c0\uc640": [2, 5, 6, 9, 10, 12, 14, 16, 17, 22, 25, 28, 35, 38, 42], "featur": [2, 3, 4, 7, 8, 9, 11, 12, 13, 14, 15, 22, 24, 25, 26, 30, 32, 35, 41], "vector\ub97c": [2, 22, 28], "\ucd94\ucd9c": [2, 13, 14, 22, 41], "\ud3c9\uade0\uacfc": [2, 4, 27, 37], "\uacf5\ubd84\uc0b0\uc744": 2, "\uacc4\uc0b0": [2, 10, 11, 13, 14, 21, 28, 30], "frechet": [2, 33], "\ud558\ub294": [2, 4, 5, 6, 7, 11, 12, 14, 16, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 31, 32, 34, 35, 36, 37, 39, 40, 41, 42], "\ud3c9\uac00\uc9c0\ud45c": 2, "lvert": 2, "mu_x": 2, "mu_g": 2, "rvert": 2, "tr": 2, "sigma_x": 2, "sigma_g": 2, "v3\uc758": 2, "pool": [2, 24], "layer\uc758": [2, 15], "map\uc744": [2, 12, 15, 25], "\uc0ac\uc6a9": [2, 3, 4, 7, 8, 11, 13, 14, 15, 16, 18, 22, 25, 33, 34, 37, 39], "quality\ub97c": [2, 12, 18, 28], "fid\uc5d0\uc11c": 2, "distance\ub97c": [2, 12], "\ub300\uc2e0": [2, 8, 11, 12, 14, 17, 18, 24, 25, 28, 33], "trick\uc744": [2, 25], "\uc0ac\uc6a9\ud574": [2, 9, 12, 15, 20, 22, 24, 25, 27, 28, 29, 37, 39], "\ud655\ub960": [2, 4, 11, 23, 27, 36, 42], "\ub370\uc774\ud130\uc14b\uc758": [2, 5, 9, 16, 21, 27, 30, 38], "\ud3c9\uac00\uc5d0": [2, 16], "\ud6a8\uacfc\uc801\uc784": 2, "metric\ubcf4\ub2e4": 2, "\uc18d\ub3c4\uac00": [2, 22, 23, 31, 40], "\uc624\ub798\uac78\ub9bc": 2, "n": [2, 4, 9, 11, 12, 14, 16, 19, 20, 31, 33, 39, 40, 41, 42], "kid": [2, 8, 23], "\ub17c\ubb38": [2, 9, 11, 20, 22, 27, 32, 33, 35], "fid\uc640": [2, 15, 16, 18, 21, 27, 34], "bias\uac00": [2, 7, 26], "\uc788\uc74c\uc744": [2, 6, 17, 18, 27, 28], "\uc99d\uba85\ud558\uace0": 2, "dataset\uc758": [2, 13, 39], "sampl": [2, 3, 4, 9, 12, 15, 19, 22, 25, 29, 30, 31, 34, 35, 36, 37, 39, 41, 42], "\ubcc0\uacbd": [2, 3, 4, 6, 32], "gaussian": [2, 3, 4, 11, 15, 20, 26, 31, 34, 35, 39, 41, 42], "sobol": 2, "sequenc": [2, 3, 5, 9, 13, 20], "\ud558\uc5ec": [2, 4, 6, 29, 32, 37], "unbias": [2, 9, 31], "\uc81c\uc548": [2, 3, 8, 10, 13, 18, 27, 28, 29, 33], "v3\uc5d0": 2, "\ud1b5\uacfc\ud558\uae30\uc704\ud574": 2, "resiz": [2, 3, 8, 13, 29], "\uacfc\uc815\uc774": [2, 6, 11], "\ud3ec\ud568\ub418\ub294\ub370": 2, "score\uac12\uc5d0": 2, "\uc904\uc218": 2, "\uc788\uc5b4": [2, 3, 12, 16, 32, 36, 39], "best": [2, 12, 18, 25, 33, 34], "percformance\uc758": 2, "one": [2, 4, 9, 25, 31, 32, 39, 40], "process\ub97c": [2, 10, 11, 12, 34], "imagenet\uc758": 2, "\ub370\uc774\ud130\ub97c": [2, 6, 8, 9, 11, 14, 16, 18, 21, 24, 25, 27, 29, 31, 32, 36, 39, 42], "imagegpt\ub97c": 2, "\uc7ac\uc0dd\uc131": 2, "k": [2, 8, 11, 15, 19, 20, 23, 33, 36, 39, 41], "notimagenet": 2, "imagegpt": 2, "vision": [2, 9, 15, 23, 27, 32, 38, 43], "\ubd84\uc57c\uc5d0": [2, 31], "transform": [2, 5, 11, 16, 18, 22, 24, 27, 30], "label": [2, 4, 11, 32, 34, 37], "dataset\uc774": [2, 23], "\ud544\uc694\uc5c6\ub294": 2, "\uc790\uae30\uc9c0\ub3c4": 2, "\ubc29\uc2dd": [2, 8, 14, 22, 31, 39], "challenge\uc5d0\uc11c\ub3c4": 2, "\uc0c1\ub2f9\ud55c": [2, 5], "\ubcf4\uc784": [2, 3, 18, 33], "\uc0dd\uc131\ubaa8\ub378\uc5d0": 2, "\ud1b5\uacfc\ud55c": 2, "p_": [2, 4, 6, 11, 12, 14, 16, 20, 31, 32, 33, 34, 36, 39, 42], "hat": [2, 15, 17, 19, 21, 31, 32, 35, 39, 40], "\ubd84\ud3ec\ub97c": [2, 11, 14, 15, 21, 24, 27, 32, 36, 42], "\ube44\uad50": [2, 3, 4, 9, 10, 14, 15, 18, 21, 27, 30, 33, 34, 37], "\ud55c\uacc4": [2, 3, 4, 28, 39], "explicit": [2, 36], "model\uc5d0\ub9cc": 2, "\uc801\uc6a9": [2, 4, 12, 14, 15, 18, 23, 24, 33, 39, 41], "\uac00\ub2a5\ud558\uace0": [2, 8], "model\uc5d0\ub294": 2, "\uc801\uc6a9\ud560": [2, 28, 31], "\uc0dd\uc131\ub418\ub294": [2, 6, 7, 23, 25, 26, 27, 34, 41], "\ub370\uc774\ud130\uc758": [2, 21, 27, 32, 36], "\uba85\uc2dc\uc801\uc73c\ub85c": [2, 6], "\ubaa8\ub378\ub9c1\ud558\uc5ec": [2, 33, 34], "\uc8fc\ub85c": [2, 14, 16, 17, 39], "noise\ub85c\ubd80\ud130": [2, 23], "\uacfc\uc815\uc5d0": [2, 6, 25], "\uc8fc\uc5b4\uc9c4": [2, 6, 9, 12, 14, 16, 17, 21, 22, 28, 30, 31, 33], "\ubd84\ud3ec\ub85c\ubd80\ud130": 2, "\uc0d8\ud50c\ub9c1\ud558\uc5ec": 2, "volatil": 2, "rkl\uc740": 2, "\uc591\uc758": [2, 4, 7, 14], "epoch": [2, 14, 32, 35, 36, 41], "\ud6c4\uc5d0": [2, 3, 8, 15, 29, 34], "\ubc14\ub85c": [2, 8, 9, 11, 22, 24, 26, 30], "\uc218\ub834\ud558\ub294": [2, 40], "\ubc29\uba74": 2, "is\ub294": 2, "\ud070": [2, 3, 4, 6, 9, 11, 12, 14, 17, 18, 20, 21, 24, 26, 27, 28, 29, 30, 39, 40, 41], "\ubcc0\ub3d9\uc131\uc744": [2, 27], "capacity\uac00": 2, "\uc99d\uac00\ud560\uc218\ub85d": [2, 33, 40], "kl\uacfc": 2, "rkl\uc758": 2, "\uac1c\uc120\ub418\ub294": [2, 38], "\uac83\uc744": [2, 4, 5, 6, 7, 9, 11, 12, 14, 17, 18, 21, 22, 23, 24, 26, 27, 28, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], "\ud655\uc778": [2, 12, 18, 25, 30, 33, 37], "fid\ub098": 2, "is\uac00": [2, 27], "\uadf8\ub798\ud504\uc640": 2, "\ud615\ud0dc\ub97c": [2, 11], "\ub744\ub294\uac83\uc744": 2, "\ud2b9\ud788": [2, 3, 9, 24, 28, 31, 37, 39, 41], "neg": [2, 11, 12, 15, 16, 22, 25], "kl\uacfc\ub294": 2, "\ub192\uc740": [2, 3, 4, 6, 9, 11, 14, 16, 17, 18, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37], "colleration\uc744": 2, "\ubcf4\uc774\uc9c0\ub9cc": [2, 12, 15, 25], "rkl\uacfc\ub294": 2, "\ub192\uc9c0": 2, "\uc54a\uc740": [2, 3, 6, 8, 9, 12, 14, 17, 18, 21, 24, 26, 27, 30, 31, 32, 42], "\ubcf4\uc778\ub2e4": [2, 12, 14, 16, 18, 21, 25], "capacity\uc5d0": 2, "\uc218\uce58": [2, 18], "\ubcc0\ud654\ub294": [2, 24], "\ud06c\uc9c0": [2, 15], "\ub370": [2, 6, 14, 16, 17, 27], "\ubc18\ud574": [2, 18, 23, 39], "\uad49\uc7a5\ud788": [2, 15], "\uc218\uce58\uc758": 2, "\ubcc0\ud654\ub97c": [2, 12, 39], "\ubcf4\uc5ec\uc900\ub2e4": [2, 5, 10, 12, 15, 16, 24, 25, 28, 37, 39], "rank": [2, 5], "coller": 2, "\ubaa8\ub378\uc5d0": [2, 3, 5, 6, 8, 9, 11, 15, 16, 18, 21, 22, 24, 25, 27, 28, 30, 35, 38, 39, 40, 41], "\ubcc4\ub85c": [2, 28], "\uc21c\uc704\ub97c": [2, 28], "\ub9e4\uaca8": 2, "\uc21c\uc704\uc758": 2, "kendal": 2, "s": [2, 3, 4, 6, 9, 10, 12, 14, 15, 25, 26, 28, 29, 31, 35, 36, 37, 38, 39, 40], "\u03c4": 2, "ranking\uc774": 2, "\ub9e4\uaca8\uc9c4": 2, "\uc218\uc5f4": 2, "\uc0ac\uc774\uc758": [2, 4, 6, 9, 11, 14, 15, 16, 21, 39], "from": [2, 5, 9, 11, 22, 26, 36, 40], "scipi": 2, "import": [2, 10, 12, 18, 20], "stat": 2, "h": [2, 3, 7, 11, 19, 20, 21, 29, 30, 33, 34, 41], "z": [2, 3, 6, 7, 11, 12, 13, 14, 19, 20, 25, 31, 33, 34, 36, 39, 40, 42], "kendalltau": 2, "significanceresult": 2, "statist": [2, 32], "9999999999999999": 2, "pvalu": 2, "016666666666666666": 2, "19999999999999998": 2, "8166666666666667": 2, "result": [2, 9, 10, 12, 13, 17, 18, 20, 24, 31, 40, 42], "\uc720\uc0ac\ub3c4\ub294": 2, "\ub192\uc74c": [2, 27, 37], "889": 2, "kl\uacfc\uc758": 2, "\ube44\uad50\ud574\ubcf4\uba74": [2, 18], "infin": 2, "cleanfid": 2, "96": [2, 27], "\ub098\uba38\uc9c0": [2, 6, 15, 27, 28, 38], "metric\uac04": 2, "\ub0ae\uc74c": [2, 20], "network": [2, 6, 7, 10, 11, 15, 17, 23, 29, 31, 36], "\uae30\ubc18\uc758": [2, 3, 5, 15, 17, 21, 22, 30, 38], "\uc911\uc5d0\uc11c\ub294": [2, 4], "infinity\uc774": 2, "\uac00\uc7a5": [2, 3, 4, 5, 6, 8, 9, 12, 13, 16, 17, 21, 22, 26, 27, 28, 30, 31, 32, 35, 40], "\ub192\uace0": [2, 5], "is\uc640": 2, "\ub300\ubd80\ubd84\uc758": [2, 4, 6, 14, 20, 39], "metric\uc774": 2, "\uce21\uc815\uc744": 2, "v3\ub97c": 2, "\uc0ac\uc6a9\ud558\ub294\ub370": [2, 6, 15, 17, 31], "\uacfc\uc5f0": [2, 9], "\uc801\uc808\ud55c\uac00": 2, "\uac00\uc815": [2, 11, 22], "infinity\ub294": 2, "space\uac00": [2, 12], "distribution\uc744": [2, 8, 25, 26, 33], "\ub530\ub978\ub2e4\ub294": 2, "\uac00\uc815\ud558\uc5d0": 2, "\uce21\uc815\ub418\ub294": 2, "\uc2e4\ud5d8": [2, 4, 9, 17, 27, 28, 30, 31, 34, 36], "10k\uc758": 2, "\uc0dd\uc131\ud558\uace0": [2, 4, 5, 6, 21, 22, 28, 33, 35], "\uc6d0\ubcf8\uc758": 2, "20k\uc758": 2, "\uac01\uac01\uc758": [2, 4, 8, 12, 15, 21, 25], "network\uc640": [2, 21], "network\ub97c": [2, 3, 11, 26], "model\uc5d0": [2, 6, 12, 15, 16, 20, 23, 28, 39], "fit": 2, "\uc774\ub54c": [2, 3, 4, 6, 15, 22, 23, 29, 31, 32, 33, 35, 36, 38, 39, 40, 41, 42], "\uae30\ubc18\uc73c\ub85c": [2, 5, 6, 9, 13, 14, 17, 19, 22, 23, 25, 31, 32, 35, 39, 40, 42], "\uac01": [2, 3, 4, 6, 11, 13, 14, 15, 17, 20, 21, 22, 24, 26, 27, 28, 33, 34, 35, 38, 39, 40, 41], "\uc0d8\ud50c\uc758": [2, 24, 27], "\ud655\ub960\uac12\uc744": 2, "\uacc4\uc0b0\ud55c\ub2e4": [2, 12, 34], "8": [2, 4, 8, 11, 12, 13, 15, 18, 19, 20, 21, 23, 26, 32, 33, 36, 39, 40, 41], "\uac12\uc774": [2, 4, 5, 8, 10, 18, 22, 25, 32, 33, 34, 37, 39, 40, 42], "\ub0ae\uc740": [2, 3, 10, 11, 15, 17, 18, 24, 29, 30, 33, 35], "tail": 2, "vector\uc758": [2, 26], "\uc6d0\ubcf8": [2, 6, 9, 14, 15, 21, 23, 27, 28, 35, 39, 40, 41, 42], "\ub0ae\uc544\uc57c\ud568": 2, "\ud655\ub960\uc744": [2, 5, 9, 36], "\uac16\ub294": [2, 4, 8, 9, 16], "\ud655\uc778\ud574\ubcf4\uba74": 2, "clip\uc744": [2, 3, 15], "\ud655\uc2e4\ud788": [2, 4], "\ub5a8\uc5b4\uc9c0\ub294": [2, 4, 9, 18, 27], "\ubc18\uba74": [2, 3, 4, 6, 12, 14, 16, 20, 34, 39, 40], "inception\uc758": 2, "\uc774\ubbf8\uc9c0\ub4e4\uc740": [2, 15, 23], "\ud004\ub9ac\ud2f0\ub97c": [2, 9, 22, 39], "\ubcf4\uc774\uace0": [2, 12, 14, 15, 32, 33], "\uac00\uc815\uc5d0": 2, "\uc704\ubc30": 2, "normal": [2, 5, 10, 11, 15, 26, 31, 32, 36, 37], "latent": [2, 3, 4, 6, 8, 9, 14, 15, 17, 22, 23, 24, 25, 26, 30, 31, 35, 38, 40, 41, 42], "represent": [2, 4, 9, 14, 19, 33], "vector\ub4e4\uc744": 2, "dimension\uc5d0": [2, 20], "\ud22c\uc601\uc2dc\ucf1c": 2, "\ub530\ub974\ub294": [2, 21, 23, 41], "\uc9c0": 2, "\ud655\uc778\ud55c\ub2e4": 2, "\ucd94\ucd9c\ud55c\ub2e4": 2, "\uc5f0\uc0b0\uc744": [2, 5, 29], "d\ub85c": 2, "\ud22c\uc601\uc2dc\ud0a8\ub2e4": 2, "value\ub97c": 2, "\uad6c\ud55c\ub2e4": [2, 30, 34], "valu": [2, 8, 10, 20, 40], "\uc5b4\ub5a0\ud55c": [2, 3, 12, 24, 26, 35, 39], "\uc0ac\uac74\uc774": 2, "\uc6b0\uc5f0\ud788": 2, "\uc77c\uc5b4\ub0a0": 2, "\ubc1c\uc0dd\ud560": [2, 5, 12], "\ud655\ub960\uc774": [2, 21], "\uac70\uc758": [2, 9, 12, 16, 18, 32, 39], "\uc5c6\ub2e4": [2, 14, 15, 20, 23, 29, 34], "\uc778\uacfc\uad00\uacc4\uac00": 2, "\uc788\ub2e4": [2, 3, 4, 5, 10, 12, 14, 15, 16, 18, 20, 21, 23, 24, 25, 28, 29, 30, 34, 37, 39], "\ud06c\ub2e4": 2, "distribution\uc740": 2, "random\uc744": 2, "\uae30\ubc18\uc73c\ub85c\ud558\uae30\ub54c\ubb38\uc5d0": 2, "\uc791\uc544\uc57c\ud55c\ub2e4": 2, "\uc989": [2, 4, 6, 8, 9, 11, 12, 14, 15, 16, 23, 28, 30, 31, 32, 33, 34, 37, 39, 41], "value\uac00": 2, "\ucee4\uc57c\ud55c\ub2e4": 2, "\ubaa8\ub4e0": [2, 3, 4, 5, 6, 8, 10, 12, 14, 15, 17, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 34, 39, 40, 42], "dataset\uc5d0": [2, 11, 16, 33, 39], "clip\uc758": [2, 3, 6, 28], "value\uac12\uc740": 2, "05\ub97c": 2, "\ub118\uc5b4": 2, "random\uc131\uc744": 2, "\uc720\uc9c0\ud558\uc9c0\ub9cc": 2, "inception\uc740": 2, "05\ubcf4\ub2e4": 2, "\uac12\uc744": [2, 4, 8, 10, 12, 15, 18, 21, 22, 23, 25, 31, 33, 34, 37, 39], "\ubcf4\uc5ec": 2, "\uc720\uc9c0\ud558\uc9c0": 2, "\ubabb\ud55c\ub2e4": [2, 12, 14, 18], "net\uc744": 2, "\ud1b5\ud55c": [2, 3, 8, 13, 23, 28, 31, 34, 40], "\uce21\uc815\ubcf4\ub2e4": 2, "\uc81c\uc548\ud55c\ub2e4": [2, 3, 12, 21, 24, 25, 28, 34, 39], "consist": [3, 10, 12, 29], "control": [3, 5, 13, 25, 26, 41], "synthesi": [3, 4, 6, 16, 19, 22, 23, 24, 26, 31, 35], "charact": [3, 35], "refer": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "paper": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "ab": [3, 4, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 40, 41, 42], "2311": [3, 13], "17117": [3, 13], "code": [3, 4, 5, 6, 7, 8, 11, 13, 15, 19, 20, 21, 22, 24, 26, 28, 30, 31, 32, 33, 34, 35, 36, 39, 40, 41, 42, 43], "offici": [3, 6, 8, 10, 13, 15, 33, 34], "nonoffici": 3, "project": [3, 9, 13, 14, 19, 20, 22, 34, 39, 41], "page": [3, 13, 28, 39], "humanaigc": 3, "github": [3, 13, 18, 20, 21, 28, 30, 32, 33, 35, 39, 43], "io": [3, 10, 11, 13, 18, 21, 28, 30, 32, 33, 39], "geonhak": [3, 13, 43], "song": [3, 12, 13, 31, 39, 40, 43], "march": [3, 13], "13": [3, 4, 13, 15, 22, 24, 37, 39], "2024": [3, 13, 15, 22, 31, 32, 36, 39, 42, 43], "exampl": [3, 9, 10, 26, 28, 35, 38], "figur": [3, 4, 10, 13, 15, 18, 22, 24, 25, 27, 28, 30, 32, 35, 37], "\ubaa8\ub378\ub4e4\uc774": [3, 8, 9, 15, 26, 27, 35, 41], "visual": [3, 12, 22, 28, 37, 40, 41], "\uc5f0\uad6c\uc5d0": 3, "\uc8fc\ub958\uac00": 3, "\ub418\uc5c8\uc9c0\ub9cc": 3, "\uc601\uc5ed\uc5d0\uc11c\ub294": 3, "\uc5b4\ub824\uc6c0\uc774": [3, 6, 18], "animation\uc5d0\uc11c": 3, "\uc0c1\uc138": 3, "\uc815\ubcf4\uc758": [3, 14, 25], "\uc77c\uad00\uc131\uc744": [3, 14, 21, 32, 39], "\uc720\uc9c0\ud558\ub294": [3, 14, 20], "\uac83\uc740": [3, 6, 9, 11, 12, 14, 21, 22, 27, 28, 30, 32, 36, 41], "\ubb38\uc81c\uc774\ub2e4": 3, "image\uc758": [3, 8, 12, 15, 16, 18, 19, 23, 25, 28], "\ubcf5\uc7a1\ud55c": [3, 4, 9, 14, 16, 27], "appear": [3, 13, 35], "\ud2b9\uc9d5\uc758": 3, "\uc720\uc9c0\ud558\uae30": [3, 7], "\uc704\ud574\uc11c": [3, 4, 9, 13, 16, 26, 30, 31], "spatial": [3, 12, 14, 21, 22, 29], "attent": [3, 4, 8, 11, 13, 14, 15, 16, 17, 19, 20, 22, 24, 25, 29, 33, 34, 37, 41], "feature\uacfc": [3, 5, 24], "\ud1b5\ud569\ud560": 3, "referencenet": 3, "\uc124\uacc4": [3, 18], "controllability\uc640": 3, "continuity\uc744": 3, "\ud6a8\uacfc\uc801\uc778": [3, 14, 21, 22, 24], "pose": [3, 7, 13, 25, 26, 35, 41], "guider": 3, "\ub3c4\uc785": [3, 15, 18, 22], "\ube44\ub514\uc624": [3, 13, 14, 21, 29], "\ud504\ub808\uc784\uac04": 3, "\ubd80\ub4dc\ub7ec\uc6b4": 3, "\uc804\uc774\ub97c": 3, "effect": [3, 12, 25, 26, 38, 41], "tempor": [3, 13, 21], "\uc784\uc758\uc758": [3, 4, 12, 16, 28, 31], "\ub300\ud574\uc11c\ub3c4": [3, 4, 11, 12, 16, 21, 27, 28, 32, 34, 39], "animate\ud560": 3, "\uc788\uace0": [3, 12, 15, 16, 17, 22, 23, 29, 31, 36, 38, 40, 41, 42], "\uc6b0\uc6d4\uc131\uc744": 3, "histori": 3, "animation\uc740": 3, "sourc": [3, 4, 11, 12, 13, 25, 26, 28, 32, 33, 38], "\uc774\ubbf8\uc9c0\ub85c\ubd80\ud130": [3, 9, 14], "\uc0ac\uc2e4\uc801\uc778": [3, 14], "\ube44\ub514\uc624\ub97c": [3, 13, 14, 21, 29], "animate\ud558\ub294": 3, "\uc791\uc5c5\uc73c\ub85c": 3, "gan\uc744": [3, 14, 15, 25, 26], "\uc2dc\uc791\uc73c\ub85c": 3, "\uc5f0\uad6c\uac00": [3, 5, 16, 17, 31], "\uc9c4\ud589\ub418\uc5b4\uc654\ub2e4": 3, "\uadf8\ub7ec\ub098": [3, 12, 13, 14, 28, 39, 40], "\ub610\ub294": [3, 5, 13, 14, 16, 17, 21, 23, 28, 32], "\ube44\ub514\uc624\ub294": 3, "local": [3, 15, 24, 25, 29], "distort": [3, 12, 28], "blur": [3, 24], "detail": [3, 7, 9, 13, 15, 17, 22, 25, 30], "semant": [3, 4, 9, 17, 24, 28, 29, 32, 41], "inconsist": 3, "instabl": [3, 31], "\ubb38\uc81c\uac00": [3, 12, 17, 27, 29, 32, 36], "\ub110\ub9ac": [3, 14], "\uc0ac\uc6a9\ub418\uae30\uc5d0\ub294": 3, "\uc788\uc5b4\uc654\ub2e4": 3, "\uae30\ubc18": [3, 4, 5, 13, 14, 15, 17, 23, 24, 27, 28, 33], "\uc6b0\uc218\uc131\uc5d0": 3, "task\uc5d0": [3, 5, 7, 19, 20, 28], "\ud65c\uc6a9\ud558\ub824\ub294": [3, 25], "\uc5f0\uad6c\ub4e4\uc774": [3, 8, 18, 25, 31], "\ubcf4\uc600\ub2e4": [3, 14, 18, 21, 24, 25, 39], "dreampos": 3, "23": [3, 10, 32], "04": 3, "\ud655\uc7a5\ud55c": 3, "fashion": 3, "\ud569\uc131\uc744": 3, "\uac00\ub2a5\ud558\ub294\ub370": 3, "\ucd08\uc810\uc744": [3, 28, 42], "\ub9de\ucdc4\ub2e4": 3, "\ubcf8": [3, 4, 6, 9, 11, 12, 14, 17, 20, 21, 27, 30, 33, 34, 37, 39], "clip\uacfc": [3, 14], "feature\ub97c": [3, 15, 22], "\ud1b5\ud569\ud55c": [3, 9], "adpatar": 3, "module\ub97c": 3, "\uc81c\uc548\ud588\ub2e4": [3, 25, 39], "sample\uc5d0": 3, "finetuning\uc774": 3, "\ud544\uc694\ud558\uace0": [3, 14, 22, 23], "\uc6b4\uc6a9": 3, "\ud6a8\uc728\uc774": 3, "\ub5a8\uc5b4\uc9c4\ub2e4": [3, 4, 14, 39], "disco": 3, "07": [3, 18], "\uc218\uc815\ud558\uc5ec": 3, "danc": [3, 13], "\uc9c4\ud589": [3, 4, 11, 13, 22, 25, 33, 34, 37, 40], "controlnet\uc744": [3, 13], "\ud1b5\ud569": [3, 4, 13], "\uad6c\ucd95": [3, 4, 29, 33, 41], "\ubcf4\uc874\uc5d0": [3, 14], "\uc5b4\ub824\uc6c0\uc744": [3, 13, 14, 16, 25, 33], "\uacaa\uace0": [3, 16], "frame\uac04": [3, 13], "jitter": 3, "issu": [3, 33], "\uc874\uc7ac": [3, 13], "\uad00\uc810\uc5d0\uc11c\uc758": 3, "generation\uc5d0": [3, 6, 16], "\uc2dc\uac01\uc801": [3, 9, 14, 22, 24, 28], "\ud488\uc9c8\uacfc": [3, 14, 21], "\ub2e4\uc591\uc131\uc5d0": [3, 28], "\uc9c4\uc804\uc774": 3, "\uc788\uc5b4\uc654\uc9c0\ub9cc": 3, "detail\uc744": [3, 25, 28], "\uc0b4\ub9ac\ub294": 3, "\uac83\uc774": [3, 4, 6, 7, 9, 11, 12, 14, 16, 17, 20, 22, 26, 27, 28, 29, 31, 32, 34, 35, 37, 38, 39, 40, 41, 42], "\uc5b4\ub835\uace0": [3, 4, 13, 14, 32], "\uc815\ud655\ub3c4": [3, 32], "\uce21\uba74\uc5d0\uc11c\ub3c4": 3, "\ubd80\uc815\ud655\ud55c": [3, 12], "\ubd80\ubd84\uc774": [3, 12, 15, 26, 27], "\ub354\uc6b1\uc774": 3, "\uc2e4\uc9c8\uc801": 3, "\uc6c0\uc9c1\uc784\uc744": [3, 14], "\ub2e4\ub8f0": 3, "\uc77c\uad00\uc131": [3, 13], "\uce21\uba74\uc5d0\uc11c": [3, 14, 17, 26], "\uc548\uc815\uc801\uc774\uace0": 3, "\uc5f0\uc18d\uc801\uc778": [3, 14, 29, 39], "\uc601\uc0c1\uc744": [3, 9, 29, 30, 39], "\ub9cc\ub4e4\uc5b4\ub0b4\ub294": 3, "\uc5b4\ub835\ub2e4": [3, 13, 14, 21], "\ud604\uc7ac\ub294": 3, "\uc77c\ubc18\uc131\uacfc": 3, "\ub3d9\uc2dc\uc5d0": [3, 5, 6, 8, 24, 25], "\ub9cc\uc871\ud558\ub294": [3, 12, 39], "\ucc3e\uc744": [3, 28, 30], "\uc5c6\uc5b4": [3, 11, 37, 42], "\uad6c\uc870": [3, 9, 10, 15, 21, 26, 27, 32, 40], "\uc694\uc57d": [3, 14, 21, 27, 30], "consistency\ub97c": [3, 39], "attention\ub97c": 3, "unet\uc73c\ub85c": 3, "\ud558\uc5ec\uae08": 3, "\uc77c\uad00\ub41c": [3, 6, 14, 21, 29], "\uad00\uacc4\uc131\uc744": 3, "\uc885\ud569\uc801\uc73c\ub85c": 3, "\ud568": [3, 4, 11, 12, 13, 20, 21, 22, 27, 28, 30, 33, 34, 37], "controllability\ub97c": [3, 26], "lightweight": 3, "signal\uc744": 3, "denois": [3, 6, 10, 17, 20, 23, 24, 27, 29, 31, 39, 40, 41], "\uc808\ucc28\uc5d0": 3, "\ud1b5\ud569\ud568": 3, "stability\ub97c": 3, "layer": [3, 5, 7, 10, 11, 12, 15, 20, 22, 26, 29, 30, 32, 36, 37, 41], "\uc5f0\uc18d\uc801\uc774\uace0": 3, "motion": [3, 4, 14, 31], "process\uc640": [3, 12, 16], "\uace0\ud574\uc0c1\ub3c4": [3, 5, 21, 22, 24, 27, 32], "qualiti": [3, 7, 10, 22, 25, 29, 31, 33, 34, 36, 37, 39, 42], "\ubcf4\uc874\uc744": [3, 13], "\uad00\uacc4\uc131": 3, "\ud559\uc2b5": [3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42], "5k": [3, 13, 40], "\uc778\ud130\ub137": 3, "\uc138\ud2b8\ub85c": 3, "\uc7a5\uc810": [3, 15, 21], "appearance\uc758": 3, "consistency\uc744": 3, "\ud6a8\uacfc\uc801\uc73c\ub85c": [3, 6, 14, 31, 39], "\uc720\uc9c0": [3, 9, 41], "flickering\uacfc": 3, "\uc5c6\ub294": [3, 5, 12, 13, 14, 24, 25, 32, 34, 35, 37], "\uc2e0\ub8b0\ub3c4\uc758": [3, 22], "image\uc5d0\ub3c4": 3, "\uac00\ub2a5": [3, 4, 8, 11, 13, 15, 16, 22, 34, 40, 41], "benchmark\uc5d0": 3, "\uc6b0\uc218\uc131": 3, "\uc99d\uba85": [3, 4], "t2i": [3, 5, 9, 17, 21, 22, 24], "ldm": [3, 4, 8, 13, 17, 19, 24, 25, 29, 39], "space\uc5d0\uc11c\uc758": [3, 12], "controlnet": [3, 5, 13, 41], "adapt": [3, 14, 15, 17, 20, 26], "mask": [3, 5, 21, 29, 33, 38, 41], "edg": [3, 4, 7, 32, 41], "depth\uc640": 3, "\uc870\uac74\ubd80": [3, 14, 21], "\uc0dd\uc131\uc744": [3, 6, 7, 13, 14, 17, 21, 22, 28, 29, 37, 39], "encod": [3, 4, 5, 9, 13, 15, 16, 19, 21, 33, 35, 36, 37, 38, 41, 42], "ip": [3, 13], "content": [3, 22, 25, 29, 32, 38], "objectstitch": 3, "edit": [3, 4, 15, 16, 17, 22, 23, 28, 30, 41], "\ubc29\ubc95": [3, 4, 5, 9, 14, 30, 34, 36, 37, 39, 43], "tryondiffus": 3, "virtual": 3, "apparel": 3, "try": 3, "on\uc744": 3, "parallel": [3, 12], "u": [3, 4, 11, 12, 13, 14, 19, 21, 30, 31, 35, 37, 40, 41], "t2v": [3, 21], "inter": 3, "frame": [3, 13], "modeling\uc744": 3, "\ub9ce\uc774": [3, 4, 9, 12, 14, 27, 28, 29, 30, 34, 36], "\uc774\ub904\uc9d0": 3, "\uc0bd\uc785\ud55c": 3, "animatediff": [3, 13], "person": [3, 6, 8, 9, 17, 28], "module\uc744": 3, "data\ub85c": [3, 8, 13], "\ud559\uc2b5\uc2dc\ud0a8": [3, 7, 16, 30], "anyone\uc5d0\uc11c\ub294": 3, "modeling\uc5d0": 3, "\ubc1b\uc544": [3, 7, 11, 13, 21, 27, 34], "\ubc29\ubc95\ub860": [3, 20, 21, 39], "i2v": 3, "videocompos": 3, "condit": [3, 4, 5, 8, 9, 11, 15, 18, 21, 22, 23, 27, 29, 30, 31, 34, 35, 38, 39, 41], "latent\uacfc": 3, "nois": [3, 4, 8, 10, 11, 17, 18, 23, 24, 26, 27, 29, 30, 31, 34, 35, 36, 39, 40, 41, 42], "\uac04": [3, 14], "weight": [3, 5, 8, 10, 12, 15, 17, 20, 22, 27, 38, 40, 41], "mix": [3, 10, 15, 27], "videocraft": 3, "textual": [3, 8, 17, 35], "\ud1b5\ud569\ud558\uc5ec": 3, "cross": [3, 8, 13, 14, 15, 17, 22, 24, 25, 35, 37, 41], "attention\uc5d0": [3, 13, 15], "\uc8fc\uc785": [3, 4, 25], "\ubc29\ubc95\ub4e4": 3, "\ubaa8\ub450": [3, 5, 8, 9, 10, 12, 14, 15, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 31, 32, 34, 35, 38, 39, 41], "\uc548\uc815\uc801\uc778": [3, 32], "\uc0ac\ub78c": [3, 13, 14, 21, 24, 32, 37], "\uc0dd\uc131\uc5d0\ub294": [3, 13, 15], "pidm": [3, 14], "lfdm": 3, "leo": 3, "\ubaa9\ud45c": [3, 8, 9, 14, 28, 32], "animation\uc744": 3, "guid": [3, 4, 6, 12, 14, 23, 31, 38], "\ud569\uc131": [3, 14, 27], "eq": [3, 13, 39], "object": [3, 4, 9, 10, 22, 28, 30, 31, 33, 35, 38], "epsilon_": [3, 4, 6, 11, 14, 19, 34, 39, 41], "theta": [3, 4, 6, 7, 11, 12, 14, 16, 17, 19, 20, 31, 33, 34, 35, 36, 39, 40, 41, 42], "unet": [3, 10, 11, 24, 30, 35, 41], "func": 3, "c": [3, 6, 7, 8, 11, 12, 14, 15, 16, 17, 19, 21, 25, 26, 30, 35, 39, 41], "embed": [3, 5, 7, 8, 9, 11, 14, 15, 16, 20, 21, 22, 25, 29, 33, 34, 35, 41], "t": [3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 19, 21, 22, 29, 30, 31, 33, 34, 35, 39, 40, 41], "timestep": [3, 7, 8, 9, 12, 30, 35, 39, 41], "z_t": [3, 9, 12, 19, 39, 40, 41], "vit": [3, 5, 13, 15, 16, 24, 30, 35], "l": [3, 6, 8, 12, 14, 15, 16, 17, 19, 30, 32, 39, 41, 42], "14": [3, 4, 15, 30, 39, 40], "downsampl": [3, 4, 11, 15, 21, 24, 34, 38, 40, 41], "middl": [3, 4, 26, 38, 41], "upsampl": [3, 11, 15, 16, 21, 22, 29, 34, 37, 41], "re": [3, 5, 22], "tran": 3, "block\ubcc4": 3, "2d": [3, 11, 21], "convolut": [3, 15, 18, 22, 26, 29, 32, 33, 41], "self": [3, 5, 7, 10, 11, 15, 17, 20, 21, 22, 26, 31, 36, 37, 39, 41, 42], "attention\ub85c": 3, "\uad6c\uc131": [3, 13, 17, 21, 22], "overview": [3, 9, 12, 13, 31, 42], "3\uac00\uc9c0": [3, 9, 13, 17, 37, 38, 39, 41], "\uc911\uc694": 3, "\uc694\uc18c": [3, 17, 21], "image\ub85c\ubd80\ud130": [3, 16], "character\uc758": 3, "\uc81c\uc5b4\uac00\ub2a5\ud55c": [3, 13], "movements\ub97c": 3, "signal": [3, 9, 10, 40], "\uc5f0\uc18d\uc131\uc744": [3, 15], "relationship": [3, 16, 22], "text\ubcf4\ub2e4": 3, "image\uac00": [3, 12, 16, 32], "level": [3, 9, 12, 22, 23, 24, 26, 29, 41], "\ub0b4\ud3ec\ud568": 3, "encoder\uac00": 3, "encoder\ubcf4\ub2e4": 3, "\uc0ac\uc6a9\ub418\uc5c8\uc9c0\ub9cc": 3, "consistency\uc5d0\ub294": 3, "\uc5ed\ubd80\uc871": 3, "\uc774\uc720": [3, 4, 8, 18], "encoder\ub294": [3, 24, 27, 42], "224x224\uc758": 3, "\uc774\ubbf8\uc9c0\ub4e4\ub85c": 3, "\uad6c\uc131\ub418\uc5b4": [3, 41], "\uc911\uc694\ud55c": [3, 5, 9, 10, 14, 18, 21, 26, 28], "\uc138\ubd80\uc815\ubcf4": 3, "\uc190\uc2e4\uc774": [3, 14, 39], "clip\uc740": [3, 12, 16], "text\uc5d0": [3, 28, 33], "\ub354\uc6b1": [3, 9, 21, 27, 33, 37], "\ubd80\ud569\ud558\uac8c": 3, "\ud6c8\ub828\ub418\uc5b4": [3, 17], "matching\uc5d0": 3, "\uac15\uc870\ub418\uace0": 3, "encoding\uc5d0": [3, 15], "\ubd80\uc871\ud568\uc774": 3, "extract": [3, 11], "network\uc778": [3, 12], "\uace0\uc548": 3, "\uc81c\uc678": 3, "referencenet\uc740": 3, "sd\ub85c": 3, "\ucd08\uae30\ud654\ud558\uace0": 3, "\ub3c5\ub9bd\uc801\uc73c\ub85c": [3, 14, 21, 31], "\uc218\ud589\ud558\uace0": 3, "unet\uacfc": [3, 14], "layer\ub85c": [3, 21], "map": [3, 4, 7, 9, 11, 14, 15, 22, 25, 31, 32, 40, 41, 42], "x_1": [3, 11], "mathcal": [3, 5, 7, 11, 12, 14, 16, 19, 20, 32, 39, 42], "time": [3, 4, 7, 8, 10, 11, 12, 15, 16, 18, 19, 20, 21, 22, 24, 25, 30, 31, 33, 34, 37, 41], "x_2": 3, "\uc8fc\uc5b4\uc84c\uc744": [3, 4, 13, 14, 19, 21, 39], "t\ubc88": 3, "\uacf1\ud574": 3, "w\ucd95\uc5d0": 3, "concat": [3, 8, 9, 24, 29], "attention\uc744": 3, "map\uc758": [3, 15, 25], "\ubc18\uc744": 3, "\uacb0\uacfc\ub85c": [3, 6, 21, 27], "\ubf51\uc74c": [3, 33], "2\uac00\uc9c0": [3, 6, 31, 33, 37], "\uc0ac\uc804": [3, 5, 6, 9, 14, 21, 28, 31, 35, 39], "\ud559\uc2b5\ub41c": [3, 6, 8, 14, 21, 27, 28, 29, 30, 31, 32, 34, 37, 39], "sd\ub97c": [3, 24], "\uc0ac\uc6a9\ud568\uc5d0": 3, "\ucd08\uae30\uac12\uc774": 3, "\uc815\uc758": [3, 4, 10, 18, 40], "\ub41c": [3, 4, 6, 9, 17, 20, 22, 24, 27, 30, 31, 32, 35, 39, 41], "\uc0ac\uc6a9\uac00\ub2a5": 3, "referencenet\uc758": 3, "\uacf5\uc720\ub418\uace0": 3, "\ub124\ud2b8\uc6cc\ud06c": [3, 14, 21, 42], "\uad6c\uc870\ub97c": [3, 5, 7, 14, 19, 26, 32, 33, 35, 37, 41], "\uac00\uc9d0\uc5d0": 3, "unet\uc740": 3, "space\uc5d0": [3, 12, 39], "\uc0c1\uad00\uad00\uacc4\uac00": [3, 27, 40], "\uc788\ub294": [3, 4, 5, 6, 7, 9, 12, 14, 15, 16, 17, 18, 21, 22, 24, 26, 27, 28, 29, 30, 31, 32, 34, 35, 38, 39, 40, 41], "\uc120\ubcc4\uc801\uc73c\ub85c": 3, "\ud559\uc2b5\uc774": [3, 4, 8, 11, 15, 22, 25, 29, 32, 36, 41], "encoder\ub97c": [3, 12, 13, 24], "\uc81c\uacf5\ud568\uc5d0": 3, "\uc2e0\uc18d\ud55c": 3, "\ucd08\uae30\uac12": 3, "\uc124\uc815": [3, 4, 11, 20, 27, 33], "controlnet\uc740": 3, "target": [3, 8, 9, 11, 12, 13, 25, 28, 31, 32, 35, 40], "image\uc640": [3, 8, 12, 16, 32, 33], "\uacf5\uac04\uc801\uc73c\ub85c": [3, 14], "align\ub41c": 3, "\ud65c\uc6a9": [3, 4, 6, 29, 32, 33, 34], "\ubd80\uc801\ud569": 3, "\ubc29\ubc95\uc5d0\uc11c\ub294": 3, "\uacf5\uac04\uc801\uc73c\ub85c\ub294": 3, "\uad00\uacc4\ub418\uc5b4\uc788\uc9c0\ub9cc": 3, "align\ub418\uc9c0": 3, "\ud0c0": [3, 31, 32, 40], "generation\uc5d0\uc11c\ub294": [3, 5], "frame\uc5d0": 3, "denoising\uc744": [3, 12, 18, 23], "\ucd94\ucd9c\ud560": 3, "\ubc88\ub9cc": [3, 17], "\ud544\uc694": [3, 10, 21, 34, 39], "\ud6a8\uacfc": [3, 13, 14, 25, 32, 37], "\ub2e8\uacc4\uc5d0\uc11c": [3, 11, 14, 17, 24, 28], "\uacc4\uc0b0\ub7c9\uc774": [3, 36], "\uc99d\uac00\ud558\uc9c0": 3, "\uc54a\ub294\ub2e4": [3, 12, 14, 21, 28, 29, 34], "robust\ud55c": 3, "\uc785\uc99d\ud574\uc654\uc9c0\ub9cc": 3, "tuning\uc774": [3, 27, 39], "\ud544\uc694\ud588\uc5c8\ub2e4": 3, "\uc800\uc790\ub4e4\uc740": [3, 9, 12, 16, 24, 27, 28, 33, 34, 37], "\ucd94\uac00\uc801\uc778": [3, 7, 8, 11, 14, 15, 16, 19, 20, 23, 26, 28, 31, 39, 41], "\uacc4\uc0b0\ub7c9": 3, "\uc99d\uac00\ub97c": 3, "\ub9c9\uae30\uc704\ud574": 3, "\ud1b5\ud569\ud558\uc9c0": 3, "\uc54a\uace0": [3, 11, 12, 14, 20, 21, 31, 36, 38, 40, 42], "latent\uc640": 3, "\ub3d9\uc77c": [3, 25], "\ud574\uc0c1\ub3c4\ub97c": [3, 24, 26, 29, 38], "align\uc744": 3, "four": 3, "kernel": [3, 15], "stride": [3, 15, 32], "us": [3, 6, 8, 9, 10, 28, 29, 32, 33, 37], "16": [3, 4, 5, 11, 13, 14, 15, 19, 20, 21, 24, 26, 30, 32, 33, 34, 35, 39, 41], "32": [3, 5, 10, 11, 15, 20, 22, 26, 27, 30, 33, 34, 41], "64": [3, 15, 21, 26, 27, 37, 40, 41], "128": [3, 15, 22, 27, 32, 36, 40], "channel": [3, 7, 11, 21, 22, 26, 34, 38, 41], "\ucd08\uae30\ud654": [3, 5, 13, 14, 21], "final": [3, 11, 16], "layer\uc5d0\uc11c": [3, 15], "zero": [3, 5, 9, 16, 20, 21, 22, 27, 33, 37], "\uc774\ubbf8": [3, 8, 32, 37], "\uacf3\uc5d0\uc11c": 3, "\ud1b5\ud569\ud588\uc744": 3, "dependency\uac00": 3, "\uac00\ub2a5\ud568\uc744": 3, "\ub0b4": [3, 9], "block": [3, 15, 32, 34, 36, 41], "\uc548\uc5d0": [3, 25, 37], "attention\uacfc": 3, "\uc21c\uc11c": 3, "reshap": 3, "b": [3, 4, 5, 7, 11, 12, 16, 17, 20, 21, 26, 30, 32, 33, 37, 42], "\uc218\ud589": [3, 4, 9, 13, 14, 22, 28, 33, 36, 39], "residu": [3, 11, 16, 17, 22, 32, 34, 35, 37, 41], "connect": [3, 21, 31, 37], "details\uc5d0": 3, "smooth": 3, "continu": [3, 4, 31, 35, 42], "\ub2e8\uacc4": [3, 6, 11, 14, 36], "\uccab": [3, 4, 6, 7, 12, 14, 22, 24, 26, 32], "\ubc88\uc9f8": [3, 4, 6, 7, 14, 24, 26, 27], "singl": [3, 15, 25, 28, 31, 39, 41], "noise\ub97c": [3, 10, 11, 12, 15, 18, 22, 23, 26, 39], "\uc785\ub825\uc73c\ub85c": [3, 14, 15, 17, 21, 22, 27, 39], "\ubc1b\ub294": [3, 9, 11, 14, 21, 26], "\ud074\ub9bd\uc5d0\uc11c": 3, "\ub79c\ub364\uc73c\ub85c": [3, 14, 15], "\uc120\ud0dd": [3, 11, 21, 33], "\ucd08\uae30": [3, 17, 31], "weight\ub294": [3, 7, 14, 20], "guider\ub294": [3, 13], "decod": [3, 9, 21, 29, 33, 35, 41, 42], "\ub294": [3, 4, 5, 6, 7, 9, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42], "\uadf8\ub300\ub85c": [3, 9, 12, 16, 21, 30, 34, 41], "\ud6c8\ub828\ud55c": 3, "\uc18d": [3, 14], "layer\ub9cc": [3, 20], "\uc785\ub825": [3, 5, 6, 13, 14, 21, 22, 27, 28, 32, 35, 38, 42], "24frame": 3, "10": [3, 4, 8, 11, 13, 17, 18, 22, 23, 24, 27, 29, 30, 31, 32, 34, 36, 39, 40, 41], "second": [3, 9, 31], "long": [3, 11, 13, 35], "\uc778\ud130\ub137\uc5d0\uc11c": [3, 13], "\ub2e4\uc6b4\ub85c\ub4dc": 3, "dwpose": 3, "distil": [3, 15, 34], "whole": 3, "bodi": [3, 13, 41], "idea": [3, 23], "research": [3, 22, 27, 38, 40], "student": [3, 40], "head": [3, 9, 11, 21, 25, 34], "onli": [3, 5, 10, 24, 25, 29, 33], "plug": [3, 13, 41], "plai": [3, 41], "gpu": [3, 13, 14, 15, 20, 39, 41], "nvidia": [3, 14, 35, 41], "a100": [3, 14, 15, 20, 35, 39], "768": [3, 15, 39], "\ud574\uc0c1\ub3c4": [3, 29], "center": [3, 13, 34], "crop": [3, 13], "30": [3, 21, 27, 29, 38], "000": [3, 4, 24, 30, 39], "batch": [3, 5, 8, 13, 20, 21, 22, 32, 35, 36, 40, 41], "size": [3, 5, 13, 15, 20, 22, 24, 26, 32, 36, 37, 38, 40, 41, 42], "learn": [3, 5, 9, 13, 14, 15, 20, 21, 25, 26, 27, 28, 32, 37, 40, 41], "rate": [3, 5, 8, 10, 13, 14, 21, 25, 31, 32, 40, 41], "\uce90\ub9ad\ud130": [3, 17], "skeleton\uc758": 3, "\uae38\uc774\uc5d0": 3, "\uadfc\uc0ac\ud558\uae30": 3, "\uc720\ub3c4\ub41c": [3, 32], "\uae38\uc774": [3, 13, 29], "rescal": [3, 24, 31, 34], "ddim": [3, 4, 9, 16, 27, 28, 39, 40, 41], "sampler": [3, 27, 40], "\uae34": [3, 13, 26, 29], "\uc601\uc0c1": [3, 9, 14, 29], "aggreg": 3, "\ucc44\ud0dd": [3, 8, 34], "evalu": [3, 4, 8, 9, 10, 15, 16, 29, 31, 38], "benchmark": [3, 32, 37, 38], "dataset": [3, 4, 12, 15, 18, 22, 28, 29, 30, 33, 34, 36, 37, 40], "2\uac1c": [3, 11, 14, 22], "ubc": [3, 14], "tik": 3, "tok": 3, "\uc804\uc2e0\uc774": 3, "\ub098\uc624\ub294": [3, 25, 27, 32, 33, 34, 35, 39], "\uc808\ubc18": 3, "\uae38\uc774\uc758": 3, "portrait": [3, 9, 25], "cartoon": 3, "humanoid": 3, "characters\uc5d0": 3, "\uc720\uc0ac\ud55c": [3, 4, 8, 12, 17, 19, 28, 33, 35, 39, 40, 42], "\ubcf4\uc774\ub294": [3, 8, 10, 15, 18, 23, 32, 40], "ssim": 3, "psnr": 3, "lpip": [3, 4, 12, 15, 31], "fvd": [3, 21, 29], "fr\u00e9chet": 3, "distanc": [3, 15, 21, 31, 33], "tabl": [3, 4, 8, 17, 18, 20, 22, 24, 25, 27, 29, 30, 32, 34, 41], "quantit": [3, 4, 16, 39, 41], "500": [3, 8, 14, 27], "videos\ub85c": 3, "\uc57d": [3, 14, 16, 17, 28, 32, 33], "bdmm\uc740": 3, "\uc637\uc758": [3, 14], "\uc783\uc5b4\ubc84\ub9ac\ub294": [3, 25], "\uc0c9\uacfc": 3, "\uc12c\uc138\ud55c": 3, "\uad6c\uc870\uc801": [3, 5, 13], "\uc694\uc18c\uc5d0": 3, "error": [3, 17, 30, 40, 42], "\ubc1c\uc0dd": [3, 20, 29, 35], "\ubc29\ubc95\uc740": [3, 4, 5, 6, 12, 13, 16, 17, 20, 28, 32, 35, 39], "\uc138\ubd80": [3, 17, 21, 28], "\ub0b4\uc6a9\uae4c\uc9c0": 3, "\uc77c\uad00\uc131\uc788\uac8c": [3, 9], "\ubcf4\uc874\ub428": 3, "tiktok": 3, "340": 3, "between": [3, 9, 16, 33, 37, 40], "disco\uc5d0\uc11c\ub294": 3, "foreground": 3, "mask\ub97c": [3, 25], "sam": 3, "\ud65c\uc6a9\ud558\ub294": [3, 28, 29], "pipelin": [3, 34, 37], "\uc5c6\uc774": [3, 5, 8, 10, 11, 16, 17, 21, 22, 24, 25, 27, 28, 30, 31, 32, 33, 34, 37, 39, 41], "\uc790\uccb4\uac00": [3, 6, 18, 28], "subject": [3, 14, 17, 35], "motion\uc73c\ub85c\ubd80\ud130": 3, "\uc804\uacbd\uacfc": 3, "\ubc30\uacbd\uc758": 3, "\uad6c\ubd84": 3, "sequence\uc5d0\uc11c\ub3c4": 3, "\uc2dc\uac01\uc801\uc73c\ub85c": [3, 6, 33], "motion\uc744": 3, "robust": [3, 4, 9, 12, 30, 41], "gen": [3, 35], "image\uc5d0": [3, 11, 12, 16, 28], "\uc678\uad00": [3, 13, 14], "\uc2e0\ub8b0\ub3c4\ub9cc": 3, "\uc5bc\uad74\uc774": 3, "\uc77c\uad00\ub418\uac8c": [3, 6], "\uc720\uc9c0\ub418\ub294": [3, 9], "\ubb38\uc81c\uc5d0": [3, 11], "\ubd09\ucc29\ub41c": 3, "\uc0c1\ud669": 3, "\uc18d\uc5d0\uc11c": 3, "\ub300\ube44": [3, 39], "\uc2dc\uac04\ub3d9\uc548": 3, "apper": 3, "design": [3, 15, 26, 36, 42], "\ud6a8\uacfc\uc131": 3, "\uc99d\uba85\uc744": [3, 12], "encoder\ub9cc": 3, "finetun": [3, 5, 6, 8, 13], "\uc774\ud6c4": [3, 4, 6, 13, 14, 16, 17, 20, 22, 28], "\uacb0\ub860": [3, 27, 30], "referencenet\ub97c": 3, "\uc88b\uc558\ub2e4": [3, 30], "\uac83\uc5d0": [3, 7, 22, 28, 32], "\uac00\ub054": [3, 39], "\uc65c\uace1": 3, "\uce21\uba74\ub9cc": 3, "\ubcf4\uc774\uae30": 3, "\ub54c\ubb38\uc5d0": [3, 7, 9, 11, 13, 14, 15, 17, 20, 22, 26, 27, 31, 32, 35, 36, 39, 40, 41, 42], "\ubcf4\uc774\uc9c0": 3, "\ubd80\ubd84\uc5d0": [3, 6, 15, 26, 27, 31, 42], "\ub300\ud574\uc11c\ub294": [3, 8, 12, 13, 16, 18, 21, 27, 40], "ill": 3, "problem\uc73c\ub85c": 3, "\ubd88\uc548\uc815": 3, "\ud65c\uc6a9\uc5d0": 3, "non": [3, 4, 9, 12, 15, 18, 22, 30, 34, 41], "oper": [3, 21, 31], "effici": [3, 7, 9, 10, 20, 30, 37], "translat": 4, "brownian": [4, 31], "bridg": 4, "cvpr": [4, 8, 15, 18, 19, 22, 26, 35, 38, 43], "2205": [4, 37], "07680": 4, "xuekt98": 4, "seonhoon": [4, 9, 30, 43], "relat": [4, 9, 30, 43], "youtub": [4, 9, 20, 33], "video": [4, 9, 13, 31, 43], "nov": [4, 6, 12, 21, 29, 30, 40], "\uc740": [4, 5, 8, 9, 11, 13, 14, 15, 22, 24, 26, 28, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 41, 42], "\ub3c4\uc785\ud55c": [4, 17, 24], "\ucd5c\ucd08\uc758": [4, 9], "\ubd84\uc57c\uc5d0\uc11c": [4, 10, 15, 17, 18, 25, 36, 39], "\ud55c\uacc4\ub97c": [4, 15, 21, 22, 25, 32], "\uadf9\ubcf5\ud568": 4, "\uc774\ud574\ud558\uae30": 4, "\uc704\ud574\uc11c\ub294": [4, 14, 28, 30, 33, 41], "process": [4, 9, 18, 23, 28, 30, 33, 35, 36, 40, 41], "\uc774\ud574\ud574\uc57c\ud568": 4, "stochast": [4, 9, 10, 16, 23, 31, 36, 39, 40], "\ud574\ub2f9\ud568": 4, "\uc2dc\uac04\uc758": 4, "\ud750\ub984\uc5d0": 4, "\ubd88\ud655\uc2e4\uc131\uc744": 4, "\uac00\uc9c0\uace0": [4, 5, 9, 12, 16, 17, 24, 26, 29, 31, 33, 36, 39, 40, 41, 42], "\ubcc0\ud558\ub294": [4, 12], "\ubcc0\uc218\ub4e4\uc758": 4, "\uc9d1\ud569": 4, "x_t": [4, 9, 11, 12, 16, 19, 30, 31, 34, 39, 41], "\ub098\ud0c0\ub0bc": [4, 32, 39], "\uc788\ub294\ub370": [4, 12, 23, 24, 25, 30, 39, 41, 42], "\uc5ec\uae30\uc11c": [4, 7, 11, 17, 19, 26, 27, 28, 31, 39, 40, 42], "\ubcc0\uc218\ub97c": 4, "\ubcc0\uc218\uac00": 4, "\uad00\ucc30\ub41c": 4, "\uc2dc\uac04\uc744": [4, 9, 14], "\ub098\ud0c0\ub0c4": [4, 11, 27], "discret": [4, 22, 31, 33, 40], "\uad6c\ubd84\ud560": 4, "variabl": [4, 12, 36, 40, 42], "wiener": 4, "\uc18c\uac1c": [4, 8, 9], "\uc720\uccb4\uc758": 4, "\ubbf8\uc18c\uc785\uc790\uac00": 4, "\ubd88\uaddc\uce59\ud558\uac8c": 4, "\uc6b4\ub3d9\ud558\ub294": 4, "\ud604\uc0c1": [4, 15, 35], "\uad74\ub69d\uc5d0\uc11c": 4, "\ud37c\uc838\ub098\uac04": 4, "\uc5f0\uae30": 4, "\uc624\ub978\ucabd\uc73c\ub85c": 4, "90\ub3c4": 4, "\ud68c\uc804\uc2dc\ud0a8": 4, "\uc0ac\uc9c4\uc73c\ub85c\ubd80\ud130": 4, "\uc9c1\uad00\uc801\uc73c\ub85c": 4, "\uc774\ud574\ud574\ubcfc": 4, "\uc5f0\uc18d": [4, 14], "\uc2dc\uac04": [4, 6, 9, 11, 13, 14, 20, 21, 22, 29], "\uacfc\uc815\uc73c\ub85c": [4, 29, 30, 35], "\ubaa8\ub378\ub9c1\ud55c": [4, 33], "w_0": [4, 8, 20], "\uc774\uace0": [4, 9, 12, 36, 39, 41, 42], "max": [4, 6, 20, 39], "1000": [4, 10, 11, 24, 27], "\uc778": [4, 5, 9, 12, 19, 30, 31, 39, 40], "100\ubc88": 4, "w_t": [4, 31, 35], "\ub098\ud0c0\ub0b8\ub2e4": [4, 12, 28], "\uc774\ud574\ud574\ubcf4\uc790": 4, "\uac00\uc815\ud574\ubcf4\uc790": 4, "\uc774\ub77c\uace0": [4, 7, 9, 12, 28, 31], "\ud558\uc790": 4, "\uc27d\uac8c": [4, 24, 26, 28], "\ud558\ub2e4\uace0": 4, "\uc815\uc218": [4, 24], "requir": [4, 20], "\uc774\ub2e4": [4, 11, 12, 20, 22, 30, 34, 39], "\ub9c8\ub2e4": [4, 15, 22, 30, 32, 40, 41], "\ubd80\uc5ec\ub418\uc5b4\uc57c": 4, "\ud55c\ub2e4": [4, 5, 12, 14, 16, 19, 21, 28, 29, 30, 34, 37, 39], "\uac04\uaca9\uacfc": 4, "\ubcc0\ud654\ub7c9\uc774": [4, 8, 40], "\ube44\ub840\ud574\uc57c": 4, "\uc624\ub798": [4, 28], "\uc9c0\ub0ac\uc744\uc218\ub85d": 4, "\ubcc0\ud55c\ub2e4": 4, "notat": [4, 29, 40], "www": [4, 9, 20, 33], "com": [4, 9, 20, 28, 32, 33, 35], "watch": [4, 9, 20, 33], "v": [4, 5, 8, 9, 11, 17, 19, 20, 25, 28, 33, 35, 36, 39, 40, 41], "ld0rxwajpkm": 4, "ab_channel": [4, 9], "finrgb": 4, "delta": [4, 8, 12, 17, 20, 31], "\uac04\uaca9": 4, "\uc0b4\ud3b4\ubcf4\uace0\uc790": 4, "\uac04\uaca9\uc758": 4, "i": [4, 8, 11, 12, 14, 15, 16, 19, 20, 23, 24, 26, 29, 31, 33, 35, 36, 37, 39, 40, 41, 42], "d": [4, 11, 12, 14, 15, 19, 20, 21, 26, 31, 36, 39, 40], "epsilon_t": [4, 12, 16], "sim": [4, 6, 11, 19, 29, 31, 36, 39, 40, 41], "\uc2dc\uc810\uc5d0\uc11c": 4, "\ub2e4\uc74c": [4, 5, 6, 14, 21, 26, 28, 31, 32, 37, 39, 41], "\uac04\uaca9\uae4c\uc9c0": 4, "\uc99d\uac00\ud55c": [4, 27], "\uac12": [4, 15, 31, 33], "w_": [4, 24, 35], "sqrt": [4, 11, 12, 16, 19, 31, 39, 41], "\uc774\ud574": [4, 9, 21], "\ub77c\uace0": [4, 8, 9, 12, 17, 20, 22, 28, 30, 37, 39, 42], "\uc815\uc758\ud574": 4, "\uadfc\uac70\ub97c": 4, "\ucc3e\uc544\ubcf4\uba74": 4, "\ubcc0\uc218": 4, "epsilon": [4, 6, 11, 12, 14, 16, 17, 19, 30, 31, 34, 35, 39, 40, 41], "\ub3c4\uc785\ud568\uc73c\ub85c\uc368": 4, "\ubd80\uc5ec": 4, "\uac04\uaca9\ub3c4": 4, "\uace0\ub824": [4, 34], "\uadf8\ub807\ub2e4\uba74": [4, 9], "\uc65c": [4, 7, 9, 12, 18, 30], "\ud558\ud544": 4, "\uacf1\ud588\uc744\uae4c": 4, "\uac00\uae4c\uc6cc\uc9c8": 4, "\ucc9c\ucc9c\ud788": 4, "\uc218\ub834\ud568": 4, "\ub9cc\uc57d": [4, 27], "\ud558\ub2e4\uba74": 4, "\uc791\uc740": [4, 5, 8, 11, 12, 17, 20, 21, 24, 27, 28, 30, 31, 32, 39], "\ub428": [4, 27, 30, 33], "\ub77c\uba74": 4, "\ub108\ubb34": [4, 12, 16, 18, 21, 24, 25, 33, 39], "\uc791\uc544\uc9d0": 4, "\ucee4\uc9c8": 4, "\ucee4\uc9d0": 4, "\uc8fc\uc758\ud560": 4, "\uc0ac\ud56d": 4, "\uc774\ubbc0\ub85c": [4, 9, 12, 31, 34, 40], "w_1": 4, "\uc11c\ub85c": [4, 6, 9, 12, 26, 30, 32], "\ub3c5\ub9bd\uc778": 4, "\ub9de\uc9c0\ub9cc": 4, "\ub3c5\ub9bd\uc774\ub77c\ub294": 4, "\ub9d0\uc740": [4, 32], "\uc544\ub2d8": 4, "epsilon_0": 4, "var": 4, "\uacf5\ubd84\uc0b0\uc740": 4, "\ud30c\ub780\uc0c9": [4, 27], "\uc810\ub4e4\uc740": 4, "1\ubc88": [4, 32], "\uacb0\uacfc\uc784": 4, "\ubd80\ud130": [4, 5, 12, 16, 22, 33, 40], "\uae4c\uc9c0": [4, 20, 29, 30, 38, 39, 40], "\uc218\ud589\ud558\uba74": 4, "\ub9cc\ud07c": [4, 12, 24, 30, 33], "t_2": [4, 31, 39], "t_1": [4, 31, 39], "ex": [4, 9, 11, 14, 32], "5\ubd84": [4, 35], "10\ubd84\uc73c\ub85c": 4, "\uc9c4\ud589\ud558\uba74": 4, "w_5": 4, "\uc544\ub2d0": 4, "\uc788\uc73c\ub098": [4, 21], "\ubcc0\ud654\ub7c9": 4, "t_": [4, 12, 15, 23, 31, 39], "t_5": 4, "\ub530\ub978\ub2e4": 4, "standard": [4, 10, 15, 26, 30, 31, 32, 40], "\uc2dc\uc810\uacfc": 4, "\uc2dc\uc810\uc758": [4, 10, 14, 34], "\uc54c\uace0": 4, "\uc77c": [4, 9, 36, 39, 40], "\uc810\uc744": [4, 12, 14, 23, 25], "\uc120\ud615\uc73c\ub85c": 4, "\uc5f0\uacb0\ud558\ub294": 4, "\ub2e4\uc74c\uacfc": [4, 6, 7, 9, 12, 14, 16, 17, 19, 26, 28, 31, 32, 35, 36, 39, 40, 41, 42], "\uac19\ub2e4": [4, 12, 16, 28, 34, 37, 39], "\uc774\ud574\ub97c": [4, 12], "probabl": [4, 23, 31], "start": 4, "state": [4, 40, 41], "end": [4, 5, 11, 14, 26], "\uac12\uc5d0": [4, 34, 39], "\ub418\uc5b4": [4, 9, 17, 22, 26, 31, 36, 41], "\uc815\uc758\ub420": 4, "\uc544\ub798\uc758": [4, 7, 9, 14, 19, 24, 32, 37], "\uadf8\ub9bc\uc744": [4, 9, 12, 24, 26, 27, 32], "\uc2dc\uc791\uac12\uacfc": 4, "123": 4, "\ubd84\uc0b0\uc740": 4, "\uc2dc\uc791\ud574\uc11c": [4, 11, 26], "\uc99d\uac00\ud558\ub2e4\uac00": 4, "\ucd5c\ub300\uac00": 4, "\ub418\uc5c8\ub2e4\uac00": 4, "\uc774\ud6c4\ub85c\ub294": 4, "\uac10\uc18c\ud558\uc5ec": 4, "\ub9c8\uc9c0\ub9c9\uc5d4": 4, "\uc218\ub834\ud558\uac8c\ub41c\ub2e4": 4, "w_1000": 4, "100\uac1c\uc758": [4, 14], "\uc0d8\ud50c\ub9c1\ud55c": [4, 31], "abstrcat": 4, "\uae30\uc874\uc758": [4, 7, 9, 12, 14, 21, 23, 27, 32, 39, 41], "\ub4e4\uc740": [4, 9, 37], "\ubcc0\ud658\uc744": 4, "gener": [4, 7, 9, 13, 15, 16, 17, 18, 21, 22, 24, 25, 26, 28, 30, 32, 33, 34, 35, 36, 37, 40, 41, 43], "\ub2e4\ub8f8": 4, "\uc774\ub85c": [4, 17, 37], "\uc778\ud574": [4, 13, 17, 22, 24, 29, 32, 37], "\uc0c1\uc774\ud55c": 4, "\ub3c4\uba54\uc778": [4, 17], "\ubcc0\ud658": [4, 33], "\uc5d0\ub294": [4, 9, 11, 32, 37, 39], "\uc5b4\ub824\uc6c0": [4, 8, 13, 15, 36], "\ub17c\ubb38\uc740": [4, 17, 26, 27, 32, 35], "\uae30\ubc18\ud55c": [4, 5, 10], "\ubaa8\ub378\ub9c1\ud558\ubbc0\ub85c": 4, "bidirect": 4, "\uc784": [4, 30], "\ubcc0\ud658\uc5d0": 4, "\uc811\ubaa9\ud55c": 4, "\ub17c\ubb38\uc784": 4, "\ud6cc\ub96d\ud55c": [4, 30, 33, 37], "\uc2e4\ud5d8\uc801\uc73c\ub85c": [4, 12, 26, 31, 37], "\uc99d\uba85\ud568": [4, 37], "introduct": 4, "i2i": 4, "\ubcc0\ud658\uc5d0\uc11c": 4, "pix2pix": [4, 32], "fideltii": 4, "\ub192\uc558\uc73c\ub098": 4, "output": [4, 5, 7, 9, 11, 13, 15, 20, 29, 31, 32, 33, 35, 38, 40], "\ud559\uc2b5\ud558\uae30": [4, 6, 9, 14], "\ub54c\ubb38": [4, 15, 30, 39], "\uc0dd\uc131\ud615": [4, 9, 36], "\ub9cc\ud07c\uc758": [4, 27], "\uc548\ub098\uc624\uace0": 4, "applic": 4, "\ubcf4\ub2e4": [4, 10, 11, 18, 20, 22, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 40, 41], "\uc2dc\ud0b4\uc73c\ub85c\uc368": 4, "\uc774\ub807\uac8c": [4, 7, 17, 27, 28, 30, 36], "desir": [4, 21], "\ucd94\ub860\ud574\ub0b8\ub2e4\ub294": 4, "\uba85\ub8cc\ud55c": 4, "\uc774\ub860\uc801": 4, "\uadfc\uac70\uac00": 4, "\uc548\ub418\ubbc0\ub85c": 4, "domain": [4, 12, 32, 40], "\uba87\uba87": [4, 12, 16, 18], "\uc5d0\uc11c\ub9cc": 4, "\ud65c\uc6a9\ub420": [4, 9], "inpaint": [4, 22, 31, 38, 41], "super": [4, 10, 11, 15, 21, 26, 27, 29, 31, 32, 36, 38, 41, 42], "space": [4, 6, 9, 14, 15, 17, 21, 22, 24, 28, 29, 31, 33, 35, 40, 41, 42], "\uc218\ud589\ud568\uc73c\ub85c\uc368": 4, "\uac1c\uc120": [4, 15, 18, 27, 34, 41], "\ud558\uae34": 4, "\ud588\uc73c\ub098": 4, "mechan": [4, 8, 21], "multi": [4, 5, 8, 9, 13, 14, 15, 28, 37, 41], "modal": [4, 5, 9, 28, 37], "\uc8fc\uc5b4\uc9c0\ubbc0\ub85c": 4, "\uc81c\uc2dc\ud558\uae30\uac00": 4, "\ud798\ub4e6": 4, "\uc81c\uc548\ud558\ub294": 4, "\uc544\ud0a4\ud14d\uccd0": [4, 9, 30, 33, 34, 37], "\uac04\uc758": [4, 6, 12, 14, 16, 21, 25, 31, 32], "\uac00\uc18d\uc744": 4, "\uc218\ud589\ud568": [4, 21], "work": [4, 9, 30, 43], "\ucc38\uace0": [4, 5, 9, 21, 27, 30], "duffus": 4, "simplifi": 4, "\uc7a0\uae50": 4, "\uc0b4\ud3b4\ubcf4\uba74": [4, 17, 23, 39], "\uac19\uc74c": [4, 28], "\uc0bd\uc785\ub41c": 4, "\ub4dc\ub7ec\ub098": 4, "\uc788\uc9c0": [4, 17, 18, 29], "\uc54a\uc73c\ubbc0\ub85c": 4, "\ub3c4\ub2ec\ud560": 4, "\ubcf4\uc7a5\uc774": 4, "\ub3d9\uc548\uc758": 4, "\ubd84\ud3ec\uac00": [4, 23, 32, 42], "\uc2dd": [4, 14, 34], "\uc55e\uc11c": [4, 31, 32], "\ubcf4\uc558\ub358": 4, "\ubd84\uc0b0\uc744": [4, 27, 37], "\uad6c\ud574\ubcf4\uc790": 4, "\uc2dd\uacfc": [4, 31], "\uc758\ubbf8\uc784\uc744": 4, "\uc54c": [4, 6, 12, 16, 27, 37, 39], "method": [4, 9, 10, 26, 30, 31, 33, 34, 40], "\ud5a5\ud574": 4, "forward": [4, 7, 12, 15, 16, 18, 20, 21, 23, 26, 32, 35, 36, 40, 41, 42], "vqgan": 4, "\uc601\uc0c1\uc758": [4, 39], "total": [4, 41], "\u03b4_t": 4, "\ubd84\uc0b0": [4, 11, 27, 34, 42], "\ub098\ud0c0\ub09c": 4, "\uc0ac\uc6a9\ud558\uac8c": 4, "\ub418\uba74": [4, 29], "\uac00\ub2a5\ud55c": [4, 5, 6, 10, 11, 14, 19, 25, 30, 31, 36, 39, 41], "\ucd5c\ub300": [4, 6, 20, 33], "\ubd84\uc0b0\uac12": 4, "\uc5d0\uc11c\uc758": [4, 15, 29, 30, 31, 40, 41], "\ubd84\uc0b0\uac12\uc778": 4, "\u03b4_": 4, "\ucee4\uc9c0\uba74": 4, "\ubd84\uc0b0\uac12\ub3c4": 4, "\ucee4\uc9c0\ub294\ub370": 4, "\ub2e4\ub8e8\uae30\uc5d0": 4, "\ud07c": [4, 8], "x_0": [4, 11, 12, 14, 16, 39], "\uc774\uba74\uc11c": 4, "\ub3c5\ub9bd\uc77c": 4, "schedul": [4, 11, 18, 22, 30, 31, 32, 34, 35, 40, 41], "\ud574\ubcfc": [4, 35], "\uc815\uc218\uc758": 4, "\ucd5c\ub313\uac12\uc778": 4, "\uc774\ub77c\uba74": [4, 9], "delta_t": 4, "\uadf8\ub9bc\uacfc": [4, 7, 22, 26, 33, 36, 37, 42], "\uac19\uac8c": 4, "\ub41c\ub2e4": [4, 10, 12, 14, 21, 22, 30, 37, 39], "\uc2dc\uac01\ud654\ud55c": 4, "m_t": 4, "overt": 4, "\uc2dc\uc791\ud558\ub294": 4, "\uc5d0\uc11c\ub294": [4, 6, 9, 12, 16, 18, 22, 29, 30, 35, 36, 37], "m_0": 4, "\ud3c9\uade0\uc740": 4, "\ub05d\ub098\ub294": 4, "\ubd84\uc0b0\uc774": [4, 19], "\uc911\uac04": [4, 6, 14, 18, 28, 34], "\uc9c0\uc810\uae4c\uc9c0\ub294": 4, "\uc99d\uac00": [4, 15, 34], "\ud558\ub2e4\uac00": 4, "\uc9c0\uc810\ubd80\ud130": 4, "\uac10\uc18c": 4, "\ubd84\uc0b0\uac12\uc5d0": 4, "\uc758\ud574": [4, 6, 14, 22, 26, 31, 32, 35], "\uacb0\uc815": 4, "\uc2a4\ucf00\uc77c\ub9c1\ud558\ub294": 4, "\ub450\uc5b4": [4, 32], "\uc870\uc808": 4, "\ud560": [4, 5, 6, 7, 9, 11, 12, 14, 17, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 37, 39, 40, 41], "\uc870\uc808\uc744": 4, "\uacc4\uc218": 4, "\ud3ec\ud568\ub41c": 4, "\ub514\ud3f4\ud2b8": 4, "margin": [4, 36, 42], "\ub9cc": [4, 8, 9, 11, 12, 20, 22, 29, 30, 32, 35, 39, 40], "\uc81c\uacf5": [4, 9], "\uc11c\ub294": 4, "transit": 4, "q_": [4, 12, 33, 39, 42], "bb": 4, "x_": [4, 8, 10, 11, 12, 15, 16, 25, 31, 34, 35, 39, 40], "\uc54c\uc544\uc57c\ud568": 4, "\ub54c\uc758": [4, 9, 12, 14, 24, 27], "\uc4f8": [4, 9, 12, 36], "m_ty": 4, "m_": 4, "\uc4f0\ub294": 4, "\uc633\uc74c": 4, "\ud558\uac8c": [4, 5, 9, 15, 24, 29, 30, 34, 36, 38, 40, 41, 42], "\ub300\uccb4": [4, 9, 15, 20], "\ud558\uba74": [4, 7, 9, 15, 27, 30, 32], "\uc720\ub3c4\ub428": 4, "delta_": [4, 11], "\ub300\uc785": 4, "\uad6c\ud558\uba74": 4, "\ub420": [4, 14, 22, 26, 27, 28, 29, 40], "\uc778\ub370": [4, 7], "\uc544": 4, "\ub3c4\uba54\uc778\uc73c\ub85c\ubd80\ud130": 4, "\ub3c4\uba54\uc778\uc73c\ub85c\uc758": 4, "fix": [4, 10, 11, 17], "\uc815\uc758\ud558\ub294\uad6c\ub098": 4, "\ub85c\ubd80\ud130": [4, 5, 6, 7, 9, 16, 21, 31, 32, 35, 36, 40, 41, 42], "\uc2dc\uc791": [4, 7, 21], "\ub9e4": [4, 11, 40, 41], "\uc2a4\ud15d\ub9c8\ub2e4": [4, 24], "\uc870\uae08\uc529": [4, 9, 27], "\uc81c\uac70\ud574\ub098\uac10": 4, "\ub460\uc73c\ub85c\uc368": 4, "\uc790\uccb4\uc5d0\uc11c": 4, "mu_": [4, 11, 12, 16], "\uc608\uce21\ub41c": [4, 14, 17, 22], "\ub178\uc774\uc988": [4, 14, 17, 21, 24, 35], "\ud3c9\uade0\uac12\uc774\uba70": 4, "tild": [4, 11, 12, 14, 15, 17, 18, 29, 39, 40, 42], "\ub178\uc774\uc988\uc758": [4, 29], "\ucc98\ub7fc": [4, 9, 22, 26, 31, 32, 33, 38, 41], "paramet": [4, 7, 10, 11, 17, 20, 25, 31, 33, 35, 37, 39, 40, 41], "\uc2e0\uacbd\ub9dd": [4, 7, 17], "\uc608\uc804": 4, "loss": [4, 7, 10, 15, 17, 18, 19, 22, 23, 25, 30, 31, 33, 34, 35, 36, 39, 42], "\uac19\uc558\uc74c": 4, "\uc774\ub85c\ubd80\ud130": 4, "elbo": [4, 11, 33], "term": [4, 5, 18, 36, 42], "\uace7": [4, 9], "\ubb34\uc2dc\ud560": 4, "\uc138": [4, 5, 6, 9, 24, 26, 29, 32, 35, 40], "\ub418\ubbc0\ub85c": [4, 7], "\ubca0\uc774\uc988": 4, "\uc774\ub860\uacfc": 4, "markov": [4, 10, 11, 36], "chain": [4, 9, 11, 34, 35, 36], "properti": [4, 22, 31, 35], "11": [4, 24, 37, 39], "\ub3c4\ucd9c": 4, "markovian": [4, 11, 12, 22, 34, 40], "\uc131\ub9bd\ub428\uc744": 4, "12": [4, 26, 39], "\uc815\ub9ac\ub428": 4, "\ud1b5\ud569\ud558\uace0": 4, "reparameter": [4, 33, 39], "mu_t": 4, "\ubcc0\ud615\ud560": 4, "\ubcc0\ud615": [4, 21], "\uc608\uce21\ud558\ub294": [4, 5, 11, 12, 16, 17, 22, 29, 39, 40], "\ub178\uc774\uc988\ub97c": [4, 11, 14, 27, 30], "\uc608\uce21\ud558\ub3c4\ub85d": [4, 11, 14, 18, 22, 40], "\ud559\uc2b5\ub428": 4, "\ub0b4\uc6a9\uc744": [4, 6, 9, 13, 17, 21], "\uc2dd\uc5d0": [4, 31, 39], "\uba85\uc2dc\ud558\uae30": 4, "\uba85\uc2dc\ub41c": 4, "\uc368\ubcfc": 4, "combin": [4, 9, 12], "\uc368\ubcf4\ub294": 4, "\uac83\uc784": 4, "\uadf8\ub7f0\ub370": [4, 7, 26], "\ucc38\uace0\ud574\ubcf4\uba74": 4, "\uc6b0\ub9ac\ub294": [4, 9, 42], "\uadfc\uc0ac\ud558\ub3c4\ub85d": 4, "\ud559\uc2b5\uc2dc\ucf1c\uc57c\ud568": 4, "mu": [4, 11, 26, 31, 34, 39, 40, 42], "_t": [4, 12, 14, 31, 39, 41], "\uc815\ub9ac\ub41c": 4, "\ud559\uc2b5\ub418\uc5b4\uc57c\ud558\ub294": 4, "kl": [4, 11, 19, 36, 42], "arg": [4, 30, 35, 42], "min_": [4, 42], "c_": [4, 6, 8, 14, 15, 24, 25, 31, 35, 39], "\ub2e8\uc21c\ud654\ub420": 4, "algorithm": [4, 11, 30, 31], "\uc815\ub9ac": [4, 32], "\ub9c8\uce58": [4, 9], "\uadf8\ub7ec\ud588\ub4ef\uc774": 4, "\ube60\uc9c4": 4, "acceler": [4, 10, 34, 35], "\uac00\uc18d\uc2dc\ud0ac": 4, "\uae38\uc774\ub97c": [4, 21], "\ub450\uc5c8\uc744": 4, "varibal": 4, "subset": [4, 14], "\uc815\uc758\ub428": 4, "\uac12\uc758": [4, 14, 18, 39], "\ub450\uc5c8\uc74c": 4, "experi": [4, 43], "setup": [4, 23], "\ud558\uc774\ud37c\ub9c8\ub77c\ubbf8\ud130": 4, "\ud504\ub808\uc784\uc6cc\ud06c\ub294": 4, "\uc774\ub8e8\uc5b4\uc9d0": 4, "\uc0ac\uc6a9\ub41c": [4, 5, 6, 14, 32, 40], "\uac83\uacfc": [4, 7, 14, 16, 28, 38, 40], "stage": [4, 9, 13, 41], "fid": [4, 5, 9, 11, 16, 18, 19, 22, 24, 26, 31, 33, 34, 37, 39, 40, 41], "\uc0dd\uc131\ubb3c\uc758": [4, 6], "\ud3c9\uac00\ud558\uae30": [4, 9, 21, 27], "5\uac1c\uc758": [4, 6, 14, 15, 28], "\uc0d8\ud50c\uc744": [4, 5, 16, 17, 21, 28, 32, 42], "\ud53d\uc140": [4, 14, 15, 22, 24, 31, 37], "\ub9c8\ub2e4\uc758": 4, "\ud45c\uc900\ud3b8\ucc28\uc758": 4, "\ud3c9\uade0\uc744": [4, 5], "\uad6c\ud568": 4, "\ub370\uc774\ud130\uc14b\uc5d0": [4, 14, 27, 31, 39, 40, 42], "\ub300\ud574\uc11c": [4, 9, 14, 16, 17, 19, 21, 26, 27, 28, 30, 31, 32, 35, 36, 40], "\ud3c9\uade0": [4, 5, 6, 11, 13, 21, 35, 42], "\ub0c4": [4, 22, 33], "\ub2a5\ub825\uc744": [4, 5, 6, 7, 9, 17, 27, 28, 29, 30], "\uc2e4\ud5d8\ud568": 4, "\ub2a5\ub825": [4, 9], "celebamask": 4, "hq": [4, 12, 17], "layout": [4, 19], "\uc8fc\uace0": [4, 13, 16], "photorealist": [4, 9, 16, 21, 27, 37], "\uc0dd\uc131\ud574\ub0b4\ub294": [4, 8, 9, 18, 23], "\ud3c9\uac00": [4, 5, 8, 21, 22, 23, 29, 35], "sketch": [4, 41], "edges2sho": 4, "edges2handbag": 4, "realist": [4, 23, 38], "transfer": [4, 20, 25, 28, 32, 35], "faces2com": 4, "\uc2e4\ud5d8\uc740": [4, 9], "\ud3c9\uac00\ud588\ub2e4\uba74": 4, "\uc2e4\ud5d8\uc5d0\uc11c\ub294": [4, 21], "qualit": [4, 8, 17, 33, 39, 41], "comparison": [4, 9, 16, 20, 23, 25, 34, 35, 37, 40], "\ucd94\ub860": [4, 9, 14, 30, 31, 33, 39], "\uc9c0\ub3c4": [4, 32], "\ubc29\uc2dd\uc73c\ub85c": [4, 6, 9, 11, 12, 17, 20, 22, 25, 29, 31, 34, 36, 39], "\ud559\uc2b5\ud558\ubbc0\ub85c": 4, "\uad1c\ucc2e\uc740": [4, 28], "cyclegan": 4, "\uc2a4\ucf00\uc77c\uc758": 4, "\ub370\uc774\ud130\uc14b": [4, 9, 14, 20, 21, 29, 30, 31, 33, 37, 38, 40, 41], "\ub5a8\uc5b4\uc9d0": 4, "drit": 4, "\ubaa8\ub378\ub4e4": [4, 37], "\ub0c8\uc73c\ub098": 4, "\ubcc0\ud658\ub41c": 4, "oversmooth": 4, "\uc788\uc5c8\uace0": [4, 32], "ground": [4, 11, 13, 14, 22, 31, 32, 36], "truth": [4, 11, 14, 22, 31, 32, 36], "\uacfc\ub294": 4, "\uac70\ub9ac\uac00": [4, 32, 39], "\uba40\uc5c8\uc74c": 4, "cde": 4, "\ubaa8\ub378\ub4e4\ubcf4\ub2e4\ub294": 4, "\uc131\ub2a5": [4, 8, 9, 14, 15, 20, 27, 30, 31, 32, 33, 34, 35, 36, 39, 40, 41], "\uc601\ud5a5": [4, 34], "\ubc1b\uc74c": [4, 37], "\uc904": [4, 12, 16, 24, 32, 34, 37], "rregular": 4, "occlus": [4, 14], "\ub098\ud0c0\ub098\ub294\ub370": 4, "\uc9c1\uc811\uc801\uc778": [4, 36], "\ud558\ubbc0\ub85c": [4, 11, 12, 42], "\ubb38\uc81c\ub85c\ubd80\ud130": 4, "\uc790\uc720\ub85c\uc6c0": 4, "\ud2b9\uc131\uc73c\ub85c": 4, "\uc0dd\uc131\ud574\ub0c4": 4, "\uc2e4\ud5d8\uc5d0\uc11c": [4, 16, 32, 42], "\uae30\ub85d\ud588\uc73c\uba70": 4, "\uae30\ub85d\ud568": [4, 33], "\uc131\ub2a5\uc740": [4, 14, 18, 27, 30], "\ub6f0\uc5b4\ub0a8": 4, "\uc810\uc218\uac00": [4, 5, 33, 37], "\ub6f0\uc5b4\ub0ac\uc74c": 4, "\ud558\uae30": [4, 6, 11, 14, 17, 29, 31, 33, 35, 39, 40, 41, 42], "\uc2e4\ud5d8\ud588\uc74c": 4, "\uc5d0\uc11c\ub3c4": [4, 32, 35], "campar": 4, "\uae30": 4, "\ub85d\ud568": 4, "\uc0c9\uc0c1\ud654": 4, "\ub4f1\uc758": [4, 11, 14, 17, 28, 31, 32, 39, 40], "ablat": [4, 8, 17, 25, 34, 40], "studi": [4, 6, 8, 17, 25, 40], "pre": [4, 17, 20, 23, 25, 28, 29, 32, 35, 39, 41], "factor": 4, "\ud588\uc74c": [4, 34], "\ub450\uace0": [4, 15, 18], "down": [4, 11, 15, 41], "\uc791\uc744": [4, 41], "\uc774\ud558": [4, 24], "\uc870\uae08\ub9cc": 4, "\ub298\ub824\ub3c4": 4, "\ud06c\uac8c": [4, 6, 14, 17, 23, 27, 28, 30, 32, 36, 38, 39, 40, 41, 42], "\uc774\uc0c1\uc758": [4, 14, 27, 31], "\ud0a4\uc6cc\ub3c4": 4, "\ubcc0\ud654\uac00": [4, 12, 29, 32, 37], "\ubbf8\ubbf8\ud568": 4, "maximum": [4, 5], "varianc": [4, 10, 11, 12, 16, 27, 31, 40, 42], "\uacc4\uc218\uc5d0": 4, "\ub418\uc5c8\uc74c": 4, "\uac83\ucc98\ub7fc": [4, 32], "scale": [4, 5, 8, 9, 12, 13, 16, 20, 22, 26, 34, 37, 41], "\ud568\uc73c\ub85c\uc368": [4, 28, 38], "conclus": 4, "futur": 4, "\uc0c8\ub85c\uc6b4": [4, 5, 6, 8, 12, 13, 14, 17, 21, 23, 24, 26, 27, 28, 29, 32, 34, 35, 36, 37, 38, 39, 40, 42], "\ubc29\ubc95\uacfc": [4, 14, 16, 24, 27, 36], "\ub2ec\ub9ac": [4, 14, 16, 23, 27, 36, 42], "\uc2e4\ud5d8\uc744": [4, 6, 9, 12, 16, 19, 40], "\uc5d0\ub3c4": [4, 31], "\uc801\uc6a9\ud574\ubcfc": 4, "\uc608\uc815": 4, "\uc790\ub8cc": [4, 32], "sine": 4, "qua": 4, "none": [4, 7, 11, 21, 26, 30, 41], "tistori": [4, 28], "158": 4, "autoregress": [5, 22, 36], "scontent": 5, "gmp1": 5, "xx": 5, "fbcdn": 5, "t39": 5, "2365": 5, "358725877_789390529544546_1176484804732743296_n": 5, "_nc_cat": 5, "108": 5, "ccb": 5, "_nc_sid": 5, "3c67a6": 5, "_nc_ohc": 5, "plfu_ur_vyaax_nagu8": 5, "_nc_ht": 5, "oh": 5, "00_afdrhahxv1pcf0lqicjiynmorpvcgeq0emv5_ve2_tncvg": 5, "oe": 5, "652ff632": 5, "jun": [5, 22, 24, 29], "hyoung": [5, 22, 24, 29], "lee": [5, 22, 24, 29, 32, 36, 42, 43], "oct": [5, 16, 17, 23, 27, 41], "\ubcf5\uc7a1\ud558\uac8c": 5, "\uad6c\uc131\ub41c": [5, 14, 21, 41, 42], "\uac1d\uccb4": [5, 9, 38], "\uc190": 5, "\uc0dd\uc131\ud55c\ub2e4": [5, 14, 21, 24, 29], "\ud14d\uc2a4\ud2b8\uc640": [5, 9, 14, 16, 17, 21, 28], "\ub458": [5, 12, 16], "\ub2e4": [5, 12, 14], "\uac00\uc9c4": [5, 16, 18, 24, 25, 27, 28, 31, 32, 33, 35, 41, 42], "\uac80\uc0c9": 5, "\uc99d\uac15": 5, "\ud1a0\ud070": 5, "\ub514\ucf54\ub354": [5, 6, 14], "\uc804\uc6a9": [5, 37], "\uba40\ud2f0": [5, 14], "\ubaa8\ub2ec": 5, "\ubaa8\ub378\uc774\ub2e4": [5, 14, 16, 24, 39], "cm3": 5, "\uc544\ud0a4\ud14d\ucc98\ub97c": [5, 14, 24], "\uc0ac\uc6a9\ud558\uba70": [5, 12], "\uc2a4\ud0c0\uc77c": [5, 6, 14, 32], "\ub370\uc774\ud130\uc5d0": [5, 21, 24, 26, 27, 39], "tun": 5, "\uac00\uc84c\ub2e4": 5, "\ub9de\ub3c4\ub85d": [5, 24], "\ud559\uc2b5\ud588\ub2e4": [5, 24, 29], "larg": [5, 8, 27, 30, 41], "scale\uc758": [5, 15], "\ub2e8\uacc4\ub97c": [5, 12, 17, 24, 36], "\ud3ec\ud568\ud55c\ub2e4": [5, 24], "\ub370\uc774\ud130\ub294": [5, 21], "\ub77c\uc774\uc13c\uc2a4\uac00": 5, "shutterstock\uc758": 5, "scale\ub85c": 5, "\ud559\uc2b5\ud55c\ub2e4": [5, 11, 12, 14, 21, 24, 29, 30, 39], "sft": 5, "\ub2e8\uacc4\ub85c": [5, 6, 14], "\uc9c4\ud589\ud588\ub2e4": [5, 29, 39], "\uc785\ub825\uacfc": 5, "\ucd9c\ub825": [5, 14, 31, 32], "\ud1a0\ud070\uc744": [5, 6, 14, 22, 28], "\uc11e\uc744": 5, "\ud504\ub86c\ud504\ud2b8\uc5d0": [5, 6], "\ub9de\ub294": [5, 6, 21, 22, 32, 35], "\uc0dd\uc131\ud558\ub294\ub370": [5, 6, 41], "cm3leon\uc740": 5, "output\uc744": [5, 7, 16, 24], "contain": 5, "\uc18c\uac1c\ud55c\ub2e4": [5, 12, 14, 16, 21, 24], "iamg": 5, "segmentation\uae4c\uc9c0": 5, "\uac00\ub2a5\ud558\ub2e4": [5, 10, 11, 13, 15, 23, 25, 29, 34], "3\uc5b5": 5, "\uac1c\uc758": [5, 14, 17, 20, 21, 22, 24, 26, 28, 29, 30, 31, 32, 33, 35], "\ud1a0\ud070\uc73c\ub85c": [5, 22, 33], "\ud559\uc2b5\ud588\ub294\ub370": 5, "generation\ub3c4": 5, "\uc218\ud589\ud55c\ub2e4": [5, 30, 39], "5\ubc30\ub85c": 5, "\uc904\uc600\ub2e4": 5, "shot": [5, 9, 16, 21, 22, 25, 27, 33, 37], "coco\ub85c": [5, 37], "fid\ub97c": [5, 10], "\uce21\uc815\ud55c": 5, "88": [5, 22], "\uc810\uc73c\ub85c": 5, "google\uc758": 5, "parti": 5, "\uc131\ub2a5\uacfc": [5, 23, 27], "\uc218\uc900\uc744": 5, "\ub2ec\uc131\ud588\ub2e4": [5, 39], "ra": 5, "cm3\ub97c": 5, "\ub3c4\uba54\uc778\uc5d0\uc11c": [5, 6], "\uc7a0\uc7ac\ub825\uc744": [5, 39], "\uc5f0\uad6c\ud588\ub2e4": 5, "gafni\uc758": 5, "tokenizer\ub97c": [5, 28], "\uc0ac\uc6a9\ud588\ub2e4": [5, 14, 24, 29, 39], "tokenizer\ub294": 5, "256x256": [5, 13, 16, 21, 22, 24, 27, 31, 38, 39], "8192\uac1c\uc758": 5, "vocabulary\uc5d0\uc11c": 5, "1024\uac1c\uc758": 5, "\uc778\ucf54\ub529\uc744": 5, "\uc9c4\ud589\ud55c\ub2e4": [5, 12, 29, 30], "\ud14d\uc2a4\ud2b8\uc5d0\uc11c\ub294": 5, "zhang\uc758": 5, "\ucee4\uc2a4\ud140": 5, "56320": 5, "vocabulari": 5, "\uc2a4\ud398\uc15c\ud55c": 5, "\ud1a0\ud070\uc778": 5, "break": 5, "figure_8_9": 5, "modality\uac04": 5, "transition\uc744": 5, "\ubaa9\uc801": [5, 14], "sequence\uc5d0": 5, "\ub9de\ucdb0": [5, 16, 33], "\uad00\ub828\uc131\uc774": 5, "\ubb38\uc11c": 5, "memori": [5, 20, 33, 37], "bank": 5, "\uac80\uc0c9\ud558\ub294": 5, "\uac83\uc774\ub2e4": [5, 12, 16, 21, 23, 30, 39], "dens": [5, 14, 20], "strategy\uc744": 5, "\ud3ec\ud568\ud558\uace0": [5, 29, 30], "\ucffc\ub9ac": 5, "\uc608": [5, 14], "m": [5, 9, 10, 11, 14, 15, 19, 25], "\ud6c4\ubcf4": 5, "\uad00\ub828\uc131": [5, 6], "\uc810\uc218": [5, 37], "return": [5, 7, 8, 10, 11, 20, 21, 26, 30, 36, 41, 42], "\ud574\uc900\ub2e4": [5, 34], "retriv": 5, "\uae30\ubc18\uc778": 5, "bi": 5, "\ub530\ub790\ub2e4": 5, "karpukhin": 5, "\ubb38\uc11c\ub97c": 5, "\ud30c\ud2b8\ub85c": [5, 15], "\ubd84\ub9ac\ud558\uace0": 5, "\uc778\ucf54\ub354": [5, 6, 14], "\ubb38\uc11c\uc758": 5, "vector": [5, 9, 15, 19, 22, 26, 28, 33, 35], "representation\ub85c\uc368": 5, "\uac1c\ub97c": [5, 29], "\ub0b8\ub2e4": [5, 21, 28], "\ucd5c\uc885": [5, 11, 14, 15, 21, 24, 30, 41], "\uac80\uc0c9\uc740": 5, "\uc810\uc218\uc5d0": [5, 37], "\uc815\ub82c\ub41c": [5, 14, 29], "\ubaa9\ub85d\uc744": 5, "\uc5bb\uae30": 5, "inner": [5, 20], "product": [5, 9], "search\ub85c": 5, "generator\ub97c": [5, 15, 26, 36], "\uc720\uc6a9\ud55c": [5, 14], "\ucd94\ucd9c\ud558\uae30": 5, "\uac00\uc9c0": [5, 6, 7, 9, 14, 17, 24, 26, 28, 29, 31, 32, 35, 40], "\uc694\uc18c\ub97c": [5, 17, 21, 27], "\uace0\ub824\ud588\ub2e4": 5, "relev": [5, 10], "\uac80\uc0c9\ub41c": 5, "\ubb38\uc11c\ub294": 5, "\uad00\ub828\uc788\uc5b4\uc57c": 5, "\uc810\uc218\ub97c": [5, 9, 16, 33, 37], "\uc0ac\uc6a9\ud55c\ub2e4": [5, 12, 14, 16, 21, 24, 39], "\ud14d\uc2a4\ud2b8\ub85c": [5, 7], "\ubb38\uc11c\ub85c": 5, "\ub2e4\uc591\uc131\uc740": 5, "\ubb38\uc11c\uc5d0\uc11c": 5, "\uc911\ubcf5\uc131\uc744": 5, "\ud53c\ud558\uae30": 5, "\ud544\uc218\uc801\uc778": 5, "\uc808\ucc28\ub2e4": 5, "\ub2e8\uc21c\ud558\uac8c": 5, "\uae30\ubc18\ud574": [5, 20], "top": [5, 6, 9, 24, 30], "\ubb38\uc11c\ub9cc": 5, "\uac00\uc838\uc628\ub2e4\uba74": 5, "\uc911\ubcf5\uc774": 5, "downstream": [5, 20], "\uc548\uc88b\uc740": 5, "\ub07c\uce60": 5, "\uc774\ud558\ub85c": 5, "queri": [5, 8, 13, 19, 20, 28], "dropout": [5, 14], "\uac80\uc0c9\uc5d0": 5, "\ucffc\ub9ac\uc758": 5, "\uc0ad\uc81c": [5, 11], "\uc801\uc6a9\ud588\ub2e4": [5, 29], "\ub2e4\uc591\uc131\uacfc": [5, 27], "\uc815\uaddc\ud654\ub97c": [5, 26], "\uc2dc\ucf30\ub2e4": [5, 24], "\ud14d\uc2a4\ud2b8\ub97c": [5, 9, 14, 21, 26, 27, 28], "\uac80\uc0c9\ud55c\ub2e4": 5, "\ud559\uc2b5\uc5d0\uc11c\ub294": 5, "\ucea1\uc158": [5, 16], "\uc30d\uc5d0": [5, 6, 14, 31], "\uc0d8\ud50c": [5, 9, 14, 19, 21, 26, 27], "3\uac1c\ub97c": 5, "\ubb34\uc791\uc704\ub85c": [5, 21, 28], "\uc120\ud0dd\ud55c\ub2e4": 5, "\uc0ac\uc2e4\uc0c1": [5, 40], "\ud559\uc2b5\uc5d0\uc11c": [5, 14], "\uc0ac\uc6a9\ud560": [5, 7, 13, 14, 15, 16, 20, 21, 22, 27, 29, 39, 42], "\uc218\uc758": [5, 30], "4\ubc30\uc774\ub2e4": 5, "chameleon": 5, "\ubcc0\ud615\uc2dc\ucf1c": 5, "infil": 5, "\ud45c\ud604\ud55c\ub2e4": 5, "\ucd94\uac00\ub418\uc5c8\uace0": 5, "\ub2e8\uc5b4\uc758": 5, "\uc7ac\ubc30\uce58\uac00": 5, "\uc9c4\ud589\ub410\ub2e4": 5, "\ud559\uc2b5\uc5d0\ub294": 5, "\ub2e4\uc6a9\ub3c4": 5, "\uac00\uc838\uc654\ub2e4": [5, 24, 29], "cm3\uac00": 5, "\ud504\ub86c\ud504\ud2b8\ub85c": [5, 21, 27], "cm3\ub294": 5, "\ud504\ub86c\ud504\ud2b8\ub97c": [5, 6, 17, 21, 22, 24, 27], "\ud65c\uc6a9\ud55c\ub2e4": 5, "\ub514\ucf54\ub354\ub9cc": 5, "\uc544\ud0a4\ud14d\uccd0\ub97c": [5, 9, 31, 40], "zhang\uc5d0": 5, "bia": [5, 9, 11, 21, 31], "norm\uc758": 5, "\ud30c\ub77c\ubbf8\ud130\ub97c": [5, 17, 20, 24, 27], "\uc81c\uac70\ud588\ub2e4": [5, 24], "length\ub97c": [5, 12, 13], "2048": [5, 29, 40], "4096\uae4c\uc9c0": 5, "\ud655\uc7a5\ud588\ub2e4": 5, "\ud45c\uc900": [5, 14, 32], "\ud3b8\ucc28": 5, "006": 5, "truncat": [5, 15, 40], "3\uc73c\ub85c": [5, 37], "\uc798\ub9b0": [5, 24], "0\uc73c\ub85c": [5, 7, 12, 14, 27, 34, 38], "0\uc5d0": [5, 12], "0002\ub85c": 5, "posit": [5, 11, 15, 16, 21, 22, 25], "\ucd08\uae30\ud654\ud55c\ub2e4": [5, 14], "metaseq": 5, "\ud559\uc2b5\ub410\ub2e4": 5, "\uc0ac\uc774\uc988": [5, 29], "350m": 5, "760m": 5, "7b": 5, "4t": [5, 29], "trillion": 5, "9t": 5, "\uc8fc\uc694\ud55c": [5, 17, 29], "\ud558\uc774\ud37c": 5, "\ud30c\ub77c\ubbf8\ud130\ub294": [5, 41], "size\ub85c": 5, "\uba40\ud2f0\ubaa8\ub2ec": 5, "\ub9de\uac8c": [5, 9, 12, 14, 16, 20, 22, 24, 27], "\uc124\uc815\ud588\ub2e4": 5, "perplex": 5, "ppl": [5, 35], "\uc5b8\uc5b4": [5, 30], "\ud558\ub098\uc774\ub2e4": 5, "\ud5f7\uac08\ub9ac\ub294": 5, "\ub0ae\uc744": [5, 7], "\uc218\ub85d": 5, "\uc88b\ub2e4": [5, 9, 20, 34], "\ubaa8\ub378\uc5d0\uc11c": [5, 21, 24, 27, 28, 30, 34, 37, 40], "\uc54c\uace0\ub9ac\uc998\uc5d0": 5, "\uc9c4\ud589\ub418\uc5b4": [5, 22, 31], "\uc654\ub2e4": [5, 14, 18], "dall": [5, 15, 16, 17, 22, 35, 37, 38, 39], "e\ub294": [5, 33], "\uc544\uc6c3\ud48b\uc758": 5, "\ud5a5\uc0c1\ub418\ub294": [5, 27], "\uc0d8\ud50c\ub9c1\uacfc": 5, "512\uac1c": [5, 33], "\uc804\ub7b5\uc744": [5, 14, 17, 21], "\ucc44\ud0dd\ud588\ub2e4": 5, "make": [5, 20, 29], "scene": [5, 9, 29, 38], "guidance\ub85c": 5, "ranking\uc5d0": 5, "\uc624\uc9c1": [5, 6], "\uc0d8\ud50c\ub9cc": 5, "\ud544\uc694\ud558\uac8c": 5, "\ub428\uc73c\ub85c\uc368": [5, 38], "\ud6c4\ubcf4\uc758": 5, "\uc218\ub97c": [5, 14, 21, 24, 29, 33], "\ud655\ub960\uc801": 5, "\uae30\uc220\ub85c": [5, 28], "\uc0ac\uc6a9\ub41c\ub2e4": [5, 11, 14, 24], "\uc0d8\ud50c\ub9c1\uc5d0\uc11c": 5, "softmax\uc758": 5, "temperature\ub97c": 5, "\uc218\uc815\ud574": [5, 9], "\uc608\uce21": [5, 9, 10, 11, 14, 17, 22, 33, 39], "\ubb34\uc791\uc704\uc131\uc744": 5, "\uc81c\uc5b4\ud55c\ub2e4": 5, "nucleu": 5, "\uc0d8\ud50c\ub9c1\uc73c\ub85c\ub3c4": 5, "\ubd88\ub9ac\uace0": 5, "\ubbf8\ub9ac": [5, 14, 28], "\uc815\uc758\ud55c": [5, 18, 31], "\uc784\uacc4\uac12\uc744": [5, 37], "\ucd08\uacfc\ud558\ub294": 5, "\ub204\uc801": 5, "\uc0c1\uc704": 5, "\uc138\ud2b8\uc5d0\uc11c": [5, 21], "\uc0d8\ud50c\ub9c1\uc744": [5, 27, 36], "begin": [5, 11, 14, 41], "align": [5, 8, 11, 14, 22, 27, 28, 29, 37, 38, 41], "operatornam": 5, "logit": [5, 22], "_": [5, 6, 7, 12, 14, 15, 17, 19, 20, 21, 26, 30, 31, 32, 35, 36, 39, 40, 41, 42], "cond": [5, 24], "t_y": 5, "mid": [5, 11, 20, 23], "t_x": 5, "uncond": 5, "bf": [5, 34], "mathrm": [5, 11, 12, 14], "cf": [5, 21], "alpha_c": [5, 13], "cdot": [5, 12, 14, 19, 31, 36, 39, 41], "cfg\ub294": [5, 39], "uncondit": [5, 11, 15, 16, 22, 34, 39, 40], "\uc0d8\ud50c\uc5d0": [5, 21, 24, 27, 31], "\uc758\ubbf8\ud55c\ub2e4": [5, 12, 23, 39], "text\ub97c": [5, 16, 33], "\ubaa9\ud45c\uc758": 5, "\ub9c8\uc2a4\ud06c": [5, 16, 21, 22], "\ub300\uccb4\ud55c\ub2e4": 5, "\ubaa9\ud45c\ub97c": [5, 14], "\ud559\uc2b5\uc758": [5, 15, 31, 32, 39], "\ud575\uc2ec": [5, 14, 17, 21, 23, 27, 30, 34], "\uc774\uc810": [5, 15], "\ud558\ub098\uc774\uba70": 5, "guidance\ub97c": [5, 13, 14, 16, 34, 37], "\uc218\ud589\ud560": [5, 9, 30, 31], "\ucd94\ub860\uc5d0\uc11c\ub294": 5, "stream\uc744": 5, "\ud14d\uc2a4\ud2b8\uc5d0": [5, 9, 14], "\ub2ec\ub77c\uc9c0\ub294": [5, 35], "stream\uacfc": 5, "\ud1a0\ud070\uc5d0": [5, 22], "condition\ub41c": 5, "stream": 5, "cfg\uc5d0\uc11c": 5, "logit\uc758": [5, 15], "\ube84\uc148": 5, "\uc5f0\uc0b0\uc774": [5, 19, 39], "\ud14d\uc2a4\ud2b8\uc5d0\uc11c": [5, 17, 21], "\ubc29\ubc95\uc758": [5, 6, 28], "probability\ub97c": 5, "\ube84\uc148\ud558\ub294": 5, "\uc5f0\uc0b0\uacfc": 5, "\ube44\uc2b7\ud558\ub2e4": [5, 24], "ms": [5, 15, 16, 33, 37], "coco": [5, 16, 22, 33, 37, 41], "30k": 5, "\uce21\uc815\ud588\ub2e4": [5, 30], "\ud6a8\uc728\uc131\uc774": 5, "\ucd94\ub860\uc5d0\uc11c": 5, "1\uac1c": [5, 33], "2\uac1c\ub85c": 5, "\uc608\uc81c\ub85c": 5, "\ub3d9\uc791\ud560": [5, 27], "\uc6b0\uc218\ud55c": [5, 10, 14, 17, 21, 24, 32, 33], "\uae30\ub85d\ud588\ub2e4": [5, 25], "\uace0\ud488\uc9c8": [5, 9, 13, 14, 17, 24], "\ud655\uc7a5\uc2dc\ud0a4\ub294": 5, "\uac80\uc0c9\uc758": 5, "\uc911\uc694\uc131\uc744": [5, 17, 32], "figure5": 5, "llm\uc5d0\uc11c": 5, "\ub2e8\uacc4\uc774\ub2e4": 5, "\uba85\ub839\uc5b4": 5, "\uc774\ud574\ud558\ub294": 5, "\ub3c4\uc640\uc8fc\uba70": 5, "task\uc5d0\uc11c\ub3c4": 5, "\uc5bb\uc5c8\ub2e4": [5, 24], "\ud29c\ub2dd\uc774": 5, "\ub208\uc5d0": [5, 14], "\ub744\uac8c": [5, 14], "\uc99d\ud3ed\uc2dc\ud0a4\ub294": 5, "\ubc1c\uacac\ud588\ub2e4": 5, "cm3leon\uc744": 5, "task\ub97c": [5, 20, 23, 28, 33, 39], "\uc11e\uc5b4": 5, "\ub113\uc740": 5, "\ubc94\uc704\uc5d0\uc11c": 5, "\ud588\ub2e4": [5, 24, 29, 30, 39], "\uacfc\uc815\uc740": [5, 42], "\ub530\ub974\uba70": 5, "instruction\uacfc": 5, "\ucd9c\ub825\uc744": [5, 14], "\uacb0\ud569\ud574": 5, "objective\ub97c": [5, 20, 28], "figure6": 5, "initi": [5, 20, 31], "image\ub97c": [5, 8, 11, 12, 15, 16, 17, 19, 21, 23, 27, 28, 33], "\uc218\uc815\ud558\ub294": [5, 28], "task\uc774\ub2e4": 5, "instructpix2pix": [5, 14], "\ud558\ub298\uc758": 5, "\uc0c9\uc744": 5, "\ud30c\ub780\uc0c9\uc73c\ub85c": 5, "\ubcc0\uacbd\ud574\uc918": 5, "\ud3b8\uc9d1\uc774": 5, "\uc774\uac83\uc740": [5, 9, 17, 27], "cm3leon\uc774": 5, "\uc774\ud574\ud558\uace0": 5, "\uc788\uc5b4\uc11c": [5, 12], "\uc0dd\uc0b0\ud558\ub294": 5, "\uc0dd\uc131\uc5d0": [5, 6, 13, 15, 16, 17, 27, 28, 41], "\uacf5\uac04\uc801": [5, 21], "\uc815\ubcf4": [5, 14, 21, 22, 25], "\uc704\uce58": [5, 29], "\ud1b5\ud569\uc2dc\ud0ac": [5, 9], "\uc788\ub3c4\ub85d": [5, 12, 17, 22, 24, 28, 29, 31, 32, 38, 39, 42], "figure16": 5, "flamingo": 5, "1000\uc5b5": 5, "openflamingo": 5, "400\uc5b5": 5, "30\uc5b5": 5, "\ud1a0\ud070\uc784\uc5d0\ub3c4": 5, "\ubd88\uad6c\ud558\uace0": [5, 9, 14, 16, 27, 29, 32, 40], "\ub3d9\ub4f1\ud55c": 5, "2307": [6, 17, 24], "06949": [6, 17], "site": 6, "hyoungseo": [6, 17, 43], "cho": [6, 17, 19, 43], "generation\uc758": [6, 16], "\uc77c\ud658\uc73c\ub85c": 6, "\uc0c8\ub86d\uace0": 6, "\ucc3d\uc758\uc801\uc778": 6, "\uac1c\ub150\uc744": [6, 28, 39], "\ub2e4\ub8f9\ub2c8\ub2e4": 6, "\uae30\uc220\uacfc": [6, 24], "\uae30\uc220\uc774": [6, 16, 27], "\ubc1c\uc804\ud568\uc5d0": 6, "\ubfd0\ub9cc": [6, 24, 29, 32], "\uac1c\uc778\ud654\ub41c": [6, 13, 17, 28], "\uc0dd\uc124\ud560": 6, "\uc788\uac8c": [6, 7, 9, 14, 21, 24, 27, 29, 31, 37], "\ub418\uc5c8\uc2b5\ub2c8\ub2e4": 6, "\uac15\ub825\ud55c": [6, 16], "\uc124\uba85\ub418\uc9c0": 6, "\ucc3d\uc758\uc801": 6, "\uc788\uc744\uae4c\uc694": 6, "sysnthesi": 6, "\uae30\uc220\uc740": 6, "\uc778\ucf54\ub354\uc5d0\uc11c": [6, 14], "\ucd94\ucd9c\ud55c": [6, 8, 15, 30], "\uc784\ubca0\ub529\uc744": [6, 14, 24], "conditioning\ud569\ub2c8\ub2e4": 6, "\ucc98\ub9ac\ud558\uc5ec": 6, "\ud1b5\ud569\ud558\ub294": [6, 14], "\ubc29\uc2dd\uc785\ub2c8\ub2e4": [6, 31, 40], "model\uacfc": [6, 7, 12, 16, 18, 19, 39], "\ud65c\uc6a9\ud574\uc11c": [6, 9, 34, 42], "generation\uc5d0\uc11c\uc758": 6, "\uc774\uc810\uc744": 6, "\ubcf4\uc785\ub2c8\ub2e4": [6, 32], "\uc785\ub825\ub41c": [6, 14, 28, 38], "\ud574\ub2f9\ud558\ub294": [6, 7, 14, 16, 22, 38], "\uc784\ubca0\ub529\uc73c\ub85c": [6, 14], "\ub9e4\ud551\ud569\ub2c8\ub2e4": 6, "\ub514\ucf54\ub354\ub294": 6, "\uc784\ubca0\ub529\uc5d0": [6, 14, 24], "condition\uc774": 6, "\ubd80\uc5ec\ub41c": 6, "\uc0dd\uc131\ud558\uae30": [6, 17, 28, 31, 32, 39], "\ud6c8\ub828\ub429\ub2c8\ub2e4": 6, "personalization\uc740": 6, "\ub9e5\ub77d\uc5d0\uc11c": 6, "\uc0ac\uc6a9\uc790\uac00": [6, 23, 24, 28], "\uc785\ub825\ud55c": 6, "\uc8fc\uc81c\ub098": 6, "\uc2a4\ud0c0\uc77c\uc744": [6, 14, 17, 25, 27], "\ud45c\ud604\ud558\ub294": [6, 11, 28, 29, 35], "\ubaa9\ud45c\ub85c": [6, 14, 17, 28, 32, 35], "\uc77c\ubc18\uc801\uc73c\ub85c": [6, 14, 27, 28, 31, 39], "\ud559\uc2b5\uc2dc\ud0a4\uae30": 6, "\ucd5c\uc801\ud654\ud558\uac70\ub098": 6, "\ub124\ud2b8\uc6cc\ud06c\ub97c": [6, 14, 17, 21], "\ud65c\uc6a9\ud569\ub2c8\ub2e4": [6, 31], "\uc5f0\uad6c\uc5d0\uc11c\ub294": [6, 16, 17], "\ucd08\ucca8\uc744": [6, 28], "\ub9de\ucd94\uace0": 6, "\uae30\ubc1c\ud55c": 6, "\uc7a5\uba74\uc744": 6, "\uc811\uadfc": [6, 14, 17, 28], "\ubc29\ubc95\uc774": [6, 12, 14, 16, 17, 21, 27, 32, 39], "xu": 6, "et": [6, 12, 16, 18, 31, 39, 40], "al": [6, 12, 16, 18, 31, 39, 40], "set": [6, 11, 13, 15, 20, 30, 32, 35, 37, 40], "evolut": 6, "\ud65c\uc6a9\ud574": [6, 9, 13, 24, 29, 30, 32, 34, 41], "3d": [6, 11, 14, 29], "\ud615\ud0dc\uc758": [6, 24, 28, 35], "\ubaa8\ub378\ub9c1\uc744": [6, 21, 33], "\uc81c\uc548\ud588\uc2b5\ub2c8\ub2e4": [6, 26], "elgamm": 6, "gan\uc758": [6, 12, 28], "\ud0d0\uad6c\ud558\uba70": 6, "\uc2a4\ud0c0\uc77c\uc5d0\uc11c\uc758": 6, "\ud3b8\ucc28\ub97c": 6, "\uadf9\ub300\ud654\ud558\ub294": 6, "\ud559\uc2b5\ud588\uc2b5\ub2c8\ub2e4": [6, 9], "sbai": 6, "\uc190\uc2e4": [6, 33], "\ud568\uc218\ub97c": [6, 15], "\ub3c4\ub9bd\ud588\uc2b5\ub2c8\ub2e4": 6, "\uce74\ud14c\uace0\ub9ac\uc640": 6, "\uc77c\uce58\ud558\ub3c4\ub85d": [6, 28], "\ucd5c\uc801\ud654\ud558\uba74\uc11c\ub3c4": 6, "\uce74\ud14c\uace0\ub9ac\uc758": 6, "\uac1c\ub150\ub4e4\uacfc": 6, "\ucc3e\ub294": [6, 12, 14, 28], "\uc811\uadfc\ud588\uc2b5\ub2c8\ub2e4": 6, "\uac1c\ub150\ub4e4\uc740": 6, "\ud63c\ud569\ub420": 6, "\uc788\uc73c\uba70": [6, 7, 17, 21, 27, 32, 33, 37], "\uc720\uc5f0\ud55c": 6, "\uacfc\uc815\uc744": [6, 10, 11, 14, 16, 17, 22, 23, 24, 28, 29, 30, 40, 42], "\uac16\uac8c\ub429\ub2c8\ub2e4": [6, 26], "bottom": 6, "model\uc5d0\uc11c\ub294": [6, 28], "\uc624\ud1a0\uc778\ucf54\ub354\uc758": [6, 14], "\ub0b4\uc5d0\uc11c": [6, 17, 24, 28, 29, 38], "\uc9c4\ud589\ub429\ub2c8\ub2e4": [6, 40], "\uba3c\uc800": [6, 7, 17, 21, 26, 27, 30, 33, 36], "\uc778\uace0\ub354": 6, "\ub9e4\ud551\ud558\ub294": [6, 32], "d\ub294": [6, 12], "\uc7ac\uad6c\uc131\ud558\ub3c4\ub85d": 6, "ddpm\uc758": [6, 10, 16, 18, 25, 34], "\uc190\uc2e4\uc744": [6, 14, 17], "\ucd5c\uc18c\ud654\ud558\ub3c4\ub85d": [6, 17, 31], "\ud559\uc2b5\ud569\ub2c8\ub2e4": [6, 32, 36, 40, 41], "e_": 6, "z_": [6, 14, 33, 39, 40, 41], "\uc7a0\uc7ac": [6, 27], "\ucf54\ub4dc": [6, 21, 26, 30], "zt": 6, "\ucd94\uac00\ub41c": [6, 7, 11, 12, 39], "\uc7a1\uc74c": 6, "\uc81c\uac70\ud569\ub2c8\ub2e4": 6, "\uacfc\uc815\uc5d0\uc11c": [6, 10, 11, 12, 15, 16, 17, 20, 23, 25, 27, 28, 32, 36, 39], "\ud604\uc7ac": [6, 9, 10, 25, 27], "t\uc640": 6, "\uc870\uac74": [6, 14, 16], "\ubca1\ud130": [6, 14], "c\ub3c4": 6, "\uace0\ub824\ub429\ub2c8\ub2e4": 6, "model\uc740": [6, 11, 12, 15, 16, 19, 20, 22, 28, 39], "\uc778\ucf54\ub529\uc5d0\uc11c": 6, "\ud30c\uc0dd\ub41c": [6, 14, 28], "\ud504\ub86c\ud504\ud2b8": [6, 21], "ramesh": 6, "\ubb38\uc81c\ub97c": [6, 8, 12, 14, 20, 24, 28, 31, 37], "decompos": [6, 17], "\ud504\ub86c\ud504\ud2b8\ub85c\ubd80\ud130": 6, "\uc608\uce21\ud569\ub2c8\ub2e4": [6, 17, 32], "\ub2e4\uc74c\uc73c\ub85c": [6, 17], "\ubd80\uc5ec\ud558\uc5ec": 6, "decoder\ub85c": 6, "\ubcf4\ub0b4\uc9d1\ub2c8\ub2e4": 6, "\ub3c5\ub9bd\uc801\uc778": [6, 10, 31], "\uc774\ub8e8\uc5b4\uc9d1\ub2c8\ub2e4": 6, "l_": [6, 18, 23, 29, 31, 34, 39, 41], "\uc815\uc758\ub41c": [6, 28, 40], "\uc784\ubca0\ub529": [6, 14, 21, 24, 28], "\uc811\uadfc\ubc95\uc740": 6, "\ub2e4\uc591\uc131\uc744": [6, 13, 27], "\ud5a5\uc0c1\uc2dc\ud0a4\uba70": 6, "\uc811\uadfc\ud558\uace0": 6, "\uacf5\uac04\uc5d0\uc11c": [6, 28], "\uc81c\uc57d\uc744": [6, 32], "conceptlab\uc740": 6, "\uc0dd\uc131\ud558\uace0\uc790": [6, 23, 26, 36, 42], "\ub300\ud45c\ud558\ub294": 6, "\ub2e8\uc77c": [6, 14, 16, 28, 31], "v_": [6, 15], "\ucd5c\uc801\ud654\ud569\ub2c8\ub2e4": 6, "\uce74\ud14c\uace0\ub9ac\uc5d0": [6, 21], "\uc720\uc0ac\ud558\uba74\uc11c\ub3c4": [6, 28], "\uba64\ubc84\ub4e4\uacfc": 6, "\uac00\uc9c0\ub3c4\ub85d": [6, 27], "\uc9d1\ud569\uc744": 6, "\uacc4\uc0b0\ud569\ub2c8\ub2e4": [6, 31, 35], "\ud6c8\ub828\ud558\ub294": [6, 14], "\ub3d9\uc548": [6, 9, 12, 14, 21, 24, 36], "\ubc14\ud0d5\uc73c\ub85c": [6, 32, 40], "contraints\ub97c": 6, "\ub354\ud558\uae30": 6, "blip": [6, 9], "vqa": 6, "\uae0d\uc815\uc801": 6, "\uc81c\uc57d": 6, "po": 6, "\ubd80\uc815\uc801": 6, "\uac00\uc9c0\ub97c": 6, "\uc870\uac74\uc740": 6, "\uc815\uc758\ub429\ub2c8\ub2e4": 6, "\ub450\uac00\uc9c0": [6, 34], "\uce21\uc815\ud569\ub2c8\ub2e4": [6, 9, 40], "\uc6b0\uc120": [6, 7, 9, 16, 24, 35, 40], "\ub2e8\uc5b4": [6, 21, 25, 28], "\ubb34\uc791\uc704": [6, 17], "\uc0d8\ud50c\ub9c1\ub41c": 6, "y\uc5d0": 6, "\ud1b5\ud569\ud569\ub2c8\ub2e4": 6, "\ubb38\uc7a5\uc740": 6, "\uc778\ucf54\ub529\ub418\uba70": 6, "\uc774\uac83\uc774": [6, 9, 32], "\uc815\uc758\ud569\ub2c8\ub2e4": [6, 31, 35, 38, 40, 41, 42], "\ud1b5\uacfc\uc2dc\ud0a4\uba74": 6, "\ud504\ub86c\ud504\ud2b8\uc758": [6, 14], "\uc778\uc2a4\ud134\uc2a4\uac00": 6, "prior\ub97c": 6, "\ud1b5\uacfc\ud558\uba74": 6, "\uc870\uac74\uacfc": 6, "\uae0d\uc815": 6, "\ubd80\uc815": 6, "\uad11\ubc94\uc704\ud558\uac8c": 6, "\uc720\uc9c0\ud558\uace0\uc790": [6, 35], "\ud1b5\uacfc\ud558\uc9c0": 6, "\uc54a\uc2b5\ub2c8\ub2e4": [6, 9, 31, 32], "\uc5f0\uad6c\uc5d0\uc11c\uc758": 6, "\ud568\uc218\ub294": [6, 19], "langl": 6, "rangl": 6, "lambda": [6, 11, 31, 32, 35], "v\uc5d0\uc11c": 6, "\uc870\uac74\uc5d0\uc11c": 6, "\uba40\uc5b4\uc9c0\uace0": 6, "\uc81c\uc57d\uc870\uac74\uc5d0": 6, "\uac00\uae4c\uc6cc\uc9c0\ub3c4\ub85d": [6, 12], "\uc815\uaddc\ud654\ub294": 6, "\uc9d1\ud569\uc774": 6, "\ud074": [6, 27], "\uba64\ubc84\ub85c\uc758": 6, "collapsing\uc744": 6, "\ubc29\uc9c0\ud558\ub294": [6, 14], "\uc0ac\uc6a9\ub429\ub2c8\ub2e4": [6, 7, 17], "\uc81c\uc57d\uc5d0": 6, "s_": [6, 14, 15, 25, 31], "max_": 6, "\uc720\uc0ac\ub3c4": [6, 16, 21], "\ubc29\uc2dd\uc740": [6, 8, 17, 20, 28, 39, 40, 41], "\ud568\uc218\uc5d0": 6, "\ud1b5\ud569\ub418\uba70": 6, "\ub0c4\uc73c\ub85c\uc368": 6, "\uc870\uac74\uc5d0": 6, "\ud328\ub110\ud2f0\ub97c": [6, 32], "\ubd80\uc5ec\ud569\ub2c8\ub2e4": 6, "\uacfc\uc815": [6, 8, 11, 18, 21, 22, 28], "\uac1c\ub150\uc5d0": [6, 28], "\ub2e8\uc5b4\ub97c": [6, 28], "\ucd94\ub860\ud558\uace0": [6, 30], "\ucd94\uac00\ud558\ub294": [6, 12, 14, 20, 21, 27, 41], "\uac70\uce69\ub2c8\ub2e4": 6, "\uc218\ub3d9\uc73c\ub85c": 6, "\uc801\uc6a9\ud558\ub294": [6, 11, 12, 20, 31, 35, 39, 40, 41], "\ud798\ub4e4\uace0": 6, "\uad11\ubc94\uc704\ud55c": 6, "\uba64\ubc84\ub4e4\uc744": 6, "\uc815\ud655\ud558\uac8c": [6, 14, 28], "\ub300\ud45c\ud558\uc9c0": 6, "\ubabb\ud560": [6, 17, 24], "\uc810\uc9c4\uc801\uc73c\ub85c": [6, 31, 39], "\ud655\uc7a5\ud558\ub294": [6, 21], "scheme\uc744": 6, "\uc81c\uc548\ud569\ub2c8\ub2e4": [6, 7, 9, 17, 31, 32], "\ud6c8\ub828\ub41c": [6, 7, 14, 17, 27, 28], "\uc9c8\uc758\ud558\uc5ec": 6, "\uc774\ubbf8\uc9c0\uc5d0": [6, 8, 10, 14, 15, 18, 21, 22, 23, 25, 27, 28, 30, 32, 33], "\uc874\uc7ac\ud558\ub294": [6, 9, 30], "\uba64\ubc84\uac00": 6, "\ubb34\uc5c7\uc778\uc9c0": [6, 35, 42], "\uc2dd\ubcc4\ud558\ub3c4\ub85d": 6, "\ub098\uc628": [6, 12, 16, 17, 19, 31, 33, 34, 37, 39, 40, 41, 42], "\uc778\uc2a4\ud134\uc2a4\ub97c": 6, "\ud6c8\ub828\uc758": 6, "\ucd94\uac00\ud569\ub2c8\ub2e4": 6, "\ub2e8\uacc4\uc5d0": [6, 31], "\uac78\uccd0": [6, 21, 28], "\ubcf4\uc5ec\uc90d\ub2c8\ub2e4": [6, 7, 32, 35, 41, 42], "\uc870\uac74\uc774": [6, 14, 17], "\uc9c0\uc18d\uc801\uc73c\ub85c": [6, 27], "\uc870\uc815\ub418\uace0": 6, "\ud655\uc7a5\ub418\uc5c8\uc74c\uc744": 6, "\uac1c\ub150": [6, 28, 35, 39], "\uc14b\uc5d0": [6, 14], "\ud63c\ud569": [6, 27], "\uac1c\ub150\uc5d0\uc11c": 6, "im": 6, "\ub9cc\ub4ed\ub2c8\ub2e4": [6, 32], "\ud1b5\uacfc\ud558\uc5ec": 6, "\uc138\ud2b8\ub97c": [6, 21], "\uc0dd\uc131\ud569\ub2c8\ub2e4": [6, 9, 17, 31, 41, 42], "\uac00\uae5d\uac8c": [6, 15, 32], "\ub9cc\ub4dc\ub294": [6, 11, 14, 16, 17, 21, 32, 42], "\uc218\uc815\ub41c": 6, "\uc801\uc6a9\ud569\ub2c8\ub2e4": [6, 9, 32], "\uac1c\ub150\uc774\ub098": 6, "\uc801\uc6a9\ub420": 6, "\uacc4\uce35\u3147\uc801": 6, "\ubc18\ubcf5\uc801\uc73c\ub85c": [6, 14], "\ub610": [6, 8, 12, 15, 18, 23, 24, 25, 30, 35, 38], "\uacb0\uacfc\ubb3c\uc5d0": 6, "\uac1c\ub150\uc758": 6, "\uc81c\uc5b4\ud558\uae30": [6, 13, 17], "\uac00\uc911\uce58": [6, 14, 17, 32, 37], "\ud56d\ubaa9\uc774": 6, "\ucd94\uac00\uc801\uc73c\ub85c": [6, 7, 9, 12, 16, 24, 27, 31, 40], "\uadf8\ub9bc\uc5d0\ub294": 6, "\uac1c\ub150\uc774": 6, "\uc67c\ucabd\uc5d0": [6, 21], "\ud45c\uc2dc\ub418\uc5b4": 6, "\uc5b4\ub5a4": [6, 7, 9, 11, 12, 14, 16, 20, 21, 22, 24, 27, 28, 30, 32, 39, 42], "\uc0dd\uc131\ud588\ub294\uc9c0\ub97c": 6, "\uacb0\uacfc\ub294": [6, 7, 12, 14, 16, 18, 27, 32], "\ud65c\uc6a9\ud588\uc2b5\ub2c8\ub2e4": [6, 17, 40], "conceptlab\uc774": 6, "\uc81c\uc548\ud55c": [6, 12, 14, 26, 27], "\ud504\ub86c\ud504\ud2b8\uc640": [6, 21], "\uc801\uc6a9\ud588\uc2b5\ub2c8\ub2e4": [6, 41], "\uac1c\ub150\ub4e4\uc744": 6, "\ud63c\ud569\ud558\uc5ec": [6, 14, 39], "\ub3c5\ud2b9\ud55c": 6, "\ucc3d\uc870\ubb3c\uc744": 6, "\ud559\uc2b5\ud560": [6, 15, 16, 21, 24, 27, 31, 32, 36], "\uadf8\ub9bc\uc758": [6, 7, 9, 12], "\uc717\uc904\uc5d0\uc11c\ub294": 6, "\uc801\uc6a9\ud558\uc5ec": [6, 21, 39, 40], "\uc774\uc5b4\uc9c0\ub294": [6, 28], "\uc904\uc5d0\uc11c\ub294": 6, "\uc5bb\uc5b4\uc9c4": 6, "conceptlab\uc758": 6, "\ud6a8\uacfc\ub97c": [6, 12, 37, 38], "\uc785\uc99d\ud558\uae30": 6, "\uc815\uc131\uc801": [6, 8, 14, 33], "\uc815\ub7c9\uc801": [6, 8, 14, 17, 22, 33], "\ud3c9\uac00\ub97c": [6, 14, 17, 21, 24, 32, 33, 36, 37, 39], "\uadf8\ub9bc\ub4e4\uc5d0\uc11c": 6, "\uc788\ub4ef\uc774": [6, 12, 27], "negative\ub97c": 6, "\uc801\uc6a9\ud558\uc600\uace0": 6, "\uc2dc\ub4dc\ub97c": 6, "\ub2ec\ub9ac\ud558\uba70": 6, "\ub2a5\ub825\uc774": [6, 9, 30], "\uc7a5\uba74\uc5d0": [6, 28], "\ubc30\uce58\ud560": 6, "\uc0dd\uc131\ubb3c\ub4e4\uc740": 6, "\ubc30\uacbd": [6, 14, 15, 24, 28], "\ucc3d\uc870\ub4f1": 6, "\ub2e4\uc591\ud558\uac8c": [6, 38, 40], "\uac00\ub2a5\ud569\ub2c8\ub2e4": [6, 9, 17, 31, 35, 40, 41], "conceptlab\uc744": 6, "mixing\uc758": 6, "mixing\uc740": 6, "\uac1c\ub150\ub4e4\uc758": 6, "\ud569\uccd0": 6, "\ud558\uc774\ube0c\ub9ac\ub4dc": 6, "\ud615\uc131\ud558\ub294": 6, "\uc870\uac74\ub9cc\uc744": 6, "\uc608\ub97c": [6, 12, 26, 30, 31, 32, 38], "\ub4e4\uc5b4": [6, 12, 26, 30, 31, 32], "\uc904\uc5d0\ub294": 6, "\ub78d\uc2a4\ud130\uc758": 6, "\uc8fc\uc694": [6, 13, 21, 24], "\uc0dd\uc0c1\uacfc": 6, "\uc9d1\uac8c\ubc1c": 6, "\uac70\ubd81\uc774\uc758": 6, "\ub4f1\uaecd\uc9c8": 6, "\uc735\ud569\ud558\ub294": 6, "\uadf8\ub9bc\uc740": [6, 7, 9, 12, 19, 24, 26, 27], "conceptlab\uc5d0": 6, "\uac1c\ub150\ub4e4\uc774": 6, "\uc138\ub300": 6, "\uc5b4\ub5bb\uac8c": [6, 7, 9, 11, 21, 22, 27, 28], "\ubc1c\uc804\ud558\ub294\uc9c0": 6, "diffusion2\uc640": 6, "kandinski": 6, "\ubaa8\ub378\uacfc": [6, 14, 15, 21, 27, 32], "\ud3c9\uac00\ud588\uc2b5\ub2c8\ub2e4": [6, 36], "kandinsky\uc758": 6, "\uc720\ub9ac\ud55c": 6, "\ud504\ub86c\ud504\ud2b8\ub294": [6, 17, 21], "model\uc774": [6, 12, 16, 18], "\ud1a0\uadfc\uacfc": 6, "\ubaa8\ub450\uc5d0": 6, "\ub9de\ucdb0\uc9c8": 6, "\ub2e4\uc911": [6, 24], "\ucc98\ub9ac\ud558\uace0": 6, "\ud45c\ud604\uc744": [6, 13, 14], "\uac16\ucd94\uace0": [6, 9, 12], "\ud3ec\ud568\ud558\uba70": 6, "\uac1c\ub150\uacfc": 6, "\ub2ee\uc9c0": 6, "\uce21\uc815\ud588\uc2b5\ub2c8\ub2e4": 6, "\ud3c9\uac00\uc5d0\ub294": 6, "\uc560\uc644\ub3d9\ubb3c": 6, "\uc2dd\ubb3c": 6, "\uacfc\uc77c": 6, "\uac00\uad6c": 6, "\uc545\uae30\uc758": 6, "5\uac00\uc9c0": [6, 21, 41], "\ub3c4\uba54\uc778\uc5d0": 6, "\uc30d\uc744": [6, 14, 21, 31, 32], "\uace0\ub824\ud558\uace0": [6, 14], "\uc870\ud569\uc5d0": 6, "\ub79c\ub364": [6, 11, 14, 21], "\uc2dc\ub4dc\ub85c": 6, "\ud6c8\ub828\ud558\uc5ec": 6, "\ucd1d": [6, 9, 13, 15, 25, 26, 27, 28, 32, 40], "75\uac1c\uc758": 6, "\uc5bb\uc5c8\uc2b5\ub2c8\ub2e4": 6, "32\uac1c\uc758": 6, "\uc0dd\uc131\ud588\uc2b5\ub2c8\ub2e4": [6, 38], "diffusionr\uacfc": 6, "\ubaa8\ub378\uc5d0\uc11c\ub294": [6, 17, 22], "\uc0ac\uc6a9\ud558\uace0": [6, 7, 8, 12, 15, 17, 20, 22, 25, 27, 28, 35, 38, 39], "160\uac1c\uc758": 6, "\uae30\uc900\uc73c\ub85c\ub294": [6, 27], "\uc720\uc0ac\uc131\uc744": [6, 28], "\ud0c0\uac9f": [6, 14, 24], "\uce74\ud14c\uace0\ub9ac\uc640\uc758": 6, "\uacf5\uac04": [6, 17, 21, 28], "\uc720\uc0ac\uc131": 6, "\uacc4\uc0b0\uc744": [6, 15], "\ud2b9\uc815\ub429\ub2c8\ub2e4": 6, "\ub2e4\uc74c\uc73c\ub85c\ub294": [6, 27], "\uc81c\uc57d\uacfc": [6, 21], "\uac70\ub9ac\ub97c": [6, 15, 28, 39], "\uacb0\uacfc\uc801\uc73c\ub85c": [6, 17, 32], "\uc720\uc0ac\uc131\uc5d0\uc11c": 6, "\uc6b0\uc6d4\ud55c": [6, 31], "\ubcf4\uc600\uace0": [6, 18], "\uc2e0\ub8b0\uc131": [6, 17], "\uac70\ub9ac": 6, "\uce21\uc815\uc5d0\uc11c": 6, "\uce74\ud14c\uace0\ub9ac\uc5d0\uc11c": 6, "4\uac00\uc9c0": [6, 39], "kandinsky\ub97c": 6, "\ub2a5\uac00\ud588\uc2b5\ub2c8\ub2e4": 6, "user": [6, 17, 25, 28], "personalization\uacfc": [6, 13], "\uc720\uc0ac\ud558\uac8c": [6, 14, 19, 22, 24, 27, 31, 38, 41], "\ud3ec\ud568\ud558\ub294": [6, 8, 14, 21, 28, 32, 38], "\ud56d\uc0c1": 6, "\uc720\uc9c0\ud558\uc9c0\ub294": 6, "\ubabb\ud569\ub2c8\ub2e4": [6, 17], "\ucd5c\uc801\ud654": [6, 17, 24, 28], "\uc6d0\ud558\ub294": [6, 7, 8, 9, 12, 14, 23, 25, 26, 27, 32], "\uac00\uc838\uc624\uc9c0\ub294": 6, "\ube44\ud589\uae30": 6, "\ubb3c\uace0\uae30": 6, "2\uc5d0": [6, 24], "\uad00\ub828\uc774": 6, "\uc18c\uac1c\ud588\uc2b5\ub2c8\ub2e4": [6, 17], "\uc0ac\uc6a9\uc744": 6, "constraints\ub77c\ub294": 6, "\uc870\uac74\ub4e4\uc744": 6, "\ucd9c\ub825\uc5d0": [6, 14], "\uacfc\uc815\uc5d0\uc11c\ub294": [6, 22], "\ub3c5\ud2b9\ud558\uba74\uc11c\ub3c4": 6, "\uba64\ubc84\ub4e4\uacfc\uc758": 6, "\uba85\ud655\ud55c": [6, 16, 21], "\uad6c\ubcc4\uc744": 6, "\ubcf4\uc7a5\ud588\uc2b5\ub2c8\ub2e4": 6, "\ud6a8\uacfc\uc131\uc744": 6, "\uc785\uc99d\ud588\uc73c\uba70": 6, "\ub2e4\uc591\ud558\uace0": 6, "\ub9e4\ub825\uc801\uc778": 6, "ad": [7, 41], "2302": [7, 41], "05543": 7, "lllyasviel": 7, "mai": [7, 14, 19, 24, 28, 32, 34, 35, 39], "28": [7, 42], "\ubaa8\ub378\ub4e4\uc740": [7, 8, 9, 34], "prompt\ub85c": [7, 25, 28], "\uc870\uc808\ud560": [7, 26, 27], "\uc774\ub7f0": [7, 9, 26, 27], "control\ub9cc\uc73c\ub85c": 7, "\uc870\uc808\ud558\ub294\ub370": 7, "\ud55c\uacc4\uac00": [7, 25, 28, 29, 32, 37, 41], "condition\uc744": [7, 8, 24, 39], "\uc918\uc11c": 7, "controlnet\uc774\ub77c\ub294": 7, "profession": 7, "prompt\uc640": [7, 8, 16], "\uc67c\ucabd": [7, 14, 17, 21, 24, 27], "canni": 7, "edge\ub97c": 7, "input\uc73c\ub85c": [7, 15, 19, 24, 26], "\ubc1b\uc544\uc11c": [7, 9, 17, 26, 42], "\uc624\ub978\ucabd\uc758": 7, "\uc2dd\uc73c\ub85c": [7, 12], "\uadf8\ub9bc\uc5d0\uc11c\ub294": [7, 22], "controlnet\uc774": 7, "\uc5ed\ud560\uc785\ub2c8\ub2e4": 7, "conrolnet": 7, "\uadf8\ub7ec\uba74": [7, 26], "\uac00\ub2a5\ud558\uac8c": [7, 12, 20, 22, 26, 29, 39], "\ud588\uc744\uae4c\uc694": [7, 9], "\uc774\uc81c\ubd80\ud130": 7, "\uc54c\uc544\ubcf4\ub3c4\ub85d": [7, 26], "\ud558\uaca0\uc2b5\ub2c8\ub2e4": [7, 17, 26, 42], "controlnet\uc758": [7, 13], "\uad6c\uc870\ub294": [7, 26, 27, 41], "\uac00\uc9d1\ub2c8\ub2e4": [7, 19], "lock": 7, "copy\uc640": 7, "trainabl": [7, 10, 17, 18, 20], "copy\ub97c": 7, "\uc124\uacc4\ud588\ub294\uc9c0": 7, "\uc54c\uc544\ubd05\uc2dc\ub2e4": 7, "\uc774\uc720\ub294": [7, 11, 15, 24], "\uae30\uc874\uc5d0": [7, 8, 14, 19, 20, 23, 26, 27], "\ubc29\ub300\ud55c": 7, "\uc704\ud574\uc11c\uc785\ub2c8\ub2e4": 7, "\ub370\uc774\ud130\uac00": [7, 11, 14, 21, 24, 26, 27, 28, 36, 42], "\uc591\uc774": [7, 27], "\uacbd\uc6b0\uc5d0": [7, 14, 27, 32, 41], "\uc624\ubc84\ud53c\ud305\uc744": [7, 14], "\ud53c\ud560": 7, "\ud6a8\uacfc\ub3c4": 7, "convolution\uc774\ub780": 7, "weight\ub791": 7, "\ucd08\uae30\ud654\ud55c": 7, "1x1": 7, "convolution\uc744": [7, 21], "\ub9d0\ud569\ub2c8\ub2e4": [7, 32], "\ud6c8\ub828\uc774": [7, 14, 21], "\uc2dc\uc791\ub418\uae30": 7, "\uc804\uc5d0\ub294": 7, "input\uc5d0": [7, 33], "output\uc774": [7, 32], "\ub611\uac19\uc544\uc9d1\ub2c8\ub2e4": 7, "\ubaa8\ub378\uc774\ub791": 7, "\ub611\uac19\uc740": 7, "\uac00\uc9c0\uac8c\ub418\ubbc0\ub85c": 7, "\uc720\uc9c0\ud560": [7, 17, 23, 28, 32], "\ube44\uc2b7\ud558\ubbc0\ub85c": 7, "scratch\ubd80\ud130": [7, 39], "\ud559\uc2b5\ud558\ub294": [7, 11, 14, 18, 21, 23, 26, 31, 32, 36, 39, 40, 42], "\ube60\ub974\uac8c": [7, 17, 18, 34, 37, 39, 42], "\ud6c8\ub828\uc2dc\ud0ac": 7, "\uc788\uac8c\ub429\ub2c8\ub2e4": 7, "convolution\uc740": 7, "\ud558\ub294\uc9c0": 7, "\uc790\uc138\ud788": [7, 9, 17, 26, 35, 40], "\uadf8\ub9bc\uc5d0\uc11c": [7, 9, 12, 26, 27, 32, 35], "\ubd80\ubd84\uc744": [7, 12, 15, 16, 24, 27, 31, 32, 35, 38, 40, 41, 42], "\uc218\uc2dd\uc73c\ub85c": [7, 31, 39], "\ud45c\ud604\ud558\uaca0\uc2b5\ub2c8\ub2e4": 7, "mathbf": [7, 26], "f": [7, 10, 11, 12, 16, 19, 20, 21, 30, 31, 32, 35, 36, 39, 40], "neural": [7, 10, 18, 29, 31, 32], "\uc758\ubbf8\ud569\ub2c8\ub2e4": [7, 17, 27, 36], "\ud45c\ud604\ud558\uae30\uc704\ud574": 7, "\ub9cc\ub4e4\uc5b4\uc11c": [7, 9, 28], "parameter\ub97c": [7, 8, 11, 15, 27, 33, 34], "theta_": 7, "\ub77c\uace0\ud558\uace0": 7, "\uace0\uc815\uc2dc\ucf1c\ub450\uaca0\uc2b5\ub2c8\ub2e4": 7, "\ud45c\ud604\ud558\uace0": 7, "convolution\uc758": 7, "z1": 7, "z2": 7, "\ub450\uaca0\uc2b5\ub2c8\ub2e4": 7, "\ud45c\ud604\ud560": [7, 17, 31, 39, 40], "weight\uc640": [7, 27], "bias\uc758": 7, "\ucd08\uae43\uac12\uc774": 7, "0\uc774\ubbc0\ub85c": 7, "\uc9c4\ud589\ub418\uc9c0": 7, "\uc54a\uc558\uc744": [7, 27], "\uc785\ub2c8\ub2e4": [7, 9, 17, 27, 31, 32, 36, 40, 42], "controlnet\uacfc": 7, "\ub0b4\ubbc0\ub85c": 7, "\ubcf4\uc874\ud560": [7, 14], "\uc804\ubd80": 7, "\ucd08\uae30\ud654\ub418\uc5b4\uc788\uc73c\uba74": 7, "gradient\uac00": 7, "0\uc774\ub77c\uc11c": 7, "\uc548": [7, 9, 13, 32], "\ub418\ub294\uac70": 7, "\uc544\ub2d0\uae4c\uc694": 7, "\ud655\uc778\ud558\uae30": [7, 16], "\uac04\ub2e8\ud55c": [7, 12, 13, 24, 28], "\uacbd\uc6b0\ub97c": [7, 17], "\uc0dd\uac01\ud574\ubcf4\uc8e0": 7, "wx": 7, "gradient\ub294": 7, "partial": [7, 8, 11], "0\uc774\uace0": [7, 27], "neq0": 7, "gradient": [7, 10, 11, 14, 15, 18, 20, 31, 32, 34, 36], "step\uc5d0\uc11c": [7, 11, 12, 18], "0\uc774": [7, 10, 11], "\uac12\uc73c\ub85c": [7, 12, 16, 18, 20, 22, 39, 42], "\uac00\uac8c\ub418\uace0": 7, "\ud575\uc2ec\uc801\uc778": [7, 16], "\uac00\uc815\uc774": 7, "\ubd80\ubd84\uc740": [7, 15, 16, 17, 19, 26, 27, 41], "\uc788\uae30": [7, 31, 32, 39], "\uc704\ubc30\ub420": 7, "\uac00\ub2a5\uc131\uc774": [7, 14, 18], "\uc9c0\uae08\uae4c\uc9c0": [7, 11], "\uc598\uae30\ud55c": 7, "diffusion\uc5d0": [7, 39], "\uc801\uc6a9\ud55c": [7, 12, 16, 18, 21, 23, 24, 29, 31, 39, 40, 41], "overal": [7, 9, 15, 37], "structur": [7, 12, 19, 20, 26, 31, 41], "loss\ub294": [7, 11, 15], "diffusion\uc5d0\uc11c": 7, "\ud615\ud0dc\uc785\ub2c8\ub2e4": [7, 26], "training\uc744": [7, 12, 16], "50": [7, 11, 27, 28, 30], "\ud655\ub960\ub85c": [7, 14], "empti": [7, 16], "string\uc73c\ub85c": 7, "\ubc14\uafd4\uc8fc\uc5c8\ub2e4\uace0": 7, "prompt\uac00": [7, 8], "\uc8fc\uc5b4\uc9c0\uc9c0\uc54a\uc744": 7, "semantics\ub97c": 7, "\ubc30\uc6b0\ub294": [7, 21], "\uacbd\ud5a5\uc774": [7, 8, 9, 15, 25], "\ud5a5\uc0c1\uc2dc\ucf1c\uc904": 7, "\uc788\ub2e4\uace0": [7, 9, 11, 12, 16, 24, 27, 28, 31, 33, 40, 41, 42], "training\uc774": 7, "\ubc29\ubc95\ubcf4\ub2e4": [7, 14, 21], "\ud6a8\uc728\uc801\uc774\ub77c\ub294": 7, "\uacb0\uacfc\ub4e4\uc740": 7, "\uacb0\uacfc\ub4e4\uc785\ub2c8\ub2e4": 7, "\ub17c\ubb38\uc5d0": [7, 11, 21, 27, 42], "\uc788\uc73c\ub2c8": 7, "\ucc38\uace0\ud558\uc2dc\uae30": 7, "\ubc14\ub78d\ub2c8\ub2e4": 7, "limitation\uc774\ub77c\uace0": 7, "\uc774\ubbf8\uc9c0\uc785\ub2c8\ub2e4": [7, 9], "\uc8fc\uc5c8\uc74c\uc5d0\ub3c4": 7, "\uc0dd\uc131\ub418\uc9c0": 7, "\uc54a\ub294": [7, 9, 15, 17, 21, 27, 31, 32, 35, 40, 42], "\ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4": 7, "limit": [7, 15], "\ucf54\ub4dc\ub294": 7, "\uacf5\uc2dd": 7, "\uad6c\ud604": [7, 30, 36, 42], "\uac00\uc838\uc654\uc2b5\ub2c8\ub2e4": 7, "\ucd08\uae30\ud654\ud558\ub294": 7, "\ucf54\ub4dc\ub85c": [7, 24], "\ub9cc\ub4e4": [7, 9, 28, 33], "def": [7, 10, 11, 20, 21, 26, 30, 36, 41, 42], "zero_modul": 7, "modul": [7, 11, 13, 15, 20, 21, 26, 36, 41, 42], "out": [7, 11, 15, 30, 31, 39, 41, 42], "detach": [7, 30, 36], "zero_": 7, "\uae30\ubcf8\uc801\uc73c\ub85c": [7, 12, 14, 15, 20, 25, 37, 41], "nn": [7, 11, 20, 21, 26, 36, 41, 42], "sequential\uacfc": 7, "\uac19\uc740\ub370": 7, "step\uac19\uc740": 7, "input\uc744": 7, "\ubc1b\uc544\uc904": 7, "\ub9cc\ub4e0": [7, 26, 27, 32], "timestepembedsequenti": 7, "sequenti": [7, 11, 26, 36, 41], "timestepblock": 7, "pass": [7, 9], "children": 7, "support": 7, "an": [7, 9, 26, 28, 42], "extra": [7, 9, 15], "emb": [7, 11], "context": [7, 9, 11, 20, 24, 25, 29, 33, 35], "isinst": 7, "elif": [7, 11, 30, 35], "spatialtransform": 7, "els": [7, 10, 11, 20, 21, 26, 30, 35, 41], "github\uc758": 7, "cldm": 7, "py\uc5d0": 7, "class\uc785\ub2c8\ub2e4": 7, "init": [7, 20], "\uae38\uc5b4\uc11c": 7, "\uc0dd\ub7b5\ud588\uc2b5\ub2c8\ub2e4": 7, "__init__": [7, 10, 11, 21, 26, 36, 41, 42], "make_zero_conv": 7, "conv_nd": 7, "dim": [7, 11, 21, 26, 30, 35, 41], "pad": [7, 11, 41], "hint": [7, 8], "kwarg": 7, "t_emb": 7, "timestep_embed": 7, "model_channel": 7, "repeat_onli": 7, "fals": [7, 10, 11, 20, 21, 30, 36, 41], "time_emb": 7, "guided_hint": 7, "input_hint_block": 7, "type": [7, 35, 36], "dtype": [7, 11, 30, 35], "zero_conv": 7, "zip": [7, 10, 11], "input_block": 7, "append": [7, 11, 26, 36, 41], "middle_block": 7, "middle_block_out": 7, "customizi": 8, "To": [8, 9, 10, 22], "2212": [8, 38], "04488": 8, "seunghwan": [8, 10, 15, 18, 23, 25, 43], "ji": [8, 10, 15, 18, 23, 25, 43], "aug": [8, 18, 25], "user\uc758": 8, "private\ud55c": 8, "concept\uc744": [8, 28], "\uc0dd\uc131\ud558\uace0\uc790\ud558\ub294": 8, "\uc695\uad6c\ub294": 8, "\ud480\uc9c0": 8, "\ubabb\ud568": 8, "diffusion\uc740": [8, 15], "partial\ud55c": 8, "\ubd80\ubd84\ub9cc\uc744": 8, "\ud559\uc2b5\uc2dc\ud0b4\uc73c\ub85c\uc368": 8, "\uae30\uc874\ubcf4\ub2e4": 8, "\ube60\ub978": [8, 17, 22, 31, 39], "\ubc29\uc2dd\uc744": [8, 12, 14, 16, 21, 23, 31, 41], "\ubfd0": 8, "concept\uc5d0": [8, 28], "compress\ud558\ub294": 8, "\ud65c\ubc1c\ud558\uac8c": 8, "\uc5f0\uad6c": [8, 14, 18, 21, 22, 23], "\ub418\uc5b4\uc9d0": 8, "\uc785\ub825\ub9cc\uc73c\ub85c": 8, "\uc218\uc900\uae4c\uc9c0": [8, 18], "\uc774\ub984": [8, 12], "general\ud55c": [8, 12], "\uc0dd\uc131\ud558\uc9c0\ub9cc": [8, 14, 17, 36], "user\uac00": 8, "concept\uc758": [8, 28], "\ud589\ubcf5\ud55c": 8, "\uc6b0\ub9ac": [8, 28], "\uac00\uc871": 8, "\uc6b0\ub9ac\uc9d1": 8, "\uac15\uc544\uc9c0": 8, "\ubf40\uc090\uac00": 8, "\ud30c\ub9ac\ub85c": 8, "\uc5ec\ud589\uc744": 8, "\ub5a0\ub098\ub294": 8, "\uacfc\uc815\uc911\uc5d0": 8, "\ubcf4\uc9c0": [8, 35], "\ubabb\ud588\uae30\ub54c\ubb38\uc5d0": 8, "model\uc5d0\uac8c\ub294": 8, "\ub2f9\uc5f0\ud55c": 8, "\uba87\uc7a5\uc758": 8, "\uc774\ubbf8\uc9c0\ub9cc\uc73c\ub85c": [8, 25], "finetuning\ud558\ub294": [8, 17], "In": [8, 30], "\ud559\uc2b5\ud558\uace0\uc790\ud558\ub294": 8, "\uc0dd\uc131\ud574\ub0b4\uc57c\ud568": 8, "\ud559\uc2b5\ub418\uc5c8\ub358": 8, "finetuning\ud55c": 8, "\ud6c4\uc5d0\ub3c4": [8, 17], "customization\uc774": 8, "\uc9c4\ud589\ud558\ub2e4\ubcf4\uba74": 8, "\ud559\uc2b5\ud588\ub358": 8, "\uc78a\uc5b4\ubc84\ub9ac\uac70\ub098": 8, "\uc65c\uace1\ud574\ubc84\ub9bc": 8, "draft": 8, "overfit": [8, 35], "\ub418\uc5b4\uc11c": 8, "\uacb0\uacfc\ubb3c\uc758": [8, 24], "variation\uc774": [8, 26], "\ub0ae\uc544\uc9d0": 8, "\uc880\ub354": [8, 10, 15, 18, 25, 39], "\ub098\uc544\uac00": 8, "text\ub85c": 8, "\uc720\uc9c0\ub97c": 8, "caption\uc744": 8, "regular": [8, 11, 30, 42], "tuning\ub3d9\uc548": 8, "augment": [8, 25, 27, 29, 30], "\ubc29\uc2dd\uc758": [8, 10, 23, 24, 34], "\ubcf4\uc5ec\uc8fc\uace0\uc788\uc74c": 8, "\uac8c\ub2e4\uac00": [8, 9, 16, 24], "control\ub3c4": 8, "\uac00\ub2a5\ud568": [8, 20, 22, 28, 33, 37], "general\ud558\uc9c0": 8, "\uc0dd\uc131\uc740": [8, 22], "\ubd88\uac00\ub2a5\ud568": 8, "global\ud55c": 8, "\ud3ec\ud568\ud55c": [8, 13, 21, 22, 23], "\uc18c\ub7c9\uc758": [8, 11], "\uae30\ubc95": [8, 20, 30, 31], "learning\uc740": 8, "\uc0dd\uac01\ubcf4\ub2e4": 8, "\ud6a8\uacfc\uc801\uc774\uace0": 8, "\uc720\uc6a9\ud568": 8, "\uc2dc\uc5d0\ub294": [8, 11, 14, 18, 33, 41], "\uc804\uccb4\ub97c": [8, 12, 38], "\ud559\uc2b5\ud558\uac70\ub098": 8, "\ucd94\uac00\ud574": [8, 11, 12, 15, 23, 24, 29, 39], "\uc7ac\ud559\uc2b5": [8, 10, 34], "\uc704\uc5d0\uc11c": [8, 16, 17, 21, 23, 24], "customization\uc758": 8, "\uc77c\uc73c\ud0a4\uae30": 8, "\uc26c\uc6c0": 8, "etc": [8, 15, 23], "\uc544\uc8fc": [8, 12], "\uc77c\ubd80\ub9cc\uc744": 8, "\ub300\uc0c1\uc73c\ub85c": [8, 32], "\ucee8\uc149\uc73c\ub85c": 8, "finetuning\uc744": [8, 17], "invers": [8, 9, 23, 35], "vs": [8, 10, 12, 16, 24, 32, 33, 34, 37, 38, 40, 41], "\ubaa8\ub378\ub4e4\uc744": [8, 38], "compress\ud560": 8, "finetuning\ud568\uc73c\ub85c\uc368": 8, "resourse\ub97c": 8, "\uc808\uc57d\ud560": 8, "backbone\uc73c\ub85c": 8, "dm\uc758": 8, "equat": [8, 9, 10, 13, 15, 16, 18, 23, 25, 31, 34, 39], "\uc2dc\uc810\uc5d0": 8, "noise\uac00": [8, 11, 12, 16, 18, 26], "\uc11e\uc778": 8, "text\ub098": 8, "\uc0ac\uc6a9\ud558\uc9c0\uc54a\uace0": 8, "space\ub85c": [8, 12, 15, 23, 28], "embedding\ub41c": 8, "\u03b5": [8, 10], "\u03b5_": 8, "\u03b8": 8, "\ub080": 8, "\u03b5\ub97c": 8, "\uc608\uce21\ud574\ub0b4\ub294": [8, 11], "tuning\ud560\ub54c\ub294": 8, "layer\uc5d0\ub300\ud574": 8, "update\ud558\ub294\uac8c": 8, "\uae30\ubcf8": [8, 14, 24, 27], "resource\uac00": [8, 15], "\ube44\ud6a8\uc728\uc801\uc73c\ub85c": 8, "\ub9ce\uc774\ub4e4\uace0": 8, "overfitting\ub418\uae30": 8, "\ubcc0\ud654\ub7c9\uc744": [8, 39], "\uccb4\ud06c": 8, "while": 8, "\ubd80\ubd84\uc5d0\ube44\ud574": 8, "\uc5f0\uc0b0\uc758": [8, 19], "wegith": 8, "fig": [8, 10, 18], "latent\uc5d0": [8, 14], "\uc8fc\uc785\ud558\ub294": [8, 12], "kei": [8, 19, 20, 22, 23, 25, 29], "parameter\uc5d0": 8, "\ub2e8": [8, 17, 23, 25, 31, 35], "\ucc28\uc9c0": 8, "\uc758\ubbf8\ud558\ub294": [8, 27, 42], "\ud3ec\ud568\ub418\ub294": 8, "\ub098\uba38\uc9c0\ub294": [8, 13, 25], "freez": [8, 13, 17, 20, 22, 29, 35, 37], "\uc2e4\uc81c\ub85c\ub294": [8, 10, 14], "\uc4f0\uc9c0\uc54a\ub294": 8, "\ub2e8\uc5b4\ub85c": 8, "\ud615\uc2dd\uc73c\ub85c": 8, "captioning\ud55c": 8, "finetuning\uc911\uc5d0": 8, "\uc78a\uc5b4\ubc84\ub9ac\ub294": 8, "\ud604\uc0c1\uc774": [8, 14, 26, 32, 38], "\uc788\uc744\uc218\uc788\uc74c": 8, "moon": 8, "\uc0dd\uc131\ud558\uba74": [8, 32], "finetuning\ud588\ub358": 8, "moongat": 8, "\uc0dd\uc131\ud574\ubc84\ub9bc": 8, "\ubc29\uc9c0\ud558\uae30\uc704\ud574": 8, "world\uc758": 8, "image\uc5d0\uc11c": [8, 12, 33], "200\uc7a5\uc758": [8, 25], "regul": 8, "\uc720\uc0ac\ud558\ub2e4": 8, "clip\uc5d0\uc11c": [8, 27], "space\uc0c1\uc758": 8, "vector\uac00": 8, "similar\ud558\ub2e4": 8, "joint": [8, 16, 33, 34], "trane": 8, "rare\ud55c": 8, "key\ub97c": 8, "\ubd80\uc5ec\ud574": [8, 41], "constrain": 8, "optim": [8, 10, 13, 17, 22, 25, 28, 33, 35, 42], "merg": [8, 20], "concept\uc73c\ub85c": 8, "weight\ub97c": [8, 15, 20, 27], "appendix": [8, 40], "a\uc5d0\ub294": 8, "\ub098\uc640\uc788\ub294\ub370": 8, "\uc624\ud0c8\uc790\uc77c": 8, "\uac00\ub2a5\uc131": 8, "reg": 8, "caption\uc758": 8, "\ubf51\uc544": [8, 34], "\uacf1\ud55c": 8, "\uac12\uacfc\uc758": 8, "norm\uc744": 8, "\uacc4\uc0b0\ud588\uc744\ub54c": 8, "n\uac1c\uc758": [8, 15, 33], "attention\uc774": 8, "\ub3d9\uc791\ud558\ub294": [8, 19], "\ucc3e\uc544": [8, 28], "\ud558\ub098\ub9cc": 8, "\uc0ac\uc6a9\ud558\uc790": 8, "250": [8, 30], "two": [8, 9, 14, 26, 28, 33, 35, 39, 40, 41], "veri": 8, "small": [8, 28, 38, 41], "far": 8, "awai": 8, "zoom": 8, "techniqu": [8, 11, 15, 23, 37], "quant": [8, 28], "\ub300\uc751\ub418\ub294": 8, "\uc0dd\uc131\ud574\ub0c8\ub294\uac00": 8, "\ud45c\ud604\ud574\ub0c8\ub294\uac00": 8, "prefer": [8, 37], "baselin": [8, 33, 40], "customdiffus": [8, 17], "all": [8, 9, 20], "\uc120\ud638": 8, "inversion\uc740": [8, 28], "alignment\ub294": 8, "\uc120\ud638\ub3c4\uc640": 8, "\ube44\uc2b7\ud558\uc9c0\ub9cc": [8, 27], "alignment\uc218\uce58\ub97c": 8, "diffusion\uc774": 8, "\ub192\uc544": 8, "overfitting\ub41c": [8, 25], "\u314cgen": 8, "generate\ub41c": 8, "\uc218\uce58\ub294": [8, 18, 34], "regulat": 8, "world": [8, 15, 21, 29], "customizing\uc774": 8, "resourse\uac00": 8, "Of": 8, "category\uc758": 8, "object\uc5d0": [8, 21], "\ub3d9\uc791\ud558\uc9c0": [8, 14, 18], "hierarch": 9, "2022": [9, 12, 16, 19, 22, 31, 32, 37, 40], "2204": 9, "06125v1": 9, "sep": [9, 37, 38], "18": [9, 12, 31, 35], "dalle2": [9, 15], "2022\ub144\uc5d0": 9, "\uacf5\uac1c\ub418\uc5b4": 9, "\uc138\uc0c1\uc744": 9, "\ub180\ub77c\uac8c": 9, "\ub2a5\ub825\ub3c4": 9, "\ub6f0\uc5b4\ub0ac\uace0": 9, "\uc0ac\uc6a9\uc790": 9, "\uc785\ub9db\uc5d0": 9, "\uc870\uc791\ud560": 9, "\ub418\uc5c8\uc8e0": 9, "\uc774\ub984\uc740": 9, "\uc77c\uae4c\uc694": 9, "\ucd08\ud604\uc2e4\uc8fc\uc758": 9, "\ud654\uac00": 9, "salvador": 9, "dali": 9, "wall": 9, "\ud569\uc131\uc5b4\uc785\ub2c8\ub2e4": 9, "\uc0dd\uc131\ud574\ub0b8": 9, "\uacb0\uacfc\ubb3c\uc774": [9, 24, 33], "\uc5b4\ub5bb\uae38\ub798": 9, "\uacb0\uacfc\ubb3c": [9, 33], "\uc0dd\uc804": 9, "\ubaa8\uc2b5": [9, 22], "vibrant": 9, "robot": 9, "half": [9, 30], "\ubaa8\uc2b5\uc774": [9, 32], "\ubcf4\uc774\ub124\uc694": 9, "\ucd08\ud604\uc2e4\uc8fc\uc758\uc801": 9, "\uac19\uae30\ub3c4": 9, "corgi": 9, "\uc5b4\ub5a4\uac00\uc694": 9, "depict": 9, "explos": 9, "nebula": 9, "\ubaa8\uc2b5\uc744": [9, 28, 39], "\uc131\uc6b4\uc758": 9, "\ud3ed\ubc1c\ub85c": 9, "\ubb18\uc0ac\ud574\ub2ec\ub77c\uace0": 9, "\ud588\uc744": [9, 12, 30, 35, 39], "\uadf8\ub9bc\uc785\ub2c8\ub2e4": [9, 42], "nasa": 9, "\ucd2c\uc601\ud55c": 9, "\ucd08\uc2e0\uc131": 9, "\ud3ed\ubc1c\uc758": 9, "\uc794\ud574\uc785\ub2c8\ub2e4": 9, "\uadf8\ub7f4\ub4ef\ud558\uc9c0": 9, "\uc54a\ub098\uc694": 9, "thi": [9, 10, 11, 13, 20, 28, 35, 43], "mosaic": 9, "largest": 9, "ever": 9, "taken": 9, "hubbl": 9, "telescop": 9, "crab": 9, "six": 9, "light": 9, "year": 9, "wide": 9, "expand": [9, 34, 41], "remnant": 9, "star": 9, "supernova": 9, "\uc8fc\uc758\uc0ac\ud56d": 9, "\ube44\uc120\ud615\uc801\uc73c\ub85c": 9, "\uc0b4\ud3b4\ubd05\ub2c8\ub2e4": 9, "\uc624\ud508\uc6d4\ub4dc": 9, "\uac8c\uc784\ucc98\ub7fc": 9, "\ub9d0\uc774\uc8e0": 9, "\ud575\uc2ec\uc774": 9, "\ub418\ub294": [9, 12, 14, 33, 34, 35, 36, 38, 41], "\uc9c8\ubb38\ub4e4\uc744": 9, "\ub358\uc9c0\uba70": 9, "\ud30c\ud5e4\uccd0": 9, "\uac81\ub2c8\ub2e4": 9, "\ud3ec\uc2a4\ud305\uc740": 9, "openai": [9, 31], "blog": [9, 28], "assemblyai": 9, "eden": 9, "meyer": 9, "\ucc38\uace0\ud588\uc2b5\ub2c8\ub2e4": 9, "\ubcf8\uaca9\uc801\uc73c\ub85c": 9, "\uc804\uc5d0": [9, 35], "\uc54c\uc544\uc57c\ud560": 9, "\ubaa8\ub378\uc785\ub2c8\ub2e4": [9, 19, 26, 36], "The": [9, 13, 26], "fundament": 9, "principl": 9, "ar": [9, 10, 11, 20, 24, 41], "quit": 9, "simpl": [9, 18, 34, 38, 41], "first": [9, 10, 20, 31], "associ": 9, "caption": [9, 16, 29, 30, 33, 37], "through": [9, 16, 28], "respect": [9, 34, 37], "dimension": [9, 11], "Then": [9, 20], "cosin": [9, 12, 22, 28, 34, 35, 40], "similar": [9, 29, 31, 33, 35], "each": [9, 26, 35], "pair": [9, 20, 22, 23, 29, 37, 41], "comput": [9, 10, 15, 20, 29, 31, 32, 34, 35, 37, 38, 39, 40, 41, 43], "simultan": 9, "maxim": [9, 33], "correct": [9, 35], "minim": 9, "incorrect": [9, 17, 35], "\ud1b5\ud569\uc2dc\ucf30\uc2b5\ub2c8\ub2e4": 9, "\ucd5c\ucd08\ub294": 9, "\uc815\ub2f5\uc740": 9, "\uc544\ub2d9\ub2c8\ub2e4": [9, 26], "22\ub144": 9, "5\uc6d4": 9, "\uc0ac\uc6a9\ud558\uc9c0": [9, 17, 30, 31, 39], "imagen": [9, 17, 21, 22, 30, 35, 39], "\uc5d0\uac8c": [9, 30], "sota": [9, 14, 15, 21, 22, 25, 27, 29, 33, 37, 41], "\ub0b4\uc8fc\uc5c8\uc2b5\ub2c8\ub2e4": 9, "\ucc0d\uba39\ud558\uae30": 9, "\ub0b4\uc758": [9, 24], "\ud3ec\ucc29\ud574\ub0bc": 9, "\ud45c\ud604": [9, 11, 14, 29, 40], "\ub04c\uc5b4\uc62c\ub9ac\uae30": 9, "\uc778\ub370\uc694": 9, "unclip": 9, "\ubd80\ub985\ub2c8\ub2e4": [9, 40], "architectur": [9, 10, 15, 17, 21, 26, 28, 31, 36, 37, 38, 42], "\ubcf5\uc7a1\ud574\ubcf4\uc774\ub2c8": 9, "assembl": 9, "ai": [9, 17, 24, 32], "\ub2e8\uc21c\ud654\ub41c": 9, "\uc0b4\ud3b4\ubcfc\uac8c\uc694": 9, "f1x4fhzf4mq": 9, "360": 9, "\ubaa8\ub378\uc778": [9, 23, 30, 32, 37], "\uac19\ub124\uc694": 9, "\ucea1\uc158\uc744": [9, 21], "\uc0c1\uc751\ud558\ub294": 9, "autogregress": 9, "\ube44\uad50\ud558\ub294": [9, 12, 17, 39], "\uc218\ud589\ud588\uc2b5\ub2c8\ub2e4": [9, 32], "computation": [9, 41], "\ud558\uace0": [9, 12, 19, 24, 30, 31, 41], "\ud6c4\ubc18\ubd80\uc5d0\ub294": 9, "\uc2e4\ud5d8\ud569\ub2c8\ub2e4": 9, "\ubaa8\ub378\ub9cc": 9, "\uc774\ub791": [9, 33, 42], "\uc0ac\uc6a9\ud588\uc744\uae4c\uc694": 9, "\ud559\uc2b5\ud558\ub294\ub370": [9, 28, 35], "\uc131\uacf5\uc744": 9, "\uac70\ub450\uace0": 9, "shift": [9, 12, 30], "capabl": 9, "\ub6f0\uc5b4\ub0ac\uc2b5\ub2c8\ub2e4": 9, "\ub2ec\uc131\ud574\ub0c8\uc2b5\ub2c8\ub2e4": 9, "tak": 9, "\uac31\uc2e0\ud558\ub294": 9, "\uc911\uc774\uc5c8\uc8e0": 9, "determinist": [9, 10, 34, 40, 42], "\ub355\ubd84\uc5d0": 9, "\uc874\uc7ac\ud558\uc9c0": [9, 21, 32], "essenti": 9, "\ubcc0\uc8fc\ud558\uba74\uc11c": 9, "\uc788\uc8e0": 9, "variat": [9, 11], "\uc67c\ucabd\uc758": 9, "\ubcf4\uc874\ub429\ub2c8\ub2e4": 9, "\uadf8\ub4e4\uc774": 9, "\ud45c\ud604\ub418\ub294": 9, "\ubc29\uc2dd\uc774\ub098": 9, "\ubc14\ub01d\ub2c8\ub2e4": 9, "\uadf8\ub7fc\uc5d0\ub3c4": [9, 14, 29, 32], "\ud2b9\uc720\uc758": 9, "\ud654\ud48d\uc740": 9, "\ubcc0\uc8fc\uace1\ucc98\ub7fc": 9, "\ub9e4\ubc88": [9, 12, 20, 33], "\uc0c8\ub86d\uac8c": [9, 12, 28], "\uc5f0\uc8fc": 9, "\ud574\ub0bc": 9, "\uc788\ub294\uac81\ub2c8\ub2e4": 9, "\ud30c\ud5e4\uce58\uae30": 9, "\uc774\ubc88\uc5d0\ub294": [9, 32], "\uc0b4\ud3b4\ubcf4\uc8e0": 9, "\uc790\uccb4\uc758": 9, "\uc124\uba85": [9, 12, 21, 34], "\uc0ac\uc2e4": [9, 18], "\uc870\uac74\uc73c\ub85c": [9, 14], "\uc790\uccb4\ub3c4": 9, "\ubc1b\uc2b5\ub2c8\ub2e4": 9, "\ubb3c\ub860": [9, 27], "\ubc1b\uaca0\uc8e0": 9, "1\ub3001": 9, "\ub300\uc751\ub418\uae30": 9, "duel": 9, "\ubb38\uc81c\ub420": 9, "\uc5c6\ub2e4\uace0": [9, 26], "\ubcc0\ub860\ud569\ub2c8\ub2e4": 9, "\ub192\uc774\uae30": [9, 18, 22, 39], "2\uac1c\uc758": [9, 39, 41], "dot": [9, 12, 15], "\uc0ac\uc6a9\ud588\ub2e4\uace0": [9, 16, 27, 35, 40], "modifi": 9, "glide": [9, 38, 39], "\uc8fc\uc7a5\ud569\ub2c8\ub2e4": [9, 40, 41], "\ud1b5\ud569\uc2dc\ud0a4\ub0d0\ud558\uba74": 9, "\ucd94\uac00\ud558\uace0": [9, 11, 15, 17, 21, 22], "token": [9, 15, 20, 21, 28, 33, 35, 41], "\ud558\ub294\uac70\uc8e0": 9, "\ubc29\ubc95\uc73c\ub85c": [9, 14, 27, 28, 32, 34, 36, 40], "\uc0ac\uc6a9\ud568\uc73c\ub85c\uc368": [9, 34, 38], "\uc788\ub358": 9, "\ud65c\uc6a9\ud560": [9, 28, 31], "\ud544\uc694\ud560\uae4c\uc694": 9, "obtain": 9, "full": [9, 11, 14, 18, 21, 25, 38], "we": [9, 28, 35, 41], "which": [9, 28, 37], "possibl": [9, 40], "given": [9, 12, 13], "\ub531\ud788": 9, "\uc640\ub2ff\uc9c0\ub294": 9, "\uc2e4\ub9dd\ud558\uae34": 9, "\uc774\ub985\ub2c8\ub2e4": 9, "\uc720\ubb34\uc5d0": 9, "\ud488\uc9c8\uc744": [9, 14, 24, 27, 28], "\uc218\ud589\ud588\ub2e4\uace0": [9, 16], "\ud55c\ubc88": [9, 11, 31, 35, 42], "\uc0b4\ud3b4\ubcfc\uae4c\uc694": 9, "\ubaa8\ub378\ucc98\ub7fc": [9, 30], "\uc8fc\uc5b4": [9, 30, 32], "\ud6cc\ub96d\ud588\uc2b5\ub2c8\ub2e4": 9, "\uacbd\uc6b0\uc758": [9, 14, 32], "\uc544\ud0a4\ud14d\uccd0\uc5d0": 9, "same": [9, 20], "\uadf8\ub807\uc9c0\ub9cc": [9, 37], "\uc758\ubb38\uc774": [9, 27], "\ub9d0\ub054\ud788": 9, "\ud574\uc18c\ub418\uc9c0\ub294": 9, "\uc65c\ub0d0\ud558\uba74": [9, 12], "95": 9, "\ubc29\uc2dd\uc5d0": [9, 28], "\uc801\uc6a9\ud574": [9, 24, 39], "\uc2e4\ud5d8\ud588\uc2b5\ub2c8\ub2e4": [9, 40], "\uacf5\uc815\ud55c": 9, "\uc2e4\ud5d8\uc774\ub77c\uace0": 9, "\ubcf4\uae34": 9, "\uc5b4\ub824\uc6b8": [9, 22], "\ud559\uc2b5\uc2dc\ucf30\uc744": 9, "\uc5c6\uc2b5\ub2c8\ub2e4": [9, 41], "\uac1c\uc778\uc801\uc73c\ub85c": [9, 26, 27], "\uc800\ub294": [9, 26], "\ubcf4\uace0": [9, 11, 27], "\ubc18\ub4dc\uc2dc": [9, 23], "\uc368\uc57c\ud558\ub294": 9, "\uadfc\uac70\uc5d0": 9, "\uc124\ub4dd\ub825\uc774": 9, "\ub5a8\uc5b4\uc9c4\ub2e4\uace0": 9, "\uc0dd\uac01\ud588\uc2b5\ub2c8\ub2e4": 9, "\uc368\uc57c\ud560\uae4c\uc694": 9, "\uac1d\uccb4\ub97c": [9, 22], "\ubb18\uc0ac\ud55c": 9, "\uac1d\uccb4\uc758": 9, "\ubc1c\ud604": 9, "\uc758\ubbf8\ub860\uc801": 9, "\uad00\uacc4\ub97c": [9, 10, 18, 39], "\uc911\uc694\ud558\ub2e4\uace0": [9, 35], "manipul": [9, 23, 25, 31], "diff": 9, "appli": [9, 29], "interpol": [9, 15, 18, 31], "normalis": 9, "produc": 9, "descript": [9, 35], "\ud558\ub294\uc9c0\ub294": 9, "\uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4": [9, 36, 41], "\uadf8\ub798\uc11c": [9, 15, 16, 27, 36, 40], "\ubb50\uac00": [9, 22], "\uc88b\uc740\uac00\uc694": 9, "\uc0dd\uc131\ubb3c\uacfc": 9, "\uc0dd\uc131\ubb3c\uc744": 9, "\uc0ac\ub78c\ub4e4\uc5d0\uac8c": 9, "\uc81c\uc2dc\ud558\uace0": 9, "photor": [9, 16, 37], "\ub9e4\uae30\ub3c4\ub85d": 9, "when": [9, 26, 36, 37], "guidanc": [9, 13, 27, 29, 38, 41], "both": [9, 12, 30], "versu": 9, "\uacb0\ub860\uc740": 9, "compar": [9, 28], "\ud6e8\uc52c": [9, 12, 16, 17, 18, 21, 27, 30, 32], "bipartit": 9, "z_i": [9, 19], "\uc778\ucf54\ub529": [9, 19, 22, 29], "\uc5bb\uc73c\uba70": 9, "\ubcf5\uc6d0\ud558\ub294\ub370": 9, "\ud544\uc694\ud55c": [9, 22, 28, 29, 30, 32], "\uc794\uc5ec": 9, "\uc815\ubcf4\ub4e4\uc744": [9, 41], "\uc9c0\ub2d9\ub2c8\ub2e4": 9, "\ubcc0\uc8fc\ud558\uae30": 9, "\u03b7": [9, 10], "\ud574\uc9c0\uace0": 9, "\ubcf5\uc6d0\ud574\ub0c5\ub2c8\ub2e4": 9, "\ucee4\uc9c8\uc218\ub85d": [9, 10, 18, 25], "\uc0dd\uae30\uace0": 9, "\uadfc\ucc98\uc5d0\uc11c": 9, "perceptu": [9, 12, 32], "centere": 9, "\ub9cc\ub4e4\uc5b4\ub0bc": [9, 16], "\ud0a4\uc6b0\uba74": 9, "\uc874\uc7ac\ud558\uace0": [9, 31], "\uc720\uc2e4\ub418\uc5c8\ub294\uc9c0": 9, "\ud0d0\uc0c9": 9, "\ud0d0\uc0c9\ud574\ub0bc": 9, "\uc788\ub294\uac70\uc8e0": 9, "\uac83\ub3c4": [9, 11, 27, 42], "\ud574\uc11c": [9, 15, 22, 28, 34, 36, 39], "\uc900\ub2e4\uba74": 9, "\ucea1\uc158\uc774": 9, "\uc8fc\uc5b4\uc838\uc788\uc744": 9, "\uc6b0\ub9ac\uac00": [9, 11, 32], "z_t0": 9, "current": [9, 10, 11], "embd": 9, "\uc870\uc791\ub429\ub2c8\ub2e4": 9, "typograph": 9, "attak": 9, "attack": 9, "\uc0ac\ubb3c": 9, "\uc704\uc5d0": [9, 16, 40], "\uae00\uc528\uac00": 9, "\uc4f0\uc5ec": 9, "\uacbd\uc6b0\uc785\ub2c8\ub2e4": [9, 26], "multimod": [9, 30, 37], "\uc0ac\ubb3c\uc744": 9, "\ud310\ub2e8\ud558\ub294": 9, "ipod": 9, "\uc885\uc774\uac00": 9, "\ubd99\uc740": [9, 32], "\uc0ac\uacfc\ub97c": 9, "\ubd84\ub958\ub97c": [9, 15], "\uc218\ud589\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4": 9, "\uc5ed\uc2dc": [9, 42], "granni": 9, "smith": 9, "\uac00\uae5d\ub2e4\uace0": 9, "\ud310\ub2e8\ud588\uc2b5\ub2c8\ub2e4": 9, "\uc0ac\uacfc\uc758": 9, "\uc0ac\uc9c4\uc73c\ub85c": 9, "recov": 9, "\ud574\ub0c5\ub2c8\ub2e4": 9, "\uc774\ucc98\ub7fc": [9, 31, 42], "\ub2e8\uc810\uc740": 9, "\uc5c6\ub098\uc694": 9, "cube": 9, "\uadf8\ub4e4\uc758": [9, 28], "\uc18d\uc131": [9, 22, 32], "color": [9, 25, 31, 35, 38, 41], "\ub9e4\uce6d\uc2dc\ud0a4\ub294": 9, "\ub5a8\uc5b4\uc9d1\ub2c8\ub2e4": 9, "red": [9, 33], "blue": [9, 33], "\ud30c\ub780": [9, 30], "\ud050\ube0c": 9, "\ube68\uac04": [9, 27], "\ud050\ube0c\ub97c": 9, "\uadf8\ub824\ub2ec\ub77c\uace0": 9, "\ud050\ube0c\uc640": 9, "\ud050\ube0c\uc5d0": 9, "\uc0c9\uc0c1": [9, 22], "attribut": [9, 12, 26, 38], "\ubd80\uc5ec\ud574\uc57c\ud560\uc9c0": 9, "\ud5f7\uac08\ub824\ud569\ub2c8\ub2e4": 9, "sign": 9, "sai": 9, "deep": [9, 18, 21, 27, 31, 32, 37, 40], "\ub9cc\uc758": 9, "\ubb38\uc81c\ub294": 9, "\uc5b4\ub824\uc6cc\ud558\ub294": 9, "\ubb38\uc81c\uc785\ub2c8\ub2e4": 9, "\uc0c1\ud669\uc5d0\uc11c": [9, 11], "\ub514\ud14c\uc77c\uc744": [9, 14, 22, 28], "\ubb18\uc0ac\ud558\ub294": 9, "show": [9, 37], "some": 9, "complex": [9, 41], "\ub124\uc628": 9, "\uc0ac\uc778\ub4e4\uc758": 9, "\ub514\ud14c\uc77c\ub4e4\uc774": 9, "\ud655\uc778\ud558\uc2e4": 9, "\ub17c\ubb38\uc758": [9, 17, 21, 23, 26, 27, 34, 39, 42], "\uc218\ud559\uc801": 9, "justifi": 9, "\ub77c": [9, 40, 41], "\ud569\uc2dc\ub2e4": [9, 26], "\uadf8\uc5d0": [9, 23, 32, 42], "\uc800\uc790\uc758": 9, "\uc8fc\uc7a5": [9, 34, 37], "\uc0d8\ud50c\ub9c1\ud560": [9, 31], "equal": 9, "hold": 9, "becaus": 9, "function": [9, 15, 22, 28, 31, 36, 39, 40, 42], "rule": [9, 40], "\ud3ec\uc2a4\ud305\uc744": 9, "\ubd80\uac00": 9, "\uacf5\uc2dd\uc744": 9, "\ud480\uc5b4\uc11c": 9, "\ud574\uc124\ud574\ubcf4\uba74": 9, "\uc0d8\ud50c\ub9c1\ud558\uace0": [9, 30, 42], "\uc0d8\ud50c\ub9c1\ud568\uc73c\ub85c\uc368": 9, "\uc0d8\ud50c\ub9c1\uc774": 9, "\uac00\ub2a5\ud574\uc9c0\ub294": 9, "\uc5c6\ub294\uc9c0": 9, "\uad81\uae08\ud574\uc11c": 9, "\uacf5\ubd80\ud574\ubd24\uc2b5\ub2c8\ub2e4": 9, "\ud574\uc18c\ud558\uae30": 9, "\ub178\ub825\uc744": 9, "\ud558\uace0\uc788\ub294\uc9c0": 9, "\uc815\ub7c9\uc801\uc73c\ub85c": [9, 14], "\ud3c9\uac00\ud560": [9, 38], "\uc870\uc0ac\ud574\ubd24\uc2b5\ub2c8\ub2e4": 9, "\uacb0\uacfc\ubd80\ud130": 9, "\ub9d0\uc500\ub4dc\ub9ac\uba74": 9, "\uc6f9\ud06c\ub864\ub9c1": 9, "\uc874\uc7ac\ud55c\ub2e4\uace0": 9, "\ud558\uace0\uc788\ub294\uc9c0\ubd80\ud130": 9, "preview": 9, "safeti": 9, "\ub178\ub825": 9, "\ub370\uc774\ud130\uc5d0\uc11c": [9, 27], "violent": 9, "hate": 9, "adult": 9, "\uc81c\uac70\ud568\uc73c\ub85c\uc368": 9, "\ub178\ucd9c\ub418\ub294": 9, "\ucd5c\uc18c\ud654\ud588\ub2e4\uace0": 9, "polici": 9, "\uc704\ubc18\ud55c": 9, "\uc790\uc815\ud558\ub294": 9, "\uc2dc\uc2a4\ud15c\uc744": 9, "\ubcf4\uc720\ud558\uace0": 9, "\uc2e0\ub8b0\ud560": 9, "\uc804\ubb38\uac00\ub4e4\uacfc": 9, "\uac80\ud1a0\ub97c": 9, "\uc9c4\ud589\ud588\ub2e4\uace0": [9, 16, 38], "eval": [9, 10, 21], "\uae30\ubc95\uc774": [9, 16, 31], "2202": [9, 40], "04053": 9, "j": [9, 11, 15], "min": [9, 10, 20, 39], "dallev": 9, "contribut": [9, 14, 15, 34], "3\uac00\uc9c0\ub97c": 9, "\uc81c\uacf5\ud569\ub2c8\ub2e4": [9, 17, 31], "\ucd5c\uadfc\uc758": [9, 32], "recognit": [9, 27], "skill": 9, "\uc0c1\ub300\uc801\uc73c\ub85c": [9, 17, 34], "\ub6f0\uc5b4\ub098\uc9c0\ub9cc": [9, 15, 18], "count": [9, 38], "spaial": 9, "\ub2a5\ub825\uc740": [9, 30], "\ub5a8\uc5b4\uc9d0\uc744": 9, "gender": 9, "skin": 9, "tone": 9, "bias": 9, "metric": [9, 10, 11, 23, 29, 31, 32, 35, 38], "\ubd84\uc11d": [9, 28, 34], "web": 9, "\ud559\uc2b5\ud588\uc74c\uc744": 9, "\ubcf4\uc5ec\uc8fc\uc5c8\uc2b5\ub2c8\ub2e4": [9, 19], "social": 9, "sec": 9, "\uc790\uc138\ud55c": [9, 12, 27, 40, 41], "diagnost": 9, "who": 9, "nurs": 9, "252\uac1c\uc758": 9, "\ud0d0\uc9c0\ud569\ub2c8\ub2e4": 9, "autom": 9, "detect": 9, "verifi": 9, "reliabl": 9, "\uc8fc\uba74\uc11c": 9, "\uc0ac\ub78c\uc758": [9, 14, 21, 26], "\uc131\ubcc4\uc744": 9, "\ub9de\ucd94\uac8c": 9, "\ub2f5\ubcc0\uc744": 9, "\uc2e0\uacbd\ub9dd\uc73c\ub85c": 9, "facial": [9, 25], "landmark": 9, "\ucd94\ucd9c\ud558\uace0": [9, 24], "illumin": 9, "\ubcf5\uc7a5\uc744": 9, "\ud0d0\uc9c0\ub41c": 9, "uniform": [9, 10, 30, 41], "\uc73c\ub85c\ubd80\ud130": [9, 32], "skew": 9, "\ub418\uc5b4\uc788\ub294\uc9c0": 9, "expert": 9, "per": 9, "profess": 9, "averag": [9, 10, 31, 39, 40], "\ud3c9\uac00\ud558\ub294\ub370\uc5d0": 9, "\uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4": 9, "satbl": 9, "\uc6f9\ud06c\ub864\ub9c1\uc744": 9, "\uc874\uc7ac\ud588\uc2b5\ub2c8\ub2e4": 9, "\ub178\ub825\uc774": 9, "\uc9c0\uc18d\ub418\uace0": 9, "\ubbf8\ub798\uc5d0\ub294": 9, "\uc548\uc804\ud558\uac8c": 9, "\uc788\uae30\ub97c": 9, "\uae30\ub300\ud569\ub2c8\ub2e4": 9, "iclr": [10, 12, 20, 40, 42], "2021": [10, 12, 18, 20, 31, 33, 34, 40], "2010": 10, "02502": 10, "april": [10, 15], "\ub2e8\uc810\uc778": 10, "process\ub85c": [10, 11, 18, 34, 39], "\uc815\uc758\ud568\uc73c\ub85c\uc11c": 10, "deterministic\ud55c": 10, "sampling\uc774": [10, 34], "adversari": [10, 15, 17, 23, 26, 36], "\ubcf4\uc5ec\uc8fc\uace0\uc788\ub2e4": 10, "gan\uc740": [10, 15, 26, 32], "\ubd88\uc548\uc815\uc131\uc744": [10, 32], "\ub9ce\ub2e4": [10, 14], "generator\uc640": 10, "discriminator\uc758": [10, 15], "imbalanced\uc5d0": 10, "\uc758\ud55c": [10, 28], "mode": [10, 12, 20, 41], "collaps": 10, "\uadf8\ub7ec\ub358": 10, "ddpm\uacfc": [10, 12, 16, 23], "ncsn\uac19\uc740": 10, "training\uad6c\uc870\uac00": 10, "\ub4f1\uc7a5\ud558\uc600\uace0": 10, "\uc131\uacf5\uc758": 10, "\ubcf4\uc5ec\uc8fc\uc5c8\ub2e4": [10, 12, 25, 30, 39], "ddpm\uc740": [10, 34], "process\uc5d0\uc11c": [10, 12, 18, 23, 34], "\uac70\uce58\ub294\ub370": 10, "\uc774\ub54c\ubb38\uc5d0": 10, "gan\uc5d0": 10, "\ub290\ub9b0": [10, 39], "performance\ub97c": 10, "50k": [10, 40], "less": 10, "than": 10, "about": 10, "20h": 10, "256": [10, 12, 14, 22, 24, 32, 33, 36, 37], "1000h": 10, "ddim\uc740": [10, 12, 34], "chain\uc5d0": 10, "\ub300\uccb4\ud558\uc600\uace0": 10, "\uacb0\uad6d": [10, 12, 16, 18, 22, 33, 34], "\ube60\ub974\uace0": [10, 12, 17, 39], "\ube44\uad50\uc801": [10, 15, 18, 41], "\uc0dd\uc131\ud574\ub0b4\uace0": [10, 25], "accel": 10, "ddpm\uacfc\ub294": 10, "consistency\ud55c": 10, "\ubcf4\uc5ec\uc90c\uc73c\ub85c\uc368": 10, "latent\uac04\uc758": 10, "interpolation\uc774": 10, "If": 10, "equival": 10, "process\ub294": [10, 12, 16, 39], "\ub3d9\uc791\ud55c\ub2e4": 10, "\ubbf8\ub798": 10, "\uc2dc\uc810\uc744": [10, 12], "\uc608\uce21\ud558\uae30\uc704\ud574": 10, "\uc774\uc6a9\ud55c\ub2e4": [10, 12, 16], "\uc2dc\uc810\uc740": 10, "\uacfc\uac70": [10, 31], "\uac12\uc5d0\ub294": 10, "\uac16\ub294\ub2e4": 10, "t\ub294": 10, "ddpm\uc5d0\uc11c": [10, 12, 16, 18, 34], "\uc88c\uc9c0\uc6b0\uc9c0\ud558\ub294": 10, "hyper": [10, 15, 18, 20, 25], "parameter\uc774\ub2e4": [10, 39], "\ub300\ucda9": 10, "\ubc88\uc758": [10, 22], "sequential\ud558\uac8c": 10, "\uac70\uccd0\uc57c\ud558\uace0": 10, "\ud604\uc800\ud788": [10, 18, 40], "\uc18d\ub3c4\ub97c": [10, 17, 21, 39], "\uc694\uc18c\uac00": [10, 13], "\uad6c\ud558\uae30\uc704\ud574": 10, "\ucc38\uc870": [10, 17], "\uac12\ub9cc\uc744": 10, "\u03c3\ub294": 10, "process\uc758": [10, 18], "stochastic\ud55c": [10, 12], "chap": 10, "And": 10, "unifi": 10, "\uc2dd\uc744": [10, 12, 34, 40], "\uc774\uc6a9\ud574": [10, 12, 14, 16, 23, 27, 28, 42], "\uc0d8\ud50c\ub9c1": [10, 14, 15, 21, 22, 27, 29, 34, 37], "\uad00\uacc4": [10, 22], "t\uc2dc\uc810\uc758": [10, 12], "\uc608\uce21\ud55c": [10, 12, 16, 17, 39], "\u03c3": 10, "\u03c3\uac00": 10, "\uac00\uc9c8": 10, "\uc218\uc2dd\uacfc": 10, "\ub3d9\uc77c\ud558\ub2e4": 10, "explan": 10, "deterministic\ud558\uae30\ub54c\ubb38\uc5d0": [10, 34], "\uacc4\uc0b0\ud560": [10, 34], "subset\uc758": [10, 34], "\uc2dc\uc810\ub9cc\uc73c\ub85c": [10, 34], "method\ub294": [10, 28, 34], "\uc57d\uac04\uc758": [10, 14, 16, 34], "\uc800\ud558\uac00": [10, 17, 34], "efficiency\ub97c": [10, 34], "\ucda9\ubd84\ud788": [10, 17, 31, 34, 39], "\uc99d\uac00\uc2dc\ud0ac": [10, 34], "ddim\uc758": [10, 34], "od": [10, 31], "encoding\uc774": 10, "\uc720\ub3c4\ud560": 10, "table1": [10, 15], "euqat": 10, "simple\ud558\uac8c": 10, "control\ud558\uae30\uc704\ud55c": 10, "\ud69f\uc218": [10, 17], "3\uc758": [10, 33], "\u03b7\uac00": 10, "step\uc5d0": [10, 12, 18, 39], "step\uacfc": 10, "time\uc774": 10, "linear\ud55c": 10, "step\uc5d0\uc11c\ub3c4": 10, "\uc5b4\ub290\uc815\ub3c4\uc758": [10, 39], "object\ub97c": 10, "kera": 10, "diffusionmodel": 10, "image_s": 10, "width": [10, 15, 21, 34], "block_depth": 10, "get_network": 10, "denorm": 10, "convert": [10, 35], "pixel": [10, 32, 33, 39, 41], "back": 10, "rang": [10, 33, 35, 36, 41], "mean": [10, 11, 12, 16, 30, 35, 40], "tf": 10, "clip_by_valu": 10, "diffusion_schedul": 10, "diffusion_tim": 10, "angl": 10, "start_angl": 10, "aco": 10, "max_signal_r": 10, "end_angl": 10, "min_signal_r": 10, "diffusion_angl": 10, "signal_r": 10, "co": [10, 11, 40], "noise_r": 10, "sin": [10, 11], "note": 10, "squar": [10, 35, 40], "sum": [10, 12, 20, 42], "alwai": 10, "noisy_imag": 10, "exponenti": [10, 24, 31, 39], "move": [10, 24, 31, 39], "ema_network": 10, "predict": [10, 11, 12, 17, 35, 37, 39, 40, 41], "compon": 10, "calcul": 10, "pred_nois": [10, 11], "pred_imag": 10, "train_step": 10, "have": 10, "deviat": 10, "like": [10, 15], "shape": [10, 11, 21, 26, 28, 35, 36, 38], "batch_siz": [10, 26, 30, 42], "minval": 10, "maxval": 10, "accordingli": 10, "gradienttap": 10, "tape": 10, "separ": [10, 21, 26, 35], "noisi": [10, 14, 41], "noise_loss": 10, "image_loss": 10, "trainable_weight": 10, "apply_gradi": 10, "noise_loss_track": 10, "update_st": 10, "image_loss_track": 10, "name": [10, 20], "reverse_diffus": 10, "initial_nois": 10, "diffusion_step": 10, "num_imag": 10, "step_siz": 10, "line": 10, "pure": [10, 40], "its": 10, "assum": 10, "nonzero": 10, "next_noisy_imag": 10, "ones": 10, "remix": 10, "next": 10, "next_diffusion_tim": 10, "next_noise_r": 10, "next_signal_r": 10, "generated_imag": 10, "probabilist": [11, 20, 27], "neurip": [11, 34, 37], "2020": [11, 12, 18], "2006": [11, 20], "11239": [11, 20], "pytorch": [11, 20, 21, 26, 33, 36, 42], "implement": [11, 20, 25, 30, 35, 36, 39, 42], "review": [11, 20, 28, 43], "pr": [11, 20, 35], "409": [11, 20], "beomsoo": [11, 20, 43], "park": [11, 12, 16, 20, 43], "apr": [11, 20, 26, 31, 36, 42], "19": [11, 20], "velog": [11, 32, 33], "yetsyl0705": 11, "what": 11, "inference\ub85c": [11, 39], "\ud559\uc2b5\uc2dc\ucf1c": [11, 20], "parameter": [11, 31], "markov\uac00": 11, "distribution\uc758": 11, "\ub54c\uae4c\uc9c0": [11, 12, 40], "\ub354\ud574\uac00\ub294": 11, "\uc5ed\uc73c\ub85c": 11, "\uac70\uce58\uba70": [11, 39], "\uad6c\uc131\ub428": 11, "\uc815\uc758\ud558\uae30": 11, "\uc27d\uace0": 11, "\ud559\uc2b5\uc2dc\ud0a4\ub294": [11, 16, 32], "\ud3b8\ub9ac\ud568": 11, "\ud488\uc9c8\uc758": [11, 14, 16, 32, 39], "\uc0dd\uc131\uc774": [11, 13, 17, 22, 25, 29, 33, 34, 37], "\ubcc0\ubd84\ucd94\ub860": [11, 42], "\uc0ac\ud6c4\ud655\ub960": 11, "posterior": [11, 33, 42], "\ubd84\ud3ec": [11, 33], "\ub2e4\ub8e8\uae30": [11, 42], "\uc26c\uc6b4": [11, 42], "\ud655\ub960\ubd84\ud3ec": [11, 39], "\uadfc\uc0ac": 11, "approxim": [11, 36, 39, 42], "\ud45c\ud604\uc2dd\uc5d0": 11, "\ubcf4\ud1b5": [11, 17, 20, 26, 27, 28, 32], "parameter\uc758": [11, 16], "\uc2dd\uc758": [11, 12], "\ucc28\uc218\ubcf4\ub2e4": 11, "\uc218\ub85c": 11, "3\ucc28": 11, "\ud45c\ud604\uc2dd": 11, "\ucc28\uc218\ub85c\uc758": 11, "\ud568\uc218": [11, 14, 15, 31, 32, 33, 34], "\uc0c1\ud0dc\uc5d0\uc11c": [11, 17, 32], "\uc0c1\ud0dc\ub85c": [11, 17, 21, 35, 41], "\ub118\uc5b4\uac08": 11, "\ub2e8\uacc4\uc758": [11, 14, 28, 36], "\uc0c1\ud0dc\uc5d0\ub9cc": 11, "graphic": [11, 37], "_0": [11, 31, 39], "prod_": [11, 12], "quad": [11, 31], "beta_t": [11, 12], "chain\uc73c\ub85c": 11, "data\uc5d0": [11, 12, 15], "\ucd94\uac00\ud560": 11, "beta_1": 11, "\ub354\ud574\uc900\ub2e4": 11, "\uc774\uba74": [11, 23, 37], "mean\uc778": 11, "\uc774\uc804": [11, 12, 14, 15, 16, 20, 26, 36], "\uac16\uc9c0": 11, "\ub178\uc774\uc988\uac00": 11, "\uc99d\uac00\ud568": 11, "\ub2e8\uc21c\ud788": [11, 14, 15, 23, 28, 32], "noise\ub9cc\uc744": 11, "\ub354\ud574\uc8fc\ub294\uac8c": 11, "scaling\ud558\ub294": 11, "variance\uac00": 11, "\ubc1c\uc0b0\ud558\ub294": 11, "\ub9c9\uae30": 11, "\uc704\ud568": [11, 32], "\uc644\uc804": 11, "destroy\ub41c": 11, "\uc0c1\ud0dc": 11, "boldsymbol": 11, "sigma": [11, 12, 26, 31, 34, 39, 40, 42], "\uac00\uc6b0\uc2dc\uc548": [11, 14, 29], "1994\ub144": 11, "process\uac00": [11, 23], "\uac00\uc6b0\uc2dc\uc548\uc774\uba74": 11, "process\ub3c4": 11, "\uac00\uc6b0\uc2dc\uc548\uc73c\ub85c": 11, "\uc4f0\uba74": 11, "\ub41c\ub2e4\ub77c\ub294": 11, "\uc99d\uba85\uc774": 11, "\ud574\uc57c": [11, 12], "sigma_": [11, 34, 35, 40], "hierarach": 11, "vae\uc5d0\uc11c\uc758": 11, "\uacfc\uc815\uacfc": 11, "\ube44\uc2b7\ud568": [11, 28], "\ubaa9\uc801\uc740": 11, "\uc81c\uac70\ud560": 11, "\uac83\uc778\uac00": 11, "\ub4e4\uc5b4\uc654\uc744": [11, 14, 27], "\uc608\uce21\ud560": [11, 22], "\uc608\uce21\uc774": 11, "\uac00\ub2a5\ud574\uc9d0": [11, 28], "leq": [11, 40], "_q": [11, 19], "geq": 11, "likelihood\ub97c": 11, "\ucd5c\uc18c\ud654": 11, "\ubc29\ud5a5\uc73c\ub85c": [11, 12, 23, 25, 36, 40, 41], "\uc218\uc2dd\uc744": [11, 12, 23, 31, 32, 34, 39, 42], "evid": [11, 33], "bound": [11, 42], "\uc6b0\ud56d\uacfc": 11, "\uc815\ub9ac\ud558\uace0": 11, "\ud480\uc5b4\ub0b4\uba74": 11, "elbo\uc758": 11, "\uc5ed\ud560\uc740": 11, "\uad00\ucc30\ud55c": 11, "\ud798\ub4e0": 11, "\uc774\ub8e8\uace0": 11, "\uc870\uae08": 11, "\ubd84\ud3ec\uc778": [11, 39], "\ud45c\ud604\ud558\ub824": 11, "\ucc28\uc774": [11, 23], "diverg": 11, "underbrac": [11, 12], "_1": [11, 14], "\ub098\uc628\ub2e4": [11, 34], "term\uc73c\ub85c": 11, "\ud559\uc2b5\uc2dc\ud0b4": 11, "reconstruct": [11, 24, 28, 35, 40, 42], "\uc9c0\uc6b0\ub294": 11, "\uc9c0\uc6c0": 11, "ddpm\uc5d0\uc11c\ub294": [11, 12, 16, 18], "induct": 11, "bias\ub97c": [11, 26, 28], "\ub298\ub824": [11, 27], "stable\ud558\uace0": 11, "\uc131\ub2a5\ub3c4": [11, 27, 30, 38], "\uac1c\uc120\ud560": [11, 18, 39], "\uc788\uc5c8\uc74c": [11, 20, 28], "\ub9cc\ub098\ubcf4\uc9c0": 11, "\ubabb\ud588\ub358": [11, 35], "\uc815\ud655\ud55c": [11, 13, 14, 28, 30, 31], "\uc608\uce21\uc744": [11, 14, 17], "\ud480\ub824\ub294": 11, "\uace0\uc815": [11, 13, 18, 28], "\ud588\ub354\ub2c8": 11, "\uc798\ub428": 11, "02\ub85c": 11, "linear\ud558\uac8c": 11, "\uac00\uae4c\uc6b8\uc218\ub85d": 11, "\uc801\uac8c": [11, 12, 33], "\uc8fc\ub294": [11, 12, 16, 21, 41], "parameter\uac00": 11, "\ub418\uae30": [11, 20, 32], "beta": [11, 17], "progress": [11, 31, 39], "posterior\ub97c": 11, "\ub354\ud574": 11, "\ub9cc\ub4e4\uc5c8\uc744\ub54c": 11, "\ubcf5\uc6d0": [11, 14], "simplic": 11, "sjina0722": 11, "\ub9ac\ubdf0": [11, 20], "\uc0c1\uc218\ub85c": 11, "\uac00\uc815\ud588\uace0": 11, "\ubc1b\uae30": [11, 25], "\ud559\uc2b5\uc2dc\ud0a4\uc9c0": 11, "\uc54a\uc544\ub3c4": [11, 36, 41], "\ub41c\ub2e4\uace0": 11, "\uc0dd\uac01\ud574": 11, "term\uc744": 11, "\uc81c\uac70": [11, 17, 22, 24], "\uad6c\ud558\uc9c0": [11, 36], "\uad6c\ud574": 11, "\uc815\ud655\ub3c4\ub97c": [11, 27], "\ub192\uc784": 11, "int_": 11, "sigma_1": 11, "arrai": 11, "ll": [11, 20, 35], "infti": 11, "255": 11, "case": [11, 15, 38], "\uc0ac\uc774\ub85c": 11, "linearli": [11, 12, 22, 40], "\ub2e8\uacc4\uc5d0\ub294": 11, "\ucd94\uac00\ud558\uc9c0": 11, "divergence\ub97c": 11, "\uc88c\ud45c": 11, "\uc704\uc640": [11, 12, 20, 21, 30, 31, 32, 34, 40], "\ub098\ud0c0\ub09c\ub2e4": [11, 14], "output\uac04": 11, "\uc904\uc774\ub294": [11, 17, 40], "denoising\uacfc": 11, "\ube44\uc2b7\ud574": 11, "ddpm\uc774\ub77c\ub294": 11, "\uc774\ub984\uc774": [11, 37], "\ubd99\uc74c": 11, "objective\uc744": 11, "\uc5d0\uc11c\ubfd0\ub9cc": 11, "t\uc5d0": [11, 39], "\uac00\ub2a5\ud558\uae30": 11, "\ud6a8\uacfc\uc801": 11, "psuedo": 11, "\ub354\ud574\ub098\uac00\ub294": 11, "\uc5bc\ub9c8\ub9cc\ud07c": 11, "\ub354\ud574\uc84c\ub294\uc9c0\ub97c": 11, "step\uc758": [11, 12, 16, 39], "\ucd94\uac00\ub418\uc5c8\ub294\uc9c0\ub97c": 11, "\ud559\uc2b5\ub41c\ub2e4": [11, 28], "\ucf54\ub4dc\uc5d0\uc11c\ub294": [11, 20], "\ub178\uc774\uc988\uc640": [11, 14], "t\ub85c": [11, 12, 16], "\uc5bb\uace0": 11, "p_loss": 11, "x_start": 11, "default": [11, 20], "torch": [11, 20, 30, 35, 41, 42], "randn_lik": [11, 35], "q_sampl": 11, "do": [11, 26, 28, 41], "slow": 11, "25": [11, 20, 22, 24, 27, 30, 36], "seem": 11, "significantli": [11, 37], "x_self_cond": 11, "self_condit": 11, "no_grad": 11, "model_predict": 11, "pred_x_start": 11, "detach_": 11, "take": 11, "model_out": 11, "pred_x0": 11, "pred_v": 11, "predict_v": 11, "rais": [11, 30, 35], "valueerror": [11, 35], "unknown": [11, 35], "loss_fn": 11, "reduct": [11, 30, 35], "reduc": [11, 35], "loss_weight": 11, "\ub098\uba74": [11, 17], "noise\uc5d0\uc11c": 11, "\uc21c\ucc28\uc801\uc73c\ub85c": [11, 33, 41], "p_sampl": 11, "int": [11, 30, 36, 39, 41, 42], "devic": [11, 30, 35], "batched_tim": 11, "model_mean": 11, "model_log_vari": 11, "p_mean_vari": 11, "clip_denois": 11, "pred_img": 11, "backbon": [11, 24, 29], "\ub2e8\uacc4\ub294": 11, "resnet": [11, 27, 30, 34, 41], "convnext": 11, "\ube14\ub85d": 11, "groupnorm": [11, 34], "upsampling\uc73c\ub85c": 11, "block_klass": 11, "resnetblock": 11, "group": 11, "resnet_block_group": 11, "modulelist": [11, 41], "dim_in": 11, "time_emb_dim": 11, "time_dim": 11, "prenorm": 11, "linearattent": 11, "dim_out": 11, "is_last": 11, "conv2d": [11, 20, 41], "init_dim": 11, "out_dim": 11, "dim_mult": 11, "learned_vari": 11, "learned_sinusoidal_cond": 11, "random_fourier_featur": 11, "learned_sinusoidal_dim": 11, "determin": 11, "dimens": [11, 20, 21, 41], "input_channel": 11, "init_conv": 11, "in_out": 11, "list": [11, 30, 41], "random_or_learned_sinusoidal_cond": 11, "sinu_pos_emb": 11, "randomorlearnedsinusoidalposemb": 11, "fourier_dim": 11, "sinusoidalposemb": 11, "time_mlp": 11, "gelu": 11, "num_resolut": 11, "len": [11, 30, 36, 41], "ind": 11, "enumer": [11, 35, 36, 41], "mid_dim": 11, "mid_block1": 11, "mid_attn": 11, "mid_block2": 11, "default_out_dim": 11, "final_res_block": 11, "final_conv": 11, "zeros_lik": 11, "clone": [11, 41], "block1": [11, 41], "block2": [11, 41], "attn": [11, 15, 25], "pop": 11, "resolution\uc5d0": [11, 27], "conv\uc5d0\uc11c": 11, "\ucc28\uc6d0\uc744": [11, 22, 29], "3\ubc30\ub85c": 11, "\ub298\ub9ac\uace0": 11, "v\ub85c": 11, "\ubd84\ud574": [11, 17], "dim_head": [11, 21], "hidden_dim": 11, "to_qkv": 11, "to_out": 11, "qkv": 11, "chunk": [11, 35, 41], "rearrang": [11, 21, 29], "einsum": 11, "softmax": [11, 19, 33], "layernorm": 11, "block\uc5d0": [11, 15, 16, 34], "sinusoid": [11, 29], "embedding\uc774": [11, 22, 28], "\ucd94\uac00\ub3fc\uc11c": 11, "\uad6c\ubd84\ub428": 11, "half_dim": 11, "math": 11, "10000": 11, "arang": 11, "score": [11, 15, 16, 21, 22, 31, 32, 33, 36, 37, 39, 40, 41], "is\ub85c": 11, "model\uc778\ub370\ub3c4": 11, "model\ubcf4\ub2e4": [11, 16, 23], "\uc6b0\uc6d4": 11, "codelength\uc5d0\uc11c": 11, "\ucc28\uc774\uac00": [11, 12, 18, 21, 27, 28, 39], "\uc5c6\uae30": [11, 22, 39], "overfitting\uc758": 11, "\uac00\ub2a5\uc131\ub3c4": 11, "\uc801\uc74c": 11, "incept": [11, 21, 27, 33, 40], "v3\uc73c\ub85c": 11, "\uacc4\uc0b0\ud55c": [11, 36], "\ud559\uc2b5\ub418\uba74": [11, 28], "\uacc4\uc0b0\ud558\ub294": [11, 36, 42], "\uc131\uc801\uc774": 11, "\uc88b\uace0": [11, 39], "variance\ub97c": [11, 18], "\uc0ac\uc6a9\ud588\uc744": [11, 27, 28, 31, 34], "\ub54c\uc5d0\ub3c4": [11, 12], "\uac10\uc18c\ud558\uc9c0": 11, "2210": 12, "10960": 12, "sehwan": [12, 16, 43], "domain\uc5d0\uc11c": 12, "control\ud558\ub294": 12, "\ubd80\uc871\ud558\ub2e4": [12, 14, 29], "model\uc18d\uc5d0\uc11c": 12, "space\ub97c": [12, 24, 28], "\ubc1c\uacac\ud558\uae30": 12, "\uc81c\uc548\ud558\uace0": [12, 31], "space\ub77c\uace0": 12, "\uba85\uce6d\ud55c": 12, "space\uc758": [12, 28, 39], "\ud2b9\uc131": 12, "homogen": 12, "across": 12, "\ub4e4\uc744": [12, 30, 37, 42], "strength\uc640": 12, "deficiency\ub97c": 12, "\uae30\uc900\uc73c\ub85c": [12, 20, 27, 30, 31, 40], "\uc0bc\uace0": 12, "translation\uc744": 12, "design\uc744": 12, "approach": [12, 21, 42, 43], "guidance\ub294": [12, 14, 34], "unconditional\ud55c": [12, 14, 16], "variable\uc5d0": 12, "variable\uc744": 12, "\ud569\uce58\ub294": 12, "\uc774\uc6a9\ud558\uba74\uc11c": 12, "\uba85\ud655\ud558\uac8c": [12, 36], "control\ud558\uae30\uac00": 12, "\uc27d\uc9c0": 12, "\uc54a\ub2e4": [12, 14, 15, 23, 29, 39], "\ucd94\uac00\ud558\uc5ec": [12, 16], "\uac70\uce58\ub294": [12, 31], "variable\uc774": 12, "class\uc778\uc9c0": 12, "\ubd84\ub958\ud558\uace0": 12, "\ubd80\uc5ec\ud558\ub294": 12, "\uc791\ub3d9\ud55c\ub2e4": [12, 21], "variable\ub4e4\uc5d0": 12, "classify\ub97c": 12, "\uc2e4\ud589\ud574\uc57c": 12, "\ud558\uae30\uc5d0": 12, "\uc0ac\uc6a9\ud558\uae30\uac00": 12, "\ud798\ub4e4\uc5b4": 12, "\uc2dc\ucf1c\uc57c": 12, "\uc2dc\uac04\uc801\uc73c\ub85c": [12, 14, 29], "\ube44\uc6a9\uc801\uc73c\ub85c": 12, "\ubd80\ub2f4\uc774": 12, "diffusionclip": 12, "space\ub294": 12, "origin": [12, 23, 24, 40], "edit\ud558\uae30": 12, "frozen": [12, 15, 27, 37], "model\uc5d0\uc11c": [12, 19, 39], "\ubc1c\uacac\ud558\uc600\uace0": 12, "\uce6d\ud55c\ub2e4": 12, "space\uc5d0\ub294": 12, "\ud2b9\uc131\ub4e4\uc774": 12, "\uc874\uc7ac\ud55c\ub2e4": 12, "editing\uacfc": 12, "boosting\uc744": 12, "design\ud558\uc5ec": 12, "space\ub85c\uc368\uc758": 12, "\ubc1c\uacac\uc0ac\ub840\uc774\ub2e4": 12, "\uaef4\uc788\ub294": [12, 16], "\uc5bc\ub9cc\ud07c\uc778\uc9c0": [12, 16], "\uc608\uce21\ud55c\ub2e4": [12, 16, 34], "\uc774\uc6a9\ud558\uc5ec": [12, 16, 21, 27, 33], "\uc81c\uac70\ub41c": [12, 16], "\uad6c\ud560": [12, 16, 40, 42], "constant\ud55c": [12, 16], "\uace0\uc815\uc2dc\ud0a8\ub2e4": [12, 16], "ddpm\uc5d0\uc11c\uc758": [12, 16], "sigma_t": [12, 35, 39, 40], "alpha_": [12, 16, 35], "alpha_t": [12, 16, 39, 40], "bigg": [12, 39], "ddim\uc5d0\uc11c\ub294": 12, "\uad00\uc810\uc758": 12, "\uc81c\uc2dc\ud558\uc600\uace0": 12, "general\ud558\uac8c": 12, "\uc801\uc6a9\ub418\ub294": [12, 31], "process\uc5d0": [12, 28], "eta": [12, 17], "1\uc778": 12, "ddpm\uc774": [12, 18], "\ub418\uace0": [12, 14, 15, 20, 21, 25, 31, 32, 35, 37, 40, 42], "stochastic\ud574\uc9c0\uba70": 12, "0\uc778": 12, "ddim\uc774": 12, "deterministic\ud574\uc9c4\ub2e4": 12, "cfrac": 12, "2i": [12, 31, 39, 40], "textrm": 12, "point": [12, 29, 31], "encoder\uc640": [12, 22], "text\uac04\uc758": [12, 16], "embedding\uc744": [12, 21, 24, 28, 34], "\ud3b8\uc9d1\ub41c": 12, "\ucd5c\uc18c\ud654\ud558\ub294": [12, 28, 36, 40, 41], "collapse\uc5c6\uc774": 12, "\uade0\uc77c\ud55c": 12, "editing\uc744": 12, "\ud588\ub2e4\uace0": [12, 16, 27, 34, 40], "_i": [12, 14], "editiing\uc744": 12, "naiv": 12, "approach\ub97c": 12, "\ud1b5\ud574\uc11c\ub294": 12, "editing\uc774": [12, 15, 16], "\uc774\ub8e8\uc5b4\uc9c0\uc9c0": 12, "chapter\uc5d0\uc11c\ub294": 12, "\uc54a\ub294\uc9c0\uc5d0": 12, "\uc124\uba85\uc744": [12, 27, 28], "\ud574\uacb0\ud558\ub294": [12, 39], "controllable\ud55c": 12, "process\uc778": 12, "ddim\uc5d0\uc11c": [12, 34, 37], "\uc124\uba85\ud558\uc600\ub294\ub370": 12, "chapter\ubd80\ud130\ub294": 12, "\uc124\uc815\ud558\uace0": [12, 22, 27, 32, 35], "\uc124\uc815\ud558\uc600\ub2e4": 12, "variable\ub85c": 12, "\uc5ed\ud560\uc744": [12, 17, 18, 41], "\ub2f4\ub2f9\ud558\uace0": 12, "\ub3cc\uc544\uac00\uae30\uc5d0": 12, "\ub2f4\ub2f9\ud55c\ub2e4": 12, "prompts\uc5d0": [12, 16], "manipulate\uc2dc\ud0a4\ub294": 12, "3\uc5d0\uc11c": 12, "\uc18c\uac1c\ud55c": [12, 24, 31, 40], "optimize\ud558\ub3c4\ub85d": 12, "update\ud558\ub294": 12, "images\ub97c": 12, "\uc0dd\uc131\ud558\uac70\ub098": [12, 21], "manipulation\uc744": 12, "\ud55c\ub2e4\uace0": [12, 28], "\ub300\uc548\uc73c\ub85c": 12, "manipulate\ud558\ub3c4\ub85d": 12, "shift\ud574\uc8fc\ub294": 12, "\uc81c\uc2dc\ub418\uc5c8\ub2e4": 12, "\uc644\uc804\ud788": [12, 23, 32, 40], "manipulate\ud558\uc9c0": 12, "\ub458\ub2e4": [12, 33], "shifted\ub41c": 12, "\uc0ac\uc6a9\ud558\uae30\uc5d0": 12, "cancel": 12, "out\ub418\uc5b4": 12, "variable\uc5d0\uc11c\ub294": 12, "\uae30\uc874\uacfc": [12, 39], "\ub2e4\ub984\uc774": 12, "\uc5c6\ub2e4\ub294": [12, 16], "\uc99d\uba85\uc740": 12, "proof": [12, 16], "theroem\uc744": 12, "theroem": 12, "defin": [12, 20], "beta_": 12, "ddim\uc5d0\uc11c\uc758": 12, "\uc2dd\uc774\uace0": 12, "\ud56d\ub9cc": 12, "\ub530\ub85c": [12, 22, 28, 32, 36, 39], "\ubb36\uc5b4\uc11c": 12, "\ud45c\ud604\ud558\uba74": [12, 35, 42], "root\ub97c": 12, "\ub0b4\ubd80\ub97c": 12, "\uacc4\uc0b0\ud558\uba74": [12, 33], "\uc815\ub9ac\ud558\uba74": [12, 32], "therefor": 12, "epsilon\uc744": [12, 16], "\uacb0\uacfc\uc774\ub2e4": [12, 16], "\ubd84\uc790\ub97c": 12, "\uc791\uae30\uc5d0": 12, "\uc218\ub834\ud558\uae30\uc5d0": 12, "\uc5c6\uc74c\uc744": [12, 18], "\ud6a8\uacfc\ub294": 12, "\uc88b\uc9c0": [12, 18, 24, 25, 27, 31, 40, 41], "\uc54a\uc74c\uc744": 12, "No": 12, "chapter": 12, "1\uc5d0\uc11c": [12, 21, 24], "asyrp\ub97c": 12, "\ube44\ub300\uce6d\uc801\uc778": 12, "\uc0ac\uc6a9\ud55c\ub2e4\ub294": [12, 27], "\uac83\uc778\ub370": 12, "\ub3cc\uc544\uac00\ub294": [12, 32], "\uc900\ub2e4\ub294": 12, "\ub9ccmodify\ud558\uace0": 12, "\uc720\uc9c0\ud55c\ub2e4": [12, 14], "loss\uc2dd": 12, "\uc7ac\uad6c\uc131\ud558\uc600\ub2e4": 12, "modify\ub97c": 12, "\ud558\uc9c0": [12, 14, 27, 28, 30, 40], "modifiy\ub97c": 12, "loss\uc2dd\uc740": 12, "lambda_": [12, 40], "ref": 12, "recon": 12, "\uc124\uacc4\uac00": 12, "\ub418\uc5c8\ub2e4": [12, 21, 28], "\uc774\uc81c": [12, 27, 40], "epsilon\uc778": 12, "\uac83\uc778\uc9c0\uc5d0": 12, "\ud544\uc694\ud558\ub2e4": [12, 14, 30], "\uac83\ubcf4\ub2e4": [12, 14, 20, 21, 30, 37, 41], "result\ub97c": [12, 16], "nice": 12, "properties\ub97c": 12, "models\uc758": 12, "backbone\uc778": 12, "net\uc5d0\uc11c": [12, 37], "\ub3c4\ucd9c\ub41c\ub2e4": 12, "net\uc758": [12, 13, 14, 21], "bottleneck": [12, 20, 33, 41], "\uae4a\uc740": [12, 32], "map\uc778": 12, "h_t": 12, "\uc815\ud558\uc600\ub2e4": 12, "\ubd80\ub978\ub2e4": 12, "space\ubcf4\ub2e4": 12, "resolutions\uc744": 12, "semantic\ub97c": 12, "\uac00\uc9c4\ub2e4": [12, 34, 39], "space\uc5d0\uc11c\ub294": 12, "\ubc1c\uacac\ud560": 12, "nice\ud55c": 12, "\ud2b9\uc131\ub4e4\uc744": 12, "\ud06c\uae30\ub294": [12, 20, 24, 39, 41], "times512": 12, "times3": [12, 15], "control\uc774": [12, 26], "\uc9c0\ubc30\uc801\uc774\uace0": 12, "robust\ud568\uc744": 12, "\ucd94\uce21\ud560": 12, "skip": [12, 21, 31, 35, 37], "connection\uc758": 12, "\ubc1b\uc9c0": 12, "\uc54a\uc73c\uba70": [12, 39], "\uc555\ucd95\ub41c": 12, "\uacf5\uac04\uc774\uba70": 12, "control\ud558\ub294\ub370\uc5d0": 12, "\uc9c0\uc815\ud558\uae30": 12, "\uc124\uc815\ud574\ub450\uace0": 12, "\ud574\ubcf4\uc558\ub294\ub370": 12, "8th": 12, "layer\uc774\uc804\uc758": 12, "\uc9c0\uc815\ud55c": [12, 23, 37], "manipulaton\uc774": 12, "\uc774\ub8e8\uc5b4\uc84c\uace0": 12, "\uc774\ud6c4\uc758": [12, 18], "\uacfc\ud55c": 12, "manipulation\uc774": 12, "\uc774\ub8e8\uc5b4\uc9c0\uac70\ub098": 12, "\uc544\uc608": [12, 37], "\uc0dd\uc131\ub418\uc5c8\ub2e4": 12, "space\ub9cc\uc758": 12, "\ud2b9\uc131\uc740": 12, "chapter5\uc5d0\uc11c": 12, "\uc124\uba85\ud55c\ub2e4": 12, "manipulating\ud558\ub294\ub370": 12, "\uc131\uacf5\ud588\uc74c\uc5d0\ub3c4": 12, "\uc218\ub9ce\uc740": [12, 31], "timestep\uc5d0\uc11c": 12, "optimizing\ud558\uae30\ub780": 12, "\ub300\uc2e0\uc5d0": [12, 14, 40], "\uc785\ub825\ubc1b\uc544": [12, 40], "\ucd9c\ub825\ud574\uc8fc\ub294": 12, "\ucd94\uac00\ud558\uc600\ub2e4": 12, "optimizing\ud574\uc918\uc57c": 12, "\ubc29\ubc95\uc5d0": [12, 16, 29], "\uc2dc\uac04\ub3c4": 12, "setting\uac12\ub4e4\uc5d0": 12, "robust\ud558\ub2e4": 12, "timestep\uacfc": 12, "feature\uc778": [12, 14], "\ucd9c\ub825\ud558\ub294": [12, 36], "\ud559\uc2b5\ud558\uae30\uc5d0": 12, "unseen": 12, "\uc77c\ubc18\ud654\ud560": 12, "accelerated\ud55c": 12, "\uacfc\uc815\uc5d0\uc11c\ub3c4": [12, 20], "\ubcf8\ub2e4": 12, "scheme\uc774": 12, "\uc5b4\ub5bb\ub4e0": 12, "\uac04\uc5d0": [12, 14], "\ubcf4\uc874\ub41c\ub2e4\uba74": 12, "\uc124\uacc4\ud574\ub3c4": 12, "manipulation\ud6a8\uacfc\ub97c": 12, "control\ud574\uc11c": 12, "\uc774\uc6a9\ud558\ub294": 12, "\uc2dd\uc740": [12, 18], "space\uc640": 12, "\ube44\uad50\ud558\uc600\ub2e4": [12, 14, 39], "intuit": [12, 26], "choos": 12, "interv": [12, 31], "percept": 12, "priorit": 12, "choi": 12, "earli": [12, 41], "stage\uc5d0\uc11c\ub294": 12, "context\ub97c": [12, 16, 28], "generate\ud558\uace0": 12, "later": 12, "impercept": 12, "details\ub97c": 12, "generate\ud55c\ub2e4\uace0": 12, "stage\uc5d0\uc11c": 12, "\uc9c4\ud589\ud558\ub294": [12, 31], "\uad6c\uac04\uc744": 12, "\uc81c\uc2dc\ud55c\ub2e4": [12, 16], "process\uc5d0\uc11c\ub294": 12, "context\uac00": 12, "generate\ub418\uc5b4\uc57c": 12, "interval\uc744": 12, "\uacb0\uc815\ud558\uae30": 12, "\uce21\uc815\uc9c0\ud45c\ub97c": 12, "t\uc2dc\uc810\uc5d0\uc11c": 12, "target\uc774": 12, "image\uac04\uc758": 12, "lpips\ub97c": 12, "\ub0a8\uc740": [12, 16, 30], "process\uc744": 12, "\uad6c\uc131\uc694\uc18c\ub97c": 12, "\uc9c0\ud45c\ub77c\uace0": [12, 27], "t\uc758": 12, "lpips\ub85c": 12, "\uc2dc\uc810\uc5d0\uc11c\uc758": 12, "\ucc28\uc774\ub294": [12, 23, 37], "\uc5bc\ub9cc\ud07c\uc758": 12, "change\ub97c": 12, "\uc8fc\uc5c8\ub294\uc9c0\ub97c": 12, "strength": [12, 13], "\uc815\uc758\ud55c\ub2e4": [12, 14, 23, 29], "xi_t": 12, "interval\uc774": 12, "\uc791\uc73c\uba74": [12, 42], "\uc791\uc544\uc9c0\uba70": 12, "\uc77c\uc5b4\ub098\uc9c0": 12, "\ud06c\uba74": [12, 14], "\ucee4\uc9c0\uace0": 12, "\uc77c\uc5b4\ub09c\ub2e4": 12, "\ucda9\ubd84\ud55c": [12, 27], "\ud55c\uc5d0\uc11c": 12, "\ucd5c\uc18c\uc758": 12, "\uacb0\uc815\ud558\ub294": 12, "\ucd5c\uace0\uc758": [12, 30, 34], "\ubc29\ubc95\uc774\ub2e4": [12, 34], "\uc2e4\ud5d8\uc801\uc778": 12, "33\uc778": 12, "t\uc2dc\uc810\uc744": 12, "\uacb0\uc815\ud558\uc600\ub2e4": 12, "variou": [12, 26, 34, 40, 41, 43], "proper": 12, "\ud2b9\uc131\ub4e4\uc740": 12, "\ud2b9\uc131\ub4e4\uc5d0": 12, "\ud544\uc694\ub85c": [12, 28], "\uacbd\uc6b0\ub3c4": [12, 27, 32], "smile\ud55c": 12, "attribute\ub97c": 12, "\uacbd\uc6b0\ubcf4\ub2e4": 12, "pixar": [12, 17], "style\uc758": 12, "attribute\uc744": 12, "\uae38\uac8c": 12, "\uc124\uc815\ud574\uc57c": 12, "33": 12, "t\ub97c": 12, "\uc124\uc815\ud55c\ub2e4": [12, 16], "33d": 12, "y_": [12, 20, 34], "\uc758\ubbf8\ud558\uba70": 12, "\uc694\uad6c\ud558\ub294": 12, "attributes\uc5d0": 12, "\uc791\uc74c": 12, "\uae40": 12, "flexibl": [12, 41], "amount": 12, "chang": [12, 34], "\uc124\uc815\ud558\uba70": 12, "stochasticity\ub97c": 12, "\uc81c\uac70\ud558\uc5ec": [12, 39], "\uc644\ubcbd\ud55c": 12, "inversion\uc744": [12, 17], "\uac00\ub2a5\ucf00": 12, "\ud558\uc600\ub2e4": [12, 14, 21, 27], "elucid": 12, "diffusionbas": 12, "karra": [12, 31], "stochasticity\uac00": 12, "\uc99d\uac00\uc2dc\ud0a8\ub2e4\uace0": 12, "\uc99d\uba85\ud558\uc600\ub2e4": [12, 14], "interval\uc740": 12, "interval\uc5d0": 12, "control\ud560": 12, "\uae38\uac8c\ub418\uba74": 12, "quality\ub294": [12, 28], "\uc99d\uac00\ud558\uc9c0\ub9cc": 12, "interval\ub3d9\uc548": 12, "\uacc4\uc18d\ud574\uc11c": 12, "\uc8fc\uc785\ud574\uc57c": 12, "content\uac00": 12, "\ub2ec\uc131\ud558\uba74\uc11c\ub3c4": 12, "content\uc5d0": [12, 25], "\ucd5c\uc18c\ud55c\uc758": [12, 14, 32], "\ubcc0\ud654\ub9cc\uc744": 12, "\uc124\uc815\ud558\ub294": [12, 40, 42], "\uc911\uc694\ud558\ub2e4": [12, 14], "\ud574\uacb0\ud574\uc57c": 12, "\ubd80\ubd84\uc73c\ub85c": [12, 42], "\ubcf4\uc558\uc73c\uba70": 12, "image\ub85c": [12, 16], "\uaef4\uc788\ub294\uc9c0\uc5d0": 12, "\uc9c0\ud45c\ub85c": [12, 23, 27], "defici": 12, "gamma_t": 12, "\uc5ec\uae30\uc11c\ub294": [12, 27, 28], "strength\uc640\ub294": 12, "\ud310\ub2e8\ud558\ub294\ub370\uc5d0": 12, "semantics\ubcf4\ub2e4\ub294": 12, "actual": [12, 20], "\uace0\ub824\ud588\uae30\uc5d0": 12, "\uc124\uc815\ud558\uc600\ub2e4\uace0": 12, "2\uc778": 12, "gamma_": 12, "presenc": 12, "model\uc5d0\uc11c\uc758": 12, "where": [12, 34, 40, 41], "\ub418\uba70": [12, 21, 29, 35, 38], "\ub354\ud558\ub294": 12, "\uc0ac\ub77c\uc838": 12, "\ud2b9\uc131\uc774": 12, "assymetr": 12, "ddim\uc744": [12, 39], "control\ub41c": 12, "f_t": 12, "\ucc98\uc74c\ubd80\ud130": [12, 14, 21], "\uc2dc\uc810\uae4c\uc9c0\ub294": 12, "\uc9c4\ud589\ud558\ub2e4\uac00": 12, "\uc2dc\uc810\ubd80\ud130": 12, "\ub05d\ub0a0": 12, "celeba": [12, 17], "2018": 12, "lsun": [12, 18, 31, 39, 40], "bedroom": [12, 31, 40], "church": [12, 40], "yu": 12, "2015": 12, "\ub370\uc774\ud130\uc14b\uc5d0\uc11c": [12, 17, 28, 30, 37, 40], "2020b": 12, "meng": [12, 31, 39], "afhq": 12, "dog": [12, 35], "iddpm": 12, "nichol": [12, 40], "dhariw": [12, 40], "metfac": 12, "adm": [12, 16, 31, 34], "p2": 12, "\ud559\uc2b5\uc2dc\ucf30\ub2e4\uace0": [12, 16], "model\ub4e4\uc740": [12, 20, 39], "checkpoint\ub97c": [12, 20, 25], "\ud65c\uc6a9\ud588\uc73c\uba70": 12, "frozen\uc0c1\ud0dc\ub97c": 12, "\uc720\uc9c0\uc2dc\ucf30\ub2e4\uace0": 12, "attribute\ub4e4\uc758": 12, "\ubc18\uc601\ud574\uc11c": 12, "manipulate\ud588\ub2e4\ub294": 12, "\uc2ec\uc9c0\uc5b4": 12, "depart": 12, "factori": 12, "templ": 12, "attribute\uc740": 12, "\ud3ec\ud568\uc774": 12, "\ub418\uc5b4\uc788\uc9c0": 12, "\uc54a\uc558\uc74c\uc5d0\ub3c4": [12, 30], "tuning\ud558\uc9c0": 12, "inference\ud558\ub294": 12, "control\ud558\uace0": 12, "\ub0c8\ub2e4\ub294": 12, "\uc810\uc774": [12, 26, 27], "\uc7a5\uc810\uc774\ub2e4": 12, "model\ub4e4\uacfc": 12, "\uc9c4\ud589\ud558\uc600\ub294\ub370": [12, 19], "tuning\ud558\uc5ec": [12, 27], "image\uc744": 12, "editing\ud558\ub294": 12, "diffsionclip": 12, "asyrp\uc758": 12, "\uc88b\uc74c\uc744": 12, "seen": 12, "smile": 12, "\ucd94\uac00\ud558\uae30": 12, "\ucd5c\uc801\ud654\ub41c": [12, 36], "\uc801\uc6a9\uc2dc\ucf30\uc744": 12, "\ub098\ud0c0\ub0b4\uc5c8\ub294\ub370": 12, "\uc801\uc6a9\ud55c\uacbd\uc6b0": 12, "face\ub85c": 12, "\ubc14\ub00c\ub294": [12, 26, 31], "distortion\uc774": 12, "\ubc1c\uc0dd\ud568\uc744": 12, "delta_h": 12, "scaling\uc744": [12, 37], "\ud558\ub294\ub370\uc5d0": 12, "change\uc758": 12, "\uc591\uc5d0": 12, "\ubc18\uc601\ub41c\ub2e4": 12, "3\ubc30": [12, 24], "\ud568\uc5d0": 12, "\ubc18\uc601\ub418\ub294": [12, 32], "attribute\ub610\ud55c": 12, "\ubcc0\ud654\ud55c\ub2e4\ub294": 12, "\ud45c\ud604\ub418\uc5b4": 12, "scaling\uc5d0": 12, "\ub41c\ub2e4\ub294": 12, "\ud569\uccd0\uc11c": [12, 27], "\ubd80\uc5ec\ub97c": 12, "\uacbd\uc6b0\uc5d0\ub3c4": [12, 32], "attribute\ub4e4\uc774": 12, "\ubc18\uc601\uc774": [12, 35], "\uc8fc\uc785\ud588\uc744": 12, "\ube44\uad50\ud55c": [12, 16, 17, 38, 40], "\ucd94\uac00\ub418\uc5c8\uc5b4\ub3c4": 12, "\uc5c6\uc73c\uba70": 12, "\ucd94\uac00\ub418\uc5c8\uc744": 12, "distortion\uc740": 12, "\uc5c6\uace0": [12, 16], "change\ub9cc": 12, "\ubc1c\uc0dd\ud55c\ub2e4": [12, 14, 24], "\uc2ec\ud558\uac8c": 12, "robustness\ud55c\uc9c0": 12, "homogeneous\ud55c": 12, "\uc131\uc9c8\uc744": [12, 31], "attribute\uc5d0": 12, "\ub40c\uc744": 12, "\ud655\uc778\ud558\uc600\ub2e4": 12, "\ub4e4\uc5d0": 12, "\ud3c9\uade0\uc778": 12, "result\uac00": 12, "\ube44\uc2b7\ud568\uc744": 12, "chapter4\uc5d0\uc11c": 12, "\ube44\ucd94\uc5b4": 12, "\ubcf4\uc558\uc744": [12, 26, 32], "process\uc5d0\uc11c\ub9cc": 12, "\uc801\uc6a9\uc744": 12, "\uc2dc\ud0a8\ub2e4": 12, "global": [12, 15], "\uce6d\ud558\uba70": 12, "\ud06c\uae30": [12, 22, 24, 39], "\uc801\uc6a9\ub41c\ub2e4\uace0": 12, "\uac00\uc815\ud588\uc744": 12, "t_e": 12, "sum_t": 12, "\uc591\ub9cc": 12, "\uac19\ub2e4\uba74": 12, "\ube44\ub85d": 12, "\uc0ac\uc6a9\ud558\uc600\uc9c0\ub9cc": 12, "\uc5f0\uad6c\ub97c": [12, 17, 21], "\ud574": [12, 15, 29], "\uc5ec\uc9c0\uac00": [12, 39], "\ud310\ub2e8\ud55c\ub2e4": 12, "models\uc5d0\uc11c": 12, "space\uc778": 12, "\ubc1c\uacac\ud588\uace0": 12, "\uc131\uacf5\uc801\uc778": 12, "semantic\ud55c": 12, "\uc81c\uc548\uc744": 12, "\ub17c\ubb38\uc774\ub2e4": 12, "\ub300\ud45c\uc801\uc778": [12, 36], "\ud2b9\uc131\uc73c\ub85c\ub294": 12, "timesteps\uc774": 12, "framework": 13, "custom": [13, 14], "framework\uc778": 13, "identity\uc640": [13, 14, 25], "postur": 13, "sequence\uac00": 13, "ident": [13, 14, 21, 26, 35], "moving\uc774\ub098": 13, "\ubaa8\ub4c8": [13, 14, 21], "controlling\uc744": 13, "preserving\uc744": 13, "t2v\uc758": 13, "\uc9c4\uc804\uc5d0\ub3c4": 13, "\uc778\uac04": [13, 16], "\uc911\uc2ec": 13, "\uacaa\ub294": [13, 14], "open": [13, 15, 38], "\ubd80\uc871": 13, "\ubb18\uc0ac\uc758": 13, "\uc5b4\ub824\uc6c0\uc73c\ub85c": 13, "\uacaa\ub294\ub2e4": 13, "\uc81c\uc5b4\ub97c": [13, 28], "lora": [13, 17], "\uae30\uc220\ub4e4\uc740": [13, 17], "\uc81c\uc5b4\uac00": 13, "\ubd80\ub2f4": 13, "\ubc29\ubc95\ub860\uc778": 13, "network\ub85c": 13, "animatediff\uc5d0\uc11c": 13, "\uc601\uac10\uc744": [13, 21, 28], "block\uc744": [13, 16, 34], "1000\uc758": 13, "\uc601\uc0c1\uc73c\ub85c": [13, 39], "\ud6c8\ub828\uc740": 13, "\ubcc0\uc774\ub098": 13, "\ud2b9\ubcc4\ud55c": [13, 21], "\uc5f0\uc18d\uc801": 13, "frame\uc774": 13, "\ud544\uc694\ud558\uae30": 13, "video\ub85c": 13, "split\ud558\uc5ec": 13, "6000\uac1c\uc758": 13, "\uc9e7\uc740": [13, 27], "\ud68d\ub4dd\ud55c\ub2e4": 13, "description\uc744": [13, 28], "minigpt": 13, "v2": [13, 38], "captioner\ub85c": 13, "describ": 13, "manner": 13, "\uba85\ub839\uc73c\ub85c": 13, "\ud68d\ub4dd": [13, 30], "subject\uc640": 13, "background": 13, "\ub0b4\uc6a9\uc5d0": 13, "\uc815\ud655\ud788": [13, 16, 32], "\ubb18\uc0ac": 13, "consistency\uc640": 13, "\ud5a5\uc0c1\uc744": [13, 15, 22, 32, 34], "net\uacfc": [13, 21], "controlnet\ub97c": 13, "block\uc73c\ub85c": 13, "block\uc740": 13, "animatediff\ub85c": 13, "\ud655\uc7a5": [13, 21, 33], "length\ub294": 13, "64\ub85c": 13, "mm_sd_v15": 13, "ckpt": 13, "\uac1c\uc778": 13, "\uc778\ubb3c\uc758": [13, 14], "appearance\uc640": 13, "\ubc30\uacbd\uc744": 13, "video\uc758": [13, 21], "\uace0\uc548\ub428": 13, "prompt\uc774\uc9c0\ub9cc": 13, "\ubb18\uc0ac\uac00": 13, "adapter\uc5d0": 13, "prompt\ub97c": [13, 16, 25, 28, 39], "\uc678\uad00\uc5d0": 13, "\ubc30\uacbd\uc5d0": 13, "\uc5bc\uad74": [13, 17], "feature\ub294": [13, 26], "embedding\uc5d0": 13, "concat\ub41c": 13, "\ubcf4\ub0c4": 13, "attentino": 13, "cloth": 13, "c_t": 13, "c_f": 13, "c_c": 13, "prime": 13, "openclip": [13, 15, 24, 30], "h14": 13, "arcface\ub97c": 13, "\uc0c1\uad00": 13, "laion": [13, 19, 21, 25, 30, 39, 41], "2b\uc5d0\uc11c": 13, "\uc218\uc9d1": [13, 28, 38], "512x512": [13, 14, 22, 24, 30, 39, 41], "v100": [13, 41], "100k": 13, "1\uc7a5": [13, 30], "adamw": 13, "decai": [13, 31], "webvid": [13, 21, 29], "10m": [13, 21, 29], "valid": [13, 20, 27, 30, 36], "module\uc758": [13, 20], "16\uc5d0\uc11c": [13, 24], "\ud655\uc7a5\ud558\uae30": [13, 21], "18\ucd08": [13, 30], "13000": 13, "module\ub9cc": 13, "\ud6c8\ub828\ud558\uace0": 13, "controlnet\uc774\ub098": 13, "10k": [13, 21, 40], "\uc885\ub8cc": 13, "block\uacfc": 13, "unfreez": 13, "\uc218\uc9d1\ud55c": 13, "6k": 13, "dwpose\ub098": 13, "zoedepth\ub97c": 13, "depth\ub97c": 13, "352x352": 13, "25k": [13, 40], "express": 13, "\ub0ab\uac8c\ud558\uae30": 13, "\uad6c\uc870\uc5d0\uc11c": [13, 27], "weight\ub9cc": [13, 20], "5e": [13, 14], "20k": 13, "depth": [13, 28, 32, 34, 41], "depth\uc5d0\uc11c\ub9cc": 13, "\ub3d9\uc2dc": 13, "1\uc758": 13, "alpha_f": 13, "\uc801\uc751\ud558\ub3c4\ub85d": 13, "styliz": 13, "2303": [15, 25, 30, 31], "05511": 15, "task\uc758": [15, 20], "\uafb8\uc900\ud788": 15, "\ubc1c\uc804\uc911": 15, "\uae30\uc874\uc5d0\ub294": [15, 29, 38], "stylegan\uacfc": 15, "\uc8fc\ub97c": [15, 25], "\uc774\ub918\uc9c0\ub9cc": 15, "\ubca0\uc774\uc2a4\ub85c": [15, 25], "\ucd94\uc138\uac00": 15, "\uae09\uaca9\ud558\uac8c": [15, 18], "\ubc14\ub00c\uc5b4\ubc84\ub9bc": 15, "\uc7a1\ub294\uac83\uc740": 15, "\ubb34\ub9ac\uc77c\uae4c": 15, "gigagan\uc740": 15, "\uc18d\ub3c4\uc810": 15, "\uc18d\ub3c4\uc801": 15, "512px\uc758": 15, "13\ucd08\ub9cc\uc5d0": 15, "megapixel": [15, 29], "1600\ub9cc": 15, "4k": 15, "66\ucd08\ub9cc\uc5d0": 15, "\ud65c\uc6a9\uc131": 15, "\uc0c1": 15, "\ubcf4\uc5ec\uc8fc\uace0": [14, 15, 16, 17, 21, 34, 35, 37], "\ud559\uc2b5\uacfc": [15, 32], "iteration\uc774": [15, 22], "\ub4e4\uc5b4\uac00\ub294\ub370": 15, "iteration\uc740": 15, "\uc548\uc815\uc131\uc744": 15, "\ud0a4\uc6cc\uc8fc\ub294": 15, "cost\uac00": [15, 20], "\ud55c\ub2e4\ub294": [15, 22, 32], "\ub2e8\uc810\uc774": [15, 16, 23, 25, 31], "\ubc18\uba74\uc5d0": [15, 31, 32, 36, 40, 42], "pass\ub9cc": 15, "\ud544\uc694\ud558\ubbc0\ub85c": 15, "\uc54a\ub2e4\ub294": 15, "object\uc758": [15, 28], "class\uac00": 15, "\uba85\ud655\ud788": [15, 36], "\uc815\uc758\ub418\uc9c0\uc54a\uc740": 15, "develop\ud55c\ub2e4\uba74": 15, "\ub118\uc5b4\uc124": 15, "\uc788\uc744\uae4c": [15, 27], "img": [15, 24, 36], "66": 15, "space\uc0c1\uc5d0\uc11c\uc758": 15, "stylegan2": 15, "stylegan2\ub85c": 15, "\uc120\uc815": 15, "distribution\uc5d0\uc11c\uc758": 15, "disentangle\ub41c": 15, "\uc2dc\ud0a4\ub294": [14, 15, 21], "gigagan\uc5d0\uc11c\ub294": 15, "network\uc758": 15, "z\uc640": 15, "\ud53c\ub77c\ubbf8\ub4dc": 15, "\uad6c\uc870\uc758": 15, "block\ub4e4\ub85c": 15, "\uac12\uc73c\ub85c\ubd80\ud130": 15, "vector\ub294": [15, 28], "layer\ub9c8\ub2e4": 15, "\ub4e4\uc5b4\uac00\uc11c": [15, 26, 28], "scaling\ud568\uc73c\ub85c\uc368": 15, "style\uc744": [15, 25, 28, 39], "\ubc18\uc601": [14, 15], "demodul": 15, "select": 15, "size\ub9cc": 15, "up\uc744": 15, "\uc548\ub418\ub294": [15, 32], "\uc624\ud508": 15, "\ub54c\ubb38\uc774\ub2e4": [15, 24], "\uc5f0\uc0b0\uc740": 15, "\uad6c\uc870\uc0c1": 15, "\ub808\uc774\uc5b4\uc0c1\uc5d0": 15, "filter\uac00": 15, "\uc8fc\uc785\ubd80\ud130": 15, "\uc0dd\uc131\uae4c\uc9c0": 15, "\ucc38\uc5ec": [15, 43], "\ud558\ub294\ub370": [15, 22, 30], "\ud45c\ud604\ub825\uc744": 15, "\ub5a8\uc5b4\ud2b8\ub9b4": 15, "\ub808\uc774\uc5b4\ub9c8\ub2e4": 15, "k_": 15, "\ucc28\uc6d0\uc758": [15, 22, 29], "set\uc744": 15, "w\uc758": 15, "affin": 15, "\uac70\uce5c": [15, 16, 29, 33, 38], "kernel\uac12\uc5d0": 15, "summation\ud55c": 15, "filter\ub85c": 15, "\uacc4\uc0b0\uc5d0": 15, "softmax\ub97c": 15, "\uc598\ub294": 15, "differentiable\ud558\ubbc0\ub85c": 15, "kernel\uc744": 15, "\ub54c\ubcf4\ub2e4": [15, 27, 31], "\uc808\uc57d\ub41c\ub2e4\ub294": 15, "interleav": 15, "filter\ub294": 15, "recept": 15, "field": [15, 32, 38], "\ub0b4\ubd80\uc758": 15, "\ucea1\ucc98\uc5d0\ub294": 15, "\ud0c1\uc6d4\ud558\uc9c0\ub9cc": 15, "\uc678\ubd80\uc758": 15, "\ud55c\uacc4\uc810\uc744": [15, 31], "\uadf9\ubcf5\ud558\uae30\uc704\ud574": 15, "g_": [15, 42], "stylegan2\uc5d0": 15, "\ucd94\uac00\ud558\uba74": [14, 15, 20, 27], "\uc774\uc0c1\uc774": 15, "\uc0dd\uae40": 15, "\uc6d0\uc778\uc740": 15, "product\uac00": 15, "lipschitz\ud568\uc218\uac00": 15, "\uc544\ub2c8\uae30": 15, "lipschitz": 15, "\ud568\uc218\ub780": 15, "\uc810": [15, 30], "\ube44": 15, "\uc774\uc0c1\uc73c\ub85c": 15, "\uc99d\uac00\uc2dc\ud0a4\uc9c0": 15, "\ub9cc\uc871\ud558\uc9c0": 15, "\ubabb\ud568\uc73c\ub85c\uc368": 15, "unstabl": [15, 36, 40], "\uc2e4\ud328\ud55c\ub2e4": 15, "\ub9cc\uc871\uc2dc\ud0a4\uae30": 15, "attention\uc758": [15, 19], "product\ub97c": 15, "l2": [15, 30, 31], "distance\ub85c": 15, "advanc": [15, 38], "stylegan2\uacfc": 15, "\ucd08\uae30\uac12\uc744": 15, "unit": 15, "attentnion": 15, "\uc790\uc2e0\uc758": [15, 21], "\ud559\uc2b5\uc6a9": 15, "\uc8fc\uc785\uc6a9": 15, "\uc720\uc5f0\uc131\uc744": [15, 28], "output\uc740": [15, 33], "size\uc640": 15, "\ub3d9\uc77c\ud558\uac8c": [15, 17, 27, 31, 38, 39, 40, 41], "\ub098\ub220": [15, 29], "word": 15, "index\uc758": 15, "catch": 15, "word\ub97c": [15, 28], "global\ud558\uac8c": 15, "embedding\ud558\ub294": 15, "generator\uc758": 15, "layer\ub294": [15, 16, 22], "discrimin": [15, 26, 29, 30, 32, 36], "branch\uc758": 15, "conditioning\uc744": [15, 16, 24], "generating\uc744": 15, "c\ub85c\ubd80\ud130": 15, "\ud1b5\uacfc\uc2dc\ucf1c": 15, "stylegan\uc5d0\uc11c\ub294": 15, "res\uc758": 15, "loss\uc5d0": 15, "\ubc18\uc601\ud558\uc9c0": 15, "\uc54a\uc558\uc9c0\ub9cc": [15, 30], "\ud45c\ud604\uc758": 15, "extractor": 15, "phi": [15, 20, 29, 31, 33, 34, 39, 41, 42], "phi_": [15, 39], "rightarrow": [15, 33, 40], "conv": [15, 29], "level\uc5d0\uc11c\ub294": [15, 24], "level\uc5d0\uc11c\uc758": 15, "\uacf5\uc720": [14, 15], "resolution\uc5d0\uc11c": [15, 27], "\uacc4\uc0b0\uc774": [15, 36, 39, 42], "\uc77c\uc5b4\ub098\uae30\ub54c\ubb38\uc5d0": 15, "ij": 15, "match": [15, 31], "psi": [15, 33, 39], "conv_": [15, 21], "\uc2ec\uc740": 15, "\ud569": 15, "\uc55e\ubd80\ubd84\uc740": 15, "\ub4b7\ubd80\ubd84\uc740": 15, "awar": [15, 29], "\uc55e\uc758": 15, "\ub9ac\uc5bc\ud55c\uc9c0": 15, "\uac00\uae4c\uc6b4\uc9c0\uc5d0": 15, "\ucd08\ubc18\uc5d0\ub294": [15, 18, 22], "\uc0c1\uad00\uc5c6\uc774": 15, "\ud004\ub9ac\ud2f0\ub85c\ub9cc": 15, "\ud574\ubc84\ub9bc": 15, "\uac15\uc81c\ub85c": 15, "\ub530\ub974\ub3c4\ub85d": [15, 31, 42], "\ud558\uae30\uc704\ud574": 15, "fake": [15, 36], "pair\ub85c": 15, "\uc9c0\uc815": 15, "contrast": [15, 16, 25, 33, 37], "constrast": 15, "\uba40\uac8c": 15, "\ubca1\ud130\uc640\ub294": 15, "condition\uc758": [15, 23], "vector\uc640\ub294": 15, "\ud559\uc2b5\ub418\uc5b4\uc57c\ud55c\ub2e4": 15, "aid": 15, "2112": [15, 16, 19], "09130": 15, "stylegan\uc5d0\uc11c": 15, "discriminator\ub294": 15, "overfitting\ub418\ub294": 15, "\uc774\ubd80\ubd84\uc744": 15, "\ud574\uacb0\ud558\uae30\uc704\ud574": 15, "sota\uc758": [15, 39], "\ubf51\uc544\ub0b8": 15, "discriminator\uc5d0": 15, "fake\ub97c": 15, "\ubd84\ub958": [15, 27, 32], "\uc801\uc6a9\uc774": [15, 17, 20, 26], "64x64\uc758": 15, "3\ubc88": 15, "6\ubc88": 15, "1024x1024\uc758": [15, 27], "gigagan\uc758": 15, "\uc801\uc6a9\ud560\ub54c\uc5d0\ub294": 15, "\uc0dd\uc131\uacfc\uc815\uc911\uc5d0": 15, "real\ud568\uc744": 15, "laion2d": 15, "en": 15, "coyo": 15, "700m": 15, "1024": [15, 26, 29, 33, 36, 37, 40], "adob": 15, "intern": [15, 41], "stock": 15, "machin": [15, 27, 36], "method\uac00": 15, "\ud6a8\uacfc\uac00": [15, 26, 41], "\uc788\ub294\uac00": 15, "\ub2e8\uc21c": 15, "up\ubcf4\ub2e4": 15, "method\ub4e4\uc744": 15, "\uc218\uce58\ub97c": [15, 18, 23, 34], "text2imag": 15, "table2": 15, "time\uc744": 15, "\uc5b4\ub290\uc815\ub3c4": [15, 18], "\uade0\ud615\uc744": [14, 15], "\uc774\ub8e8\uba70": 15, "\uacbd\uc7c1\ub825\uc744": 15, "diffusion\uacfc": [15, 24, 39], "table3": 15, "diffutsion\uc758": 15, "\uc18d\ub3c4": [15, 17, 20, 21], "\uac1c\uc120\uc744": [15, 31], "distilation\ud55c": 15, "\uc218\uce58\uc801\uc73c\ub85c\ub3c4": 15, "\uc6b0\uc704\uc5d0": 15, "time\ub3c4": 15, "\ube60\ub974\ub2e4": 15, "upscal": [15, 24, 29], "md": [15, 22], "table4": 15, "src": [15, 25], "pic": 15, "img14": 15, "png": [15, 36], "alt": 15, "bg": 15, "primari": 15, "mb": 15, "700px": 15, "stylegan\uc5d0": 15, "\uc5f0\uad6c\ub41c": 15, "runcat": 15, "trick": [15, 25], "\uc0c1\uc73c\ub85c\ub294": 15, "imagen\uacfc": 15, "\ube44\uad50\ud558\uba74": [15, 24], "develop\uc774": 15, "\ud544\uc694\ud568": [15, 34], "failur": [15, 38], "toward": 16, "icml": [16, 31, 33], "10741": 16, "e\ubcf4\ub2e4": 16, "\ud3c9\uac00\uac00": 16, "\uc6b0\uc218\ud558\ub2e4\uace0": 16, "powerful\ud55c": 16, "driven": [16, 35], "natur": [16, 31], "language\ub85c": 16, "realistic\ud55c": 16, "\ubc29\ubc95\ub4e4\uc774": [16, 26], "\uc0dd\uaca8\ub098\uace0": 16, "\ub300\uc751\ud558\ub294": [16, 32], "photorealistic\ud55c": 16, "\uc0dd\uc131\ud558\uae30\uc5d0\ub294": 16, "\uc0dd\uc131\ubaa8\ub378\uc758": [16, 27], "\uc911\uc2ec\uc73c\ub85c": 16, "\ub5a0\uc624\ub974\uba70": 16, "sota\ub97c": [16, 21, 23, 25, 27, 33, 34], "\ucc0d\uc5c8\ub2e4\uace0": 16, "\uc790\uc5f0\uc2a4\ub7fd\uac8c": [16, 25, 39], "conditional\ud55c": 16, "\uc774\ub8e8\uc5b4\uc84c\ub294\ub370": 16, "beat": 16, "synthesis\ub77c\ub294": 16, "noise\ud55c": 16, "class\ub97c": 16, "sampling\uacfc\uc815\uc5d0\uc11c": 16, "label\uc5d0": 16, "\uc0dd\uc131\ud558\ub3c4\ub85d": [16, 27, 28], "gradient\ub97c": [16, 33, 34], "control\uc2dc\ud0a4\ub294": 16, "classifier\uc5c6\uc774": 16, "\uc18c\uac1c\ub418\uc5c8\ub2e4": 16, "synthesis\ub97c": 16, "guidance\ub77c\ub294": 16, "\uc81c\uc2dc\ud558\uba70": 16, "guidance\uc640": 16, "\uacb0\uacfc\uc801\uc73c\ub85c\ub294": 16, "guidance\uac00": [16, 37], "\ubcf4\uc778\ub2e4\uace0": [16, 35], "shot\uc73c\ub85c": 16, "\uc0dd\uc131\ud558\ub294\ub370\uc5d0": 16, "\ubcf4\uc600\uc73c\ub098": 16, "photorealistc\ud55c": 16, "\uc0dd\uc131\ud558\ub294\ub370\ub294": [16, 36], "\uacaa\uc744": 16, "generation\ubfd0\ub9cc": 16, "\ud3b8\uc9d1\ud560": 16, "impainting\uae30\ub2a5\ub3c4": 16, "\uac00\ub2a5\ud558\ub3c4\ub85d": [16, 17, 42], "impaint": [16, 38], "differenti": [16, 23, 31, 39, 40, 42], "\uad6c\ud558\ub294": [16, 30, 36, 42], "\ubc29\ud5a5\uc131\uc744": 16, "\ub764\ub2e4\ub77c\uace0": 16, "\uc8fc\uc7a5\ud55c\ub2e4": 16, "proport": 16, "find": 16, "improv": [16, 37], "constant\uac12\uc73c\ub85c": 16, "\uace0\uc815\uc2dc\ud0a8": [16, 41], "learnabl": [16, 26, 35, 41], "parameter\ub85c": [16, 18], "\uc124\uc815\ud558\uc5ec": [16, 38], "step\ub9cc\uc73c\ub85c": 16, "sample\uc744": [16, 34], "dharwial": 16, "image\uc0dd\uc131\uc744": 16, "\ub17c\ubb38\uc5d0\uc11c\uc758": 16, "guidance\uc774\ub2e4": 16, "\uc720\uc9c0\ud558\ub418": 16, "\uc18d\ud558\ub294\uc9c0": 16, "\ubcc4\ub3c4\uc758": [14, 16, 24], "classifier\uc758": [16, 34, 37], "\uacfc\uc815\uc758": 16, "score\uc5d0\uac8c": 16, "guide\ub97c": [16, 23], "\uc18c\uac1c\ub418\uc5c8\ub294\ub370": 16, "classifiy\ub97c": 16, "\ud574\uc57c\ud558\ubbc0\ub85c": 16, "\uaddc\ubaa8\uac00": [16, 27], "heavy\ud574\uc9c0\ub294": 16, "\ubb38\uc81c\uc810\uc744": [16, 23, 25, 33, 35], "\uc788\uc5c8\ub2e4": [16, 24, 25, 30, 39], "\uac1c\uc120\uc810\uc744": 16, "ho": [16, 18, 31], "\uae30\ubc95\uc73c\ub85c": [16, 35, 40, 41], "\uc2dd\uc5d0\uc11c": 16, "\ubcc0\ud615\uc744": [16, 28], "model\ub9cc\uc73c\ub85c": 16, "representation\uc744": 16, "\uc774\ub8e8\uc5b4\uc838": [16, 32, 42], "\uc30d\uc73c\ub85c": [16, 21, 38], "\uc774\ub8e8\uc5b4\uc9c4": [16, 21], "\ub300\uaddc\ubaa8": [16, 28, 29], "learning\uc744": [16, 33], "\uc9c4\ud589\uc2dc\ud0a8": 16, "\uc758\ubbf8\ub97c": [16, 22, 25, 27], "pair\uc5d0": 16, "\ucee4\uc9c0\ub3c4\ub85d": 16, "\uc791\uc544\uc9c0\ub3c4\ub85d": 16, "guidance\uc5d0\uc11c\ub294": 16, "guidance\uc5d0\uc11c": 16, "classifier\ub300\uc2e0\uc5d0": 16, "clip\ubaa8\ub378\uc744": 16, "classifier\ub300\uc2e0": 16, "\uad6c\ud55c": 16, "x\uc640": [16, 17], "billion": 16, "64x64": [16, 18, 21, 22, 27, 31, 37, 38, 39, 40, 41], "resolution\uc744": [16, 21, 34, 39], "\ub610\ub2e4\ub978": [16, 23], "256x256\uc73c\ub85c": [16, 27], "\uc99d\uac00\uc2dc\ud0a4\ub294\ub370": 16, "\uc0ac\uc6a9\ud558\uc600\ub2e4\uace0": [16, 27], "base\ub85c": 16, "\uc9c4\ud589\ud558\uc600\ub2e4": [16, 19, 21], "\uc218\ud589\ud574\uc57c\ud55c\ub2e4": 16, "condition\uc73c\ub85c": [16, 22, 24, 34], "\uc8fc\uae30": [16, 24], "k\uac1c\uc758": 16, "token\uc73c\ub85c": [16, 28], "encoding\ud55c": 16, "input\uac12\uc73c\ub85c": 16, "\ub123\uc5b4\uc900\ub2e4": 16, "output\uc758": 16, "token\uacfc": [16, 33], "encoding\uc744": 16, "token\uc744": [16, 33], "\uc5f0\uc0b0\ud558\uace0\uc790": 16, "\ud06c\uae30\uc5d0": [16, 38], "projection\ud558\uc5ec": 16, "\ub354\ud55c": 16, "adain\uae30\ubc95\uc744": 16, "block\uc758": 16, "\ub3c4\ucd9c\ud55c\ub2e4": 16, "block\ub4a4\uc5d0": 16, "\ubd99\ub294": 16, "\ub370\uc774\ud130\uc14b\uc740": [16, 30, 37, 42], "e\uc640": 16, "\ub370\uc774\ud130\uc14b\uc744": [14, 16, 17, 21, 26, 30], "\uc0ac\uc6a9\ud558\uc600\uace0": [16, 30, 31, 41], "architecture\ub85c\ub294": 16, "up\ub41c": 16, "2b": 16, "paremeters\ub97c": 16, "transformer\ub97c": 16, "upsampling\ud558\ub294": 16, "model\ub3c4": 16, "upsampler\uc640": 16, "\ube44\uc2b7\ud558\ub2e4\uace0": 16, "\ucc98\uc74c": [16, 26], "\uc9c4\ud589\ud588\uc744\ub54c\ub294": 16, "\uc900": [16, 26, 34], "condition\uc5d0": 16, "sequence\ub97c": 16, "impainting\uc744": 16, "\uac70\uce58\uc9c0": 16, "\uc54a\uc558\ub2e4": [16, 30], "sampling\uc744": [16, 18, 33], "\uc54c\ub824\uc9c4": 16, "\uc601\uc5ed\uc5d0": 16, "\ub300\uccb4\ud558\ub294": [14, 16], "\uc0ac\uc6a9\ud588\uae30\uc5d0": 16, "\ucc38\uc870\ud560": [16, 38], "tuning\uacfc\uc815\uc5d0\uc11c": 16, "example\uc758": 16, "\uc9c0\uc6b4\ub2e4\uc74c": 16, "\uc815\ubcf4\ub85c\uc11c": 16, "\ucc44\ub110\uacfc": [16, 21], "\uc785\ub825\ub418\ub3c4\ub85d": 16, "\uc124\uacc4\ud558\uc600\ub2e4": 16, "guidance\uc5d0": 16, "\uc801\ud569\ud558\uac8c": 16, "\ud6c8\ub828\uc2dc\ud0a4\uae30": [16, 17], "\ube44\uad50\ud588\uc74c\uc744": 16, "\uc5b8\uae09\ud588\ub2e4": 16, "\uc0ac\uc6a9\ud558\uae30": [16, 20, 39], "models\ub97c": 16, "\uc0ac\uc6a9\ud588\uc74c\uc744": 16, "\ubc1d\ud78c\ub2e4": 16, "\uc5b8\uae09\ud588\ub4ef\uc774": 16, "\uc88b\uc558\ub2e4\uace0": 16, "precision\uacfc": 16, "recal": [16, 18, 31], "IS": [16, 21, 24, 29, 31, 33], "score\uc640": [16, 27], "trade": [16, 22, 31, 34, 39], "off": [16, 22, 31, 34, 39], "\uad00\ucc30\ud558\uace0": 16, "\uc5b8\uae09\ud55c\ub2e4": 16, "\ucd5c\uc801\uc73c\ub85c": 16, "\uc218\ud589\ub418\uc5c8\uc73c\uba70": 16, "\ubc29\ubc95\uc784\uc744": 16, "\uc0c1\ub2f9\ud788": [16, 17, 20, 28], "\ud5a5\uc0c1\uc2dc\ud0ac": 16, "\uc911\uc810\uc744": [16, 33], "caption\uacfc": 16, "\uc77c\uce58\uc2dc\ud0a4\ub294": [16, 40], "\ub6f0\uc5b4\ub098\uc9c0": 16, "\uc54a\uc744": 16, "\uac00\uc124\uc744": 16, "\ud3c9\uac00\uc790\ub97c": 16, "\uc9c4\ud589\ud558\uc600\uace0": 16, "\uc778\uac04\ub4e4\uc774": 16, "\uc810\uc218\uc640": [16, 19], "\uc758\uacac\uc744": 16, "\uac00\uc9c0\uba70": [16, 39, 41], "guida": 16, "nce\uac00": 16, "\uc77c\uce58\ud558\ub294": [14, 16], "\uc0dd\uc131\ud55c\ub2e4\uace0": [16, 32], "\ud310\ub2e8\ud588\ub2e4": 16, "table1\uc740": 16, "unguid": 16, "evaluation\uc744": [16, 21], "\ud56d\ubaa9\uc5d0": 16, "\uc555\ub3c4\uc801\uc778": [16, 33], "\ubcf4\uc784\uc744": 16, "table2\ub294": 16, "glide\uc640": 16, "model\ub4e4\uc744": 16, "\ud45c\uc774\ub2e4": 16, "\uad6c\ud558\uc600\ub2e4": 16, "coco\uc5d0": 16, "\uacbd\ud5d8\uc774": 16, "\ub5a0\uc624\ub974\uace0": 17, "\uc8fc\uc81c\uc785\ub2c8\ub2e4": 17, "identity\ub97c": [14, 17], "\uc720\uc9c0\ud55c": [17, 21, 35], "\ub9e5\ub77d\uacfc": 17, "\uc9c4\ud589\ub418\uc5c8\uae30": 17, "\uc77d\uc5b4": 17, "\ubcf4\uc2dc\uae30\ub97c": 17, "\ucd94\ucc9c\ub4dc\ub9bd\ub2c8\ub2e4": 17, "contribution\uc740": [17, 26], "3\uac00\uc9c0\ub85c": 17, "lighweight": 17, "dreambooth\uc758": 17, "\uc720\uc9c0\ud558\uba74\uc11c": [17, 21, 24, 26], "\ud06c\uae30\ub97c": [17, 24, 34, 41], "\uc904\uc774\uace0": 17, "\ub192\uc77c": [14, 17, 28], "hyperdreambooth\ub97c": 17, "\uad6c\ud604\ud588\uc9c0\ub9cc": 17, "e2": [17, 35, 38, 39], "fidelity\uac00": [17, 25, 28, 34, 37], "\ub5a8\uc5b4\uc9c0\uac70\ub098": 17, "\ubb38\ub9e5\uc744": 17, "\uc81c\uacf5\ud558\uc9c0": 17, "hypernetwork\ub97c": 17, "via": [17, 22, 43], "personalization\uc744": 17, "finetuning\uc5d0": 17, "svdiff": 17, "styledrop": 17, "dreamartist": 17, "\uc608\uc2dc\uac00": 17, "\ub290\ub9ac\ub2e4\ub294": [17, 40], "\ub2e8\uc810\uc744": [17, 36, 39, 40, 42], "\uad00\ub828": [17, 21, 26], "\uc5f0\uad6c\ub4e4\uc744": 17, "hyperdreambooth\ub294": 17, "\uc18d\ub3c4\uc640": 17, "\ud6a8\uc728\uc131": [17, 22], "\ubc1c\uc804\uc744": 17, "\uc774\ub8e8\uc5c8\ub2e4\uace0": 17, "\uc774\uc804\uc5d0": [17, 28, 34], "dreambooth\ub294": 17, "\uc8fc\uc81c\uc758": 17, "hyperdreambooth\uc758": 17, "\uc601\uac10\uc6d0": 17, "\ud558\ub098\ub85c": [17, 20, 28, 41, 42], "\ud65c\uc6a9\ub418\uc5c8\uc2b5\ub2c8\ub2e4": 17, "lora\ub294": [17, 20], "\uac00\uc911\uce58\ub97c": [14, 17, 22, 24, 27], "\ub7ad\ud06c\uc758": 17, "\ud589\ub82c\ub85c": 17, "\uadfc\uc0ac\ud654\ud558\uc5ec": 17, "\ud06c\uae30\uc640": [17, 18], "\ubcf5\uc7a1\uc131\uc744": [14, 17], "\ubc29\ubc95\uc785\ub2c8\ub2e4": [17, 26, 32], "\uae30\uc220\uc744": [17, 24, 37], "\ud6a8\uc728\uc801\uc778": [17, 39], "personalization\uc774": 17, "\uc0b4\ud3b4": 17, "contribution\uc758": 17, "\uc0b4\ud3b4\ubcf4\ub3c4\ub85d": [17, 42], "\uae30\uc220": [17, 24, 27], "\ud558\ub098\uc778": [17, 27], "\uc904\uc5ec\uc11c": 17, "lidb\uc5d0": 17, "\uc124\uba85\ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4": 17, "lidb\ub294": 17, "residuals\uc758": 17, "\uacf5\uac04\uc744": [14, 17], "\uc138\ubd84\ud654\ud558\ub294": 17, "\uc544\uc774\ub514\uc5b4\uc785\ub2c8\ub2e4": 17, "orthogon": 17, "basis\ub97c": 17, "lora\uc758": 17, "a\uc640": 17, "\ud589\ub82c\uc744": 17, "\ubd84\ud574\ud558\ub294": 17, "\uac83\uc73c\ub85c\ub3c4": 17, "\uc774\ud574\ud560": [17, 22], "\uad6c\uccb4\uc801\uc73c\ub85c": 17, "\ud589\ub82c\uc740": 17, "a_": 17, "aux": [17, 25], "\ubd84\ud574\ub418\uba70": 17, "b_": [17, 18], "\ubd84\ud574\ud560": 17, "\ub808\uc774\uc5b4\ub294": [14, 17], "\ud589\ubcc4\ub85c": 17, "\uc9c1\uad50\ud558\ub294": 17, "\ubca1\ud130\ub85c": [17, 28], "\ucd08\uae30\ud654\ub418\uace0": [17, 21], "\ud559\uc2b5\ub418\ub294": 17, "\uac00\uc911\uce58\uc785\ub2c8\ub2e4": 17, "\uc120\ud615": [17, 39], "\ub808\uc774\uc5b4\uc758": 17, "residual\uc740": 17, "w_x": 17, "experiment": [17, 31, 36, 42], "\ub418\uc5c8\uc73c\uba70": [17, 21], "\uac1c\uc218\ub294": 17, "30k\uac1c": 17, "\uc0ac\uc774\uc988\ub294": 17, "120kb\ub85c": 17, "\uacbd\ub7c9\ud654": 17, "\ubcc0\uc218\ub9cc\uc73c\ub85c": 17, "\ub4f1\uc744": [17, 32, 39], "\ud3ec\uc778\ud2b8\uc785\ub2c8\ub2e4": 17, "\ub2e4\uc74c\uc740": 17, "\uc0ac\uc804\uc5d0": [17, 31, 35, 36], "\ub098\ud0c0\ub0b4\uba70": 17, "\ub808\uc774\uc5b4\uc5d0": [14, 17], "\uc544\uc774\ub514\uc5b4\ub294": 17, "x\ub97c": 17, "\ubc1b\uace0": [14, 17, 21, 37, 40], "lidb\uc758": 17, "residual\uc778": 17, "h_": [17, 24], "\ub3cc\uc785\ud558\ub294": 17, "hypernetwork\ub294": 17, "\ud2b9\ud654": [17, 33], "\ud6c8\ub828\ub418\uba70": 17, "\ud655\uc0b0": 17, "\uc190\uc2e4\uacfc": 17, "alpha": [17, 20, 39, 41], "\ubaa9\ud45c\ub294": [17, 28], "paramters\uc785\ub2c8\ub2e4": 17, "\uac00\uc911\uce58\ub294": [14, 17], "\uad00\ub828\ub41c": [17, 28], "\uc870\uc815\ub429\ub2c8\ub2e4": 17, "\ub098\ud0c0\ub0c5\ub2c8\ub2e4": [17, 32], "supervisori": 17, "\uc124\uc815\ub41c": 17, "\uac1c\uc778\ud654\uc5d0": 17, "\uc0c1\ub300\uc801\uc778": 17, "loss\uc758": [17, 18], "\ud56d\ubaa9\uc758": 17, "\uc9c0\uc6d0\ud558\uae30": 17, "\uc785\ub825\uc785\ub2c8\ub2e4": 17, "\uc9c0\uc2dc\uc0ac\ud56d": 17, "hyperdreambooth\uc5d0\uc11c\ub294": 17, "\ub4dc\ubb3c\uc9c0\ub9cc": 17, "\uc758\ubbf8": [14, 17], "\uc218\uc815\uc744": [17, 21], "\uc0bd\uc785\ud560": [17, 28], "hyperdreambooth\uc5d0\uc11c": 17, "\uad6c\uc870\ub85c": [17, 36], "\uad6c\uc131\ub418\uba70": [17, 24], "\ud558\ub098\uc785\ub2c8\ub2e4": 17, "\uac00\uc911\uce58\uc5d0": 17, "\ub354\ud558\uc5ec": 17, "\uac1c\uc778\ud654\ub97c": 17, "\uc2e4\ud589\ud569\ub2c8\ub2e4": 17, "iter": [17, 31, 40], "\ubc18\ubcf5\uc801": 17, "\uc218\ud589\ud569\ub2c8\ub2e4": 17, "hypernetwork\uac00": 17, "\ubc18\ubcf5\uc801\uc778": [17, 29, 39], "\uac1c\uc120\ud558\ub824\uace0": 17, "\uc2dc\ub3c4\ud558\ub294": 17, "\uc608\uce21\uc740": [14, 17], "\ubc29\ud5a5\uc131\uc774": 17, "\uc62c\ubc14\ub974\uace0": 17, "\uc5bc\uad74\uacfc": [17, 24], "\ubbf8\uc138\ub9cc": 17, "\uc7a1\uc544\ub0b4\uc9c0": 17, "tuning\ud558\uace0": 17, "\ub098\uc740": [17, 42], "\ub54c\uc5d0": 17, "encoding\uc740": 17, "\uc218\ud589\ub418\uba70": 17, "\ucd94\ucd9c\ub41c": [14, 17, 22, 30], "f\ub294": 17, "\uc2e4\ud589\ud558\uace0": 17, "\uc18d\uc131\uacfc": 17, "\ubc29\ud5a5\uc131\uc5d0": 17, "\uc62c\ubc14\ub974\uac8c": 17, "\ub418\uc9c0\ub9cc": [17, 39], "\uc138\ubd80\uc801\uc778": [14, 17, 26, 32], "detail\uc740": 17, "dreambooth\ubcf4\ub2e4": 17, "\ube60\ub974\uc9c0\ub9cc": 17, "\uac15\ud55c": [17, 25], "\ucd08\uae30\ud654\ub41c": [14, 17, 21], "\uc9c0\uc2dc\uc5b4": 17, "c\uc5d0": 17, "\uc870\uc815\ud569\ub2c8\ub2e4": 17, "\uc810\uc740": [17, 27, 28], "\uac1c\ub150\uc785\ub2c8\ub2e4": 17, "\uc644\ud654\ud558\uc5ec": 17, "rank\ub85c": 17, "hypernetwork\uc758": 17, "\uc8fc\uccb4\uc758": 17, "\uace0\uc8fc\ud30c\uc218": 17, "\uc0ac\ud56d\uc744": [17, 21], "\uadfc\uc0ac\ud654\ud560": 17, "\uc81c\ud55c\ub41c": [14, 17], "\uc5c5\ub370\uc774\ud2b8\ubcf4\ub2e4": 17, "\uc8fc\uc81c": 17, "\ucda9\uc2e4\ub3c4\ub97c": [14, 17], "\ub2ec\uc131\ud560": 17, "relaxed\uc758": 17, "\uac1c\ub150\uc740": 17, "\ubc29\uc2dd\ubcf4\ub2e4": 17, "\uc6b0\uc218\ud558\uac8c": [17, 26], "\uc694\uc778\uc785\ub2c8\ub2e4": 17, "\uc5ec\uae30\uc11c\ub3c4": 17, "\uc9c0\uc6d0\ud558\uba70": 17, "\uc5bc\uad74\uc5d0": 17, "\ud2b9\uc131\uacfc": 17, "\ucea1\ucc98\ud558\ub294": 17, "\ub3c4\uc6c0\uc774": [14, 17, 28, 33], "\uace0\ub824\ud560": 17, "40\ubc88\uc758": 17, "\ubc18\ubcf5\uc73c\ub85c": 17, "\uc644\ub8cc\ud560": 17, "dreambooth\uc640": 17, "\ube44\uad50\ud588\uc744": [17, 23, 27], "25\ubc30": 17, "\uc18d\ub3c4\ub77c\ub294": 17, "\uad6c\ud604\ud588\uc2b5\ub2c8\ub2e4": 17, "5\uc758": 17, "unet\uc758": [14, 17, 24], "\ud65c\uc6a9\ud558\uae30": 17, "\uc778\ucf54\ub354\ub3c4": 17, "\uac1c\uc778\ud654\ud558\uae30": 17, "\uc2dc\uac01\ud654\uc5d0": 17, "sfhq": 17, "synthet": [17, 30, 31, 43], "headquart": 17, "000\uac1c\uc758": 17, "galleri": 17, "\uc624\ub978\ucabd": [14, 17, 21, 24, 27], "\uc544\ub798\ub85c": [17, 26, 41], "\uc778\uc2a4\ud0c0\uadf8\ub7a8": 17, "\uc140\uce74": 17, "bark": 17, "skin\uc758": 17, "\ub85d": 17, "\uc2a4\ud0c0": 17, "\uc804\ubb38\uc801\uc778": 17, "\ucd2c\uc601": 17, "inversion\uc758": 17, "\ud45c\uc785\ub2c8\ub2e4": 17, "dino\uc640": 17, "\uc9c0\ud45c\ub97c": [17, 27, 32], "\ud45c\ub294": 17, "\ubd80\ubd84\uc785\ub2c8\ub2e4": [17, 26, 27], "hyperparameter\ub97c": 17, "\uc870\uc815\ud558\uc5ec": 17, "\ube44\uad50\ud588\uc2b5\ub2c8\ub2e4": [17, 32, 41], "\ud559\uc2b5\ub960\uc744": 17, "\uc99d\uac00\uc2dc\ud0a4\uace0": 17, "\ubc18\ubcf5": [17, 40], "\uac10\uc18c\uc2dc\ud0a4\uba74": 17, "\uacb0\uacfc\uc758": [17, 28], "agg": 17, "1\uc740": [17, 34], "400\ubc88\uc758": 17, "\ubc18\ubcf5\uc744": 17, "\uc2dc\ud589\ud558\uace0": 17, "2\ub294": [17, 34], "1200\ubc88": 17, "\uc694\uc18c\ub85c": 17, "\ub098\ub204\uc5b4": 17, "\uc911\uc5d0\ub294": [14, 17], "\ud558\uc774\ud37c\ub124\ud2b8\uc6cc\ud06c\ub97c": 17, "\ud558\uc774\ud37c\ub124\ud2b8\uc6cc\ud06c": 17, "\uc608\uce21\ub9cc": 17, "1\ubc88\ub9cc": 17, "\ube44\uad50\ud569\ub2c8\ub2e4": [17, 31, 40, 42], "\uc9c0\ud45c\uc5d0\uc11c": 17, "\ub2ec\uc131\ud55c\ub2e4\ub294": 17, "\uc778\uc2dd": [17, 21], "\uba54\ud2b8\ub9ad": 17, "\uc2dc\ub098\ub9ac\uc624\uc5d0\uc11c": 17, "\uc57d\ud558\ub2e4\uace0": 17, "\ub124\ud2b8\uc6cc\ud06c\uac00": [14, 17], "\uc774\ubbf8\uc9c0\uc5d0\ub9cc": 17, "\uc2a4\ud0c0\uc77c\uc5d0\uc11c": 17, "\uc0ac\ub78c\uc744": [17, 32], "\uc778\uc2dd\ud558\ub3c4\ub85d": 17, "\uc54a\uae30": [14, 17, 27, 40], "\ub54c\ubb38\uc774\ub77c\uace0": [17, 31], "\uc8fc\uc7a5\ud558\uba70": 17, "\ubcf4\uc644\ud558\uae30": 17, "study\ub97c": 17, "\ube44\uad50\ud558\uace0": 17, "\uc0ac\uc6a9\uc790\ub4e4\uc758": 17, "\ubc1b\uc558\uc2b5\ub2c8\ub2e4": 17, "ups\uac00": 17, "\uc874\uc7ac\ud569\ub2c8\ub2e4": [17, 31, 32, 35, 36, 40], "direct": [17, 31], "\uc608\uce21\uc5d0\uc11c": 17, "\uc798\ubabb\ub41c": 17, "\uc2dc\ub9e8\ud2f1": 17, "\ub098\uc62c": 17, "\uc5d0\ub7ec\uc785\ub2c8\ub2e4": 17, "\ub208": [17, 32], "\uc0c9\uae54\uc774\ub098": 17, "\ud5e4\uc5b4": 17, "\ud0c0\uc785": 17, "\uc131\ubcc4": [17, 28], "\ub4f1\uc774": [17, 27, 36, 41], "captur": [17, 22], "\uc624\ub958\uac00": [14, 17], "underfit": 17, "identity\ub294": 17, "\uc9c0\ucf1c\uc9c0\ub354\ub77c\ub3c4": 17, "\uc720\uc0ac\ud558\uc9c0": 17, "\uc0d8\ud50c\uc774": [17, 32], "\uc0dd\uc131\ub420": 17, "hypernetwork\uc640": 17, "\uc2a4\ud0c0\uc77c\uc5d0": 17, "\ubb38\uc81c\uc810\uc740": 17, "\ube5b": 17, "\ud3ec\uc988": [14, 17], "\ub4f1\uc73c\ub85c": 17, "ood\uc778": 17, "\uc0d8\ud50c\uc5d0\uc11c": 17, "\ub098\ud0c0\ub0a0": [17, 22], "hyperdreambooth\ub77c\ub294": 17, "\ubcc0\ud658\ud558\ub294": [14, 17, 32], "\uac00\ubcbc\uc6b4": 17, "\uac1c\uc778\ud654\ud558\ub294": 17, "hypernetwork\ub77c\ub294": 17, "\ud30c\ub77c\ubbf8\ud130\uc778": 17, "\uc0dd\uc131\ud558\uba70": [17, 27], "\uc774\uc5b4\uc11c": 17, "\uae30\ud0c0": [17, 21], "\uac1c\uc778\ud654": 17, "\uc791\uc5c5\uc5d0": [14, 17], "\uc904\uc774\uba74\uc11c": [17, 19, 40], "\ubb34\uacb0\uc131\uc744": 17, "\uc2a4\ud0c0\uc77c\uacfc": [17, 28, 32], "\uc758\ubbf8\uc801": [17, 28], "\uc218\uc815\uc774": [17, 28], "\uc801\uc6a9\ub41c": [14, 17, 26, 27, 32], "\uc785\uc99d\ud558\uc600\uc2b5\ub2c8\ub2e4": 17, "2102": [18, 33], "09672": 18, "ddpm\uc744": 18, "\uc57d\uac04": 18, "\uc720\uc9c0\ud558\uace0": [14, 18, 26], "likelihood\uc218\uce58\ub3c4": 18, "\ud5a5\uc0c1\ub41c": [18, 24, 28], "sampling\uc2dc": 18, "step\uc73c\ub85c": [18, 24, 34, 39], "\ub0bc": [18, 34], "scale\uacfc": [18, 26], "quailty\uc640": 18, "\uc218\uce58\uac04\uc758": 18, "quality\uc5d0": 18, "\ubaa8\ub378\uc5d0\ube44\ud574": 18, "\ub5a8\uc5b4\uc84c\ub2e4": 18, "diversity\uac00": [18, 34], "cifar": [18, 27, 31, 36, 40], "\ub3d9\uc791\ud588\uc9c0\ub9cc": 18, "dataset\uc5d0\uc11c\uc758": 18, "\ub3d9\uc791\uc740": 18, "\ubabb\ud588\ub2e4": 18, "imagenet\uac19\uc740": 18, "dataset\uc5d0\uc11c\ub3c4": 18, "\ub3d9\uc791": [18, 21], "process\uc5d0\uc11c\uc758": 18, "\uc81c\uc548\ud558\uc600\ub2e4": [14, 18, 39], "\ub0b4\ub294": [18, 20, 28], "\uc5f0\uad6c\ub4e4\uc5d0\uc11c": 18, "loglikelihood": 18, "\uc218\uce58\uc640": 18, "sample\uc758": 18, "quality\uac04\uc758": 18, "\uc5f0\uad00\uc131\uc744": 18, "\ub9ce\uc558\ub2e4": [14, 18], "distribution\uc5d0": 18, "\uc218\uce58\ud654\ud55c": 18, "\ub290\ub08c": 18, "\uc88b\uc544\uc9c0\uba74": 18, "quality\ub3c4": 18, "\uc99d\uac00\ud558\ub294": 18, "\uacbd\ud5a5\uc744": [18, 25], "ddpm\uc5d0\uc11c\ub3c4": 18, "\uac1c\uc120\ud55c\ub2e4\uba74": 18, "\uc99d\uac00\ud560": 18, "\uc54a\uc744\uae4c": 18, "angeloyeo": 18, "17": [18, 34, 39], "mle": [18, 36], "html": [18, 32], "\uc785\ud78c": [18, 25], "\ud615\ud0dc": [18, 29], "denoising\uc5d0": 18, "noising\ud560": 18, "\uc544\ub798\uc640\uac19\uc774": 18, "\uc0ac\uc6a9\ud574\ub3c4": [18, 39, 41], "\ubcf4\uc5ec\uc11c": 18, "\ubb38\uc7a5": 18, "\uc758\ubb38\uc810": 18, "\uc815": 18, "\ubc18\ub300\uc758": 18, "parameter\uc778\ub370": 18, "fix\ub97c": 18, "\ud558\ub294\uac8c": 18, "\ub9de\uc744\uae4c": 18, "step\uac04": 18, "\ucc28\uc774\ub97c": [14, 18, 31, 35, 39], "step\uc774": [18, 34], "\ub450\uac1c\uc758": [18, 21], "\ub3d9\uc77c\ud574\uc9c4\ub2e4": 18, "2\ub97c": [18, 24, 27], "\ucd08\ubc18\uc5d0": [18, 36], "\uacb0\uc815\ub418\ub294\ub370": 18, "\uacb0\uc815\ub418\ub294": 18, "\ubd80\ubd84": [14, 18, 24, 33], "\ub450\ub294\uac83\uc740": 18, "\uc124\uacc4\uc758": 18, "miss": 18, "\ud559\uc2b5\ud558\uae30\uc5d0\ub294": 18, "\ubc94\uc704\uac00": 18, "\uc791\uc544\uc11c": 18, "predict\ud558\ub3c4\ub85d": 18, "hybrid": [18, 34], "hyprid": 18, "\u03bbl_": 18, "vlb": 18, "\uc774\ubbf8\uc9c0\uc5d0\ub300\ud574": 18, "\ub3d9\uc791\ud558\uc9c0\ub9cc": 18, "32x32": [18, 34, 40], "\uc54a\ub294\uac83\uc744": 18, "scheduling\uc5d0\uc11c": 18, "mode\uc758": 18, "limitation\uc774": 18, "\uc9c0\uc801": 18, "\uac70\ub4ed\ub0a0\uc218\ub85d": 18, "\uc0c1\ub2e8": [18, 24], "noisy\ud574\uc9d0": 18, "skip\ud574\ub3c4": 18, "\uc131\ub2a5\uc5d0": [18, 27, 39], "\uc601\ud5a5\uc774": 18, "mode\ub97c": 18, "noise\ub294": 18, "\uc758\ubbf8\uc788\ub294": [18, 21], "\ubbf8\uce58\uc9c0": 18, "equation\uc744": 18, "\uc0c8\ub85c": [18, 21, 38], "\ub2e8\uacc4\uc5d0\uc11c\ub294": [18, 24], "\uac15\ud558\uac8c": [18, 25], "\uc785\ud600\uc9c0\uc9c0\ub9cc": 18, "0\uacfc": 18, "\ubd80\uadfc\uc5d0\uc11c\ub294": 18, "\ub35c": [18, 34], "direct\ub85c": 18, "\ucd5c\uc801\ud654\ud558\ub3c4\ub85d": 18, "\uc124\uacc4\ud558\uba74": 18, "\uc774\ubbf8\uc9c0\uc640\uac19\uc774": 18, "unstable\ud574\uc11c": 18, "\ucd5c\uc801\ud654\uc5d0\ub294": 18, "\uc904\uc774\uae30\uc704\ud574": 18, "2\uc5d0\uc11c": [18, 24], "\ub9d0\uae30\ub294": 18, "\ubcc0\ud654\uc5d0": 18, "\uc5c6\uc73c\ubbc0\ub85c": 18, "\ud655\ub960\uc801\uc73c\ub85c": [18, 26], "\ucd08\ubc18\uc758": 18, "sampling\ud574\uc11c": 18, "\ud559\uc2b5\ud558\ub3c4\ub85d": 18, "\uc801\uc6a9\ud574\ubcf8": 18, "\uc801\uc6a9\ud558\uba74": [18, 40, 42], "\uc804\ubcf4\ub2e4": 18, "\ub2e4\uc18c": [18, 33], "\ucde8\uc57d\ud588\ub358": 18, "64x64\uc640": 18, "cidar": 18, "\uae30\uc900": [18, 33, 34], "\ubaa8\ub378\uc774\ub098": 18, "\ubaa8\ub378\uc911\uc5d0\uc11c\ub294": 18, "fulli": [18, 21, 32], "\ube44\ud574\uc11c\ub294": 18, "\ubd80\uc871\ud55c": [18, 35], "\uba74\uc774": 18, "speed\ub97c": 18, "step\ub9cc": 18, "\uac00\ub3c4": 18, "fid\uac12\uc744": 18, "metric\uc73c\ub85c": 18, "biggan": [18, 34, 40], "big": 18, "\ubaa8\ub378\ubcf4\ub2e4": [18, 27, 32, 33, 38, 40], "\ud0c0\uac9f\uc5d0": 18, "\uc218\uce58\ub098": 18, "metric\uc5d0\uc11c": 18, "capacity\ub97c": 18, "nll": [18, 32], "\ud559\uc2b5\ub7c9": 18, "\ube44\ub840\ud568": 18, "10752": 19, "compvi": 19, "namkyeong": [19, 43], "31": [19, 24, 28, 35], "\uc624\ub298": [19, 26], "\uc54c\uc544\ubcfc": [19, 26, 38, 41], "model\uc785\ub2c8\ub2e4": 19, "\ub2e4\ub918\ub358": [19, 26], "\ucef4\ud4e8\ud130": 19, "\uc790\uc6d0\uc758": 19, "\uc18c\ubaa8\ub97c": 19, "\uc5bb\ub294\uac83\uc774": 19, "\ubaa9\ud45c\uc785\ub2c8\ub2e4": [19, 38], "\uc804\ubc18\uc801\uc73c\ub85c": [19, 27], "\uc8fc\uc5b4\uc84c\uc744\ub54c": 19, "\ud1b5\ud574\uc11c": [19, 26, 30], "\ub514\ucf54\ub529\uc744": 19, "\ub418\ub3c4\ub85d": [19, 25, 32], "\ud14c\uc2a4\ud2b8\ub97c": 19, "\ucee4\uc9c0\uc9c0": 19, "\uc54a\ub3c4\ub85d": [14, 19], "divergence\uc640": 19, "quantiz": [19, 22, 33], "vq": [19, 40], "\ud65c\uc6a9\ud558\uc600\ub2e4": 19, "\uc774\ubbf8\uc9c0\uc678": 19, "\ud14d\uc2a4\ud2b8\ub098": 19, "semat": 19, "map\uacfc": 19, "\uc815\ubcf4\ub294": [19, 29], "tau_": 19, "\uc804\ub2ec\uc744": 19, "\ud558\uc600\uace0": [19, 27], "phi_i": 19, "_k": 19, "_v": 19, "\uc815\uc758\ub418\uace0": [19, 40, 42], "\uc911\uac04\uc758": 19, "matrix\uc774\ub2e4": 19, "value\uc5d0": 19, "\ud574\ub2f9\ud558\uba70": 19, "qk": 19, "\uc9c4\ud589\ub41c\ub2e4": [19, 29, 30], "\uac19\uc774\ud45c\ud604\ub41c\ub2e4": 19, "\uc8fc\ubaa9\ud560\ub9cc\ud55c": [19, 39], "dm": [19, 29, 34], "function\uc73c\ub85c": [19, 21, 33, 34], "\uc9c4\ud589\uc2dc\ud0a4\ub294\ub370": 19, "\ubc14\uafb8\uba74\uc11c": 19, "\uc591\uc744": [19, 24], "\uc904\uc600\ub2e4\ub294": 19, "\uc810\uc774\ub2e4": [19, 24, 34], "\uadf8\uc911": 19, "\uc77c\ubd80\ub9cc": 19, "\uc18c\uac1c\ud558\ub3c4\ub85d": 19, "\ud558\uaca0\ub2e4": 19, "dataset\uc5d0\uc11c": [19, 25, 28, 33, 39], "\ubf51\uc740": [19, 26], "\uc0d8\ud50c\uacfc": [19, 32], "sample\ub4e4\uc785\ub2c8\ub2e4": 19, "\uc801\uc808\ud55c": [19, 23, 30], "\ud6a8\uc728\uc131\uc744": 19, "layout\uc774": 19, "peft": 20, "effeci": 20, "\ud558\ub098": [14, 20, 33], "\uace0\uc815\ud55c": 20, "\ucc44\ub85c": 20, "\uba87": [20, 28, 31, 32, 36, 39], "fc": 20, "\uc5f0\uc0b0\ub7c9\uc744": 20, "\uc904\uc77c": [14, 20, 21, 28, 29, 39], "3\uc744": 20, "parameter\ub294": [20, 27], "10000\ubc30": 20, "\uba54\ubaa8\ub9ac\ub294": 20, "3\ubc30\ub97c": 20, "latency\uac00": 20, "\ud29c\ub2dd\ud558\ub294": 20, "\ud30c\ub77c\ubbf8\ud130\ub9cc\uc744": 20, "\ud29c\ub2dd\ud568\uc73c\ub85c\uc368": 20, "\uc790\uc6d0\uc73c\ub85c\ub3c4": 20, "\ub192\uac8c": 20, "\ud558\ub294\uac83": 20, "upstream": 20, "\ud559\uc2b5\uc2dc\ud0a4\ub294\uac83": 20, "\uc694\uccad\uc758": 20, "\uc2dc\uc791\ubd80\ud130": 20, "\uc644\ub8cc\uae4c\uc9c0": 20, "\uac78\ub9ac\ub294": 20, "llm\uc740": 20, "\uc2dc\ud0b4": [20, 27], "tuning\uc5d0\uc11c": 20, "\ud559\uc2b5\uc2dc\ud0a4\uba74": [20, 30], "roberta": 20, "\ub2ec\uc774": 20, "\uac78\ub9bc": 20, "\uc5f0\uad6c\uc5d0\uc11c": [14, 20], "intrins": 20, "\uae30\ubc18\ud558\uace0": 20, "\uc0ac\uc2e4\uc5d0": 20, "\uc800\uc790\ub294": [20, 28, 39], "\uac16\uace0": 20, "\uac00\uc815\ud568": [20, 33], "\uace0\uc815\ud558\uace0": [20, 33], "decomposit": [20, 21], "matrices\ub97c": 20, "\ucd5c\uc801\ud654\ud558\ub294": [20, 36], "\uc2dc\ud0a4\uae30\ub85c": 20, "decomposition\ub41c": 20, "\ub354\ud574\uc90c": 20, "\uc791\uc544": 20, "3\ubc30\uae4c\uc9c0": 20, "\ubc14\uafd4\uc8fc\uba74": 20, "storag": [20, 41], "switch": 20, "overhead\ub97c": 20, "\uc678\uc5d0\ub3c4": [20, 21, 39], "\uae30\ubc95\ub4e4\uacfc": 20, "\uac00\ub2a5\ud558\ub2e4\ub294": [20, 39], "\uc7a5\uc810\uc774": [20, 36, 41], "transformer\uc758": [20, 27, 33], "w_q": [20, 41], "w_k": [20, 41], "w_v": [20, 41], "w_o": 20, "accumulated\ub41c": 20, "\uc5f0\uad6c\uc758": 20, "convention\uc744": 20, "optimizer\ub294": 20, "adam\uc744": 20, "\uc774\uc6a9": [20, 21], "mlp": [20, 22, 42], "feedforward": [20, 21], "ffn": 20, "agnostic\ud558\uc9c0\ub9cc": 20, "\uc9d1\uc911\ud568": 20, "agnost": [20, 33], "\uad6c\uc560\ubc1b\uc9c0": 20, "\ud574\uc11d\uc774": 20, "y_t": 20, "parameterized\ub41c": 20, "x_i": [20, 42], "y_i": 20, "target\uc30d\uc73c\ub85c": 20, "phi_0": 20, "maximize\ud558\uae30": 20, "\uc5c5\ub370\uc774\ud2b8\ub428": 20, "\ud06c\uae30\uc758": [20, 24], "\ud559\uc2b5\ud574": [20, 28, 29], "\uc5c4\uccad\ub09c": [20, 40], "\uc804\uccb4\uac00": 20, "\uadf8\ubcf4\ub2e4": 20, "\ucc3e\uc544\ub0b4\ub294": 20, "\ubc14\ub00c\uae30": 20, "effecient\ud574\uc9d0": 20, "01": 20, "\uc791\uc544\uc9c8": 20, "\uae30\uc874\uc5d0\ub3c4": 20, "learning\uc5d0\uc11c": [20, 33], "effecient\ub97c": 20, "\uac00\uc9c0\uac00": 20, "perform": [20, 29, 33, 37, 41], "hardwar": 20, "parellelism\uc774": 20, "\uc5c6\ub2e4\uba74": 20, "\ucd94\uac00\ud574\ub3c4": 20, "\uc99d\uac00\ud574": 20, "\uc5b4\ub824\uc6e0\uc74c": 20, "prefix": 20, "tuning\uc740": [20, 27, 28], "optimize\uac00": 20, "ba": 20, "\uacf1\ud574\uc9c4": 20, "vector\ub07c\ub9ac": 20, "coordin": 20, "wise\ud558\uac8c": 20, "\uc774\ub77c": [20, 40], "scaling\ub428": 20, "rate\ucc98\ub7fc": 20, "tuning\ud574\uc11c": 20, "r\uacfc": 20, "\uc774\ub098": [20, 39, 40], "\uc0ac\uc6a9\ud55c\ub2e4\uace0": [20, 30], "lora_a": 20, "new_zero": 20, "num_embed": 20, "lora_b": 20, "embedding_dim": 20, "lora_alpha": 20, "matrix": [20, 32], "requires_grad": [20, 36], "reset_paramet": 20, "hasattr": 20, "wai": 20, "zeros_": 20, "normal_": [20, 42], "bool": 20, "merge_weight": 20, "sure": 20, "transpos": [20, 21], "mark": 20, "tensor": [20, 30, 36, 41], "after_a": 20, "padding_idx": 20, "max_norm": 20, "norm_typ": 20, "scale_grad_by_freq": 20, "spars": [20, 33, 41], "w_0x": 20, "bax": 20, "lora\ub97c": 20, "\uc774\uc6a9\ud558\uba74": [20, 37], "inference\uc2dc": 20, "\ud558\ub77d\uc774": 20, "\uacbd\uc6b0\uc5d4": 20, "overhead\uac00": 20, "\ucd5c\uc18c\ud654\ud558\uae30": [20, 32], "\uc801\uc6a9\ud558\uace0": 20, "module\uc740": 20, "\uace0\uc815\ud568": 20, "175b\ub97c": 20, "vram\uc740": 20, "2tb\uc5d0\uc11c": 20, "350gb": 20, "checkpoint": [20, 25], "size\ub294": [20, 39], "350gb\uc5d0\uc11c": 20, "35mb\ub85c": 20, "\uc904\uc784": 20, "\ube68\ub77c\uc9d0": 20, "bert": 20, "\uacbd\uc6b0\uc5d0\uc11c": 20, "\uc88b\uc74c": [20, 33], "accuraci": [20, 30], "transformer\uc5d0\uc11c": [20, 33], "matrix\uc5d0": 20, "r\uc744": 20, "matrices\uc5d0": 20, "\uc88b\uc558\uc74c": 20, "\ub274\ub7f4\ub124\ud2b8\uc6cc\ud06c\uc758": 20, "activation\uc744": 20, "\uc904\uc774\uae30\ub3c4\ud558\uace0": 20, "\ub298\ub9ac\uae30\ub3c4\ud558\ub294": 20, "\uc5b4\ub311\ud130\ub97c": [14, 20], "\uc911\uac04\uc5d0": 20, "\uc0bd\uc785\ud558\ub294": 20, "lora\ubcf4\ub2e4": 20, "\uc0ac\uc6a9\ud558\uba74\uc11c": [20, 28], "\uc54c\ub824\uc838\uc788\uc73c\uba70": 20, "3\ub97c": 20, "\ud588\uc744\ub54c": 20, "\ubcf4\ub2e4\ub3c4": [20, 37], "\uc8fc\uc7a5\ud558\uace0": 20, "\ud559\uc2b5\uc2dc\uac04\ub3c4": 20, "\uc9e7\uc544": 20, "30\ubd84\ub9cc\uc5d0": 20, "\ud29c\ub2dd\ud560": [20, 21], "loralib": 20, "\uc124\uce58": 20, "pip": 20, "instal": 20, "altern": [20, 36], "git": 20, "microsoft": 20, "befor": 20, "in_featur": 20, "out_featur": 20, "after": 20, "add": [20, 35], "parameter\ub9cc": 20, "bigmodel": 20, "string": 20, "lora_": 20, "mark_only_lora_as_train": 20, "loop": [20, 41], "dataload": [20, 36], "\uc800\uc7a5\ud560": 20, "\ub54c\uc5d4": 20, "state_dict": 20, "\uc800\uc7a5\ud558\uac8c": 20, "save": 20, "checkpoint_path": 20, "lora_state_dict": 20, "\ubd88\ub7ec\uc62c": 20, "load_state_dict": 20, "strict": 20, "load": [20, 24, 35], "ckpt_pretrain": 20, "pt": [20, 33], "ckpt_lora": 20, "llm": [20, 22, 37], "\ud29c\ub2dd": [20, 29], "gpu\ub85c": [20, 25], "\uac00\ub2a5\ud560\uae4c": [20, 27], "\uc18c\uac1c\ud569\ub2c8\ub2e4": [20, 27, 31, 35, 38, 41, 42], "da": 20, "nhctrrve": 20, "2209": 21, "14792": 21, "jeonghwa": [14, 21, 27, 43], "yoo": [14, 21, 27, 43], "26": [21, 31, 42], "lucidrain": 21, "\uac00\uc18d\ud654": [21, 39], "\ud558\uc600\uc74c": 21, "\ud544\uc694\ud558\uc9c0": [21, 23, 31, 39], "\ubc29\ub300\ud558\ub2e4\ub294": 21, "\uc720\uc9c0\ud568": 21, "tensor\ub97c": 21, "\ubd84\ud574\ud558\uc5ec": 21, "\uadfc\uc0ac\ud654": 21, "\uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0": 21, "\uc801\uc6a9\ud558\uae30": 21, "pipeline\uc744": 21, "\uc124\uacc4\ud568": 21, "\ud0dc\uc2a4\ud06c\uc5d0\uc11c": [14, 21, 27], "\ub2ec\uc131": [14, 21, 22, 27, 28, 29, 33], "\uc778\ud130\ub137\uc744": 21, "\ud655\ubcf4\ub420": 21, "\uaddc\ubaa8\uc758": [21, 24, 27, 28], "\uc218\uc9d1\ud558\uae30\ub294": 21, "\uc874\uc7ac\ud558\ub294\ub370": 21, "\ub0ad\ube44\uc77c": 21, "\ube44\uc9c0\ub3c4": 21, "\ub808\uc774\ube14\uc774": 21, "\uc9c0\uc815\ub418\uc9c0": 21, "\ud398\uc5b4\ub9c1\ub41c": 21, "\uc5c6\uc774\ub3c4": [21, 31, 37, 39], "\ube44\ub514\uc624\ub9cc\uc73c\ub85c": 21, "\uc138\uc0c1\uc758": 21, "\uac1c\uccb4\uac00": 21, "\uc6c0\uc9c1\uc774\uace0": 21, "\uc0c1\ud638": [14, 21], "\uc791\uc6a9\ud558\ub294\uc9c0": 21, "\ub514\ud4e8\uc804": [14, 21, 27], "t2v\ub85c": 21, "\ubc29\ubc95\uc778": [14, 21], "video\ub97c": [21, 29], "prior\ub85c": 21, "\ud544\uc694\uc131\uc744": 21, "\uc6b0\ud68c\ud55c\ub2e4": 21, "\uace0\ud654\uc9c8": [21, 33, 34], "\uace0\ud504\ub808\uc784\ub960": 21, "\uc2dc\uc2a4\ud15c\uacfc": 21, "\ube44\uad50\ud558\uc5ec": 21, "\ud3c9\uac00\ud55c\ub2e4": 21, "\uc81c\ub85c\uc0f7": 21, "300\uac1c\uc758": 21, "\ud14c\uc2a4\ud2b8": [14, 21, 32], "\uc218\uc9d1\ud558\uc5ec": 21, "\uacf5\uac1c\ud560": 21, "\uacc4\ud68d\uc774\ub2e4": 21, "\uc2e0\uacbd\ub9dd\uc758": 21, "\ube14\ub85d\uc744": 21, "\ucc28\uc6d0\uc73c\ub85c": 21, "\uc2dc\uacf5\uac04": 21, "\uc2e0\uacbd\ub9dd\uacfc": 21, "\ud504\ub808\uc784": [14, 21, 29], "\uc218\uc2dd": [21, 42], "sr_h": 21, "sr": [21, 37], "t_l": 21, "uparrow_": 21, "bpe": [21, 33], "c_x": 21, "understand": [21, 27, 33, 37], "\uacf5\uc720\ud558\uc600\ub2e4": 21, "\ub9cc\ub4e4\uae30": 21, "x_e": 21, "y_e": 21, "rgb": [21, 32, 33], "_l": 21, "sr_l": 21, "d\uc5d0\uc11c": 21, "768x768": [21, 39], "\ud53d\uc140\ub85c": 21, "\uc99d\uac00\uc2dc\ucf1c": 21, "\ubcc0\ud658\ub41c\ub2e4": 21, "fp": [21, 29], "2\ucc28\uc6d0": 21, "\uc2dc\uac04\uc801": [14, 21, 29], "\ub2e4\uc74c\uc758": [21, 30], "\uc218\uc815\ud55c\ub2e4": 21, "layers\ub294": 21, "\uc815\ubcf4\ub9cc": 21, "\ucd94\uac00\ud574\uc8fc\uba74": 21, "\uc218\uc815": 21, "\uc0ac\uc774\uc988\uc758": [21, 37], "frame\uc744": 21, "\ub9cc\ub4e4\uac8c": 21, "16\uac1c\uc758": 21, "\ud504\ub808\uc784\uacfc": [14, 21], "\uc0ac\uc774\ub97c": 21, "\ubcf4\uac04\ud558\uc5ec": 21, "\uc99d\uac00\uc2dc\ud0a8\ub2e4": 21, "\ub124\ud2b8\uc6cc\ud06c\uc5d0\ub294": 21, "hallucin": [14, 21], "\ud658\uac01": 21, "\ud3ec\ud568": [21, 22, 35], "\uae5c\ubc15\uc774\ub294": [14, 21], "\uc794\uc0c1\uc774": 21, "\uc0dd\uae30\uc9c0": [21, 32], "\uc54a\uc73c\ub824\uba74": 21, "\ud658\uac01\uc774": 21, "\uc804\uccb4\uc5d0": [21, 42], "\uc720\uc9c0\ud574\uc57c": 21, "\uc815\ubcf4\ub098": 21, "\uac00\uc0c1\uc73c\ub85c": 21, "\ud504\ub808\uc784\ub2f9": [14, 21], "\uc218\ud589\ud558\ub294": 21, "\ubaa8\ub4c8\uc778": 21, "\ubaa8\ub4c8\ub85c": 21, "\ub9cc\ub4e4\uae30\uc5d4": 21, "\uba54\ubaa8\ub9ac": [21, 29, 39], "\ucef4\ud4e8\ud305": [14, 21], "\ubd80\uc871\uc73c\ub85c": 21, "\uc5b4\ub824\uc6e0\ub2e4": 21, "\ucc28\uc6d0\uc5d0\uc11c": [21, 29], "\ud504\ub808\uc784\uc5d0": [14, 21, 29], "\ucd08\uae30\ud654\ub97c": 21, "\uc804\ubc18\uc5d0": 21, "\ud658\uac01\uc744": 21, "\uc81c\uacf5\ud568": [21, 28], "\ucee8\ubc8c\ub8e8\uc158": 21, "\ub808\uc774\uc5b4": [14, 21], "\ub2e4\uc74c\uc5d0": [21, 26], "1d": 21, "\ucee8\ubc8c\ub8e8\uc158\uc744": 21, "\uc313\ub294\ub2e4": 21, "\ucee8\ubc8c\ub8e8\uc158\uc758": 21, "load\ub97c": 21, "\ucee8\ubcfc\ub8e8\uc158": 21, "\ub808\uc774\uc5b4\uc640": 21, "\uc0ac\uc774\uc5d0": [21, 39], "\uacbd\uacc4\ub97c": 21, "information\uc744": 21, "\ucc44": [21, 35], "\ud150\uc11c": 21, "height": 21, "2_d": 21, "1_d": 21, "\ud568\uc218\ub85c": [21, 31], "layer\uc5d0": [21, 26], "\ud655\uc7a5\ud558\uc600\ub2e4": 21, "layer\ucc98\ub7fc": 21, "attenion": 21, "\uc313\uc544": 21, "\uadfc\uc0ac\ud654\ud558\ub294": [21, 42], "flatten": 21, "\ucd95\uc5d0": [21, 24], "flatten\ud558\ub294": 21, "\uc5f0\uc0b0": [21, 33], "hw": 21, "attn_": 21, "spatiotemporalattent": 21, "add_feed_forward": 21, "ff_mult": 21, "pos_bia": 21, "flash": 21, "causal_time_attn": 21, "assert": [21, 26, 30], "compat": 21, "spatial_attn": 21, "spatial_rel_pos_bia": 21, "continuouspositionbia": 21, "num_dim": 21, "temporal_attn": 21, "causal": [21, 33], "temporal_rel_pos_bia": 21, "has_feed_forward": 21, "ff": 21, "mult": 21, "enable_tim": 21, "is_video": 21, "ndim": 21, "bxf": 21, "hxw": 21, "space_rel_pos_bia": 21, "exist": 21, "rel_pos_bia": 21, "bxhxw": 21, "time_rel_pos_bia": 21, "\ube44\ub514\uc624\uc758": [14, 21], "\ucd08\ub2f9": [14, 21], "\ub098\ud0c0\ub0b4\ub294": [21, 28, 32], "\ucee8\ub514\uc154\ub2dd": [14, 21], "\ud30c\ub77c\ubbf8\ud130": [21, 24, 31, 35, 36, 42], "\ucd94\uac00\ud55c\ub2e4": [14, 21, 24, 29], "\ub780": [21, 29], "\ubd80\ub4dc\ub7fd\uac8c": 21, "\ub9cc\ub4e4\uace0": [21, 27, 28], "\uc5f0\uc7a5": 21, "\uc2dc\ud0ac": [21, 27, 30], "\ud504\ub808\uc784\uc744": [14, 21, 29], "\ubcf4\uac04\ud558\uace0": 21, "extrapolation\uc744": 21, "extrapol": 21, "\ubbf8\ub798\uc758": 21, "\uc608\uce21\ud558\uac70\ub098": 21, "spatialtempor": 21, "\ucc98\ub9ac\ub41c": 21, "\uc81c\ub85c": 21, "\ud328\ub529\ud558\uace0": 21, "\uc5c5\uc0d8\ud50c\ub9c1\uc744": 21, "interpolation\uc744": 21, "\ud30c\uc778": [14, 21, 27, 29], "\ud29c\ub2dd\ud55c\ub2e4": 21, "\uc785\ub825\uc5d0": 21, "\ucc44\ub110\uc744": [14, 21], "\ub9c8\uc2a4\ud0b9": 21, "\uc785\ub825\uc744": [14, 21, 27], "3\uac1c\uc758": 21, "\ub9c8\uc2a4\ud0b9\ub418\ub294": 21, "\ubc14\uc774\ub108\ub9ac": 21, "\ucc44\ub110": [21, 24, 29], "skips\uacfc": 21, "\ud30c\uc778\ud29c\ub2dd\ud558\uc5ec": [14, 21, 27], "\ucd94\ub860\uc2dc": [14, 21], "rate\ub97c": [21, 28], "\uc81c\uacf5\ud55c\ub2e4": [21, 39], "f\ub97c": 21, "5\ub85c": 21, "16\ud504\ub808\uc784": 21, "76\ud504\ub808\uc784": 21, "x5": 21, "\uc5c5\uc0d8\ud50c\ub9c1": 21, "\ub05d": 21, "\ub9c8\uc2a4\ud0b9\ud558\uc5ec": 21, "\ucd94\uc815": [21, 28, 39], "\uc560\ub2c8\uba54\uc774\uc158\uc5d0\ub3c4": 21, "\uc694\uc18c\ub4e4\uc740": 21, "\ub300\ud574\uc11c\ub9cc": [21, 27, 30, 32], "\ube44\ub514\uc624\uc5d0": [14, 21], "\ud29c\ub2dd\ud558\uc9c0": 21, "\ub9cc\uc73c\ub85c": [21, 31, 38, 39], "decoder\ub294": 21, "\uc911\uc5d0": [21, 33], "\ub4e4\uc5b4\uc628": 21, "\ubc1b\ub294\ub2e4": 21, "\ub05d\ub098\uba74": 21, "\ub808\uc774\uc5b4\ub97c": [14, 21, 24], "\ucd08\uae30\ud654\ud558\uc5ec": 21, "\ube44\ub514\uc624\uc5d0\uc11c": [14, 21], "16\ud504\ub808\uc784\uc774": 21, "\ub514\ucf54\ub354\ub97c": [14, 21], "\ucd08\uae30\uc5d0\ub294": 21, "\ubc94\uc704": [21, 37, 38, 40], "\ubaa8\uc158\uc774": [14, 21], "\uc2dc\uc791\ud558\uace0": [21, 40], "\uc774\ud6c4\uc5d0\ub294": 21, "\uc804\ud658\ud55c\ub2e4": [21, 29], "\ub124\ud2b8\uc6cc\ud06c\ub294": 21, "\ub514\ucf54\ub354\ub85c\ubd80\ud130": 21, "\ud29c\ub2dd\ub41c\ub2e4": 21, "5b": [21, 25, 30, 39], "3b\uc758": 21, "\uc0ac\uc6a9\ud558\uc600\ub2e4": [14, 21], "nsfw": 21, "\uc720\ud574\ud55c": 21, "\uc6cc\ud130\ub9c8\ud06c": 21, "5\ubcf4\ub2e4": 21, "\ud544\ud130\ub9c1\ud558\uc600\ub2e4": 21, "Not": 21, "safe": [21, 30], "For": 21, "\uc120\uc815\uc801\uc774\uac70\ub098": 21, "\uc74c\ub780\ud558\uac70\ub098": 21, "\ud3ed\ub825\uc801\uc778": 21, "\ucf58\ud150\uce20": 21, "10m\uacfc": 21, "hd": 21, "vila": 21, "100m": 21, "10m\uc744": 21, "100m\uc744": 21, "\uc561\uc158": 21, "\uace0\uc548\ub418\uc5c8\uc73c\uba70": 21, "\ud658\uacbd\uc5d0\uc11c": 21, "\ucd2c\uc601\ub41c": 21, "\ud074\ub9bd": 21, "\ube44\ub514\uc624\uc640": 21, "\ud074\ub798\uc2a4\uc5d0": [21, 30], "\ud15c\ud50c\ub9bf": 21, "\ubb38\uc7a5\uc744": [21, 28], "\uc791\uc131\ud558\uace0": 21, "fretchet": 21, "\uce21\uc815\ud55c\ub2e4": 21, "train\uc14b\uacfc": 21, "\ud074\ub798\uc2a4": [21, 27, 30], "\uc138\ud2b8\uc758": 21, "59": 21, "794": 21, "\ucea1\uc158\uc5d0": 21, "clipsim": 21, "amazon": 21, "turk": 21, "amt": [21, 32], "\uc218\uc9d1\ud558\uc600\ub2e4": 21, "annotator\ub4e4\uc5d0\uac8c": 21, "\uc2dc\uc2a4\ud15c\uc774": 21, "\uc2f6\uc740\uc9c0": 21, "\ubb3c\uc5b4\ubd24\ub2e4": 21, "\ubd88\uc644\uc804\ud558\uac70\ub098": 21, "\ucd94\uc0c1\uc801\uc774\uac70\ub098": 21, "\ubd88\ucf8c\uac10\uc744": 21, "\ud544\ud130\ub9c1": 21, "\uce74\ud14c\uace0\ub9ac": 21, "\ub3d9\ubb3c": [21, 30], "\ud310\ud0c0\uc9c0": 21, "\uc790\uc5f0": [21, 28], "\ud48d\uacbd": [21, 24], "\uc74c\uc2dd": 21, "\uc74c\ub8cc": 21, "\uc2dd\ubcc4\ud558\uace0": 21, "\uc120\ud0dd\ud558\uc600\ub2e4": 21, "\ub3d9\uc601\uc0c1\uc744": [14, 21], "\ub370\uc5d0": 21, "\uc0ac\uc6a9\ub418\uc9c0": 21, "\uace0\uc815\ub41c": [21, 24, 28, 31, 36, 39], "\uc720\uc9c0\ud588\ub2e4": 21, "imagen\uc758": [21, 27], "drawbench": 21, "\ud504\ub86c\ud504\ud2b8\ub3c4": 21, "vedio": 21, "faithfulness\ub97c": 21, "\ud3c9\uac00\ud558\uc600\ub2e4": 21, "\ud488\uc9c8": [14, 21, 27], "\uc21c\uc11c\ub85c": 21, "\ud488\uc9c8\uc774": [21, 26, 32], "\uc88b\uc740\uc9c0": 21, "annotator\uc5d0\uac8c": 21, "\ubb3c\uc5b4\ubcf8\ub2e4": 21, "vdeio": 21, "faith": [21, 23], "\ube44\ub514\uc624\uac00": 21, "\uc77c\uce58\ud558\ub294\uc9c0": 21, "\ubcf4\uac04": 21, "film\uc758": 21, "\ubaa8\uc158": [14, 21], "\uc0ac\uc2e4\uac10\uc744": 21, "\ube44\uad50\ud558\uae30": [21, 28], "\ud3c9\uac00\ub3c4": 21, "5\uba85\uc758": 21, "\uac01\uae30": 21, "annotator\uc758": 21, "\ub2e4\uc218": [21, 34], "\ub4dd\ud45c\ub97c": 21, "vtt\uc5d0": 21, "\ubcf4\uace0\ud558\ub294": 21, "godiva": 21, "nuwa": 21, "\uc911\uad6d\uc5b4\uc640": 21, "\uc601\uc5b4\ub97c": 21, "cogvideo": 21, "\ucd94\ub860\uc744": [21, 30], "\uc218\ud589\ud558\uc600\ub2e4": 21, "\uc0f7": 21, "\uc6b0\uc218\ud558\ub2e4": 21, "finetunning\uc744": 21, "\uacb0\uacfc\uc5d0\uc11c\ub3c4": 21, "\ub2ec\uc131\ud558\uc600\ub2e4": 21, "drawbench\uc640": 21, "\ud14c\uc2a4\ud2b8\uc14b\uc5d0": 21, "cogvideo\uc640": 21, "\ube44\uad50\ud55c\ub2e4": [14, 21, 39], "vdm\uc758": 21, "\uc6f9": 21, "\ud398\uc774\uc9c0\uc5d0": 21, "\ud45c\uc2dc\ub41c": [21, 27], "28\uac1c\uc758": 21, "\ub3d9\uc601\uc0c1\uc5d0": [14, 21], "8\uac1c\uc758": 21, "8\ubc88": 21, "\ud3c9\uac00\ud558\uc5ec": 21, "76x256x256": 21, "\ud574\uc0c1\ub3c4\ub85c": [21, 29], "\ud3c9\uac00\uc790\uac00": 21, "\ub0ab\ub2e4\uace0": 21, "\ud22c\ud45c\ud55c": 21, "\ud37c\uc13c\ud2b8": 21, "\ube44\uc728": [21, 24], "\ubca4\uce58\ub9c8\ud06c\uc5d0\uc11c": 21, "video\uac00": 21, "film\uc744": 21, "drawbench\uc758": 21, "\uc800\ud504\ub808\uc784\ub960": 21, "4fps\uae4c\uc9c0": 21, "\uc5c5\uc0d8\ud50c\ub9c1\ud55c\ub2e4": 21, "\ud3c9\uac00\uc790\ub4e4\uc740": 21, "62": 21, "drawbench\uc5d0": 21, "54": 21, "\ucee4\uc11c": [21, 25, 32], "\ubb3c\uccb4\uac00": 21, "\uc6c0\uc9c1\uc774\ub294\uc9c0\uc5d0": 21, "\uc9c0\uc2dd\uc774": 21, "\uad00\ucc30": 21, "\ub9e8": 21, "vdm": 21, "\uac00\uc6b4\ub370": 21, "\ubaa8\uc158\uc758": 21, "\ud48d\ubd80\ud55c": [21, 22], "\ucf58\ud150\uce20\ub97c": [14, 21], "extrpol": 21, "\uc8fc\uc5b4\uc9c0\uba74": [14, 21], "\ub3d9\uc601\uc0c1\uc73c\ub85c": [14, 21], "\uc560\ub2c8\uba54\uc774\uc158\ud654": 21, "\uc0ac\uc6a9\uc790\ub294": [21, 26, 28], "\uac1c\uc778\ud654\ud558\uace0": 21, "\uc81c\uc5b4\ud560": [14, 21], "film": 21, "\uc6c0\uc9c1\uc774\ub294": [14, 21], "\uc804\ud658\ud558\uae30\ub9cc": 21, "\uc758\ubbf8\ub860\uc801\uc73c\ub85c": 21, "\ub9cc\ub4ec": 21, "\uc8fc\ubcc0": [21, 39], "\uc138\uacc4\ub85c\ubd80\ud130": 21, "\uc9c0\uc2dd\uc744": 21, "intelligence\ucc98\ub7fc": 21, "system\ub3c4": 21, "\uc778\uac04\uc758": 21, "\ubaa8\ubc29\ud560": 21, "\ucc3d\uc758\uc801\uc774\uace0": 21, "\uc720\uc6a9\ud560": 21, "\uc5f0\uad6c\uc790\ub4e4\uc740": 21, "\ub3d9\uc601\uc0c1\uc5d0\uc11c": 21, "\uc138\uacc4\uc758": 21, "dynamic\uc744": 21, "\ud559\uc2b5\ud568\uc73c\ub85c\uc368": [21, 25, 28, 31, 36], "\uadf9\ubcf5\ud560": [21, 28], "2301": 22, "00704": 22, "mar": 22, "t5": [22, 30, 35], "xxl": [22, 30, 35], "\uc8fc\uc5b4\uc9c0\uace0": 22, "\ub79c\ub364\ud558\uac8c": [22, 35], "\ube44\uad50\ud560": [22, 32], "\uc801\uc5b4": 22, "grain": [22, 25], "\ucd94\ucd9c\ud558\uc5ec": [14, 22], "concept": [22, 28, 37], "\uc790\uc138": 22, "900m": 22, "cc3m": 22, "06": [22, 38], "3b": 22, "\ud30c\uc778\ud29c\ub2dd": [14, 22, 24, 27], "outpaint": 22, "22": [22, 33], "02": [22, 32], "maskgit": 22, "googl": [22, 38, 40], "\ub514\ucf54\ub529": [14, 22], "\uc2dc\uc5d0": [14, 22], "\ub9c8\uc2a4\ud0b9\ub41c": [22, 29], "\uc608\uce21\ud558\uc9c0\ub9cc": 22, "\uc2e0\ub8b0\ub3c4\uac00": 22, "\ud1a0\ud070\ub9cc": 22, "\ub514\ucf54\ub529\ub428": 22, "\uc904\uc5ec": [22, 39], "\ud5a5\uc0c1": [14, 22, 25, 27, 33], "\uc778\ucf54\ub529\ub418\uace0": 22, "\ub514\ucf54\ub529\ub418\uc5b4": 22, "\ubcf5\uc6d0\ub418\ub294": [22, 32], "\ud559\uc2b5\uc740": 22, "16x16": [22, 34], "\ud30c\ub77c\ubbf8\ud130\uc758": [22, 36], "\ub300\ubd80\ubd84\uc774": 22, "\ud30c\ub77c\ubbf8\ud130\ub85c": [22, 24, 39], "unmak": 22, "\ud1a0\ud070\uacfc": 22, "t5xxl": 22, "\ubc14\uafb8\ub294\ub370": [22, 28], "noun": [22, 35], "action": 22, "verb": 22, "adject": 22, "preposit": 22, "\uac83\uc774\ub77c\uace0": [22, 27], "\uc120\ud589": 22, "4096": 22, "\uc5bb\uc74c": 22, "transformer\uc5d0": 22, "\uc785\ub825\ub418\uac8c": 22, "\ub9de\ucda4": [22, 28], "\uc9c4\ud589\ub41c": 22, "codebook": 22, "\ub9e4\ud551\uc744": [22, 32], "\ub514\ucf54\ub529\uc774": 22, "\ud574\uc0c1\ub3c4\uc758": [14, 22, 24], "\uc778\ucf54\ub529\ud560": 22, "tame": 22, "\uc778\ucf54\ub529\ub41c": [14, 22, 29], "\ud1a0\ud070\uc774": 22, "\ubb34\uc2dc\ud558\uba74\uc11c": 22, "\ud568\uc744": 22, "entropi": 22, "\uc788\uac8c\ub428": 22, "unmask": 22, "\ud1a0\ud070\uc740": [22, 28, 33], "\uad50\uccb4": 22, "\uc120\ud615\uc801\uc73c\ub85c": [22, 39], "hidden": 22, "\uc0ac\uc774\uc988\uc5d0": 22, "\ube14\ub7ed\uc774": 22, "\ubcc0\uacbd\ud558\ub294\ub370": 22, "\uc0ac\uc6a9\ub418\uace0": 22, "\uc624\ucc28\ub97c": 22, "\uacc4\uc0b0\ud568": 22, "tokens\ub97c": 22, "\uc99d\uac00\ud558\uae30": 22, "\uad6c\uc131\ud588\uc744": 22, "\ud3ec\ucee4\uc2f1": 22, "\uc9c4\ud589\ub428": 22, "\uacc4\uce35\uc801\uc73c\ub85c": 22, "\uc124\uacc4\ud588\uc74c": 22, "\uc644\ub8cc\ub418\uba74": 22, "\uc774\ud6c4\uc5d0": 22, "\ub298\ub9bc": 22, "4\uac1c": 22, "\ud45c\uc9c0\ud310\uc774": 22, "\ubcf5\uc6d0\uc774": 22, "\ub410\uc74c": 22, "\ud004\ub9ac\ud2f0\uc640": 22, "ell_g": 22, "ell_c": 22, "ell_u": 22, "l_c": 22, "l_u": 22, "cfg": [22, 39], "\uc99d\uac00\uc2dc\ud0a4\ub294": [22, 27, 31], "\uac70\uccd0": [22, 31, 32, 36, 40], "\uadf9\ubcf5": 22, "\uc5c6\uac70\ub098": [14, 22, 26], "\ub0ae\uac8c": [22, 34], "\ud6c4\ubc18\uc5d0\ub294": 22, "\uc8fc\uac8c": [22, 27, 32], "\ub85c\ub3c4": [22, 42], "foward": 22, "\uc5f0\uc0b0\uc73c\ub85c": 22, "\ub3d9\uc791\ud568": 22, "condition": 22, "independ": 22, "\uc218\ud589\ub428": 22, "\uc608\uce21\ub418\ub294": 22, "\uc120\ud0dd\ud574": 22, "\ud574\uc81c\ub418\ub294": 22, "\uc808\ucc28\ub97c": [14, 22], "rich": [22, 38], "\uc218\ubc31\ubc88\uc758": 22, "460m": 22, "1m": 22, "week": 22, "core": 22, "tpu": 22, "v4": 22, "chip": 22, "adafactor": [22, 27], "cardin": 22, "\ubc88": [22, 26, 30, 31], "\ud68c\uc804\ub41c": 22, "\ud004\ub9ac\ud2f0": [22, 29, 38], "\ub2e4\uc591\uc131": [14, 22, 27], "prompt\uc640\uc758": 22, "\uce21\uc815\ud588\uc74c": 22, "\uac00\uc838\uc62c": 22, "\uc788\ub098\uc694": 22, "\uc544\ubb34\ub798\ub3c4": 22, "\ubaa8\ub378\uc774\ub77c": 22, "\ubaa8\ub378\uc778\uac00\uc694": 22, "\uae30\uc900\uc810\uc774": 22, "\uc5b4\ub5bb\ub0d0\uc5d0": 22, "\uc544\ub2c8\ub2e4": [22, 30], "\uc815\ud558\uae30": 22, "vqgan\uc744": 22, "gan\uc774\ub77c\uace0": 22, "\uc0dd\uac01\ud560": 22, "\uacb0\uacfc\uc5d0": [22, 27, 30], "\ub2ec\ub77c\uc9c8": [22, 26], "\uad00\uc810\uc5d0\uc11c": [22, 39], "\uc0dd\uac01\ud558\uba74": 22, "\uc544\ub2c8\ub2e4\ub77c\uace0": 22, "\ub9d0\ud560": [22, 28], "\uac16\ub098\uc694": 22, "vqgan\uc5d0\uc11c": 22, "\uc778\ucf54\ub529\ud558\uace0": [14, 22], "\uc555\ucd95": [22, 33], "codebook\uc758": 22, "\uac00\uc838\uc640": [22, 24, 29], "\uad6c\uc131\ud558\ub294\ub370\uc694": 22, "\ud3ec\ud568\ub418\uc5b4": 22, "\ud3ec\uc778\ud2b8\uc5d0": 22, "token\uc774\ub77c\uace0": 22, "\uc0dd\uac01\ud558\uc2dc\uba74": 22, "\ub123\uc5c8\uc744\ub54c": 22, "\uc774\ub904\uc9c0\ub098\uc694": 22, "inference\uc5d0\uc11c\ub294": 22, "\uc5c6\ub294\ub370": 22, "token\ub300\uc2e0": 22, "\ub4e4\uc5b4\uac00\uac8c": [22, 26, 38, 40], "\ub418\ub098\uc694": 22, "\ub9c8\uc2a4\ud06c\ub41c": 22, "\ud615\ud0dc\ub85c": [22, 24, 31, 34, 41, 42], "step\uc744": [22, 24, 28, 39], "\uc218\ud589\ub429\ub2c8\ub2e4": 22, "\uc218\uc2dd\uc5d0": 22, "\ub4e4\uc5b4\uac00\ub098\uc694": 22, "value\ub85c": 22, "\uc785\ub825\ub418\uc5b4": 22, "\uc218\ud589\ub418\uac8c": 22, "\uadf8\ub807\uac8c": [22, 27, 28], "feature\uc640": 22, "gt\uc758": 22, "\ub07c\ub9ac": 22, "2108": 23, "01073": 23, "03": [23, 41], "\ubd84\uc57c\uc5d0\uc11c\uc758": 23, "\uc9c4\ud654": 23, "\uacc4\uc18d": [23, 40], "\ub418\uc5b4\uc624\uace0\uc788\ub2e4": 23, "\uc774\ub04c\uc5b4\ub0b4\ub824\ub294": 23, "\ubd84\uc57c\ub3c4": 23, "\ud65c\ubc1c\ud788": [23, 25], "\uc9c4\ud589\ub418\uace0\uc788\ub2e4": 23, "\ubc29\uc2dd\uc73c\ub85c\uc758": 23, "editing\uc5d0\ub294": 23, "\uba87\uac00\uc9c0": 23, "sdedit\uc740": 23, "\ud574\uacb0\ud574\ub098\uc544\uac14\ub2e4\ub294": 23, "contribution\uc73c\ub85c": 23, "\uc81c\uc2dc\ud558\uc600\ub2e4": 23, "abstract\uc5d0\uc11c": 23, "\ub9d0\ud55c": 23, "editing\uc774\ub780": 23, "\uc720\uc800\uac00": [23, 28], "\uc81c\uc2dc\ud558\uba74": 23, "\ub450\uac00\uc9c0\uc758": 23, "\ud3c9\uac00\uc694\uc18c\uac00": 23, "\uc720\uc800\uc758": 23, "\ub530\ub974\ub294\uc9c0": 23, "real\ud55c\uc9c0": 23, "\uc5f0\uad6c\ubc29\uc2dd\uc740": 23, "\ub450\uac00\uc9c0\ub85c": 23, "\ub098\ub25c\ub2e4": 23, "\uc774\ub8ec": 23, "\uc774\ubbf8\uc9c0\uc5d0\uc11c": [14, 23, 27], "edit\ub41c": 23, "condition\ub9c8\ub2e4": 23, "\uc7ac\ud559\uc2b5\uc744": 23, "\uc694\uad6c": [14, 23], "inversion\ud55c": 23, "vactor\ub97c": 23, "\uc870\uc791\ud574": 23, "function\uc774": 23, "\uc815\uc758\ub418\uc5b4\uc57c\ud558\uace0": 23, "function\uacfc": 23, "\uc7ac\ud559\uc2b5\uc774": 23, "\ud55c\uac1c\uc758": 23, "weight\ub85c": 23, "\ubd84\ud3ec\uc5d0\uc11c": [23, 28], "\ub192\uc740\uacf3\uc73c\ub85c": 23, "\ud574\ub098\uac00\uba74": 23, "\uc5bb\uc5b4\ub0bc": 23, "score\ub294": [23, 27], "\ubc00\ub3c4": 23, "\ud568\uc218\uc758": 23, "\uc21c\uac04": 23, "\uae30\uc6b8\uae30": 23, "\ubbf8\ubd84\uac12": 23, "\uc8fc\uc785\ud558\ub294\ub370": 23, "\uc8fc\uc785\ud55c\ub2e4": 23, "ddpm\uacfc\uc758": 23, "\uc815\uc758\ud558\ub294": [23, 31], "equation\uc758": 23, "\uc815\ub3c4\uc774\ub2e4": 23, "1907": 23, "05600": 23, "level\uc744": 23, "\uc774\ubbf8\uc9c0\uc704\uc5d0": 23, "patch\ub97c": 23, "stroke\ub97c": 23, "coarse\ud55c": 23, "stroke\uc758": 23, "procedur": [23, 40], "sde\uc758": 23, "noise\ud654\ub41c": 23, "\uc9c4\ud589\ud560": [23, 33], "\ud544\uc694\uac00": [23, 32, 35], "\uc815\uc758\ud574\uc57c\ud558\ub294\ub370": 23, "realistic\ud558\uc9c0\ub9cc": 23, "\ud558\uc9c0\uc54a\uc740": 23, "faithful\ud558\uc9c0\ub9cc": 23, "artistic\ud55c": 23, "\uc5bb\uac8c\ub41c\ub2e4": 23, "sdedit\uc758": 23, "\uacfc\uc815\uc774\ub2e4": 23, "\uc885\ud569\uc801\uc778": 23, "survey\ub97c": 23, "\ubc29\uc2dd\ub4e4\uacfc": 23, "stylegan": 23, "ada": 23, "sdedit\uc774": 23, "\uc790\uc5f0\uc2a4\ub7fd\uace0": [23, 25], "blend": 23, "\uc804\ud1b5\uc801\uc778": [23, 40], "\uae30\ubc95\uacfc": 23, "\ube44\uad50\ud574\ub3c4": 23, "01952": 24, "stabil": 24, "sdxl\uc740": 24, "\ubc30": [24, 33], "unet\uc744": 24, "\ube14\ub85d\uacfc": 24, "sdxl\uc5d0\uc11c": 24, "encoder\ub85c": 24, "\uc0ac\uc6a9\ub418\uba74\uc11c": 24, "\ud30c\ub77c\ubbf8\ud130\uac00": 24, "\uc99d\uac00\ud588\ub2e4": 24, "\ub2e4\uc218\uc758": 24, "\ube44\uc728\uc5d0": 24, "sdxl\uc744": 24, "\uc124\uacc4\ud588\ub2e4": 24, "sdxl\uc758": 24, "\uc2dc\uac01\uc801\uc778": [24, 28], "fidelity\ub97c": [14, 24], "\ud5a5\uc0c1\uc2dc\ud0a8": 24, "\ub300\ud3ed": [14, 24, 39], "\uae30\ub2a5\uc774\ub77c": 24, "\uac10\ub3c5": 24, "supervis": [24, 32], "\uac04\ub2e8\ud558\uba74\uc11c\ub3c4": 24, "\ucd94\uac00\uc758": 24, "\ud5a5\uc0c1\ud558\ub294": 24, "latent\ub97c": [14, 24], "\ubcc4\uac1c\uc758": 24, "\uadf8\ub9bc": [24, 27, 28], "\ub192\uc778": 24, "sdxl\uc774": 24, "sd\ubcf4\ub2e4": 24, "\uc2dc\uac01\ud654\ud588\ub294\ub370": 24, "128x128": [24, 40], "\ud65c\uc6a9\ud558\uace0": [14, 24], "sdedit\uc744": 24, "\uc801\uc6a9\ud55c\ub2e4": [14, 24, 29], "sdxl\uacfc": 24, "autoencoder\ub97c": 24, "sd\uc640": 24, "\ube14\ub85d\uc758": 24, "heterogen": 24, "\uc0ac\uc6a9\ud588\ub2e4\ub294": [24, 34], "\ud14c\uc774\ube14": [24, 34], "1\uc744": 24, "\ucc38\uace0\ud558\uba74": [24, 34], "highest": 24, "level\uc5d0\uc11c": 24, "\ube14\ub7ed\uc744": 24, "unet\uc5d0\uc11c": 24, "lowest": 24, "8x": 24, "l\uacfc": 24, "bigg\ub97c": 24, "encoder\uc758": [14, 24, 27, 28], "\uc0ac\uc6a9\ud588\uc73c\uba70": [24, 40], "openclip\ub85c\ubd80\ud130": 24, "\ucd94\uac00\ud588\ub2e4": [24, 29], "\uc0ac\uc774\uc988\uac00": 24, "6b\ub85c": 24, "817m": 24, "\uc2dc\ud0a4\uac70\ub098": 24, "upscale\ud558\uc5ec": 24, "\ucd5c\uc18c": [14, 24, 31], "\ud06c\uae30\uac00": 24, "\uc815\ud574\uc9c0\ub294": 24, "\ubb38\uc81c\uc810\uc774": 24, "\uc800\ud558\uc2dc\ud0a4\uac70\ub098": 24, "\uc77c\ubc18\ud654\ub97c": 24, "\uc14b\uc758": 24, "\uc2dc\uac01\ud654\ud574\uc8fc\ub294": 24, "\uadf8\ub9bc\uc774\ub2e4": 24, "\uc81c\uc548\ub41c": [14, 24], "conditiong": 24, "\ubbf8\ub9cc\uc758": 24, "39": 24, "\ub2ec\ud55c\ub2e4": 24, "\uc544\ud2f0\ud329\ud2b8\uac00": [14, 24], "\uc0dd\uae34\ub2e4": [24, 37], "\uc6d0\ub798\uc758": [14, 24], "\ud574\uc0c1\ub3c4\uc5d0\uc11c": 24, "\uc8fc\uc5c8\ub2e4": [14, 24, 28], "\ud06c\uae30\uc778": 24, "\uc81c\uacf5\ud574": 24, "\ucd94\uac00\ub41c\ub2e4": 24, "\uc815\ud560": 24, "\ud574\uc0c1\ub3c4\uc5d0": 24, "\uc758\uc874\uc801\uc778": 24, "\uc5f0\uad00\uc2dc\ud0a4\ub3c4\ub85d": 24, "imagenet\uc73c\ub85c": 24, "\uc9c4\ud589\ud574": [24, 29], "conditiong\uc5d0": 24, "\uc6b0\uc218\uc131\uc744": 24, "\uc785\uc99d\ud588\ub2e4": 24, "cin": 24, "\uc2dc\ucf30\uace0": 24, "70k": 24, "\uc7a5": [14, 24], "nocond": 24, "\ud45c": 24, "\ubcf4\ub2e4\uc2dc\ud53c": 24, "4\uc5d0\uc11c": 24, "\uace0\uc591\uc774": [24, 32], "\uba38\ub9ac\uac00": [24, 26], "\uc798\ub824\uc9c4": 24, "cropping\uc73c\ub85c": 24, "\uc0dd\uc131\ub418\uc5c8\uae30": 24, "\uade0\ub4f1\ud558\uac8c": 24, "\ub192\uc774": [24, 29], "\ub108\ube44": [24, 29], "\ucd95\uc744": 24, "\ubaa8\uc11c\ub9ac\uc5d0\uc11c": 24, "\ud53d\uc140\uc758": 24, "\uc9c0\uc815\ud558\ub294": 24, "\uc0d8\ud50c\ub9c1\ud55c\ub2e4": [24, 28], "fourier": 24, "\ud30c\ub77c\ubbf8\ud130\ub85c\uc368": 24, "\uc785\ub825\ud55c\ub2e4": [14, 24], "conditioning\uacfc": 24, "dm\uc5d0\uc11c\ub3c4": 24, "\uc0ac\uc6a9\ub420": [24, 27, 28], "\uac15\uc870\ud55c\ub2e4": 24, "conditioning\uc740": 24, "\uacb0\ud569\ub420": 24, "\ud0c0\uc784\uc2a4\ud15d": 24, "1024x1024": [24, 26, 27, 38], "\ud604\uc2e4": 24, "\uc138\uacc4\uc5d0\uc11c": 24, "\ubd80\uc790\uc5f0\uc2a4\ub7fd\ub2e4": 24, "\uc138\uacc4\uc5d0\uc11c\ub294": 24, "\ube44\uc728\uc744": 24, "\ub9ce\uace0": [24, 27], "\ube44\uc728\uc758": 24, "\uc9c0\ub2c8\uace0": [24, 36, 38], "\ub2e4\ub8f0\uc218": 24, "\ud30c\uc778\ud29c\ub2dd\ud588\ub2e4": 24, "\ud53d\uc140\uc218\ub97c": 24, "64\uc758": 24, "\ubc30\uc218\ub97c": 24, "\uc9c0\ub2c8\ub3c4\ub85d": 24, "ratio": [24, 40], "\ubc30\uce58\ub294": 24, "\ubc84\ud0b7": 24, "\ubc88\uac08\uc544": [24, 36], "\uac00\uba70": 24, "conditioning\uc73c\ub85c": 24, "\uc8fc\uc5c8\uc73c\uba70": 24, "\uacf5\uac04\uc5d0": 24, "\uc784\ubca0\ub529\ub418\ub294": 24, "tgt": [24, 25], "\ud45c\ud604\ub41c\ub2e4": 24, "\ube44\uc728\ubc0f": 24, "pretraining\uc774": 24, "\ub9c8\uce5c": 24, "\ud559\uc2b5\ud588\uace0": [24, 29], "\ucd95\uc73c\ub85c": 24, "2\uc808\uc5d0\uc11c": 24, "\uacb0\ud569\ud588\ub2e4": 24, "sd\ub294": 24, "\ud558\ub098\uc774\uace0": 24, "autoencoder\uc758": 24, "composition\uc740": 24, "ldm\uc73c\ub85c\ubd80\ud130": 24, "\ud45c\ud604\ub418\uc9c0\ub9cc": 24, "frequenc": [24, 33], "\ub514\ud14c\uc77c\ud55c": 24, "\ud5a5\uc0c1\ud558\uace0\uc790": 24, "\ud5a5\uc0c1\ud588\ub2e4": 24, "\ub05d\uc73c\ub85c": 24, "\uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c": 24, "\ubc30\uce58\uc0ac\uc774\uc988": [14, 24], "average\ub97c": 24, "\uba54\ud2b8\ub9ad\uc5d0": 24, "\uc815\ub9ac\ud574\uc8fc\ub294": 24, "\uc808\uc785\ub2c8\ub2e4": 24, "step\uc740": [24, 27, 39], "model\ub97c": [24, 28], "\ub0b4\ubd80": 24, "\uc14b\uc73c\ub85c": 24, "\ub098\uc640\uc788\ub294": 24, "\ubd84\ud3ec\uc5d0": [24, 28, 42], "600": 24, "\uc0ac\uc774\uc988\ub85c": 24, "2048\ub85c": 24, "\ud559\uc2b5\uc2dc\ucf30\uace0": 24, "\ub9c8\uce68\ub0b4": 24, "offset": 24, "\uc218\uc900\uacfc": 24, "\uc601\uc5ed\uc758": 24, "\ube44\uc728\ub85c": 24, "\uacbd\ud5d8\uc801\uc73c\ub85c": 24, "6\ucc98\ub7fc": 24, "\ucc3e\uc558\ub2e4": 24, "\uadf8\ub9bc\uc774": [24, 27], "stage\ub97c": 24, "\ud2b9\ud654\ub41c": [14, 24], "ldm\uc744": [24, 28, 39], "sdedit\uc5d0\uc11c": 24, "ediff": 24, "\ub530\ub790\uc73c\uba70": 24, "\uc2a4\ucf00\uc77c\uc5d0": 24, "inference\uc5d0\uc11c": 24, "diffuse\uc640": 24, "denoise\ub97c": 24, "\ub123\uc5c8\ub2e4": 24, "\uc2a4\ud15d\uc740": 24, "\uc120\ud0dd\uc774\uc9c0\ub9cc": 24, "\ub514\ud14c\uc77c\uc5d0\uc11c": 24, "your": [25, 29], "One": [25, 28, 31], "03231": 25, "sty": 25, "lize": 25, "ne": 25, "\ud55c\uc7a5\uc758": 25, "\uc785\ud788\uace0\uc790\ud558\ub294": 25, "\uc9c4\ud589\uc911\uc774\ub2e4": 25, "\uc774\uc804\uae4c\uc9c0\uc758": 25, "\uc5f0\uad6c\ub4e4\uc740": 25, "\ud55c\uc7a5\uc529\uc744": 25, "\uc2dd\uc774": 25, "\uc774\ub8e8\uc5c8\ub2e4": 25, "\ubc29\uc2dd\uc5d0\ub294": 25, "face\ub97c": 25, "\uc758\uc874\ub3c4\uac00": 25, "\uc785\ud788\uae30": 25, "\ud798\ub4e4\ub2e4": [25, 39], "space\uc548\uc5d0\uc11c": 25, "\uc815\ubcf4\uc640": 25, "entangl": [25, 26, 35], "\ub418\uc5b4\uc788\ub2e4": 25, "styo\ub294": 25, "\ud3ec\uc6a9\ud558\ub294": 25, "base\ubaa8\ub378\ub85c": 25, "\ucc44\uc6a9\ud55c\ub2e4": 25, "stage\ub85c": 25, "\uad6c\uc131\ub418\ub294\ub370": 25, "disentangl": 25, "learner": 25, "idl": 25, "\ubd84\ub9ac": [14, 25], "fcc": 25, "idl\ub85c\ubd80\ud130": 25, "\ubd84\ub9ac\ub41c": 25, "content\uc640": 25, "\uc6d0\ud558\ub294\ub300\ub85c": 25, "\uc7ac\uc870\ud569": 25, "detail\ud55c": 25, "\uc720\uc9c0\ud558\uae30\uc704\ud574": 25, "\uc7ac\uc0ac\uc6a9\ud558\ub294": 25, "gan\uc774": [25, 28, 36], "\ubd84\uc57c\ub97c": 25, "\uc7a5\uc545\ud558\ub358": 25, "\ub4f1\uc7a5\uc73c\ub85c": [25, 27], "\uc8fc\ubaa9\uc744": [25, 37], "\uc2dc\uc791\ud588\ub2e4": 25, "\uac00\ub2a5\ud574\uc84c\uc9c0\ub9cc": 25, "\ubd80\ubd84\uae4c\uc9c0": 25, "control\ud558\uae30\uc5d0\ub294": 25, "fine\ud55c": 25, "\uc815\ubcf4\uae4c\uc9c0": 25, "model\uc774\ub2e4": 25, "\ubcf4\uc774\uba74\uc11c": 25, "stylegan\uc744": 25, "\uc758\uc874\uc131\uc774": 25, "\ucee4": 25, "artist": [25, 29], "\uc785\ud788\ub294\ub370": 25, "\uac1c\uc120\ud55c": 25, "transfer\ub97c": 25, "disentagl": 25, "\ubd84\ub9ac\ud558\ub294": 25, "\ubc18\ub300": 25, "a\uc758": [25, 26], "conext": 25, "\ubc30\uc81c\ud568\uacfc": 25, "\ud3ec\ud568\ud558\uae30\uc704\ud574": 25, "\uc55e\uc5d0": [25, 32, 34], "negat": 25, "\ubd80\uc815\uc758": 25, "except": 25, "auxiliari": [25, 37], "\uc14b\uc744": [25, 28, 29], "\uad6c\uc131\ud574": [25, 29], "ffhq": [25, 26], "\uc784\uc758\ub85c": 25, "prompt\uac04": 25, "disentanglement\ub97c": 25, "\uc774\ubbf8\uc9c0\uc5d0\ub294": 25, "\uc774\ubbf8\uc9c0\ub9cc\uc758": 25, "style\uacfc": [25, 26], "\uad6c\ubcc4\ud558\ub294\ub370": 25, "\ub3c4\uc6c0\uc744": 25, "\uc90c": 25, "idl\uc758": 25, "\ud559\uc2b5\ub9cc\uc73c\ub85c": 25, "transfer\uac00": 25, "\uc774\ubbf8\uc9c0\ucc98\ub7fc": 25, "\uac1c\uc120\ud558\uae30\uc704\ud574": 25, "\ub3c4\uc785\ud558\uc600\ub2e4": 25, "idl\ub85c": 25, "\uc870\ud569": 25, "recombin": 25, "\uc720\uc9c0\ud558\ub3c4\ub85d": 25, "ldm\uc740": [25, 28, 29], "\uc8fc\uc785\ud558\uae30\uc704\ud574": 25, "mechanism\uc744": 25, "promt": 25, "paper\uc5d0\uc11c": 25, "m\uc758": 25, "layout\uc5d0": 25, "\ubbf8\uce5c\ub2e4": 25, "\uc8fc\uc785\ud569\uc73c\ub85c\uc368": 25, "\uc720\ub3c4": [25, 34], "replace\ud558\uc9c0\uc54a\uace0": 25, "index\ub9cc": 25, "\uc120\ud0dd\uc801\uc73c\ub85c": 25, "replac": 25, "index": [25, 28], "time\uc5d0\uc11c": 25, "n\ubc88": 25, "\uc0ac\uc6a9\ud568\uc73c\ub85c\uc11c": 25, "n_": 25, "\uc2e4\ud5d8\uc0c1": 25, "\uc774\ud558\uc758": [25, 35], "\ucd94\ucc9c": 25, "ak47": 25, "m4a1": 25, "adam": [25, 27, 32, 41], "400": 25, "ldm\uacfc": 25, "styo\uac00": 25, "\uc720\uc9c0\ud568\uacfc": 25, "\uacb0\uacfc\ubb3c\uc744": 25, "\uc0dd\uc131\ud574\ub0b8\ub2e4": [25, 28], "study\ub3c4": 25, "\ubaa8\ub378\ub4e4\uc5d0": [25, 27], "templat": 25, "\ub123\uace0": 25, "\ud559\uc2b5\ud560\uacbd\uc6b0": 25, "overfitting\uc774": 25, "\uc2ec\ud558\uace0": 25, "\ubd84\ub9ac\uc5d0": 25, "set\uc758": 25, "trick\ub3c4": 25, "\uc801\uc6a9\ud558\ub294\uac83\uc774": 25, "\uc0dd\uc131\ud574\ub0c8\ub2e4": 25, "inference\ud560": 25, "fcc\ub97c": 25, "\ud3ec\ud568\ud560": 25, "\ub192\uc544\uc838": 25, "significant\ud55c": 25, "\uc0dd\uc131\ub418\ub294\uac83\uc744": 25, "photorealistic\uc5d0\uc11c": 25, "artistic\ud558\uac8c": 25, "\ubc14\ub00c\uace0": 25, "\ub9c8\ucc2c\uac00\uc9c0\ub85c": [14, 25, 27, 28, 39], "idl\uacfc": 25, "\ubaa8\ub378\ub4e4\ubcf4\ub2e4": [25, 41], "\uc0dd\uc131\ud574\ub0bc": 25, "10\ubd84\uc774": 25, "\uac78\ub9ac\ubbc0\ub85c": 25, "efficiency\uac00": 25, "\ubabb\ud558\ub2e4\ub294": 25, "2019": 26, "1812": 26, "04948": 26, "huangzh13": 26, "stylegan\uc785\ub2c8\ub2e4": 26, "gan\uacfc": 26, "\ubcc0\uacbd\ud568\uc73c\ub85c\uc368": 26, "\uc62c\ub9ac\uace0": 26, "feature\uc758": [14, 26], "loss\ub098": 26, "\uac1c\uc120\uc5d0": 26, "\ubcf4\ub3c4\ub85d": 26, "\ud558\uc8e0": 26, "\uc81c\uc548\ud558\uc5ec": 26, "\ub192\uc774\uba74\uc11c": 26, "\uac00\ub2a5\ud574\uc84c\uc2b5\ub2c8\ub2e4": 26, "\uc911\uc5d0\uc11c": [26, 33], "contribution\uc744": [26, 34], "abstract\uc5d0\ub294": 26, "\ubb38\uc7a5\uc774": 26, "lead": 26, "automat": [26, 38], "unsupervis": [26, 32], "freckl": 26, "enabl": [26, 28], "\uad6c\uc870\uac00": 26, "\uc77c\uc744": 26, "\uc124\uba85\ud558\ub294": [26, 27, 28, 32], "\ubcf4\uc2dc\uba74": 26, "attribute\uc758": 26, "separation\uc774": 26, "\uc598\uae30\ud558\uace0": 26, "stylegan\uc758": 26, "\ud2b9\uc9d5\uc774\ub77c\uace0": 26, "\ubaa9\uc801\uc744": 26, "\uc790\uc2e0\uc774": 26, "\ub9cc\ub4e4\uace0\uc790": 26, "\uc88b\ub354\ub77c\ub3c4": 26, "\uc0ac\uc6a9\uc790\uc758": 26, "\uc758\ub3c4\uc640": 26, "\uc0c1\uad00\uc5c6\ub294": 26, "\ub79c\ub364\ud55c": [14, 26, 27, 29, 42], "\ub0b4\ubc49\uc5b4\uc900\ub2e4\uba74": 26, "\uc2e4\uc6a9\uc131\uc774": 26, "\uc88b\ub2e4\uace0": [26, 27, 31, 40, 41], "\uc5c6\uc744": [26, 37, 38], "\uadfc\ub798\uc5d0": 26, "\uc778\uae30\ub97c": 26, "\uc5bb\uc5c8\ub358": 26, "\uc774\uc720\ub3c4": 26, "\ub204\uad6c\ub098": 26, "\uc810\ub3c4": 26, "\ud55c\ubaab\ud588\ub2e4\uace0": 26, "stylegan\uc740": 26, "\ubaa8\ub378\uc774\ub77c\ub294": 26, "\uc758\ubbf8\uc788\ub2e4\uace0": 26, "network\ub294": 26, "4x4\uc5d0\uc11c": 26, "1024x1024\uae4c\uc9c0": 26, "\ub192\uc5ec\uc90d\ub2c8\ub2e4": 26, "gan\ud558\uace0": 26, "\ud2b9\uc774\ud55c": 26, "z\ub97c": 26, "noise\uc640": 26, "\uc0dd\uac01\ud574\ubcf4\uba74": 26, "\uac70\uccd0\uc11c": 26, "\uad6c\uc870\uc785\ub2c8\ub2e4": 26, "z\ub294": 26, "distribution\uc5d0\uc11c": [26, 34], "\uc0d8\ud50c\ub9c1\uc73c\ub85c": 26, "\uc5bb\uc2b5\ub2c8\ub2e4": 26, "distribution\uc73c\ub85c": 26, "\ubcf4\ub0b4\ub294": 26, "\ubc30\uc6b0\uac8c": 26, "\uac83\uc774\uace0": 26, "\ubd84\ud3ec\ub294": 26, "\uc0dd\uae30\uac8c": 26, "\uc8fc\uc5b4\uc838\uc11c": 26, "\uc801\uc744": 26, "\ud53c\ubd80\uac00": 26, "\ud76c\uba74\uc11c": 26, "\uc0d8\ud50c\ub4e4\uc774": 26, "\ud574\ubd05\uc2dc\ub2e4": 26, "\ud53c\ubd80\uc0c9\uacfc": 26, "\uba38\ub9ac": 26, "\uae38\uc774\ub77c\ub294": 26, "\uc5bd\ud788\uac8c": 26, "\ud558\ub098\ub97c": [26, 37], "\ubc14\uafc0": 26, "\ud558\ub098\ub3c4": [26, 28], "\uc77c\uc5b4\ub098\uac8c": 26, "\uc644\ud654\ud558\uae30": [14, 26], "gaussian\uc5d0\uc11c": 26, "w\ub97c": 26, "\uc0ac\uc6a9\ud569\ub2c8\ub2e4": [26, 32, 35, 40, 42], "instanc": [26, 32, 35], "normalization\uc740": 26, "\ucc44\ub110\ub9c8\ub2e4": 26, "\ucde8\ud574\uc8fc\ub294": 26, "normalization\uc5d0": 26, "scale\uc744": [26, 34], "\uacf1\ud574\uc8fc\uace0": 26, "\ub354\ud574\uc8fc\ub294": 26, "transformation\uc73c\ub85c": 26, "\uc8fc\uc5b4\uc9c0\ub294": 26, "w\ub294": 26, "\ubcf4\ub0b4\uc9c0\uac8c": 26, "adain\uc758": 26, "\uc218\uc2dd\uc740": [26, 40], "adain\uc740": 26, "\ube14\ub85d\ub9c8\ub2e4": 26, "\uac1c\uc529": 26, "style\uc740": 26, "\uc5f4\uc5ec\ub35f": 26, "adain\uc744": 26, "generator\uc5d0": [26, 28], "localization\uc774\ub77c\ub294": 26, "\ud2b9\uc9d5\uacfc\ub3c4": 26, "\ub9d0\ud558\ub294": 26, "localization\uc774\ub780": 26, "\uc77c\ubd80\ub97c": 26, "\ubc14\uafc8\uc73c\ub85c\uc368": 26, "\ud2b9\uc9d5\ub4e4\uc744": 26, "\uc758\ubbf8\uc785\ub2c8\ub2e4": 26, "map\ub4e4\uc740": 26, "normalization\ub418\uace0": 26, "style\uc5d0": 26, "statistics\ub97c": 26, "\uac00\uc9c0\uac8c": [14, 26], "convolution\uc5d0": 26, "\uc801\uc6a9\ub418\uace0": 26, "convolution\uc5d0\uc11c": 26, "normalization\uc774": 26, "\uc218\ud589\ub418\uae30": 26, "style\uc774": 26, "\ubd84\ub9ac\ub418\uac8c": 26, "\ud559\uc2b5\ub420": [26, 27], "stylemod": 26, "latent_s": [26, 30], "use_wscal": 26, "lin": 26, "equalizedlinear": 26, "gain": 26, "n_channel": 26, "view": [26, 30, 35, 36, 42], "layerepilogu": 26, "thing": 26, "dlatent_s": 26, "use_nois": 26, "use_pixel_norm": 26, "use_instance_norm": 26, "use_styl": 26, "activation_lay": 26, "noiselay": 26, "activ": 26, "pixel_norm": 26, "pixelnormlay": 26, "instance_norm": 26, "instancenorm2d": 26, "top_epi": 26, "ordereddict": 26, "style_mod": 26, "dlatents_in_slic": 26, "b\uc758": 26, "style\ub85c": 26, "\ubcc0\uacbd\ud574\uc11c": 26, "\uc774\ubbf8\uc9c0\ub4e4\uc785\ub2c8\ub2e4": [26, 40], "18\uacf3\uc5d0\uc11c": 26, "\uc0ac\uc6a9\ub418\ub294\ub370": 26, "4\uacf3": 26, "coars": 26, "\uadf8\ub2e4\uc74c": 26, "10\uacf3": 26, "\uc815\uc758\ud558\uc600\uc2b5\ub2c8\ub2e4": [26, 31], "\uc717": [26, 32], "\ubd80\ubd84\uc5d0\uc11c\ub294": 26, "\ud3ec\uc988\ub098": 26, "\uc2a4\ud0c0\uc77c\uac19\uc774": 26, "\uac08\uc218\ub85d": 26, "\ud2c0\uc744": 26, "\ubd80\ubd84\ub4e4\uc744": 26, "b\uc5d0\uc11c": [26, 37], "\uac00\uc838\uc654\uc74c\uc744": 26, "\uc548\uc5d0\ub294": 26, "\ubc14\ub014": 26, "\uc8fc\uadfc\uae68": 26, "\uba38\ub9bf\uacb0": 26, "\ud53c\ubd80": 26, "\ubaa8\ub378\ub9c1\ud558\uae30": 26, "\ub354\ud574\uc9d1\ub2c8\ub2e4": 26, "\uc548\uc5d0\uc11c\ub3c4": 26, "\ub514\ud14c\uc77c\ub4e4\uc740": 26, "deviation\uc744": 26, "\uad6c\ud574\ubd24\uc744": 26, "\uc5bc\uad74\ud615\uacfc": 26, "attribute\ub294": 26, "\ubcc0\ud558\uc9c0\uc54a\uc9c0\ub9cc": 26, "noise\uc5d0": 26, "\uc758\ud574\uc11c": 26, "\uba38\ub9ac\uce74\ub77d\uacfc": 26, "\uc0dd\uae40\uc744": 26, "\uc8fc\uc9c0": 26, "\uc5d0\ub9cc": [26, 41], "\uba38\ub9ac\uce74\ub77d\uac19\uc740": 26, "\ub514\ud14c\uc77c\uc774": 26, "\uc81c\ub300\ub85c": 26, "\uc0b4\uc544\uc788\uc9c0": 26, "layers\uc5d0": 26, "\ub4e4\uc5b4\uac04": 26, "\uba38\ub9ac\uce74\ub77d\uc758": 26, "\uc138\ubc00\ud55c": [14, 26, 41], "\ub07c\uce5c\ub2e4\ub294": 26, "localization\uc774": 26, "\ub418\uac8c\ud558\uae30": 26, "mixing\uc774\ub77c\ub294": 26, "\uc55e": 26, "\ucabd": 26, "layer\uc5d0\ub294": 26, "\ub4a4": [26, 32], "generator\uac00": 26, "\uc778\uc811\ud55c": [26, 31], "style\ub07c\ub9ac": 26, "correlated\ub418\uc5b4\uc788\ub2e4\uace0": 26, "\ub9c9\uc544\uc11c": 26, "localization\uc744": 26, "\ub418\uac8c": 26, "\ubaa9\uc801\uc785\ub2c8\ub2e4": [26, 42], "\uc800\uc790\ub4e4\uc774": [26, 27, 37], "\uc788\uc5c8\ub294\uc9c0": 26, "\ud655\uc778\ud574\ubd05\uc2dc\ub2e4": 26, "\ud45c\uc640": 26, "\ubc29\ubc95\ub4e4\uc744": [26, 40], "fid\uac00": [26, 27, 34], "2304": [14, 27, 29], "08466": 27, "\uc774\ubc88\uc5d0": 27, "\ub9ac\ubdf0\ud560": 27, "\uad6c\uae00": [27, 37], "\ub9ac\uc11c\uce58": 27, "\uadf8\ub8f9\uc5d0\uc11c": 27, "tmlr": 27, "transact": 27, "2023\uc5d0": 27, "\uc81c\ucd9c\ud55c": 27, "\ub17c\ubb38\uc778": 27, "\uc18d\ub3c4\ub85c": 27, "\ubc1c\uc804\ud558\uace0": 27, "\uc788\ub294\ub370\uc694": [27, 41], "\uc218\uc900\uc774": 27, "\uc5bc\ub9cc\ud07c": 27, "\uc654\ub294\uc9c0": 27, "\ub370\uc774\ud130\uc778": 27, "\uc815\ub3c4\uac00": 27, "\ub418\uc5c8\ub294\uc9c0": 27, "augment\ub41c": 27, "\uc815\ub3c4\uae4c\uc9c0": 27, "\uc654\ub294\uc9c0\uc5d0": 27, "\uc2e4\ud5d8\uacfc": 27, "\ub2f5\uc744": 27, "\uc81c\uc2dc\ud569\ub2c8\ub2e4": [27, 32, 38, 40], "\uae00\uc758": 27, "\ubaa9\ucc28\ub294": 27, "\ub0b4\uc6a9\uacfc": [27, 39], "\uad6c\uc131\ud558\uc600\uc2b5\ub2c8\ub2e4": 27, "task\uc5d0\uc11c": [27, 39], "augmentation\uc73c\ub85c": 27, "imagenet\uc5d0": 27, "tuning\ub41c": 27, "\uc0ac\uc6a9\ud568": [27, 28, 33, 37], "\uc0ac\uc6a9\ud558\uc600\uc744": 27, "\uae30\uc220\uc801\uc73c\ub85c": 27, "\uc5c4\uccad": 27, "\ub0b4\uc6a9\uc740": 27, "\uc5c6\ub294\ub370\uc694": 27, "\uc0ac\uc6a9\ud558\ub358": 27, "\ubc29\ubc95\ub4e4\uacfc\ub294": 27, "imagen\uc744": 27, "\ud588\ub2e4\ub294": 27, "\uc0c8\ub86d\uc2b5\ub2c8\ub2e4": 27, "\ubc1c\uc804\ub418\uc5c8\uc2b5\ub2c8\ub2e4": 27, "\uc790\uc5f0\uc2a4\ub7ec\uc6b4": 27, "\uc9c8\ubb38\uc774": 27, "\ub2f9\uc5f0\ud558\uace0": 27, "\ucc3e\uace0\uc790": 27, "\uc9c8\ubb38\uc5d0": 27, "\uc774\uc57c\uae30": 27, "imagen\uc774": [27, 37], "ca": [27, 40], "\ub370\uc774\ud130\uc640": [27, 35, 36, 42], "\uacb0\ud569\ud558\uc5ec": [14, 27, 32, 39], "\uc2dc\uac04\uc774": [14, 27, 34], "\uae38\uc218\ub85d": 27, "\ud5a5\uc0c1\ub418\uc5c8\ub2e4": 27, "\ub370\uc774\ud130\ub85c\ub9cc": 27, "\uc9c4\uc9dc": [27, 32], "\uc815\ud655\ub3c4\uc640": 27, "\uc801\ub2e4\ub294": 27, "\ub354\ud574\uc11c": 27, "\ud559\uc2b5\ud588\uc744": 27, "\ubaa8\ub378\ub4e4\uc5d0\uc11c": 27, "\ud5a5\uc0c1\uc774": 27, "augmentation\uc744": 27, "\ud558\ub824\uace0": 27, "\ud588\ub358": 27, "\ubc29\ubc95\ub4e4\uc5d0": 27, "\uc9e7\uac8c": 27, "\ud590\ub824\uace0": 27, "\ucd5c\uadfc\uc5d0\ub294": 27, "\ubcf4\uac15\ud558\ub294\ub370": 27, "\uc0ac\uc6a9\ub418\uae30": 27, "\uc2dc\uc791\ud588\uc2b5\ub2c8\ub2e4": 27, "\uc608\ub85c": 27, "Is": 27, "readi": 27, "\ub17c\ubb38\uc774": 27, "glide\ub85c": 27, "shot\uacfc": 27, "few": [27, 33, 39], "\uc2dc\ucf30\uc73c\uba70": 27, "glide\ub97c": 27, "\uc138\ud2b8\uac00": [27, 32], "100\uc758": 27, "\uc2dc\ucf30\ub2e4\uace0": 27, "\ud3ec\ud568\ud574\uc11c": 27, "\ub17c\ubb38\ub4e4\uc740": 27, "\uc774\uc6a9\ud574\uc11c": [14, 27, 28], "\ud558\uc5ec\ub3c4": 27, "\uc2dc\ud0a4\uc9c0": 27, "\ubabb\ud588\uc2b5\ub2c8\ub2e4": 27, "\uc54a\uc558\uc2b5\ub2c8\ub2e4": [27, 31], "\ub17c\ubb38\ub4e4\uacfc\ub294": 27, "\ub3d9\uc791\ud558\uace0": 27, "\uc6cc\ub099": 27, "\uc4f0\uc5ec\uc11c": 27, "\uc124\uba85\uc740": [27, 32], "\uc0dd\ub7b5\ud558\uace0": 27, "cas\uc5d0": 27, "\uc368\uc838": 27, "\ub0b4\uc6a9\uc73c\ub85c": 27, "\uc18c\uac1c\ud558\uaca0\uc2b5\ub2c8\ub2e4": 27, "cas\ub294": 27, "\ub9cc\ub4e4\uc5b4\ub0b8": 27, "\uc9c0\ud45c\uc785\ub2c8\ub2e4": 27, "\ub85c\ub9cc": 27, "\ub9cc\ub4e4\uc5b4\ub0c5\ub2c8\ub2e4": 27, "\ub370\uc774\ud130\ub9cc\uc744": 27, "50\uc744": 27, "\uc2dc\ud0a4\uace0": 27, "cas\uac00": 27, "imagenet\uacfc": 27, "\ube44\uc2b7\ud558\ub2e4\uba74": 27, "\ubcf4\uc77c": [14, 27], "\uac00\uc815\uc744": [27, 34, 40, 42], "\uc774\ud574\ud558\uba74": 27, "\uc800\uc790\uc5d0": 27, "\uc758\ud558\uba74": 27, "\uadf8\ub3d9\uc548": 27, "\uc54a\uc558\ub2e4\uace0": 27, "\uc0d8\ud50c\ub85c\ub9cc": 27, "\ub5a8\uc5b4\uc84c\uace0": 27, "\ub2f9\uc5f0\ud574\ubcf4\uc785\ub2c8\ub2e4": 27, "\ub5a8\uc5b4\uc84c\ub2e4\uace0": 27, "\uc544\ub9c8\ub3c4": 27, "\ud558\uc600\ub294\uc9c0\uc5d0": 27, "\ubaa8\ub378\ub85c\ub294": [27, 36], "\uc0ac\uc6a9\ud558\uc600\uc2b5\ub2c8\ub2e4": [27, 31], "\ud074\ub798\uc2a4\uc640": 27, "\uc9c0\uc5d0": 27, "\uace0\ubbfc\uc774": 27, "\ud544\uc694\ud588\ub2e4\uace0": 27, "\ud558\uc600\ub294\ub370": 27, "imagen\uc5d0\uc11c": 27, "\ub2e4\uc591\uc131\uc774": [27, 29, 39], "\uc800\ud558": 27, "\ub418\uba74\uc11c": 27, "\ud604\uc0c1\uc77c": 27, "\ub450\ub2e8\uc5b4": 27, "\uc774\ub984\uc73c\ub85c": 27, "\uc218\uc815\ud558\uace0": [14, 27], "\uc774\ubbf8\uc9c0\uace0": 27, "\uc624\ub978\ucabd\uc774": 27, "\uc801\uc6a9\ub418\uc9c0": [27, 42], "imagen\uc785\ub2c8\ub2e4": 27, "\uc544\ub798\uc5d0\uc11c": [27, 32], "\ud074\ub798\uc2a4\uc778": 27, "schipperke\ub97c": 27, "\uc2a4\ud0a4\ud37c\ud0a4\ub77c\ub294": 27, "\uac1c": [27, 29, 30, 32], "\ud488\uc885\uc744": 27, "\uc758\ubbf8\ud558\ub294\ub370": 27, "\uacbd\uc6b0\ub294": [27, 32], "\uaf43\uacfc": 27, "\uc804\ud600": [27, 32], "\uc5c9\ub6b1\ud55c": 27, "\ud588\ub294\uc9c0\ub97c": 27, "\uc6d0\uc73c\ub85c": 27, "\uc6d0\ub798": [14, 27, 32, 34], "imagen\uc5d0\uc11c\ub3c4": 27, "\ubd80\ubd84\uc774\ub77c": 27, "\uc54a\uc558\uace0": 27, "\ucd9c\ub825\uc73c\ub85c": 27, "\uace0\ud574\uc0c1\ub3c4\uc758": [27, 29, 39], "\uc801\uc5b4\uc11c": 27, "210k": 27, "\ud559\uc2b5\ud558\uc600\uace0": 27, "optimizer\uc758": 27, "\uc0ac\uc6a9\ud558\uc600\ub358": 27, "optimizer\ub97c": 27, "490k": 27, "\ucd5c\uc801\uc758": [27, 39], "\uc120\ud0dd\uc758": 27, "sampler\uc640": 27, "1k": 27, "10k\uac1c\uc758": 27, "\uc0d8\ud50c\ub4e4\uc5d0": 27, "\uacc4\uc0b0\ud588\uc744": 27, "\uc120\ud0dd\ud588\ub2e4\uace0": 27, "\uc815\ud588\ub294\uc9c0\ub97c": 27, "\uc0d8\ud50c\ub9c1\uc758": 27, "\uc18d\ub3c4\ub294": [14, 27], "\uc2a4\ud15d": 27, "free": [27, 29, 31, 38, 39, 41], "coeffici": [27, 31], "\ub4f1\uc5d0": 27, "\ubc1b\ub294\ub2e4\uace0": 27, "\uac04\ub2e8\ud558\uac8c": [27, 32, 39], "\uc124\uba85\ud558\uba74": 27, "\ud655\ub960\uc801\uc778": 27, "\ub3c4\uc785\ud558\uc5ec": [14, 27], "\uacf5\uac04\uc758": 27, "\ubcf4\uc774\uac8c": 27, "\ub9cc\ub4e4\uba70": 27, "\ucc38\uace0\ud574\uc8fc\uc138\uc694": 27, "\ubd84\ub958\uae30\ub098": 27, "\uc678\ubd80": 27, "\ubc18\uc601\ud560\uc9c0\ub97c": 27, "\uc758\ubbf8\ud560": 27, "\uc870\uc808\ud558\uc5ec": 27, "\ud2b9\uc131\uc774\ub098": 27, "\uacc4\uc218\ub97c": 27, "\uc870\uc808\ud568\uc73c\ub85c\uc368": 27, "\ub85c\uadf8": 27, "\uacc4\uc218\ub294": 27, "\uc0ac\uc6a9\ub418\uba70": 27, "\uc758\ubbf8\ud558\uace0": 27, "\uc758\ubbf8\ud568": 27, "\uc0dd\uc131\uc758": 27, "\uc124\uc815\ubc95\uc5d0": 27, "\uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4": [27, 34], "\uc804\ubc18\uc801\uc778": [14, 27, 28, 35], "\ud2b9\uc9d5\uacfc": 27, "\ub2e4\uc591\uc131\uc758": 27, "1\ucc28": 27, "sweep\uc73c\ub85c": 27, "\uc0d8\ud50c\ub7ec\ub97c": 27, "50k\uc5d0": 27, "\ud558\uc774\ud37c\ud30c\ub77c\ubbf8\ud130\ub97c": 27, "\ucc3e\uc2b5\ub2c8\ub2e4": 27, "sweep\uc758": 27, "\ud558\uc774\ud37c\ud30c\ub77c\ubbf8\ud130\uc758": 27, "\ubc94\uc704\ub294": 27, "75": 27, "sweep": 27, "fid\ub294": 27, "variance\ub294": 27, "1000\uc774\uc5c8\uc744": 27, "\ub54c\ub77c\uace0": 27, "sweep\uc774": 27, "\ub05d\ub09c": 27, "\ud6c4\uc5d0\ub294": 27, "weight\uc5d0": 27, "sweep\uc744": 27, "\ub54c\uc5d0\ub294": [27, 33], "2m": 27, "guidacn": 27, "cas\ub97c": 27, "\uce21\uc815\ud588\ub2e4\uace0": 27, "\ud558\uc774\ud37c\ud30c\ub77c\ubbf8\ud130\uc5d0": 27, "sweep\uc5d0": 27, "\uacb0\uacfc\uace0": 27, "\uac00\uc6b4\ub370\uc640": 27, "2\ucc28": 27, "\ub098\ud0c0\ub0b8": 27, "\uc120\ud0dd\ud558\ub294": [27, 33], "range\ub294": 27, "denos": 27, "129": 27, "\uadf8\ub798\ud504\ub294": 27, "\ubcc0\uacbd\ud588\uc744": 27, "cas\uc758": 27, "\uadf8\ub798\ud504\ub97c": [27, 39], "\uadf8\ub798\ud504\uc785\ub2c8\ub2e4": 27, "logvar": [27, 42], "coeff\uac00": 27, "3\uc77c": 27, "\ubcf4\uc600\uc73c\uba70": 27, "\ubcf4\uc778": [27, 33], "\ubd84\uc11d\ud574\ubcf4\uc790\uba74": 27, "weight\uac00": 27, "\ub192\uc544\uc9c0\uc9c0\ub9cc": 27, "score\uc5d0\ub294": 27, "\ubd80\uc815\uc801\uc778": 27, "\uc8fc\uba70": [27, 37], "augmentation\uc774": 27, "0\uc77c": 27, "\ud558\uc774\ud37c\ud30c\ub77c\ubbf8\ud130": 27, "\uc124\uc815\ud55c": 27, "\uac19\ub2e4\uace0": 27, "\ubca0\uc774\uc2a4": 27, "\ud569\uc131\uc740": 27, "\ud504\ub85c\ud1a0\ucf5c\uc744": 27, "\ub530\ub790\ub294\uc9c0\uc5d0": 27, "balance\ub97c": 27, "\uc720\uc9c0\ud558\uba70": 27, "\ud569\uc131\ud588\uc73c\uba70": 27, "\ud569\uc131\ub41c": 27, "\uaddc\ubaa8\ub294": 27, "1\ubc30\uc778": 27, "10\ubc30\uc778": 27, "12m": [27, 39], "\ubc94\uc704\ub97c": 27, "\ud569\uc131\ud588\ub2e4\uace0": 27, "\uc9c0\ud45c\uc778": 27, "is\uc758": 27, "\uad00\uc810\uc73c\ub85c": 27, "\ubd05\ub2c8\ub2e4": 27, "\ud45c\uc5d0\uc11c": 27, "\ud29c\ub2dd\ub41c": 27, "\ubca0\uc774\uc2a4\ubaa8\ub378\ub4e4": 27, "resolution\uacfc": 27, "\ud574\ub2f9\ub418\uc5c8\uc2b5\ub2c8\ub2e4": 27, "\ud655\uc778\ud558\ub294": 27, "5\uc5d0\uc11c": [27, 28], "\uc131\ub2a5\uc774\uace0": 27, "\ube68\uac04\uc0c9": 27, "\uc131\ub2a5\uc785\ub2c8\ub2e4": 27, "\ubca0\uc774\uc2a4\ub77c\uc778": 27, "cdm": 27, "\uadf8\ub9bc\uc774\uba70": 27, "\uac00\uc6b4\ub370\ub294": 27, "\uc624\ub978\ucabd\uc740": 27, "\ubd80\ubd84\ubcf4\ub2e4": 27, "\uc704\ucabd\uc5d0": 27, "\uc704\uce58\ud558\uba74": 27, "\ud574\uc11d\ud560": [27, 40], "\ubca0\uc774\uc2a4\ub77c\uc778\ubcf4\ub2e4": 27, "\ubcf4\uc778\ub2e4\ub294": 27, "2\uc5d0\uc11c\ub3c4": 27, "\uc8fc\ubaa9\ud560": 27, "\ub9cc\ud55c": [27, 30], "resnet50\uc774": 27, "\ub2e4\uc6b4\uc0d8\ud50c\ub9c1": 27, "\ud568\uc5d0\ub3c4": 27, "\uc88b\ub2e4\ub294": [27, 38], "our": [14, 27, 28, 33, 43], "resolution\ubcf4\ub2e4": 27, "resolution\uc758": 27, "\uc6d4\ub4f1\ud788": [27, 38], "\uc885\ub958\uc758": [14, 27], "\uc2dc\ucf30\uc744": 27, "cas\uc640": 27, "cas\uc5d0\uc11c\ub294": 27, "resnet50": 27, "\ud655\uc778\ud588\uc9c0\ub9cc": [27, 41], "\uc774\uc678\uc5d0": 27, "\ubaa8\ub378\ub85c\ub3c4": 27, "\ubcf8\ub2e4\ub294": 27, "\ucc28\uc774\uc810\uc774": [27, 32], "\uc0b4\ud3b4\ubcf8": 27, "\ub0ae\uc558\uc9c0\ub9cc": 27, "\ub370\uc774\ud130\ub9cc": 27, "onvnet\uae30\ubc18": 27, "\uc591\uc0c1\uc744": 27, "\ubcf4\uc600\uc2b5\ub2c8\ub2e4": 27, "\uaddc\ubaa8\uc5d0": 27, "50\uc758": 27, "\ubd84\uc11d\ud55c": 27, "\uc99d\uac00\ud568\uc5d0": 27, "8m": 27, "\ub54c\uae4c\uc9c0\ub294": 27, "\uc88b\uc558\uc73c\ub098": 27, "\ub418\uc5c8\uc744": 27, "\uc624\ud788\ub824": 27, "\ubcf4\uc790\uba74": 27, "sclae": 27, "\ub2ec\uc131\ud588\uc2b5\ub2c8\ub2e4": 27, "76": 27, "239": 27, "69": 27, "resnet\uacfc": 27, "accuracy\ub97c": 27, "\uc2dc\ucf30\uc2b5\ub2c8\ub2e4": 27, "\uc0dd\uac01\ud574\ubcfc\ub9cc\ud55c": 27, "\uac70\ub9ac\ub4e4\uc774": 27, "\uc788\uc5c8\ub294\ub370": 27, "\ud558\ub098\ub294": 27, "\uce21\uc815\ud560": 27, "256x256\ubcf4\ub2e4": 27, "\ub2e4\uc6b4\uc0d8\ud50c\ub9c1\uc744": 27, "\ud558\ub354\ub77c\ub3c4": 27, "resolution\uc774": [27, 39], "\ub2f4\ub294\ub2e4\ub294": 27, "\uac83\uc77c": 27, "\uc815\ud655\ub3c4\uac00": 27, "\uc99d\uac00\ud588\uc9c0\ub9cc": 27, "\ub370\uc774\ud130\uc5d0\uc11c\ub294": 27, "\uadf8\ub807\uc9c0": [27, 30], "\uc54a\uc558\ub358": 27, "\uace0\ud574\uc0c1\ub3c4\uc5d0": 27, "\uc815\uad50\ud55c": 27, "\ud544\uc694\ud560": [27, 32, 39], "\uc2dc\uc0ac\ud558\uace0": 27, "\ub9ac\ubdf0\ub97c": 27, "\ub9c8\uce58\uaca0\uc2b5\ub2c8\ub2e4": 27, "\ub290\ub080": 27, "\uc0b0\uc5c5\uc5d0\uc11c\ub294": 27, "shortage\ub098": 27, "imbal": 27, "\ubc1c\uc0dd\ud558\ub294\ub370": 27, "\ud574\uacb0\ubc95": 27, "\ud558\ub098\uac00": [27, 34], "\uac19\ub2e4\ub294": 27, "\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4": 27, "\ud30c\uc778\ud29c\ub2dd\uc774": [14, 27], "\ub418\uc9c0": [27, 29, 30, 32, 42], "\uc0b0\uc5c5\uc5d0\uc11c\ub9cc": 27, "\ud14d\uc2a4\ud2b8\uac00": 27, "\ud569\uc131\ud558\uace0\uc790": 27, "\ud30c\uc778\ud29c\ub2dd\uc744": [14, 27], "\ud574\uc57c\ud558\ub294": 27, "\uaf64\ub098": 27, "\ubd88\ud3b8\ud560": 27, "\uac19\uc544\uc11c": 27, "\uac16\ub294\uc9c0": 27, "\uc788\uc5c8\uc73c\uba74": 27, "\uc88b\uc558\uc744": 27, "\uac1c\uc778\uc801\uc778": 27, "\uc720\ucd94\ud574\ubcfc": 27, "\uc21c": 27, "\uc788\uc9c0\ub9cc\uc694": 27, "worth": 28, "2208": [28, 35], "01618": 28, "devocean": 28, "techboarddetail": 28, "id": 28, "164320": 28, "boardtyp": 28, "writer": 28, "searchdata": 28, "sam56903": 28, "subindex": 28, "idlist": 28, "pnwriterid": 28, "kwang": 28, "su": 28, "mun": [28, 32, 43], "5\uc7a5\uc73c\ub85c": 28, "\ucf58\uc149\ud2b8": 28, "\ubf51\uc544\ub0b4\ub294": 28, "\uc790\uc5f0\uc5b4\ub97c": 28, "creation\uc5d0": 28, "\uc804\ub840\uc5c6\ub294": 28, "\uc790\uc720\ub3c4\ub97c": 28, "contept\ub97c": 28, "\uadf8\uac83\uc758": 28, "\ubc14\uafb8\uac70\ub098": 28, "\uc5ed\ud560\uc774": 28, "\uc8fc\uc5b4\uc9c0\uac70\ub098": 28, "\ucc38\uc2e0\ud55c": 28, "\uc7a5\uba74\uc774": 28, "\uadf8\ub824\uc9c0\ub294\uac74": 28, "\ubd88\ubd84\uba85\ud558\ub2e4": 28, "\uc774\uac83\uc744": 28, "\uadf8\ub824\uc918": 28, "\uc774\uac83": 28, "\uac83\uc774\ub0d0\ub294": 28, "\ubb3c\uc74c\uc5d0\ub294": 28, "5\uac1c\ub9cc\uc73c\ub85c": 28, "\uc0ac\ubb3c\uc774\ub098": 28, "\uc790\uc5f0\uc5b4": 28, "\ubb38\uc7a5\uc5d0": [28, 32], "\ub179\uc544\ub4e4\uc5b4\uac00": 28, "\uc774\ub04c\uc5b4": 28, "\ub3c5\uc790\uc801\uc774\uba74\uc11c": 28, "\ucf58\uc149\ud2b8\ub97c": 28, "capture\ud558\uae30": 28, "\ucda9\ubd84\ud558\ub2e4\ub294": 28, "\uc54c\uac8c": 28, "\ub3c4\uc785\ud558\ub294": 28, "\uc77c\uc740": 28, "\uc77c\uc774\ub2e4": 28, "\ud655\uc7a5\ub41c": 28, "retraining\ud558\ub294": 28, "\uc5c4\uccad\ub098\uac8c": 28, "\ube44\uc6a9\uc774": [14, 28], "\ub4e4\uace0": [14, 28], "\uc608\uc81c\uc5d0": 28, "\uce58\uba85\uc801\uc778": [28, 31, 40], "\ub9dd\uac01\uc744": 28, "\ucd08\ub798\ud55c\ub2e4": 28, "figure\uc5d0\uc11c": 28, "\uc9c0\ub098\uba74\uc11c": 28, "508": 28, "701": 28, "set\uc73c\ub85c": [28, 33], "\ubcc0\ud658\ub418\uace0": 28, "\uc790\uccb4": 28, "\ubca1\ud130\ub294": 28, "\ub2e4\uc6b4\uc2a4\ud2b8\ub9bc": 28, "\uc81c\uacf5\ub428": 28, "concept\ub97c": 28, "word\uc778": 28, "\ub2e8\uc5b4\uc640": 28, "\ucc98\ub9ac\ub418\uba70": 28, "query\ub97c": 28, "\uad6c\uc131\ud558\ub294\ub370": 28, "query\ub294": 28, "\uc758\ub3c4\ud55c\ubc14\uc640": 28, "\uadf8\ub9bc\uc774\ub77c\uace0": 28, "\uc0dd\uc131\ubaa8\ub378": 28, "ldm\uc774": 28, "\uc4f0\uc784": 28, "untouched\ub418\uc5b4": 28, "\ub4e4\uc5b4\uac00\uc9c0": 28, "\uc54a\ub294\ub4ef\ud568": 28, "\uc190\uc2e4\ub418\ub294": [14, 28], "\uc774\ud574\ub3c4\ub098": 28, "generalization\uc744": 28, "\uc720\uc0ac\ub2e8\uc5b4": 28, "\ucc3e\uae30": 28, "inversion\uc2dc\ucf1c": 28, "\ud504\ub808\uc784\ud654": 28, "\uc8fc\uc5b4\uc9c4\ub2e4": 28, "\uc124\uc815\ud574": [28, 30], "\uc7ac\uad6c\uc131": 28, "concept\uc778": 28, "found": 28, "palavra": 28, "\ubcf5\uad6c": [28, 32], "segmentation\uc744": 28, "palavra\ub294": 28, "\uac1c\uccb4\ub97c": 28, "\ucc38\uc870\ud558\ub294": 28, "\uc2dd\ubcc4\ud568": 28, "\uac80\uc0c9\uc744": 28, "\uc124\uba85\ud558\uac70\ub098": 28, "\uc7a5\uba74\uc5d0\uc11c": 28, "\ubd84\ud560\ud558\uae30": 28, "\uc0ac\uc6a9\ub428": 28, "\ubcf4\ub4ef\uc774": 28, "\uadf8\ub7f4\ub4ef\ud55c": 28, "\ud569\uc131\uc5d0": [28, 37], "\ucea1\ucc98\ud558\uc9c0": 28, "goal": 28, "specifi": 28, "\uc758\uc5ed": 28, "\uc758\ub3c4\ud55c": 28, "\ub9de\ucd98": 28, "embedding\uc73c\ub85c": 28, "\uac00\uc774\ub4dc\ud574\uc11c": 28, "\uc131\uacfc\ubb3c\uc744": 28, "representation\uc73c\ub85c": 28, "\uc778\ucf54\ub529\ud558\ub294\ub370": 28, "representation\uc5d0": 28, "\ud6c4\ubcf4\uad70\uc744": 28, "\ucc3e\ub294\ub2e4": 28, "understanding\uc744": 28, "\uc0dd\uc131\uc790\uac00": 28, "\uadf8\ub9b0\ub2e4": 28, "inversion\uc5d0\uc11c": 28, "\ucd9c\ucc98": [28, 32], "hyoseok": 28, "entri": 28, "vector\ub85c\ubd80\ud130": 28, "\uc774\uc758": 28, "\uc5ed\uacfc\uc815\uc73c\ub85c\uc368": 28, "inverting\uc2dc\ucf1c": 28, "\uc54c\uc544\uac00\ub294": 28, "\uc0dd\uc131\ubaa8\ub378\ub85c\uc11c": 28, "\ub9d0\ud588\ub4ef\uc774": [28, 32], "\uac74\ub4e4\uc9c0": 28, "\ubb38\uc790\uc5f4\uc758": 28, "\ud558\uc704": [28, 39], "\ub2e8\uc5b4\ub294": 28, "\ud1b5\uacfc\ud558\uba70": 28, "dictionary\uc5d0\uc11c": 28, "\ubcc0\ud658\ud568": 28, "\uace0\uc720\ud55c": [14, 28], "\ubca1\ud130\uc5d0": 28, "\uc5f0\uacb0\ub428": 28, "index\uc5d0": 28, "encoder\uc778": 28, "c_\u03b8\uc758": 28, "\uc77c\ubd80\ub85c": 28, "target\uc73c\ub85c": 28, "\uc0bc\uc558\uc74c": 28, "\ub098\ud0c0\ub0b4\uae30": 28, "\uc790\ub9ac\ud45c\uc2dc\uc790": 28, "\ubb38\uc790\uc5f4\uc778": 28, "\uc9c0\uc815\ud568": 28, "palavra\ub97c": 28, "\ucd94\uc815\ud568": 28, "\uac1c\uc785\ud574\uc11c": 28, "tokenize\ub41c": 28, "\ubb38\uc790\uc5f4\uacfc": 28, "\ub300\uccb4\ud558\uc5ec": 28, "\ubcf8\uc9c8\uc801\uc73c\ub85c": 28, "\uc5b4\ud718": 28, "\uc8fc\uc785\ud568": 28, "5\uc7a5": 28, "\ud3ec\uc988\uc640": [14, 28], "\uc124\uc815\uc5d0": 28, "\ubb18\uc0ac\ud568": 28, "v\ub97c": 28, "\ucd5c\uc801\ud654\ud568": 28, "\uace0\uc815\ud558\uae30": 28, "\ud15c\ud50c\ub9bf\uc5d0\uc11c": 28, "\uc911\ub9bd": 28, "\ucee8\ud14d\uc2a4\ud2b8": 28, "\uc5ec\uae30\uc5d0\ub294": 28, "rendit": [28, 35], "\ud615\uc2dd": 28, "\ud504\ub86c\ud504\ud2b8\uac00": 28, "\ud3ec\ud568\ub41c\ub2e4": [14, 28], "\uc544\ub9c8": [28, 37], "\uc6d0\ubcf8\uacfc": 28, "\ubaa9\uc801\uc774": 28, "\uc544\ub2d0\uae4c": 28, "\uc2f6\uc74c": 28, "\ubaa9\ud45c\uc2dd\uc740": 28, "loss\ud568\uc218\uc640": 28, "\uc720\uc0ac\ud568": 28, "c\u03b8\uc640": 28, "e\u03b8\ub294": 28, "\ubbf8\uc138\ud55c": [14, 28], "\ud3ec\ucc29\ud560": 28, "\uc788\uc744\uac83\uc73c\ub85c": 28, "\uae30\ub300\ud568": 28, "\ud3ec\ucc29\ud558\ub294": 28, "guide\uc5d0": 28, "\ub9de\ucdb0\uc11c": 28, "\uc9c4\ud589\ud568": 28, "\uc8fc\uc81c\uc5d0": 28, "\ubcf4\uc874\ud558\uace0": [14, 28], "\uc784\ubca0\ub529\uacfc": 28, "\ucea1\uc158\ub4e4\uc5d0": 28, "\ucd94\ub860\uc774": 28, "\uac00\ub2a5\ud588\uc74c": 28, "\ub370\uc774\ud130\uc14b\uc73c\ub85c\ub3c4": 28, "\ubcf4\uc874\ud558\uba74\uc11c": 28, "\ud45c\ud604\ud55c": 28, "\uc0ac\uc9c4\uc5d0\uc11c\uc640": 28, "\uc758\uc0ac": [14, 28], "\ubc31\uc778": 28, "\ub0a8\uc131": 28, "\uc758\uc0ac\ub97c": 28, "\uadf8\ub824\ub0c8\uc74c": 28, "\ub9ce\uc558\uc74c\uc744": 28, "imageset\uc5d0\uc11c": 28, "\uc778\uc885\uc801": 28, "\uc778\uc2dd\uc744": 28, "embedding\uc758": 28, "y\ucd95": 28, "\ubcf5\uc81c\ud558\ub294\uc9c0": 28, "\uc0dd\uc131\ud558\ubbc0\ub85c": 28, "\uace0\ub824\ud558\uc5ec": 28, "\ucee8\uc149\uc5d0": 28, "64\uac1c\uc758": 28, "x\ucd95": 28, "\ub09c\uc774\ub3c4\uc640": 28, "\uc124\uc815\uc758": 28, "\uc77c\ub828\uc758": [14, 28], "prompt\uc758": 28, "embedding\uc5d0\uc11c": 28, "similarity\ub97c": 28, "\uc2a4\ucf54\uc5b4\ub294": 28, "capability\uc640": 28, "\uc2e0\ub8b0\ub3c4\ub97c": 28, "\ud658\uacbd": 28, "\ub530\ub984": 28, "\uc0dd\ub7b5": 28, "evaluation1": 28, "baseline\uacfc": 28, "set\uc5d0\uc11c": 28, "\uc0d8\ud50c\ub9c1\ud558\ub294": 28, "\uc5c6\uc5c8\ub2e4": [14, 28], "\ub2ec\uc131\ud558\uace0": 28, "baseline\uc5d0\uc11c": 28, "editablity\uc744": 28, "\uc778\uc0c1\uc801\uc778": [14, 28, 32, 41], "\ub098\ud0c0\ub0b4\uace0": 28, "word\ub9cc": 28, "\uc815\ud655\ub3c4\ub85c": 28, "\ucea1\ucc98\ud558\ub294\ub370": 28, "tradeoff": 28, "\uace1\uc120\uc758": 28, "outline\uc744": 28, "\uadf8\ub9ac\uba70": 28, "\uc218\uc815\ub420": 28, "target\uc758": 28, "\ucea1\ucc98\ud558\uc9c0\ub294": 28, "\ubc18\ub300\ub85c": 28, "\uba40\ub9ac": 28, "\ubc97\uc5b4\ub098\uba74": 28, "editability\uac00": 28, "\uac10\uc18c\ud558\ub294": 28, "reconstruction\uc774": 28, "\ubcc0\uacbd\ud574": 28, "\uace1\uc120\uc744": 28, "\uc774\ub3d9\ud560": 28, "\uc788\uc73c\ubbc0\ub85c": 28, "\uc0ac\uc6a9\uc790\uc5d0\uac8c": 28, "tradeoff\uc5d0": 28, "\uc815\ub3c4\uc758": 28, "\ud3ec\ucc29\ud558\uc9c0": [14, 28], "\ubabb\ud558\uba74\uc11c\ub3c4": 28, "\uac10\uc18c\ud568": 28, "\uc124\ubb38\uc9c0": 28, "\uc81c\uacf5\ubc1b\uc558\uace0": 28, "\uc774\ubbf8\uc9c0\uc640\uc758": [28, 35], "\uc720\uc0ac\uc131\uc5d0": 28, "\ub9e4\uae40": 28, "\uc9c8\ubb38\ubcc4\ub85c": 28, "600\uac1c\uc529": 28, "200\uac1c\uc758": 28, "\uc751\ub2f5\uc744": 28, "\uc81c\uacf5\ud558\uc9c0\ub9cc": [14, 28], "\uc758\ubbf8\ub860\uc801\uc778": 28, "\ubcf8\uc9c8\uc744": 28, "\ud30c\uc545\ud558\uac70\ub098": 28, "shape\ub97c": 28, "\ucd5c\uc801\ud654\uac00": 28, "\uac78\ub9b0\ub2e4": [28, 30], "2\uc2dc\uac04\uc774": 28, "\uc18c\uc694\ub428": 28, "\uc124\uc815\uacfc": [28, 31], "\uac1c\uc778\ud654\ub418\uba70": 28, "generation\uc744": 28, "\uc18c\uac1c\ud568": 28, "word\ub85c": 28, "inverse\ud558\uc5ec": 28, "\uc791\ub3d9\ud568": 28, "word\ub294": 28, "\uac04\ub2e8\ud558\uace0": 28, "\uc758\ubbf8\uc5d0\uc11c": 28, "\ud3b8\uc9d1\ud558\uae30": [14, 28], "\uc27d\ub3c4\ub85d": 28, "interpace\ub97c": 28, "\uc0ac\uc6a9\ud558\uc9c0\ub9cc": [28, 32], "\uc5b8\uc5b4\uc758": 28, "\ud55c\uacc4\uc5d0": 28, "\uc811\uadfc\ud560": 28, "\ub2e8\uc11c\ub97c": 28, "\uacf5\uac1c\uc801\uc73c\ub85c": [14, 28], "\uc0ac\uc6a9\uac00\ub2a5\ud55c": 28, "model\uc778": 28, "\uad6c\ud604\ub428": 28, "\uc544\ud0a4\ud14d\ucc98": 28, "\uc815\ubcf4\uc5d0": [28, 29], "\uc758\uc874\ud558\uc9c0": [28, 31], "\uc0dd\uac01": 28, "\uac70\uae30\uc5d0\uc11c": 28, "preserav": 28, "\ud5a5\uc0c1\ub420": 28, "08818": 29, "resourc": 29, "\uc904\uc774\uae30": [29, 34], "\uc555\ucd95\ud558\uc5ec": 29, "\ubaa8\ub378\ub9c1\uc758": 29, "\ubd80\uc871\ud558\uba70": 29, "\uc774\uc720\uac00": 29, "cost": [29, 31, 39, 40], "\uc14b": 29, "temproal": 29, "\uc0d8\ud50c\ub4e4": 29, "\ub07c\ub9ac\uc758": 29, "\uc0dd\uc131\ud588\ub2e4": [29, 39], "\uac70\uce58\uac8c": 29, "\uc2dc\ud000\uc2a4\uc758": 29, "\uc2dc\uac04\ucd95\uc5d0": 29, "\ud588\uace0": [14, 29], "1280x2048": 29, "\uc2dc\ud000\uc2a4": [14, 29], "\uc778\ucf54\ub529\ud574": 29, "\uc815\ub82c\ud558\uc5ec": 29, "\uc77c\uad00\uc801\uc778": 29, "\ubcc0\ud658\ud55c\ub2e4": [14, 29, 39], "\uc790\uc728": 29, "\uc8fc\ud589\uc758": 29, "\uc2dc\ubbac\ub808\uc774\uc158": 29, "\uc5d4\uc9c4": 29, "512x1024": 29, "creativ": 29, "creation": 29, "\ubb38\uc81c\uc810": [14, 29], "\uac1c\ubcc4\uc758": 29, "\uc2dc\uac04\uc801\uc778": [14, 29], "\ud504\ub808\uc784\uc73c\ub85c": [14, 29], "\ub80c\ub354\ub9c1\ud574": 29, "\uacf5\uac04\uc801\uc778": 29, "\uc5f0\uad00\ub418\uba70": 29, "\uac1c\ubcc4": [14, 29, 32], "\uc815\ub82c\ud560": 29, "\uc778\uc2dd\ud560": 29, "einop": 29, "\uad6c\ud604\ud588\uc73c\uba70": 29, "\ubc30\uce58x\uc2dc\uac04": 29, "\uc778\ucf54\ub529\uc774": 29, "\ubc30\uce58": 29, "option": 29, "ii": 29, "\uad6c\uc131\ub41c\ub2e4": [14, 29], "\uc2dc\uac04\uc5d0": 29, "\ud65c\uc6a9\ud588\ub2e4": 29, "\uac00\uc911\ud569\uc744": 29, "\uacb0\ud569\ub41c\ub2e4": 29, "\uc2dc\ud000\uc2a4\ub85c": 29, "flickering\uc774": 29, "\ubc1c\uc0dd\ud558\ub294": [29, 40], "\uad6c\ucd95\ub41c": 29, "patch": 29, "wise": 29, "\ud504\ub808\uc784\uc758": [14, 29], "\uc778\ucf54\ub354\ub294": [14, 29], "\ub3d9\uc601\uc0c1\uc740": [14, 29], "\ud504\ub808\uc784\uc5d0\uc11c": [14, 29], "\uc608\uce21\ud558\uac8c\ub054": 29, "\ud504\ub808\uc784\ub4e4\uc740": 29, "\uc778\ucf54\ub354\ub97c": [14, 29], "\ucc28\uc6d0\uc5d0": 29, "\uc785\ub825\ub41c\ub2e4": 29, "\ucd5c\uc2e0": [14, 29], "\uc7ac": 29, "\ub3c4\uc785\ud574": 29, "\uc788\uc5b4\uc57c": [29, 39], "\ud0a4": 29, "\uc81c\uc57d\uc73c\ub85c": 29, "\uc50c\uc6b4\ub2e4": 29, "16t": 29, "\ud574\uc0c1\ub3c4\uae4c\uc9c0": 29, "\ubaa9\ud45c\uc774\ub2e4": 29, "cascad": [29, 38], "\uc601\uac10\ubc1b\uc544": 29, "4\ubc30": 29, "\ud0a4\uc6e0\ub2e4": 29, "\uad6c\ucd95\ud558\uae30": 29, "\ub2e8\uc704\ub85c": 29, "\uc5f0\uc0b0\ud558\uace0": 29, "main": [29, 35], "\ud6a8\uc728\uc801\uc73c\ub85c": [29, 39, 40], "\ubaa8\ub378\ub9c1\uc774": 29, "\uc218\ud589\ub41c\ub2e4": 29, "\uadf8\ub85c": 29, "\ud328\uce58": 29, "\uc9c4\ud589\ud558\uae30\uc5d0": 29, "rd": 29, "683": 29, "060": 29, "8\ucd08": 29, "dai": [29, 41], "night": 29, "crowded": 29, "7m": 29, "52k": 29, "hour": 29, "320": [29, 41], "1280": [29, 41], "\uac00\ub2a5\ud574\uc84c\ub2e4": 29, "113": 29, "24fp": 29, "7\ucd08": 29, "30fp": 29, "\uc81c\ud55c\uc801\uc778": 29, "\ud559\uc2b5\ud588\uc9c0\ub9cc": 29, "\uc14b\uacfc": 29, "entirely\ud558\uac8c": 29, "\uc704\ucabd\uc758": 29, "iccv": [30, 32], "16203": 30, "\uac70\ub300": 30, "\ubaa8\ub378\ub85c\ubd80\ud130": 30, "\ub098\uc058\uc9c0": 30, "composit": 30, "reason": 30, "abil": [30, 36, 41], "\ud6cc\ub96d": 30, "\uc0b4\ud3b4\ubcf4\uae30": 30, "\uc2f6\ub2e4\uba74": 30, "\uc77c\ub2e8": [30, 39], "\ub3d9\ubb3c\uc758": 30, "\ud074\ub798\uc2a4\ub97c": 30, "37\uac1c\uc758": 30, "\ud074\ub798\uc2a4\uac00": 30, "pet": 30, "\uce58\uc790": 30, "\ud638\ub791\uc774": 30, "\uadf8\ub7fc": 30, "\ud68d\ub4dd\ud560": 30, "\uc218\ud589\ud574\uc11c": 30, "\ud310\ubcc4\ud55c\ub2e4": 30, "\ud074\ub798\uc2a4\uc774\ub2e4": 30, "\uc54c\uace0\ub9ac\uc998": [30, 42], "n_sampl": 30, "\uc9c0\uc815\ub41c": 30, "\uc0d8\ud50c\ub9c1\ud574": 30, "\ubca1\ud130\ub97c": 30, "\ub9cc\ub4e0\ub2e4": [14, 30, 34], "\ud310\ubcc4\uc774": 30, "\ucd9c\ub825\ud55c\ub2e4": 30, "n_trial": 30, "\uc2dc\ub3c4\ud574\uc11c": 30, "\ud3c9\uade0\ub0bc": 30, "\ucd94\ub860\ud55c\ub2e4": 30, "\ud310\uc815\ud55c\ub2e4": 30, "\ucd94\ub860\ud560": 30, "\ub4e4\uc5b4\uc11c": [30, 38], "\uc218\ud589\ud558\uae30": [14, 30], "\ud559\uc2b5\ud558\uc9c0\ub294": 30, "\uc815\uc758\ub418\uc5b4": 30, "\ub370\uc774\ud130\uc14b\uc73c\ub85c": 30, "\uad6c\ud558\uace0": 30, "\uc18c\ubaa8\ub428": 30, "\uc904\uc778\ub2e4": 30, "\uac78\ub7ec\ub0b8\ub2e4": 30, "\uc18c\uc218\uc758": 30, "\ub0a8\uc558\ub2e4\uba74": 30, "\uc774\uc81c\ub294": 30, "oxford": 30, "iiit": 30, "bash": 30, "python": 30, "eval_prob_adapt": 30, "split": 30, "to_keep": 30, "l1": [30, 31, 32], "prompt_path": 30, "pets_prompt": 30, "csv": 30, "\uc774\ub807\uac8c\uae4c\uc9c0": 30, "\uc904\uc774\ub824\uace0": 30, "\uc2a4\ud06c\ub9bd\ud2b8": 30, "rtx": 30, "3090": 30, "\ub3cc\ub9ac\uba74": 30, "\ud558\ub824\uba74": 30, "\ucd08": 30, "all_nois": 30, "randn": [30, 35], "max_n_sampl": 30, "eval_error": 30, "ts": 30, "noise_idx": 30, "text_emb": 30, "text_embed_idx": 30, "float32": 30, "pred_error": 30, "cpu": 30, "idx": 30, "inference_mod": 30, "tqdm": 30, "trang": 30, "batch_t": 30, "noised_lat": 30, "alphas_cumprod": 30, "t_input": 30, "float16": 30, "text_input": 30, "noise_pr": [30, 41], "encoder_hidden_st": [30, 35, 41], "mse_loss": [30, 35], "l1_loss": 30, "huber": 30, "huber_loss": 30, "notimplementederror": 30, "\ucd94\ub860\ud558\uac8c": 30, "\ub420\ud150\ub370": 30, "\uc0ac\uc6a9\ud574\uc57c": 30, "\ubcc0\uc218\uc5d0": 30, "\ub2ec\ub77c\uc9c0\uae30": 30, "\ub2ec\ub77c\uc84c\ub2e4": 30, "intermedi": [30, 41], "\uc62c\ub77c\uac00\ub294\uc9c0": 30, "\uc2e4\ud5d8\ud574\ubcf4\uc558\ub2e4": 30, "addit": [30, 34], "knowledg": [30, 31, 41], "\ucd94\ucd9c\ud574\ub0b4\ub294": 30, "\ubc29\ubc95\ub4e4\ubcf4\ub2e4": 30, "\ub6f0\uc5b4\ub0ac\ub2e4": 30, "\uc0dd\uc131\ud574": 30, "\uad6c\ucd95\ud558\uace0": 30, "90": [30, 37, 39], "\ud559\uc2b5\uc2dc\ucf1c\uc11c": 30, "\uc218\ud589\ud55c": 30, "\ucd94\ucd9c\ud574": 30, "\uc804\ub2ec\ud574\uc11c": 30, "\ubaa8\ub378\ubcf4\ub2e4\ub3c4": 30, "\ub192\uc740\uc9c0": 30, "aesthet": [30, 39, 41], "\ud55c\uc9c0": 30, "\ud55c\uc9c0\uc5d0": 30, "filter": 30, "\uc774\uc640": 30, "cifar10": 30, "flower": 30, "stl10": 30, "\uc774\ub4e4": 30, "\uc644\uc804\ud55c": 30, "\ud544\ud130\ub9c1\uc774": 30, "\uc548\ub41c": 30, "\uc62c\ub77c\uac08": 30, "winoground": 30, "visio": 30, "linguist": 30, "\ub9e4\uce58\uc2dc\ud0a4\ub294": 30, "\uba85\uc0ac\uc808\ub07c\ub9ac": 30, "\ub4a4\ubc14\ub010": 30, "\ub3d9\uc0ac\ub07c\ub9ac": 30, "\ud615\uc6a9\uc0ac\ub07c\ub9ac": 30, "\ubd80\uc0ac\ub07c\ub9ac": 30, "\ud488\uc0ac\ub07c\ub9ac": 30, "\uc5ec\ub290": 30, "\ub9cc\uc744": 30, "\ud559\uc2b5\ud588\uc74c\uc5d0\ub3c4": 30, "\uc774\uc790": 30, "\ubcc0\ubaa8": 30, "dit": 30, "101": 30, "79": 30, "\uae30\ub85d\ud558\uba70": 30, "\ub2a5\uac00": 30, "\ub2a5\uac00\ud588\ub2e4": 30, "\uacb9\uce58\ub294": 30, "\uc2e0\ub8b0\uad6c\uac04": 30, "\ucc0d\ud600": 30, "\ubcc4": 30, "\ubaa8\uc591\uc758": 30, "\ud68d\ub4dd\ud55c": 30, "\uae30\ub300\ub418\ub294": 30, "ood": 30, "\ud558\ub2e4": 30, "\ucd94\ucd9c\ud558\ub294": 30, "\uc6b0\uc218\ud568\uc744": 30, "\ub370\uc774\ud130\ub3c4": 30, "\ud559\uc2b5\uc2dc\ud0ac": [30, 42], "\uac1c\uc120\ub420": 30, "\ud65c\uc6a9\ud588\uc74c": 30, "\ub6f0\uc5b4\ub0a0": 30, "\uc608\uc0c1": 30, "01469": 31, "consistency_model": 31, "audio": 31, "\uc654\uc2b5\ub2c8\ub2e4": 31, "flow": [14, 31, 39], "2000\ubc30": 31, "\uc5f0\uc0b0\uc791\uc5c5\uc744": 31, "\uc694\ud558\ub294": 31, "\uc0ac\uc9c4\ucc98\ub7fc": [31, 41], "pf": 31, "ordinari": [31, 39], "trajectori": 31, "\ub4e4\uc774": [31, 35], "\uc2dc\uc791\uc810\uc73c\ub85c": 31, "\ub9e4\ud551\ub418\ub3c4\ub85d": 31, "\ub9cc\uc871\uc2dc\ud0ac": 31, "\uccab\ubc88\uc9f8": [31, 40], "\ubc29\uc2dd\uc73c\ub85c\ub294": 31, "numer": 31, "solver": [31, 32, 40], "\ud55c\ubc88\uc758": [31, 39], "\ub9cc\uc73c\ub85c\ub3c4": [31, 39, 40], "\ub450\ubc88\uc9f8": [31, 40], "\uac1c\uc120\ub418\uace0": 31, "\ubaa8\ub378\ub85c\uc11c\ub3c4": 31, "stroke": 31, "\ubcf4\uc5ec\uc900\ub2e4\ub294": 31, "\ud655\uc778\ud558\uc600\uc2b5\ub2c8\ub2e4": 31, "sde": [31, 39, 40], "drift": [31, 35], "nabla": [31, 39], "p_t": 31, "\uc2dc\uc810": 31, "solut": [31, 36], "\ubd84\ud3ec\ud569\ub2c8\ub2e4": 31, "\uc218\uc2dd\uc5d0\uc11c": 31, "pi": [14, 31, 40], "\uc815\uc758\ud558\uace0": [31, 36, 40], "approx": [31, 32, 34, 36, 39], "\ub300\uc785\ud558\uba74": 31, "empir": [31, 39], "\uacfc\uc815\uc73c\ub85c\ub294": 31, "euler": [31, 39, 40], "heun": [31, 39], "\uc5ed\ubc29\ud5a5\uc73c\ub85c": 31, "\ud480\uc5b4": 31, "\uadfc\uc0ac\uac12\uc774\ub77c\uace0": [31, 34], "\ubc29\uc9c0\ud558\uae30": [14, 31, 32], "\uc591\uc218": 31, "\uba48\ucd94\uace0": 31, "\uadfc\uc0ac\uac12\uc73c\ub85c": 31, "\uac04\uc8fc\ud569\ub2c8\ub2e4": 31, "80": 31, "002": 31, "\uc124\uc815\ud569\ub2c8\ub2e4": [31, 42], "\uc18c\uac1c\ub4dc\ub9b0": [31, 40], "\uc791\uc5c5\uc774": [14, 31], "\uc9c4\ud589\ub418\uc5c8\uc9c0\ub9cc": 31, "\ud65c\uc6a9\ud574\ub3c4": 31, "10\ubc88": 31, "\uac70\uccd0\uc57c\ub9cc": 31, "\ubcf4\uc5ec\uc900\ub2e4\uace0": [31, 34, 35, 40], "\uae30\ubc95\ub4e4\uc5d0": 31, "\uc5f0\uad6c\ub4e4\ub3c4": 31, "saliman": [31, 39], "\uc81c\uc678\ud558\uace0\ub294": 31, "\ub300\ub7c9\uc758": 31, "\uc218\uc9d1\ud574\uc57c\ud55c\ub2e4\ub294": 31, "\ubc29\uc2dd\uacfc": [31, 39], "definit": 31, "mapsto": [31, 39], "\ub9cc\uc871\ud569\ub2c8\ub2e4": 31, "\uc608\uce21\ud558\uae30": 31, "\ub370\uc774\ud130\ub85c\ubd80\ud130": 31, "f_": [31, 39, 41], "bilo": 31, "\uc720\uc0ac\ud558\uc9c0\ub9cc": 31, "invert": 31, "\ubd80\uc5ec\ud558\uc9c0\ub294": 31, "\ub9cc\uc871\ud574\uc57c": 31, "boundari": 31, "\ub9cc\uc871\ud558\uae30": 31, "\ucc28\uc6d0\uc774": [31, 42], "form": 31, "\ub9cc\uc871\uc2dc\ud0a4\ub294": 31, "\ubbf8\ubd84": [31, 39], "\ud615\uc2dd\uacfc": 31, "\uc720\uc0ac\ud558\uc5ec": 31, "leverag": [31, 37], "\ud0dd\ud569\ub2c8\ub2e4": 31, "\ub354\ubd88\uc5b4": [31, 32, 37], "\ud558\ub2e8": [31, 41], "pseudo": 31, "\ubcf4\uc774\ub4ef\uc774": 31, "inject": [31, 43], "multistep": 31, "\uc720\uc5f0\uc131\ub3c4": 31, "\ub4e4\uac04\uc758": 31, "\ubcf4\uc644\ud558\uba74\uc11c": 31, "\uc608\uc2dc\ub4e4\uc744": 31, "\uccab\ubc88\uc9f8\ub85c": [31, 42], "t_n": [31, 39], "t_i": [31, 39], "rho": [31, 39], "\ud06c\ub2e4\uba74": 31, "\uc9c4\ud589\uc2dc\ucf1c": 31, "\uc608\uce21\uac12\uc744": [14, 31, 39], "ts_": 31, "\uc9c0\uc810": 31, "\uc790\uc138\ud558\uac8c\ub294": [31, 35, 40, 41, 42], "2_": 31, "\ub85c\ubd80\ud130\uc758": [31, 32], "\ucd9c\ub825\uac12": 31, "\ub85c\ub294": [31, 40], "\ud655\uc778\ud574\ubcf8": [31, 40], "equiv": 31, "descent": [31, 36], "ema": [31, 39], "\ud559\uc2b5\ud558\uc600\ub2e4\uace0": 31, "stopgrad": 31, "\uc124\uc815\ud560\ub54c\ubcf4\ub2e4": 31, "\uc548\uc815\uc801\uc73c\ub85c": 31, "\uc131\ub2a5\uc5d0\ub3c4": 31, "\uac1c\uc120\uc774": 31, "\uc808\ucc28\ub294": 31, "\uc815\ub9ac\ud560": [31, 39], "cd": [31, 39], "run": 31, "\uc218\ub834\ud560": 31, "\ub458\uc740": 31, "\uc77c\uce58\ud558\uac8c": 31, "onlin": 31, "\ubc29\uc2dd\uc5d0\uc11c\ub294": 31, "\uadfc\uc0ac\ud558\ub294": 31, "\uc758\uc874\ud588\ub2e4\uba74": 31, "\ub9d0\ud574": [31, 32, 40], "\uadfc\uc0ac\ud560": [31, 39], "ct": 31, "\uc0ac\uc2e4\uc744": 31, "\uc788\uc2b5\ub2e4": 31, "t_nz": 31, "\uc815\uc758\ud558\uac8c": [31, 40, 41, 42], "\ubc30\uacbd\uc740": 31, "\ud074\uc218\ub85d": [31, 39], "\ube44\uad50\ud588\uc744\ub54c": [31, 35], "\uac10\uc18c\ud558\uc9c0\ub9cc": 31, "\uc99d\uac00\ud558\uac8c": 31, "\ucd08\uae30\uc5d0": [14, 31], "converg": [31, 36, 37, 40], "\uc774\ub974\ub294\ub370": 31, "\uc6a9\uc774\ud569\ub2c8\ub2e4": 31, "\uc99d\uac00\ud558\uace0": 31, "\uac10\uc18c\ud558\uac8c": 31, "\ubc14\ub78c\uc9c1\ud558\ub2e4\uace0": 31, "\uc2e4\ud5d8\ud558\uc600\uace0": 31, "\uc9c0\ud45c\ub294": [31, 39, 40], "precis": 31, "\ub370\uc774\ud130\uc14b\uc5d0\ub294": [31, 40], "ncsn": 31, "\uc9c4\ud589\ud558\uc600\uc2b5\ub2c8\ub2e4": 31, "\uc0ac\uc6a9\ud588\uc744\ub54c": [31, 40], "\uc88b\uc558\uace0": 31, "\ub4e4": 31, "\uce21\uc815\ud558\ub294\ub370": 31, "\ud2b9\ud654\ub418\uc5b4": 31, "\uc124\uc815\ud588\uc744\ub54c": 31, "\uc88b\uc558\uc2b5\ub2c8\ub2e4": 31, "\uc774\uc678\uc5d0\ub3c4": 31, "\ubcc4\ub3c4\ub85c": 31, "\ube68\ub9ac": 31, "\uc218\ub834\ud558\uc9c0\ub9cc": 31, "\ud004\ub9ac\ud2f0\ub294": 31, "vice": [31, 34], "versa": [31, 34], "\uc810\ucc28\uc801\uc73c\ub85c": [31, 40], "\uc99d\uac00\uc2dc\ud0a4\uba74\uc11c": 31, "\ubcc0\ud654\uc2dc\ucf30\uc744\ub54c": 31, "pd": [31, 39], "\ube44\ub86f\ud55c": [31, 40, 41], "\uacac\uc904\ub9cc\ud55c": 31, "\uc0dd\uc131\ud568\uc73c\ub85c\uc368": 31, "\uc131\uc9c8\ub3c4": 31, "\uc54c\uace0\ub9ac\uc998\uc744": [31, 33], "pseudocod": [31, 40], "unpair": 32, "2017": 32, "1703": 32, "10593": 32, "tensorflow": 32, "tutori": 32, "\ub17c\ubb38\ub9ac\ubdf0": 32, "cyclegan\uc744": 32, "\uc0ac\ub78c\uc774": [14, 32, 37, 38], "\ud55c\uad6d\uc778\uc774\ub77c\uace0": 32, "\ub72f\uc5b4\ubcf4\uae30": 32, "kwangsu": [32, 43], "\ub3c4\uba54\uc778\uc744": 32, "\ub3c4\uba54\uc778\uc73c\ub85c": 32, "\ubcc0\ud658\uc2dc\ud0a4\ub294": 32, "vision\uc758": [], "translation\uc740": [], "input\uacfc": 32, "\uc9dd\uc774": 32, "\uc9c0\uc5b4\uc9c4": 32, "\uc5bb\ub294": [32, 37], "\uc5b4\ub835\uc2b5\ub2c8\ub2e4": [32, 42], "\uc9dd\uc9c0\uc5b4\uc9c4": 32, "x\ub77c\ub294": [], "domain\uc73c\ub85c\ubd80\ud130": [], "\uc5bb\uc740": 32, "y\ub85c": [], "\ubc14\uafb8\ub294": [32, 35], "\uc5f0\uad6c\ub294": 32, "\ubd84\ud3ec\uc640": 32, "y\ub85c\ubd80\ud130\uc758": [], "\uad6c\ubd84\uc774": 32, "\ubd88\uac00\ub2a5\ud558\ub3c4\ub85d": 32, "y\ub85c\uc758": [], "mapping\uc5d0": [], "\uac00\ud574\uc11c": 32, "\uac15\uc81c\ud558\uae30": 32, "\uc5ed\ubc29\ud5a5": 32, "\uc9c4\ud589\ud558\uace0": [], "\uc720\uc0ac\ud574\uc9c0\ub3c4\ub85d": 32, "\uac15\uc81c\ud558\ub294": 32, "\ub3c4\uc785\ud588\uc2b5\ub2c8\ub2e4": 32, "pair\uac00": [], "\ubcf4\uc5ec\uc92c\ub2e4\uace0": 32, "\uadf8\ub9bc\uc73c\ub85c": 32, "\ubcc0\ud658\ud55c\ub2e4\uac70\ub098": 32, "\ub0ae\uc5d0": 32, "\ucc0d\uc740": 32, "\ubc24\uc5d0": 32, "\ud754\ud788": 32, "output\uc73c\ub85c": [], "\uc788\uc5c8\ub294\ub370\uc694": 32, "\ube44\uc2fc": 32, "\uc77c\uc774": 32, "\uc77c\ub300\uc77c\ub85c": 32, "\uc9dd\uc9c0\uc5b4\uc9c0\uc9c0": 32, "\ubaa8\uc74c\uc758": 32, "\ucea1\uccd0\ud558\uace0": 32, "\ubaa8\uc74c\uc73c\ub85c": 32, "\ubcc0\ud658\ud560": 32, "x\uc5d0": [], "\uc138\ud2b8": 32, "\uc81c\uacf5\ub418\uace0": 32, "output\uacfc": 34, "y\uac00": [], "\uad6c\ubcc4\ud560": 32, "\uc5c6\ub3c4\ub85d": 32, "y\ub97c": 34, "\uc774\uac8c": [], "\ubb34\uc870\uac74": 32, "\uc720\uc758\ubbf8\ud558\uac8c": 32, "\uc774\ub8ec\ub2e4\ub294": 32, "\ub73b\ud558\uc9c0\ub294": 32, "g\uac00": [], "image\uc5d0\ub294": [], "\ubb34\ud55c\ud55c": 32, "\uc218\uac00": [32, 33], "collapse\uac00": [], "\uc77c\uc5b4\ub098\uae30\ub3c4": 32, "dl": 32, "blogspot": 32, "08": [14, 32], "problem": 32, "image\ub4e0": [], "\ub9e4\ud551\ud558\uba74\uc11c": 32, "\ucd5c\uc801\ud654\uc5d0": 32, "\uc2e4\ud328\ud558\ub294": 32, "\ud604\uc0c1\uc740": 32, "\uc785\uc7a5\uc5d0\uc11c": 32, "discriminator\uac00": [], "\uc0ac\uc9c4\uc774": [32, 34], "y\uc778\uc9c0": [], "\uac00\uc9dc\uc778": 32, "\uc778\uc9c0": 32, "\uad6c\ubcc4\ud558\ub294": 32, "\uc18d\uc774\uae30\ub9cc": 32, "\uc6b0\ub9ac\uc758": 32, "\ubaa9\uc801\uacfc": 32, "\uc0c1\uad00\uc774": 32, "\ub9cc\ub4e4\ub354\ub77c\ub3c4": 32, "\uc54a\uc544\uc11c": 32, "\ubc1c\uc0dd\ud568": [], "\uc774\uc288\ub85c": 32, "\ud544\uc694\ud574": [], "\uc84c\uc2b5\ub2c8\ub2e4": [], "task\ub294": [], "\uc601\uc5b4": 32, "\ud504\ub791\uc2a4\uc5b4": 32, "\uc601\uc5b4\ub85c": 32, "\ubc88\uc5ed\ud588\uc744": 32, "\ub3c4\ub2ec\ud558\ub294": 32, "\uac19\uc544\uc57c": 32, "\uc758\ubbf8\uc758": 32, "cyclic": [], "consistency\uc774\ub77c\ub294": [], "\uc18d\uc131\uc744": 32, "\uc774\uc6a9\ud569\ub2c8\ub2e4": 32, "\ubaa9\uc801\uc2dd\uc744": 32, "\uc815\ubc29\ud5a5": 32, "\ub17c\ubb38\uacfc": [], "\ub0b4\uc6a9\uc774\uc5c8\uc74c": [], "introduction\uc5d0\uc11c": [], "\uc124\uba85\ud588\uace0": [], "\uc2a4\ud130\ub514\uc640\ub294": [], "\uc2a4\ud0b5\ud588\uc74c": [], "\ub3c4\uc2dd\ud654": 32, "mapping\ud558\ub294": [], "function\uc744": 33, "\uc6a9\uc5b4": 32, "pdata": [], "\ud45c\uc2dc": [], "dx": 36, "dy\ub294": [], "dx\ub294": [], "y\uc640": [], "\ubaa9\uc801\uc2dd\uc740": 32, "\ub450\uac1c": [], "domain\uc758": [], "distribution\uacfc": [], "\uc77c\uce58\uc2dc\ud0a4\uae30": [32, 40], "g\uc640": [], "f\uac00": [], "\ubaa8\uc21c\ub418\ub294": 32, "dy\uc5d0": [], "l_gan": [], "gan\uc5d0\uc11c": [], "\uac08": [32, 34], "x\ub85c": [], "\uc218\uc2dd\uc774": 32, "\ub098\uc624\uba70": [], "dx\uc5d0": [], "dx\ub97c": [], "\ub123\uc740": 32, "\ub9d0\ud588\ub4ef": [], "\uc81c\ud55c\uc744": 32, "\uc218\uc2dd\uc73c\ub85c\uc11c": [], "\uc608\ube44": 32, "loss\ub85c": [], "\ub300\uccb4\ud574\ubd24\ub294\ub370": 32, "\uad00\ucc30\ud560": 32, "\uc5c6\uc5c8\uc74c": [], "loss\uc640\uc758": [], "\uc0c1\ub300\uc801": 32, "\uc911\uc694\ub3c4\uc5d0": 32, "\uacb0\uc815\ub428": [], "architecture\ub85c\uc11c": [], "transfer\uc640": [], "\ubcf4\uc5ec\uc900": [32, 41], "\ucc44\ud0dd\ud568": 34, "sever": 32, "fraction": 32, "rgb\ub85c": [], "\uc548\uc815\ud654\uc2dc\ud0a4\uae30": 32, "\ud14c\ud06c\ub2c9\uc744": [32, 39], "function\uc5d0\uc11c": [], "50\uac1c\ub97c": 32, "\uc800\uc7a5\ud574": 32, "\ud55c\uaebc\ubc88\uc5d0": 32, "\uc9c4\ub3d9\uc744": 32, "sjinu": 32, "ysbsb": 32, "lsgan": 32, "\uc5c5\ub370\uc774\ud2b8\ub97c": [], "lsgan\uc744": [], "\uc774\ud574\ub294": [], "\ubabb\ud588\uace0": [], "\uc774\ub7f0\uac8c": [], "\uc788\uad6c\ub098": [], "\uc815\ub3c4\ub85c\ub9cc": [], "\uc774\ubcf4\ub2e4": 32, "\uace0\ucc28\uc6d0\uc774\uc9c0\ub9cc": 32, "\uac04\ub7b5\ud788": [32, 40], "2\ucc28\uc6d0\uc744": 32, "\ud45c\ubc29\ud558\uba74": 32, "\uacb0\uc815\uacbd\uacc4\ub97c": 32, "\ucabd\uc774": 32, "\uac00\uc9dc": [32, 36], "\uc601\uc5ed": [14, 32], "\uc601\uc5ed\uc785\ub2c8\ub2e4": 32, "\uc544\ub798\uc5d0": 32, "\uba3c": 32, "\uc0ac\uc6a9\ud55c\ub2e4\uba74": 32, "\uc785\uc7a5\uc5d0\uc11c\ub294": 32, "discriminator\ub97c": [], "\uc18d\uc774\uace0": 32, "vanish": [32, 36], "\uc77c\uc5b4\ub098\uae30": 32, "\uc18d\uc778\ub2e4\ub294": 32, "\uc774\uc720\ub9cc\uc73c\ub85c": 32, "\uc5c6\uac8c": 32, "ls": [], "generator\ub294": [], "\uc18d\uc774\ub294": [], "\ub118\uc5b4\uc11c": [], "\uac00\uc9c0\uac8c\ub054": [], "\ud574\uc57c\ud569\ub2c8\ub2e4": [], "\ub78c\ub2e4\ub97c": [], "10\uc73c\ub85c": [], "\uc544\ub2f4\uc744": [], "\uc5d0\ud3ec\ud06c": [], "\ub3d9\uc548\uc5d0\ub294": 32, "ln\uc744": [], "\uc5d0\ud3ec\ud06c\ub9c8\ub2e4": [], "\uc870\uae08\uc2dd": 32, "\uc218\ub834\ud558\uac8c": 32, "\ucc38\uac00\uc790\ub4e4\uc740": 32, "\uc0ac\uc9c4\uc774\ubbf8\uc9c0": 32, "\uac00\uc9dc\uc774\ubbf8\uc9c0\uc5d0": 32, "\ub178\ucd9c\ub41c": 32, "\uc9c4\uc9dc\ub77c\uace0": 32, "\uc0dd\uac01\ub418\ub294": 32, "\uc120\ud0dd\ud558\uac8c": 32, "study\uac00": [], "\ud14c\uc2a4\ud2b8\uc5d0": 32, "\uae30\uc900\uc784\uc5d0\ub3c4": 32, "\uc2e4\ud5d8\uc774": 32, "\uc591\uc801\uc778": 32, "\uae30\uc900\uc744": 32, "\ucc3e\uc558\ub294\ub370": [], "score\uc784": [], "fcn\uc740": [], "\uc0ac\uc9c4\uc5d0": 32, "\ub808\uc774\ube14": 32, "\ub9f5\uc744": 32, "\ub9f5\uc740": 32, "\ubd84\ud560": [], "\uba54\ud2b8\ub9ad\uc744": [], "label\uacfc": [], "\ub3c4\ub85c": 32, "\uc0c1\uc758": 32, "\uc790\ub3d9\ucc28": 32, "label\uc5d0\uc11c": [], "fcn\uc774": [], "\uac10\uc9c0\ud558\uba74": 32, "\uc131\uacf5\ud55c": 32, "\ub77c\ubca8\ub9c1": [], "pixel\ub2f9": [], "\ub2f9": 32, "cityscap": 32, "benchmark\uc758": [], "cogan": 32, "simgan": 32, "aginst": 32, "6\uc5d0\uc11c": [], "baseline\uc5d0\uc11c\ub3c4": [], "cyclegan\uc740": [], "supervise\uc778": [], "pix2pix\uc640": [], "realism": [14, 32], "\uc9c0\ub3c4\uc5d0\uc11c": 32, "\ud56d\uacf5": 32, "\uc0ac\uc9c4\uc5d0\uc11c": 32, "\ubaa8\ub450\uc5d0\uc11c": 14, "4\uc758": 32, "\ucc38\uac00\uc790\ub97c": 32, "\uc18d\uc77c": 32, "baseline\uc740": [], "\ub3c4\uc2dc": 32, "\ud48d\uacbd\uc5d0": 32, "\ud3c9\uac00\ud558\uace0": [], "3\uc740": [], "\ud3c9\uac00\ud568": 37, "cyclegan\uc774": [], "baseline\ub4e4\uc758": [], "\ub2a5\uac00\ud55c\ub2e4": [], "consistency\uc758": [], "\ubcf4\uc5ec\uc8fc\ub294": [32, 33, 35, 40, 41], "\uc5c6\uc560\uba74": [], "cycle\uc744": [], "\uc81c\uac70\ud558\ub294": [], "\uc800\ud558\ub428": [], "\uacb0\ub860\uc744": [], "\ub0b4\ub9b4": [], "\ubc29\ud5a5\uc5d0\uc11c\ub9cc": [], "\uba54\uc18c\ub4dc\ub97c": [], "cycle\ub9cc": [], "\ub3cc\ub838\uc744": 32, "backward": [32, 35, 36], "\uc774\ub530\uae08\uc529": [], "collapse\ub97c": [], "\uc720\ubc1c\ud558\ub294": 32, "\ubc1c\uacac\ud568": [], "\ub9e4\ud551\uc758": [], "\ubc29\ud5a5\uc5d0": 32, "7\uc744": [], "\uc787\uc5c8\uc74c": [], "\uc7ac\uad6c\uc131\ub41c": 32, "\uc0ac\uc9c4\uacfc": 32, "\ub3c4\uba54\uc778\uc774": 32, "\ub9ce\uc558\uc74c": [], "8\uc740": [], "cmp": 32, "fa\u00e7ad": [], "database\uc758": [], "\uac74\ucd95": 32, "ut": 32, "zapoos50k": 32, "\uc2e0\ubc1c\uacfc": [], "pix2pix\uc5d0": [], "cyclegan\uc758": [], "\ud488\uc9c8\uc740": [], "\ub300\uc758": [], "\uc9f1\uc774\ub2e4": [], "\ub9ce\uc544": [], "\uc0dd\ub7b5\ud558\uaca0\uc2b5\ub2c8\ub2e4": [], "\u3160": [], "data\uac00": [], "data\uc5d0\uc11c": [], "transslation\uc774": [], "\ud55c\uac83\ubcf4\ub2e4": [], "\ub9e4\ub825\uc801\uc774\ub2e4": [], "application\uc740": [], "\uc6f9\uc0ac\uc774\ud2b8\uc5d0": [], "\uc2e0\uacbd": [], "\uc804\ub2ec": [], "\uc791\uc5c5\uacfc": [], "\uc120\ud0dd\ud55c": [], "\uc608\uc220": [], "\uc791\ud488\uc758": [], "\uc804\ub2ec\ud558\ub294": [], "\uc791\ud488": 32, "\uceec\ub809\uc158\uc758": [], "\ubaa8\ubc29\ud558\ub294": [], "\ubcc4\uc774": [], "\ube5b\ub098\ub294": [], "\uadf8\ub9ac\ub294": [], "\ubc18": [], "\uace0\ud750": [], "\ub530\ub77c\ud558\ub294": [], "\ub290\ub08c\uc744": [], "\ub530\ub77c\ud55c\ub2e4": [], "turmukhambetov": [], "\ubc94\uc8fc\uc758": [], "\uac1d\uccb4\ub85c": [], "\ubc94\uc8fc": [], "\ubcc0\ud615\uc5d0": 14, "\ub461\ub2c8\ub2e4": 42, "turn": 14, "hors": [], "zebra": [], "\uc0c9": [], "\uad6c\uc131\uc744": [], "\ubcf4\uc874\ud558\uae30": [], "\uc720\uc6a9\ud558\ub2e4\ub294": [], "taigman": [], "49": [], "\ucc44\ud0dd\ud558\uc5ec": 34, "\uc81c\ub108\ub808\uc774\ud130\uac00": [], "\ub3c4\uba54\uc778\uc758": [], "\uc81c\uacf5\ubc1b\uc744": [], "\uadfc\ucc98\uc5d0": [], "\uc815\uaddc\ud654\ud569\ub2c8\ub2e4": [], "lident": [], "ey_pdata": [], "lidentity\uac00": [], "\uc5c6\uc73c\uba74": [], "\uc0dd\uc131\uc790": [], "\uad73\uc774": [], "\uc0c9\uc870\ub97c": [], "\uc790\uc720\ub86d\uac8c": [], "\ubcc0\uacbd\ud560": 39, "monet\uc758": [], "flickr": [], "\uc0dd\uc131\uc790\ub294": [], "\uadf8\ub9b0": [], "\uc77c\ubab0": [], "\uc801\ub300\uc801": [], "\uc0ac\uc774\ud074": 32, "\ub9e4\ud551\uc774": [], "\ub3d9\ub4f1\ud558\uac8c": [], "\uc720\ud6a8\ud560": [], "\uc190\uc2e4\uc758": [], "9\uc5d0\uc11c": [], "\ubcf4\uc5ec\uc9d1\ub2c8\ub2e4": [], "9\ub294": [], "set\uc740": [], "set\uc73c\ub85c\ubd80\ud130": [], "\uadf8\ub824\uc9c4": [], "datqa\ub97c": [], "\uadf8\ub9bc\uc5d0": [], "\ud0c0\ub2f9\ud55c": [], "monet\uc774": [], "\uc0c8": 33, "\uadf8\ub9b4": [], "generalization\uc740": [], "press": [], "\uc595\uc740": 32, "\uae4a\uc774\uc758": [], "flickr\uc5d0\uc11c": [], "\ub2e4\uc6b4\ub85c\ub4dc\ud55c": [], "\uaf43": [], "\ud6c8\ub828\ud569\ub2c8\ub2e4": [], "\uc18c\uc2a4": [], "\ub3c4\uba54\uc778\uc740": [], "\uc2a4\ub9c8\ud2b8\ud3f0\uc73c\ub85c": [], "\ucc0d\ud78c": [], "\uc870\ub9ac\uac1c\ub85c": 32, "dof": [], "\ucd08\uc810": 32, "\uae4a\uc774": [], "\ub300\uc0c1\uc740": [], "\uc870\ub9ac\uac1c\uac00": 32, "dslr\ub85c": [], "\ud3ec\ud568\ud569\ub2c8\ub2e4": [], "\uc131\uacf5\uc801\uc73c\ub85c": 39, "shallow": 32, "\ucd08\uc810\uc774": 32, "\ub9de\uc740": 32, "\ubc30\uacbd\uc774": 32, "\ud750\ub9bf\ud558\uac8c": 32, "\uad6c\ubaa9\ud558\uace0\uc790": 32, "\uac15\uc870\ud558\uae30": 32, "domain\uc740": 32, "\uc2a4\ub9c8\ud2b8\ud3f0\uc758": 32, "target\uc740": 32, "discuss": 32, "\ud765\ubbf8\ub85c\uc6b4": [32, 35], "\uade0\uc77c\ud558\uac8c": [14, 32], "\uc544\ub2c8\uc5c8\uc2b5\ub2c8\ub2e4": 32, "\ud574\uc11d": [], "task\uc640": [], "\ubcc0\ud654\ub9cc": 32, "\ud615\uccb4\uac00": 32, "\uc560\ub9e4\ud574\uc9c4": 32, "\uc774\ub7f0\uac78": [], "geometri": 32, "\ubcf4\uc544": [], "\ucf54": 32, "\uc785\uc5d0": [], "\uad6c\ud604\ud558\ub294\ub370": 32, "\ub9d0": 32, "\uc5bc\ub8e9\ub9d0": 32, "\uc608\uc81c\uc758": 32, "\ud0c0\ub294": 32, "\ub9ce\uc558\ub294\ub370": 32, "\uc5bc\ub8e9\ub9d0\uc758": 32, "\uc5c6\ub2e4\ubcf4\ub2c8": 32, "\ubc30\uacbd\ub3c4": 32, "\uc5bc\ub8e9": 32, "\uadf8\ub9ac\uac70\ub098": 32, "\uc5bc\ub8e9\ub9d0\uc5d0\uc11c": 32, "\ub178\ub797\uac8c": 32, "\uce60\ud55c": 32, "\ub54c\ub54c\ub85c": [32, 39], "\ub098\ubb34\uc640": 32, "\uac74\ubb3c\uc758": 32, "label\uc744": [], "\ubaa8\ud638\uc131\uc744": 32, "\ud574\uacb0\ud558\ub824\uba74": 32, "weak": 32, "supervision\uc774": [], "\ub9c8\ubb34\ub9ac": [], "\ud48d\ubd80\ud558\uac8c": [], "\uc81c\uacf5\ub418\uba70": [], "\ud65c\uc6a9\ud574\uc57c": [], "setting\uc5d0\uc11c": [], "\uac83\uc758": [], "\ub298\ub9ac\ub294\ub370": 32, "\uae30\uc5ec\ud569\ub2c8\ub2e4": 32, "12092": 33, "unoffici": 33, "donggeun": [33, 34, 37, 43], "sean": [33, 34, 37, 43], "ko": [33, 34, 37, 43], "june": 33, "\ubaa8\ub378\uc774\uba70": 33, "120\uc5b5\uac1c": 33, "\uc218\uc640": 33, "5\uc5b5": 33, "\ud1b5\ud558\uc5ec": 33, "2021\ub144": 33, "diverse\ud55c": 33, "3\uc640": 33, "vae\ub97c": [14, 33], "transformer\uc744": 33, "architecture\uc744": [33, 34], "model\uba70": 33, "\uc218\ub294": 33, "shot\uc744": 33, "\ubd80\ubd84\ub9cc": [33, 34], "1750\uc5b5": 33, "\uac1c\uc218\uc758": 33, "2005": 33, "14165": 33, "jalammar": 33, "how": 33, "gpt3": 33, "encoder\uc5d0\uc11c": 33, "categor": 33, "\uac16\ub294\ub2e4\uace0": 33, "cnn": 33, "d\ucc28\uc6d0\uc758": 33, "\uc704\uce58\uc5d0": 33, "\uadf8\ub9ac\ub4dc\ub85c": 33, "\ub098\ub204\uace0": 33, "\ud835\udc52_1": 33, "\ud835\udc52_\ud835\udc58": 33, "code\ub85c": 33, "e_j": 33, "\ucc3e\uc544\uc11c": 33, "\ubd80\uc5ec\ud568": 33, "p2yeong": 33, "explain": 33, "pixel\uc744": 33, "\uc9c1\uc811\uc801\uc73c\ub85c": 33, "\uc774\ubbf8\uc9c0\uc77c\uc218\ub85d": 33, "\uba54\ubaa8\ub9ac\ub7c9\uc774": 33, "\ud544\uc694\ud574\uc11c": 33, "\ube44\ud6a8\uc728\uc801": 33, "short": 33, "depend": [33, 35], "model\ub4e4": 33, "likelihood": [33, 34, 36, 42], "dependency\ub97c": 33, "\uac83\uc774\uba70": 33, "detail\uc5d0": 33, "\uc9d1\uc911\ud558\uac8c": 33, "recognizable\ud574\uc11c": 33, "\uadf9\ubcf5\ud558\uace0\uc790": 33, "192\uac1c\uc758": 33, "\ubc30\uc815": 33, "size\ub97c": 33, "\ub4e4\uacfc": [33, 37, 40], "\uc5f0\uc18d\uc801\uc73c\ub85c": 33, "\uc785\ub825\ud568": 33, "concaten": [14, 33, 38], "\ub4e4\uc758": [32, 33, 40], "\uacb0\ud569": 33, "\uc2dc\uac01\ud654": [33, 34], "jiho": 33, "ml": [33, 42], "weekli": 33, "nlp": 33, "40": 33, "\ud30c\uc774\ud504\ub77c\uc778": 33, "cqom0r2kmvi": 33, "1729": 33, "\ud835\udc5e": 33, "\u03c6": 33, "dvae": 33, "token\ub97c": 33, "\ud835\udc5d": 33, "\ud835\udf03": 33, "token\uc5d0\uc11c": 33, "decoder\uc5d0\uc11c": 33, "\u03c8": 33, "purpl": 33, "text\uc640": [33, 39], "token\ub4e4\uc758": 33, "\ud835\udc5e_\u03c6": 33, "\ud835\udc5d_\ud835\udf03": 33, "\ud559\uc2b5\ud568": 33, "elb": 33, "bound\ub97c": 33, "192": 33, "elb\ub97c": 33, "continuous\ub97c": 33, "\ubc14\uafd4\uc57c": 33, "\ud559\uc2b5\uc2dc\uc5d0\ub294": 33, "argmax\ub97c": 33, "\uc778\ub371\uc2a4\ub97c": 33, "\uc120\ud0dd\ud558\uc5ec": 33, "argmax": 33, "gumbel": 33, "\ud574\uacb0": 33, "underset": 33, "g_i": 33, "e_i": 33, "relaxation\ub97c": 33, "tau": [33, 41], "temperatur": 33, "relaxation\uc744": 33, "tight\ud558\uac8c": 33, "\uc7a1\uc544\uc90c": 33, "120\uc5b5\uac1c\uc758": 33, "token\uc740": 33, "logit\uc5d0\uc11c": 33, "\uc18c\ubb38\uc790\ud654": 33, "384": 33, "vocabulary\ub97c": 33, "\ud55c\ubc88\uc5d0": 33, "row": 33, "column": 33, "\ub300\ud558\uc5ec": 33, "n\uac1c\ub294": 33, "n\uac1c": 33, "\uace8\ub77c\uc11c": 33, "\uace0\ub974\uae30": 33, "\ubc88\uc9f8\ub85c": 33, "\uc120\ud0dd\ud568": 33, "best\ub97c": 33, "\uace0\ub97c\ub54c": 33, "prompt\ub791": 33, "\ub098\uc634": [33, 34], "score\uc774": 33, "\uc81c\uc77c": [33, 34, 36, 41], "\uc54c\ub9de\uc740": 33, "\uac1c\uc218\uc5d0": [33, 35], "df": 33, "five": 33, "vote": 33, "gan\ubcf4\ub2e4": [33, 34], "\ucc28\uc774\ub85c": 33, "\ud22c\ud45c": 33, "\ubc1b\uc558\uc74c": 33, "\ub0ae\uc744\uc218\ub85d": [33, 34], "\uc88b\uc73c\uba70": 33, "\ub192\uc744\uc218\ub85d": [33, 34], "\ub791": 33, "cub": 33, "coco\uc5d0\uc11c\ub294": 33, "\ubcf4\uc5ec\uc92c\uc74c": 33, "cub\uc5d0\uc11c\ub294": 33, "\ucc0d\uc9c0": 33, "\ubabb\ud558\uc600\uace0": 33, "score\uc5d0\uc11c\ub294": 33, "cub\uc5d0": 33, "\uacc4\uc120\uc744": 33, "\uc0dd\uac01\ud568": 33, "\uacb0\uacfc\uac12": 33, "parameter\uacfc": 33, "\ub6f0\uc5b4\ub098\uac8c": 33, "\ud574\uacb0\ud568": 33, "\uc77c\ubc18\ud654": [14, 33], "\ud3c9\uac00\uc5d0\uc11c": 33, "\uc900\uc218\ud55c": 33, "\uc2f6\uc740": 33, "\uac1d\uccb4\uac00": 33, "\ud3ec\ud568\ub418\uba74": 33, "\uacaa\uc74c": 33, "\uace0\uc2b4\ub3c4\uce58\uac00": 33, "2\ub9c8\ub9ac\uac70\ub098": 33, "\uac15\uc544\uc9c0\uc640": 33, "\uace0\uc2b4\ub3c4\uce58": 33, "\ud06c\ub9ac\uc2a4\ub9c8\uc2a4": 33, "\uc2a4\uc6e8\ud130\ub97c": 33, "\uc785\uace0": 33, "\uc544\uc26c\uc6b4": 33, "\ub370\uc774\ud130\uc14b\uc774": [33, 38], "tuning\uc73c\ub85c": 33, "limitation\uc744": 33, "2105": 34, "05233": 34, "\ubaa8\ub378\ub4e4\uc758": [14, 34], "\ub6f0\uc5b4\ub118\uc74c": 34, "\ubd80\ubd84\uc5d0\uc11c\ub3c4": 34, "\uc8fc\uc7a5\ud568": 34, "diversity\uc640": 34, "fidelity\uc758": 34, "off\uc5d0": 34, "model\ub4e4\uc774\uba70": 34, "\uc0dd\uc131\ud574\ub0b4\ub294\ub370\uc5d0": 34, "\uc131\uacf5": 34, "deep\uc5d0": 34, "\ub0ae\uc73c\uba70": 34, "\uac1c\uc120\uc0ac\ud56d\uc774": 34, "model\ub4e4\uc758": 34, "\ub04c\uc5b4\uc62c\ub9ac\uba70": 34, "\ub0ae\ucd94\uaca0\ub2e4\uace0": 34, "\uc124\uba85\ub418\uc788\uc73c\ubbc0\ub85c": 34, "\ub17c\ubb38\ub4e4\uc758": 34, "\uac00\uc815\ud558\uba70": 34, "\uacf5\ubd84\uc0b0": 34, "\ubd88\uac00\ub2a5\ud55c": 34, "\ub9e4\uac1c\ubcc0\uc218\ub85c": 34, "\uc124\uc815\ub418\uba70": 34, "ddpm\uc5d0\uc120": 34, "\uc9c0\ud45c\uac00": 34, "\ub0ae\uc558\ub2e4": 34, "scheduling\uc744": 34, "\uc0ac\uc6a9\ud588\uc9c0\ub9cc": 34, "\uc8fc\uc7a5\ud588\ub2e4": 34, "\ud559\uc2b5\uc5d0\ub3c4": 34, "\ub04a\uace0": 34, "\ubc14\uafc8": 34, "iteration\uc73c\ub85c": 34, "\ucc44\ud0dd\ud588\uc9c0\ub9cc": 34, "parameter\uc744": 34, "\ubcc0\uacbd\ud558\uc5ec": 34, "\uc77c\uc815\ud558\uac8c": 34, "\uac00\uc838\uac00\uba74\uc11c": 34, "\ubcf4\uae30": 34, "\uc2dc\ucf1c\ubcf4\uae30": 34, "head\uc5d0": 34, "8x8": 34, "\ud574\ubcf4\uae30": 34, "\uc77c\ubc18": 34, "block\uc774": 34, "biggan\uc758": 34, "connection\uc744": 34, "32\uc77c\ub54c": 34, "\ub0ae\ub2e4": 34, "160": 34, "block\ub9c8\ub2e4": 34, "\ud29c\ub2dd\uc744": [14, 34], "adain\uc774\ub791": 34, "\uc5f0\uc0b0\ud558\ub294": 34, "adagn": 34, "\uc18c\uac1c\ud588\ub2e4": 34, "\ubc29\ubc95\ub860\uc778\uc9c0\ub294": 34, "\ubaa8\ub974\uaca0\ub2e4": 34, "normalization\uc744": 34, "adpative\ud558\uac8c": 34, "embedding\uacfc": 34, "adain": 34, "\uacf1\ud558\uace0": 34, "\ub354\ud568": 34, "y_b": 34, "adagn\uc758": 34, "adagn\uacfc": 34, "additon": 34, "normalization\ubcf4\ub2e4": 34, "layer\uc744": 34, "\uc0ac\uc6a9\ud588\ub294\ub370": 34, "\uc8fc": 34, "de": 34, "\uc90c\uc73c\ub85c\uc368": 34, "zp_": 34, "normalizing\uc744": 34, "\uc0c1\uc218": 34, "log_": 34, "\uace1\ub960\uc774": 34, "\ubb34\ud55c\uc73c\ub85c": 34, "rightarrow0": 34, "\ud14c\uc77c\ub7ec": 34, "\uae09\uc218\ub97c": 34, "\uc7ac\uc804\uac1c": 34, "\uc720\ub3c4\ub294": 34, "\ubcf8\ubb38\uc758": 34, "\ubc88\uc2dd\uc774\ubbc0\ub85c": 34, "\ub611\uac19\uc774": 34, "sample\ud55c\ub2e4": 34, "gradient\uc758": 34, "\ube7c": 34, "score\uc744": 34, "scaling\uc758": 34, "classifier\uac00": 34, "scaling\uc774": 34, "\ub2e4\ub974\ub2e4": 34, "\uc8fc\uba74": 34, "\uc6f0\uc2dc\ucf54\uae30\ub77c\ub294": 34, "\uc6f0\uc2dc\ucf54\uae30\uc2a4\ub7ec\uc6b4": 34, "\uac15\uc544\uc9c0\uac00": 34, "\ub418\uc9c0\ub294": 34, "\uc6f0\uc2dc\ucf54\uae30": 34, "class\ub77c\ub294": 34, "\ubd84\uc704\uae30\uc758": 34, "\uac15\uc544\uc9c0\uc758": 34, "epsilon\uc774\ub77c\ub294": 34, "scale\uc5d0": 34, "\ubc1b\ub294\uc9c0": 34, "sampling\ud560": 34, "scale\uc774": 34, "recall\uc740": 34, "\ub0ae\uc9c0\ub9cc": 34, "precision\uc740": 34, "\ub192\ub2e4": 34, "\uc0dd\uae30\ub294\ub370": 34, "recall\uc774": 34, "diveristy\uac00": 34, "\ub0ae\ub2e4\ub294": [34, 42], "\uc758\ubbf8\uc774\uace0": 34, "precision\uc774": 34, "\ub192\ub2e4\ub294": 34, "\ub73b\uc774\ub2e4": 34, "\ub192\uc77c\uc218\ub85d": 34, "label\ucabd\uc73c\ub85c": 34, "guide\uac00": 34, "\uc0dd\uae30\ubbc0\ub85c": 34, "\uc77c\uc815\ud55c": 34, "sfid\ub294": 34, "off\ub85c": 34, "\ub3c4\ucd9c\ub418\ub294": 34, "\uac12\uc774\ubbc0\ub85c": 34, "\uc9c0\uc810\uc5d0\uc11c": 34, "\ub098\uc654\ub2e4": 34, "adm\uc740": 34, "\uc57d\uc790\uc774\uba70": 34, "g\ub294": 34, "guidance\uc758": 34, "\uc57d\uc790\uc774\ub2e4": 34, "\uc8fc\uc5c8\uc744": 34, "fid\uac12\uc774": [34, 37], "\ub098\uc654\uc73c\uba70": 34, "\ub450\ubc88\uca30": 34, "\ud50c\ub77c\ubc0d\uace0": 34, "\ubcfc\ub54c": 34, "biggan\uc740": 34, "\uc774\ubbf8\uc9c0\uac04\ub4e4\uc758": 34, "\ud50c\ub77c\ubc0d\uace0\uac00": 34, "\ub290\ub08c\uc758": 34, "\ubf51\uc544\ub0b8\ub2e4": 34, "\ub2e4\ucc44\ub85c\uc6b4": 34, "\ud55c\ub9c8\ub9ac\ub9cc": 34, "\uc0ac\uc9c4\ub3c4": 34, "\ub290\ub9ac\ub2e4": [14, 34], "\ubc95\uc744": 34, "function\uc758": [34, 39], "label\uc774": 34, "data\uc5d0\ub294": 34, "\ud655\uc7a5\uc774": 34, "\ubd88\uac00\ub2a5\ud558\ub2e4": [34, 39], "unlabel": 34, "cluster": 34, "\ubc29\ubc95\ub860\uc744": 34, "\ud558\ub824": 34, "12242": 35, "huggingfac": [35, 41], "\ucd5c\uadfc\uc5d0": [35, 36, 37], "\ub4f1\uc7a5\ud558\uc600\uc9c0\ub9cc": 35, "\ubd80\ubd84\uc5d0\uc11c": [35, 40], "\uba74\ub4e4\uc744": 35, "\uac1c\uc120\ud558\uae30": 35, "\uc18c\uac1c\ub418\uc5c8\uace0": 35, "5\uc7a5\uc758": 35, "\uc815\ub3c4\ubc16\uc5d0": 35, "\uc18c\uc694\ub418\uc9c0": 35, "\uc54a\ub294\ub2e4\uace0": 35, "\uc54c\uc544\ubcf4\uae30": 35, "\uc815\ub9ac\ub97c": 35, "gamma": [35, 40], "\uc785\ub825\ubc1b\uc544\uc11c": 35, "\uc218\uc2dd\uc801\uc73c\ub85c": [35, 40, 42], "alpha_tx": 35, "\ud560\ub54c": 35, "\ub54c\ub85c\ub294": 35, "\uace0\uc815\uc2dc\ud0a8\ub2e4\uace0": 35, "\uc55e\uc368": [35, 38, 40, 41], "\uc124\uba85\ub4dc\ub838\ub358": 35, "\ub0b4\uc6a9\ub4e4\uc744": 35, "blob": 35, "text_encoder_cl": 35, "import_model_class_from_model_name_or_path": 35, "noise_schedul": 35, "ddpmschedul": 35, "from_pretrain": 35, "subfold": 35, "text_encod": 35, "autoencoderkl": 35, "unet2dconditionmodel": 35, "first_epoch": 35, "num_train_epoch": 35, "train_dataload": 35, "until": 35, "reach": 35, "resum": 35, "resume_from_checkpoint": 35, "resume_step": 35, "progress_bar": [35, 41], "accumul": [14, 35], "pixel_valu": 35, "weight_dtyp": 35, "latent_dist": 35, "config": 35, "scaling_factor": 35, "offset_nois": 35, "bsz": 35, "randint": 35, "num_train_timestep": 35, "accord": 35, "magnitud": 35, "noisy_lat": 35, "add_nois": 35, "get": 35, "input_id": 35, "model_pr": 35, "prediction_typ": 35, "v_predict": 35, "get_veloc": 35, "part": 35, "model_pred_prior": 35, "target_prior": 35, "float": 35, "prior_loss": 35, "sync_gradi": 35, "params_to_clip": 35, "itertool": 35, "clip_grad_norm_": 35, "max_grad_norm": 35, "zero_grad": [35, 36], "set_to_non": 35, "set_grads_to_non": 35, "\ub300\uc0c1\uc5d0": 35, "\ub2f4\ub294": 35, "rare": [35, 38], "3\uac1c": 35, "unicod": 35, "\uc0d8\ud50c\ub9c1\ud574\uc11c": 35, "\uc785\ub825\ud558\uc5ec": 35, "\ud559\uc2b5\ud558\uace0\uc790": 35, "\uc2dc\ud0a8": 35, "\ucd94\uac00\ud568\uc73c\ub85c\uc368": 35, "\uc720\uc9c0\ud558\uac8c": 35, "\uc774\ub85c\uc368": [35, 42], "encourag": 35, "\uac00\uc9c0\uc758": 35, "\uccab\ubc88\uc9f8\ub85c\ub294": [35, 40], "dino": 35, "\uc0dd\uc131\ub418\uae30": 35, "\uc120\ud638\ub41c\ub2e4\uace0": 35, "\uacc4\uc0b0\ub429\ub2c8\ub2e4": 35, "pairwis": 35, "\uacb0\uacfc\ub3c4": [35, 40, 41, 42], "\uc801\uc6a9\ub428\uc73c\ub85c\uc368": 35, "\uc18c\uac1c\ub4dc\ub838\ub358": 35, "div": 35, "\ud574\uacb0\ub418\ub294": 35, "\uc785\ub825\ud588\uc744\ub54c\uac00": 35, "\uc124\uba85\ud569\ub2c8\ub2e4": 35, "randomli": 35, "can": 35, "backpack": 35, "recontextu": 35, "articul": [14, 35], "art": [35, 40], "famou": 35, "painter": 35, "statu": 35, "sculptor": 35, "\ud615\ud0dc\ub3c4": 35, "novel": 35, "\uac01\ub3c4\uc5d0\uc11c": 35, "\ubcf4\ub294": 35, "\uc0dd\uc131\ub3c4": [35, 37], "modif": 35, "speci": 35, "\uace0\uc720": 35, "\ud55c\uacc4\uc810\ub3c4": 35, "\uc790\uc8fc": [35, 40], "\ub098\ud0c0\ub098\uc9c0": 35, "\ubcf8\ubb38\uc5d0": 35, "\uc18c\uac1c\ub418\uace0": 35, "\uc788\uc9c0\ub294": 35, "\uc54a\uc9c0\ub9cc": [35, 39], "\ubd80\ubb38\uc5d0\uc11c\ub3c4": 35, "\ud559\uc2b5\uacb0\uacfc\ub97c": 35, "\ubcf4\uc5ec\uc8fc\ub294\ub370": 35, "\uc7a5\ub9cc\uc73c\ub85c\ub3c4": 35, "\ub9cc\ud654": 35, "\uc0ac\ub840\ub4e4\uc744": 35, "nip": 36, "2014": [36, 42], "1406": 36, "2661": 36, "eriklindernoren": 36, "smart": [36, 42], "lab": [36, 41, 42], "kaist": [36, 42], "\ub525\ub7ec\ub2dd": [36, 42], "chp": 36, "editor": [36, 42], "changhwan": [32, 36, 42, 43], "densiti": 36, "\ub098\ub269\ub2c8\ub2e4": 36, "\uacc4\uc0b0\ud55c\ub2e4\ub294": 36, "tractabl": 36, "\ucd94\uc815\ud558\ub294": 36, "\uadfc\uc0ac\ud654\uc2dc\ucf1c": 36, "\ubc29\uc2dd\uc774": [36, 39], "pixelcnn": 36, "pixelrnn": 36, "boltzmann": 36, "energi": 36, "\ud655\ub960\ubd84\ud3ec\ub97c": 36, "\uc815\uaddc\ud654\ud558\ub294": 36, "\uacc4\uc0b0\ud558\uc9c0": 36, "\uc644\uc804\uadf8\ub798\ud504": 36, "\uc5b4\ub824\uc6cc": 36, "\ub9ce\uc544\uc11c": 36, "\uc644\uc804\uadf8\ub798\ud504\uc774\uae30": 36, "\ub178\ub4dc\uac00": 36, "\ub298\uc5b4\ub0a0\uc218\ub85d": 36, "\uac04\uc120": 36, "\uae09\uc99d\ud558\ub294": 36, "restrict": 36, "rbm": 36, "\uc81c\uc548\ub418\uae30\ub3c4": 36, "\uc815\uc758\ud558\uc9c0": 36, "\ub300\ud45c\uc801\uc73c\ub85c\ub294": 36, "ian": 36, "goodfellow": 36, "2014\ub144\uc5d0": 36, "\ubc1c\ud45c\ud55c": 36, "\uc18c\uac1c\ub418\uae30": 36, "\uc804\uae4c\uc9c0": 36, "\ub144": 36, "\uc790\ub9ac\uc7a1\uc558\uc5c8\uc2b5\ub2c8\ub2e4": 36, "\uad6c\ud558\uac8c": 36, "taxonomi": 36, "\uc7a0\uc7ac\ubcc0\uc218": [36, 42], "\uadf8\ub85c\ubd80\ud130": 36, "\uad6c\ubd84\ud558\ub294": 36, "\uad6c\uc131\uc774": 36, "\ub9d0\ud574\uc11c": 36, "\ub4e4\uc5b4\uc624\uba74": 36, "\uac00\uc9dc\ub85c": 36, "binari": 36, "\uc9c4\ud589\ud569\ub2c8\ub2e4": [32, 36], "\ucf54\ub4dc\ub3c4": 36, "in_feat": 36, "out_feat": 36, "batchnorm1d": 36, "leakyrelu": 36, "inplac": 36, "opt": 36, "latent_dim": 36, "np": 36, "prod": 36, "img_shap": 36, "tanh": 36, "sigmoid": [36, 42], "img_flat": 36, "d\ub97c": 36, "g\ub97c": 36, "\uc190\uc2e4\ud568\uc218": [36, 42], "min_g": 36, "max_d": 36, "logd": 36, "p_z": 36, "\uc54c\uace0\ub9ac\uc998\uacfc": 36, "\ube44\uad50\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4": 36, "n_epoch": 36, "fill_": 36, "real_img": 36, "optimizer_g": 36, "gen_img": 36, "measur": 36, "fool": 36, "g_loss": 36, "adversarial_loss": 36, "optimizer_d": 36, "real_loss": 36, "fake_loss": 36, "d_loss": 36, "print": 36, "item": 36, "batches_don": 36, "sample_interv": 36, "save_imag": 36, "nrow": 36, "\ucd5c\ub300\ud654\ud558\uace0": 36, "\uc9c4\ud589\ud558\uac8c": 36, "\ud559\uc2b5\ud558\uc9c0": 36, "\uc0c1\ud669\uc774": 36, "\ubc1c\uc0dd\ud569\ub2c8\ub2e4": [32, 36, 38], "\ucd5c\uc18c\ud654\ud558\uc9c0": 36, "\ucd5c\ub300\ud654\ud558\ub294": 36, "\uae30\ubc95\ub3c4": 36, "\uc644\ubcbd\ud788": 36, "\ubcf5\uc6d0\ud558\uace0": 36, "\uc5b8\uc81c\ub098": 36, "\ub0b4\ubc49\uac8c": 36, "proposit": 36, "p_g": 36, "\uc99d\uba85\ud558\uc790\uba74": 36, "\uc190\uc2e4\ud568\uc218\ub97c": [36, 39, 41], "int_x": 36, "int_z": 36, "dz": [36, 42], "\uc77c\ub54c": 36, "\uc131\ub9bd\ud558\uace0": 36, "\uc190\uc2e4\ud568\uc218\ub294": [36, 41], "\uac19\uace0": 36, "ast": 36, "jsd": 36, "\ucd5c\uc19f\uac12\uc740": 36, "\uc131\ub9bd\ud569\ub2c8\ub2e4": 36, "mnist": [36, 42], "toronto": 36, "databas": [32, 36], "tfd": 36, "\ud3c9\uac00\uc2dc\uc5d0\ub294": 36, "parzen": 36, "estimation\uc744": 36, "\ud45c\ub97c": 36, "vae\ub294": 36, "\ud750\ub9bf\ud558\ub2e4\ub294": 36, "\ucc28\uc6d0\ucd95\uc18c\ub85c": 36, "\ud65c\uc6a9\ub418\uace0": 36, "\ud65c\uc6a9\ub418\uc5c8\ub2e4\uace0": 36, "11487": 37, "learning\uc774": 37, "\ub3c5\ucc3d\uc801\uc778": 37, "\ub9d0\ubb49\uce58": 37, "corpu": 37, "llm\ub4e4\uc758": 37, "embedding\ub4e4\uc740": 37, "\ud6a8\uacfc\uc801\uc774\ub77c\uace0": 37, "\ucda9\uc2e4\ub3c4": [14, 37], "\uc0ac\uc774\uc988\ub97c": 37, "\uc911\uc694\ud558\ub2e4\ub294": 37, "\uc81c\uc2dc\ud558\uc5ec": 37, "weight\uc744": 37, "\ub9cc\ub4e4\uc5b4": [14, 37], "\ud604\uc2e4\uc801\uc778": 37, "palett": [37, 38], "\uad6c\uc870\ubcf4\ub2e4": 37, "\uc81c\uc2dc\ud568": 37, "27": 37, "\ub2ec\uc131\ud568": 37, "evaluation\uc6a9": 37, "encoder\uc744": 37, "\ud574\ub193\uc74c": 37, "\uc774\ub780": 37, "generation\uc774": 37, "\uc77c\uc815\ud558\uc9c0": 37, "\ubabb\ubc1b\uc544\uc11c": 37, "class\ub098": 37, "object\uc774": 37, "\uc77c\uc815\ud558\uace0": 37, "\ubb34\uc5c7\uc744": 37, "\uc0dd\uc131\ud558\ub294\uac83\uc778\uc9c0": 37, "\uc790\uc138\ud558\uac8c": 37, "guide\uc758": 37, "\ub192\uc774\uba74": 37, "\ubd88\uc77c\uce58\uac00": [14, 37], "\uac00\uc911\uce58\uc758": 37, "\uc774\ub3d9\uc2dc\ucf1c": 37, "\ube57\ub098\uac00": 37, "\uc774\uc0c1\ud55c": 37, "satur": 37, "\ub35c\ud55c": 37, "\ub40c": 37, "\ud574\uacb0\ud558\uace0\uc790": 37, "\ubc31\ubd84\uc704\uc218": 37, "\uc808\ub300": 37, "\uc9c0\uc815\ud558\uace0": 37, "s\ub85c": 37, "\ub098\ub208\ub2e4": 37, "\uc9c0\uc810\uc758": 37, "among": 37, "net\uc774\ub77c\ub294": 37, "\uc5ec\ub7ec\uac00\uc9c0": 37, "modification\uc744": 37, "\ud558\uc600\ub2e4\uace0": 37, "effu": 37, "net\uc740": 37, "\uc758\ub8cc\ucabd\uc73c\ub85c": 37, "\uc788\ub294\uac78\ub85c": 37, "\uc544\ub294\ub370": 37, "remov": 37, "keep": 37, "block\uc5d0\uc11c": 37, "blocks\ub97c": 37, "\ucd94\uac00\ud568": 37, "\ubca4\uce58\ub9c8\ud06c": 37, "categori": 37, "\uc774\ub8e8\uc5b4\uc84c\ub2e4": 37, "\uae43\ud5c8\ube0c\uc5d0\uc11c": 37, "\ub2e4\uc6b4": 37, "\uac17\ub2e4": 37, "25\uba85\uc758": 37, "\ud3c9\uac00\uc790": 37, "a\uc5d0\uc11c": 37, "\ud3c9\uac00\uc790\ub294": 37, "\uc9c8\ubb38\uc744": 37, "\uae30\uc900\uc810\uc73c\ub85c": 37, "q1": 37, "q2": 37, "repres": 37, "\uae30\uc900\uc810": 37, "\ub2f5\ubcc0": 37, "\uc120\ud0dd\ud574\uc57c\ud568": 37, "am": 37, "indiffer": 37, "screenshot": 37, "drawbench\uc5d0\uc11c": 37, "\uccb4\ub9ac\ud53c\ud0b9": 37, "\uce74\ud14c\uace0\ub9ac\uc5d0\uc11c\ub3c4": 37, "\uc8fc\uc7a5\uc778": 37, "peopl": 37, "\uc62c\ub77c\uac10": 37, "people\uc744": 37, "\uc0dd\uc131\ud558\uae30\uc5d0": 37, "rater": 37, "xxl\ub85c": 37, "\uc120\ud638\ud568": 37, "evaul": 37, "\uc911\uc694\ud568": 37, "\ub07c\uce68": 37, "boost\uc5d0": 37, "thresholding\uc744": 37, "\ub04c\uc5b4": 37, "\uc62c\ub9b4": 37, "allow": 37, "usag": 37, "much": 37, "editbench": 38, "06909": 38, "\uc2dc\uac04\uc5d0\ub294": [38, 41], "\uc18c\uac1c\ud558\ub294": [38, 40, 41], "\ud3c9\uac00\uae30\ubc95": 38, "\uc608\uc815\uc785\ub2c8\ub2e4": [38, 40, 41], "\uc601\uc5ed\uc744": 38, "\uc9c0\uc815\ud558\uc5ec": 38, "\ucc38\uc870\ud558\uc9c0": 38, "\uc624\ub85c\uc9c0": 38, "\uc720\ub3c4\ud558\ub294": 38, "ssd": 38, "mobilenet": 38, "detector": 38, "\ud2b9\uc9d5\uc740": 38, "\uc810\uc785\ub2c8\ub2e4": 38, "sr3": 38, "\ud558\uba74\uc11c": 38, "\uac00\uc9c4\ub2e4\uace0": 38, "\uc791\uc5c5": 38, "\uc785\ub825\ud569\ub2c8\ub2e4": [38, 41], "\ub0b4\uae30": [38, 39], "\ucd94\uac00\ub418\ub294": 38, "\ucd08\uae30\ud654\ud574\uc11c": 38, "\uc18c\uac1c\ub418\uc5c8\ub358": 38, "1\ubd80\ud130": 38, "\ubcc0\ud654\uc2dc\ud0a4\ub294": 38, "oscil": 38, "\uc801\uc6a9\ud568\uc73c\ub85c\uc368": 38, "\uc0c1\uc2b9\ub418\ub294": 38, "240\uac1c\uc758": 38, "\uad6c\ucd95\ub418\uc5b4\uc788\uace0": 38, "\uc30d\ub9c8\ub2e4": 38, "3\uac00\uc9c0\uc758": 38, "\uce21\uc815\ud558\uac8c": 38, "\uc73c\ub85c\ub294": [38, 41], "clipscor": 38, "prec": 38, "\uc808\ubc18\uc740": 38, "\ub370\uc774\ud130\uc14b\uc73c\ub85c\ubd80\ud130": 38, "\uc218\uc9d1\ub418\uc5c8\uace0": 38, "\uc0dd\uc131\ud574\uc11c": 38, "\uad6c\ucd95\ud588\uc2b5\ub2c8\ub2e4": 38, "\uc694\uc18c\ub4e4\uc744": 38, "\uac16\ucd94\ub3c4\ub85d": 38, "materi": 38, "common": 38, "render": 38, "indoor": 38, "outdoor": [38, 40], "metal": 38, "\ubb38\uad6c\ub97c": 38, "stand": 38, "farm": 38, "\ud574\ub2f9\uc0ac\uc9c4\ucc98\ub7fc": 38, "\uad6c\ucd95\uc2dc": 38, "\ud06c\uae30\ub3c4": 38, "\uce21\uc815\ud574\ubcf8": 38, "medium": 38, "\uc131\ub2a5\uc801\uc73c\ub85c": 38, "\uc800\ud558\ub418\ub294": [32, 38, 41], "\uc18d\uc131\ubcf4\ub2e4": 38, "\uc18d\uc131\uc5d0": 38, "\ucde8\uc57d\ud55c": 38, "\uc0ac\uc9c4\uc785\ub2c8\ub2e4": [38, 41], "maskrich": 38, "00512": 40, "\ubcf4\uc5ec\uc8fc\uba70": 40, "\uac01\uad11\uc744": 40, "\uc18c\uac1c\ud558\uac8c": 40, "\uc124\uba85\ud558\uc790\uba74": 40, "\ubc18\ubcf5\ud558\uc5ec": 40, "\uc218\ucc9c\ubc88\uc758": 40, "\uc774\ubbf8\uc9c0\ub4e4\uacfc": 40, "\uc694\uc18c\ub4e4\ub85c": 40, "\ud568\uc218\ub4e4\uc740": 40, "lambda_t": 40, "monoton": 40, "decreas": 40, "\ud558\ub3c4\ub85d": 40, "\uc124\uc815\ub429\ub2c8\ub2e4": 40, "\uc774\ub4e4\uc744": 40, "\uc18c\uac1c\ud588\ub358": 40, "z_1": 40, "\ucd94\uac00\ud560\uc9c0": 40, "2021c": 40, "probabiil": 40, "\ud45c\ud604\ud574\uc11c": 40, "dt": [39, 40], "d\u03c3_t": 40, "nabla_z": 40, "rung": 40, "kutta": 40, "integr": 40, "\uc801\uc6a9\ud588\uc744\ub54c": 40, "probabilt": 40, "\ucc38\uace0\ub85c": 40, "\ud574\uc11d\ud558\uba74": 40, "\uc55e\uc73c\ub85c": 40, "\ubcf4\uac8c": 40, "\uae30\ubc95\uc740": 40, "\uc808\ucc28\ub85c": 40, "teacher": [39, 40], "\ubcf5\uc0ac": 40, "\uacf5\uc2dd\uc740": 40, "\uc18c\uac1c\ub418\ub294\ub370": 40, "\uacf5\uc2dd\uc785\ub2c8\ub2e4": 40, "\ud575\uc2ec\uc785\ub2c8\ub2e4": 40, "\ub118\uc5b4\uac00\ub294": 40, "\uc9c4\ud589\ub418\ub294": 40, "\uac12\ub4e4\uc5d0": 40, "\ubaa8\ub378\uc774\ub77c\uace0": 40, "sharp": 40, "\uc904\uc5b4\ub4dc\ub294": 40, "\ud655\uc778\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4": [40, 42], "progresss": 40, "\uc124\uc815\uac12\uc5d0": 40, "\uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4": 40, "\uc77c\ubc18\uc131\uc744": 40, "\uc783\uc9c0": 40, "\ub300\ub2e4\uc218\uc758": 40, "\uc190\uc2e4\ud568\uc218\uc5d0": 40, "\ub300\uc785\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4": 40, "\ub3d9\uc77c\ud558\uba70": 40, "\uc815\uc758\ud560": 40, "\uc801\ud569\ud558\uc9c0": [39, 40], "\uc54a\ub2e4\uace0": 40, "\uae30\ubc95\uc5d0\uc11c\ub294": 40, "\ub0b4\uc5d0\uc11c\uc758": 40, "\ud559\uc2b5\ub418\uc9c0\ub9cc": 40, "\uc9c4\ud589\ub420\uc218\ub85d": 40, "\uac10\uc18c\ud55c\ub2e4\ub294": 40, "\ud655\uc778\ud558\uac8c": 40, "\uac00\uae4c\uc6cc\uc9c0\uac8c": 40, "\ucee4\uc9c0\uac8c": 40, "\uc5ec\ub7ec\ubc88\uc758": 40, "\uac70\uce60": 40, "\uc0c1\uad00\uc5c6\uc9c0\ub9cc": 40, "\uc904\uc5b4\ub4e4\uc218\ub85d": 40, "\uce58\uba85\uc801\uc774\uac8c": 40, "\uc785\ub825\uc73c\ub85c\ub294": 40, "\uc0ac\ub77c\uc9c0\uac8c": 40, "\uc138\uac00\uc9c0": 40, "\ubc29\uc548\uc73c\ub85c": 40, "\ubc29\uc9c0\ud558\ub3c4\ub85d": 40, "\uc124\uc815\ub418\uc5c8\ub2e4\uace0": 40, "\ud655\uc778\ud588\uc2b5\ub2c8\ub2e4": 40, "\ubd80\uac00\uc801\uc73c\ub85c": 40, "\uae30\ubc95\ub4e4\ub85c": 40, "\ube44\uad50\ud574\ubcf8": 40, "snr": 40, "\uc870\ud569\uc744": 40, "\ud604\uc0c1\ub3c4": 40, "\uc2e4\ud5d8\uacb0\uacfc\ub97c": 40, "\uc9c4\ud589\uc2dc": 40, "\ub370\uc774\ud130\uc14b\uc5d0\uc11c\ub294": 40, "\ucc38\uc870\ud558\uc2dc\uba74": 40, "8192": 40, "\uc2dc\uc791\ud558\uc600\uace0": 40, "anneal": 40, "\uc9c4\ud589\ud574\ub3c4": 40, "undistil": 40, "\uc900\ud558\ub294": 40, "\uc9c4\ud589\ud558\uba74\uc11c": 40, "\uc0dd\uac01\ud588\uc744\ub54c": 40, "\uc7a5\uc810\uc774\ub77c\uace0": 40, "\uc798\ub418\ub294": 40, "\ud69f\uc218\ub97c": 40, "\uc810\ucc28": 40, "\ube44\uad50\ud574\ubcf4\uace0": 40, "2\ubc30": 40, "4\ubc30\uc529": 40, "\uc904\uc5ec\uac00\uba74\uc11c": 40, "\uc904\uc784\uc5d0\ub3c4": 40, "\uc904\uc9c0": 40, "\ud559\uc2b5\ubc29\uc2dd\uc73c\ub85c\ub294": 40, "\ubabb\ud55c": 40, "dig": 41, "more": 41, "08453": 41, "tencent": 41, "arc": 41, "\ub09c\ud574\ud55c": 41, "car": 41, "fly": 41, "wing": 41, "iron": 41, "man": 41, "bunni": 41, "ear": 41, "\uc785\ub825\ubc1b\uc744": 41, "textur": [14, 41], "\ud45c\ud604\ud558\uae30": 41, "\ub9cc\uc73c\ub85c\ub294": 41, "\ud544\uc694\ud558\ub2e4\uace0": 41, "\uc11c\uc220\ud569\ub2c8\ub2e4": 41, "extern": 41, "\uc18c\uac1c\ud558\uace0": 41, "77m": 41, "300m": 41, "\uc5f0\uc0b0\uc791\uc5c5\uc774": 41, "\uc2e4\ud589\ub429\ub2c8\ub2e4": 41, "\uac00\uc838\uc624\uae30": 41, "\uc6a9\ub7c9\uc774": 41, "\ud06c\uace0": [14, 41], "compos": 41, "generaliz": 41, "\uae30\ubc18\uc774": [14, 41], "autoencod": [41, 42], "\ubc14\uafb8\uace0": 41, "\ubcf5\uc6d0\ud558\ub294": [14, 41], "_2": 41, "bar": [39, 41], "z_0": [39, 41], "\uc785\ub825\ud568\uc73c\ub85c\uc368": 41, "matric": 41, "unshuffl": 41, "\ubcc0\ud658\uc774": 41, "1\uac1c\uc758": 41, "4\ubc88": 41, "\ud1b5\uacfc\ud558\uac8c": 41, "\uac70\uce58\uace0": 41, "f_c": 41, "\uc0dd\uc131\ub418\uace0": 41, "enc": 41, "\ub354\ud574\uc9c0\uac8c": 41, "\ub3d9\uc77c\ud558\ub3c4\ub85d": 41, "\uc124\uc815\ud588\uae30": 41, "\ub367\uc148": 41, "\uc5f0\uc0b0\ud558\ub294\ub370": 41, "fulladapt": 41, "in_channel": 41, "640": 41, "num_res_block": 41, "downscale_factor": 41, "pixelunshuffl": 41, "conv_in": 41, "kernel_s": 41, "adapterblock": 41, "total_downscale_factor": 41, "out_channel": 41, "downsample2d": 41, "in_conv": 41, "adapterresnetblock": 41, "act": 41, "relu": [41, 42], "adapter_st": 41, "adapter_input": 41, "adapter_conditioning_scal": 41, "num_images_per_prompt": 41, "repeat": 41, "do_classifier_free_guid": 41, "num_warmup_step": 41, "order": 41, "latent_model_input": 41, "scale_model_input": 41, "prompt_emb": 41, "cross_attention_kwarg": 41, "down_block_additional_residu": 41, "noise_pred_uncond": 41, "noise_pred_text": 41, "previou": 41, "extra_step_kwarg": 41, "prev_sampl": 41, "\uc885\ub958\ub85c\ub294": 41, "\ubd84\ub958\ud560": 41, "keypos": 41, "bicub": 41, "\uc81c\uc678\uc2dc\ud0a4\uace0": 41, "nearest": 41, "\ud06c\uae30\ub85c": 41, "\ubd80\ubd84\ucc98\ub7fc": 41, "\ud30c\ub77c\ubbf8\ud130\ub9cc": 41, "t2": 41, "\uc2dc\uc640": 41, "dure": 41, "\ub123\uc73c\uba74\uc11c": 41, "expens": 41, "late": 41, "\uc2e4\ud5d8\ud574\ubcf8": 41, "\ud06c\ub2e4\uace0": 41, "\ud3ec\ud568\ub418\ub3c4\ub85d": 41, "\uc218\uc2dd\ucc98\ub7fc": 41, "uniformli": 41, "\uc9c4\ud589\ud588\uace0": 41, "cubic": 41, "\uc0c1\uc138\uc0ac\ud56d\uc740": 41, "4x": 41, "tesla": 41, "32g": 41, "\uc2e4\ud5d8\ubcc4": 41, "coco17": 41, "164k": 41, "pidinet": 41, "stuff": 41, "keypoint": 41, "\ub370\uc774\ud130\uc14b\ub85c\ubd80\ud130": 41, "600k": 41, "mm": 41, "mida": 41, "\ubaa8\ub378\ub4e4\uacfc": 41, "\uc815\ub7c9\uc801\uc778": 41, "\uc218\uce58\ub85c": 41, "\ube44\uad50\ud558\ub294\ub370": 41, "\uc88b\uc2b5\ub2c8\ub2e4": 41, "comparisoin": 41, "\uc608\uc2dc\ub4e4\uc740": 41, "\uc815\ud655\ud558\uc9c0": 41, "\uc9c0\uc5ed\uc744": 41, "\ubabb\ud558\ub2e4\uace0": 41, "\uac83\ub85c": 41, "\uc704\uc5d0\uc11c\ubd80\ud130": 41, "\uc7a5\uc810\ub4e4": 41, "\uba85\uc2dc\ub418\uc5c8\ub358": 41, "\uc0ac\ub840\uc785\ub2c8\ub2e4": 41, "\uc644\ub8cc\ud55c": 41, "\uc801\uc6a9\ud558\uba74\uc11c": 41, "4\ubcf4\ub2e4": 41, "\uacbd\ub7c9\ud654\ub41c": 41, "\uc608\uc2dc\ucc98\ub7fc": 41, "\uc22b\uc790\ub97c": 41, "\ubc14\uafd4\uac00\uba70": 41, "tini": 41, "x4": 41, "x8": 41, "compress": 41, "auto": 42, "1312": 42, "6114": 42, "gunhochoi": 42, "fastcampu": 42, "ch": 42, "\ubb38\uad6c\uac00": 42, "\uc801\ud600\uc788\ub294\ub370\uc694": 42, "bayesian": 42, "vb": 42, "involv": 42, "\uc81c\uc2dc\ud558\ub294": 42, "aevb": 42, "\ub274\ub7f4": 42, "\ub124\ud2b8\uc6cc\ud06c\ub85c": [14, 42], "\uadfc\uc0ac\ud568\uc73c\ub85c\uc368": 42, "\uc774\uac00": 42, "\ubc14\uac00": 42, "\ub9cc\ub4e4\uc5b4\ub0b4\uace0": 42, "\ubcf5\uc6d0\ud558\uac8c": 42, "assumpt": 42, "\ub0b4\ub9bd\ub2c8\ub2e4": 42, "parametr": 42, "\ud558\ub2e4\ub294": 42, "\ub530\ub974\uace0": 42, "\uc131\uc9c8\uc5d0": 42, "bernoulli": 42, "\ucd5c\ub300\ud654\uc2dc\ud0a4\ub294": 42, "\uacc4\uc0b0\ud558\uae30": 42, "\ub4f1\uc7a5\ud558\uac8c": 42, "\ub3c4\uc2dd\ud654\ud55c": 42, "\uc815\ub9ac\ud558\uc790\uba74": [39, 42], "\uacc4\uc0b0\ub41c": 42, "fc1_1": 42, "784": 42, "hidden_s": 42, "fc1_2": 42, "log_var": 42, "reparametr": 42, "std": 42, "mul": 42, "exp_": 42, "ep": 42, "floattensor": 42, "cuda": 42, "add_": 42, "reparam": 42, "fc1": 42, "\ucc3e\uc73c\uba74": 42, "\ubd84\ud560\ud560": 42, "\uc720\uc0ac\ud558\ub3c4\ub85d": 42, "\uc7a0\uc7ac\ubcc0\uc218\uc758": 42, "\uc800\ud76c\uac00": 42, "\ubd80\uc5ec\ud55c": 42, "\uac00\uae5d\ub3c4\ub85d": 42, "mont": 42, "carlo": 42, "\uadfc\uc0ac\uac12\uc744": 42, "\uc5f0\uc0b0\ub7c9\uc774": 42, "\ub9ce\uc73c\ubbc0\ub85c": 42, "\ubcc0\ud658\ud558\uc5ec": 42, "\ud3c9\uade0\uc801\uc73c\ub85c": 42, "\ub192\ub2e4\uace0": 42, "backpropag": 42, "\uc6d0\ud65c\ud788": 42, "\uc0d8\ud50c\ub9c1\ud558\uc9c0": 42, "\ub354\ud558\uace0": 42, "\uacf1\ud558\uac8c": 42, "\ub530\ub978\ub2e4\uace0": 42, "\uc124\uc815\ud588\uc744": 42, "\ub54c\uc774\uace0": 42, "\uac00\uc815\ud558\uc5ec": 42, "\uc2dc\ub3c4\ud560": 42, "\uba85\uc2dc\ub418\uc5b4": 42, "\ud558\ub2e8\uc5d0\ub294": 42, "\uc67c\ucabd\uc5d0\ub294": 42, "trick\uc774": 42, "\uacbd\uc6b0\ub85c": 42, "\uace0\uc815\ub418\uc5b4": 42, "\uc788\uc5b4\ub3c4": 42, "\uc0d8\ud50c\ub9c1\ud558\ubbc0\ub85c": 42, "\ubbf8\ubd84\ud560": 42, "\uc801\uc6a9\ud558\uae30\uac00": 42, "\uc624\ub978\ucabd\ucc98\ub7fc": 42, "\ubcc0\uc218\ub85c\ub3c4": 42, "\ubbf8\ubd84\uc774": 42, "\uac00\ub2a5\ud574\uc9c0\uae30": 42, "frei": 42, "wake": 42, "sleep": 42, "\uc54c\uace0\ub9ac\uc998\ub97c": 42, "\uc801\uc6a9\ud574\uc11c": 42, "\uc2e4\ud5d8\uacb0\uacfc\ub294": 42, "\ucd5c\uc801\ud654\ud558\ub294\ub370": 42, "\uc54c\uace0\ub9ac\uc998\uc774": 42, "\uc218\ub834\ud558\uba70": [39, 42], "\uc131\ub2a5\uc801\uc73c\ub85c\ub3c4": 42, "em": 42, "\ud560\uc6a9\ud558\uc5ec": 42, "\ub9ce\uc73c\uba74": 42, "\uc218\ub834\uc774": 42, "\uc9c0\uc815\ud574\uc92c\ub2e4\uba74": 42, "\ud30c\ub77c\ubbf8\ud130\ub4e4\uacfc": 42, "\uc7a0\uc7ac\ubcc0\uc218\ub97c": 42, "\uc0ac\uc6a9\ud574\ubcf4\uba74": 42, "repositori": 43, "pseudodiffus": [], "team": 43, "aim": 43, "them": 43, "theoret": 43, "conduct": 43, "pseudolab": 43, "\ub9e4\uc8fc": 43, "\uc218\uc694\uc77c": 43, "\uc624\ud6c4": 43, "9\uc2dc": 43, "\uac00\uc9dc\uc5f0\uad6c\uc18c": 43, "discord": 43, "room": 43, "dh": 43, "\uc785\uc7a5": 43, "preliminari": 43, "\uc870\uc0c1\uc6b0": 43, "linkedin": 43, "\ubb38\uad11\uc218": 43, "\uae40\uc9c0\uc218": 43, "\ubc15\ubc94\uc218": 43, "\uc9c0\uc2b9\ud658": 43, "\uace0\ub3d9\uadfc": 43, "\uc870\ub0a8\uacbd": 43, "\uae40\uc120\ud6c8": 43, "\uc774\uc900\ud615": 43, "junhyoung": 43, "\uc870\ud615\uc11c": 43, "\uc720\uc815\ud654": 43, "\ubc15\uc138\ud658": 43, "\uc1a1\uac74\ud559": 43, "gigagan": 15, "synthes": 39, "2310": 39, "04378": 39, "luosiallen": 39, "donghyun": [39, 43], "han": [39, 43], "\uc131\uacfc\ub97c": 39, "\uac70\ub450\uc5c8\uc9c0\ub9cc": 39, "\uac00\uc9c0\uae30": 39, "\uc2e4\uc2dc\uac04": 39, "\uc0ac\uc6a9\uc774": 39, "\uadf9\ubcf5\ud558\uae30": 39, "\ud5a5\uc0c1\uc2dc\ud0a4\ub294": 39, "\uc81c\uc548\ub418\uc5c8\ub2e4": 39, "solver\uc758": 39, "\uc131\ub2a5\uac1c\uc120\uc744": 39, "step\ub9cc\uc73c\ub85c\ub3c4": 39, "dpm": 39, "\ucd94\ub860\ud560\uc218": 39, "On": 39, "\uc774\uc911": [14, 39], "models\uc740": 39, "trajectory\uc5d0": 39, "\uac16\ub3c4\ub85d": 39, "\ubaa8\ub378\ub85c\uc11c": 39, "2\uac00\uc9c0\uc758": 39, "model\uc774\uae30": 39, "\uace0\ub824\ud558\uc9c0": 39, "\uc54a\uc544": 39, "text2img": 39, "\uc81c\uc548\uc810\uc740": 39, "3\uac00\uc9c0\ub2e4": 39, "lcm": 39, "lcms\uc740": 39, "\uace0\ud488\uc9c8\uc758": 39, "distillation\uc744": 39, "step\uc774\ub77c\ub294": [], "32\uc2dc\uac04": 39, "\ubc16\uc5d0": 39, "\uac78\ub9ac\uc9c0": 39, "lcms\uc5d0": 39, "\ubc29\uc2dd\uc778": [14, 39], "\uc720\uc9c0\ud558\uba74\uc11c\ub3c4": 39, "models\ub294": 39, "\uc8fc\uc785\ud558\uace0": 39, "sampling\ud558\ub294": 39, "\uae30\ubc95\uc774\ub2e4": 39, "forwad": 39, "\ud655\ub960\ubd84\ud3ec\uc778": 39, "0t": 39, "scheduler\ub97c": 39, "timestep\uc758": 39, "\ud655\ub960\ubbf8\ubd84\ubc29\uc815\uc2dd": 39, "tag": 39, "q_t": 39, "ptobabl": 39, "\uc0c1\ubbf8\ubd84\ubc29\uc815\uc2dd": 39, "\ub9cc\uc871\ud558\ub294\ub370": 39, "dx_t": 39, "nabla_x": 39, "\ud559\uc2b5\uc2dc\ud0a8\ub2e4": 39, "\uadfc\uc0ac\uce58\ub97c": 39, "\uc608\uce21\ud558\uace0": 39, "sampling\ud558\ub294\ub370": 39, "ode\ub77c": 39, "\uacbd\ud5d8\uc801": 39, "sampling\uc758": 39, "\uc0ac\uc6a9\ub418\uc5c8\ub2e4": [14, 39], "cfg\uc758": 39, "prediction\uc740": 39, "prediction\uc744": 39, "\ub300\uccb4\ub41c\ub2e4": 39, "emptyset": [14, 39], "consistenct": 39, "cm": 39, "cm\uc758": 39, "\ud575\uc2ec\uc740": 39, "ode\uc758": 39, "\uada4\uc801\uc5d0": 39, "point\uc640": 39, "solution\uc5d0": 39, "mapping\ub418\ub294": 39, "\uc591\uc218\uac12\uc744": 39, "function\uc740": 39, "\uc790\uae30": 39, "\uc790\uc2e0\uc5d0": 39, "\ub9cc\uc871\ud574\uc57c\ud55c\ub2e4": 39, "foral": 39, "\ud568\uc218\uc774\uba70": 39, "\uc774\uae30": 39, "\ub9cc\uc871\ud55c\ub2e4": 39, "\uc2ec\uce35": 39, "\uc2e0\uacbd\ub9dd\uc744": 39, "cm\uc740": 39, "\ud559\uc2b5\ud558\uba70": 39, "\uad6c\uc131\ud55c\ub2e4": 39, "\uc9c0\uc218\ud3c9\uade0\uc774\ub3d9": 39, "leftarrow": 39, "\uc9c0\ud45c\uc774\ub2e4": 39, "\ucd94\uc815\ud55c": 39, "ode\uc5d0": 39, "solver\ub85c": 39, "euler\ub098": [], "solver\ub4f1\uc758": [], "\uc218\uce58\uc801\uc778": 39, "solver\ub97c": 39, "distillation\uc740": 39, "\uc601\uc0c1\uc5d0": 39, "generation\ub9cc": 39, "\uc7a0\uc7ac\uc131\uc774": 39, "\ud0d0\uad6c\ub418\uc9c0": 39, "\uc54a\uc558\uc74c": 39, "\ubc1c\ud718\ud558\uc5ec": 39, "\ub3c4\uc804\uc801\uc778": 39, "lcd": 39, "lcms\ub294": 39, "\uc124\uacc4\ub418\uc5c8\uae30": 39, "varepsilon": 39, "vector\ub85c": 39, "\uc784\ubca0\ub529\ud558\uace0": 39, "\ubcf5\uc6d0\ud55c\ub2e4": 39, "\uc0c1\uc5d0\uc11c": 39, "\uc774\ub904\uc9c0\uae30": 39, "laptop": 39, "gpu\uc5d0\uc11c": 39, "\ucd94\uac00\ud55c": 39, "\uc815\uc758\ub41c\ub2e4": 39, "dz_t": 39, "c\ub294": 39, "ode\uc0c1\uc5d0\uc11c": 39, "trick\uc778": 39, "\ubcc0\ud615\ud558\uc5ec": 39, "\ub300\uc785\ud55c": 39, "\uce58\ud658": 39, "cm\uacfc": 39, "pd\uc5d0\uc11c": 39, "psi_": 39, "solver\uc774\uba70": 39, "8\uc758": 39, "\uc6b0\ud56d\uc744": 39, "\uadfc\uc0ac\ud55c": 39, "\uac12\uc774\ub2e4": 39, "solver\uc774\uae30": 39, "distillation\uc2dc\uc5d0\ub9cc": 39, "edm\uc744": 39, "\ud1a0\ub300\ub85c": 39, "cm\uc5d0\uc11c": 39, "\uac04\uaca9\uc73c\ub85c": 39, "\uc5b4\ub5a0\ud55c\uac04\uaca9\uc744": 39, "8\uc744": 39, "\uc801\ubd84": 39, "clasifi": 39, "\ud6c8\ub828\ud574\uc57c\ud558\uae30": 39, "\ud6a8\uc728\uc801\uc774\uc9c0": 39, "\ubabb\ud558\uba70": 39, "lcms\uc640": 39, "method\uc5d0": 39, "cfg\ub97c": 39, "\ud1b5\ud569\ud558\uc600\ub2e4": 39, "distill\uc758": 39, "sampling\uc5d0": 39, "\ud1b5\ud569\ud558\uc600\uc73c\ub098": 39, "\ud559\uc2b5\uc2dc\uac04\uc774": 39, "\uae38\uace0": 39, "2\ub2e8\uacc4\ub97c": 39, "\ub204\uc801\ub418\uae30": 39, "t\uc774\uc5d0": 39, "ode\ub97c": 39, "stage\uc758": 39, "cfg\uc5d0": 39, "varnoth": 39, "\uc608\uce21\uac12\uacfc": [14, 39], "\ubcc0\ud615\ub418\ubbc0\ub85c": 39, "ode\ub77c\uace0": [], "ode\ub294": 39, "function\ub3c4": 39, "\ubcc0\uc218\ub85c": 39, "\ubc1b\uc544\uc624\uae30": 39, "omega_": 39, "sampling\ub41c\ub2e4": 39, "\uc774\uc804\uacfc": 39, "cfg\uac00": 39, "\uc608\uce21\ubaa8\ub378": 39, "11\ucc98\ub7fc": 39, "\ubcf4\ud1b5\uc758": 39, "\uc7a1\uace0": 39, "\uc774\uac19\uc774": 39, "\ucd18\ucd18\ud55c": 39, "\uac10\uc18c\uc2dc\ud0a4\uae30": 39, "loss\ub3c4": 39, "\uc791\uc544\uc9c0\uac8c": 39, "loss\uac00": 39, "\uc791\uc544\uc9c0\uba74": 39, "\uc218\ub834\uc18d\ub3c4\ub3c4": 39, "\ub290\ub824\uc9c0\uac8c": 39, "\uc218\ub834\uc758": 39, "\uc218\ucc9c\uc5d0\uc11c": 39, "\uc218\uc2ed\uc73c\ub85c": 39, "\ub2e8\ucd95\uc2dc\ud0a4\ub294": 39, "scheduler\ub85c": 39, "\ubc29\ubc95\uc774\ub098": 39, "solver\ub3c4": 39, "\uc99d\uba85\ud588\ub2e4": 39, "\ube44\uad50\ud558\ub294\uac83\uc774": 39, "step\ub9cc\ud07c": 39, "\ub108\ubb34\uc791\uc73c\uba74": 39, "\uc218\ub834\uc18d\ub3c4\ub97c": 39, "\uac16\uac8c\ub418\uba70": 39, "\uac12\uc77c": 39, "\uc624\ucc28\uac00": 39, "\ucee4\uc9c8\uc218": 39, "14\uc5d0": 39, "k\uac12\uc744": 39, "\uc218\uc2dd\ub3c4": 39, "foundat": 39, "cunstom": 39, "\ub54c\uac00": 39, "lcf": 39, "dataset\ub3c4": 39, "\uc885\uc18d\uc5c6\uc774": 39, "inference\ub97c": 39, "\ud560\uc218": 39, "lcm\uc740": 39, "\ubc14\ub85c\ubc14\ub85c": 39, "\uc0ac\uc6a9\ud560\uc218": [], "\uc788\ub294\uac83\uc740": 39, "\uc544\ub2c8\uace0": 39, "consisteni": 39, "ema\ub97c": 39, "dataset\uc73c\ub85c": 39, "\uc0ac\uc6a9\ud558\uae30\ub9cc\ud558\uba74": 39, "diffuson": 39, "\ubc14\ub85c\ud559\uc2b5\uc774": 39, "\uc758\ubbf8\uc774\ub2e4": 39, "650k": 39, "\uc55e\uc11c\ub9d0\ud55c\uac83\ucc98\ub7fc": 39, "768x768\uc758": 39, "solver\ub85c\ub294": 39, "20\uc758": 39, "lcm\uacfc": 39, "\uc131\ub2a5\ube44\uad50\ub97c": 39, "\ud588\ub294\ub370": 39, "distill\uc740": 39, "\uc624\ud508\uc18c\uc2a4": 39, "\ucf54\ub4dc\uac00": 39, "\uc218\ub834\ud558\uace0": 39, "\uc0dd\uc131\ud558\uc600\ub2e4": 39, "distillation\uc774\uc9c0\ub9cc": 39, "stage\ub9cc": [], "\uc774\uac19\uc740": 39, "\ubcf4\uc5ec\uc92c\ub2e4": 39, "\ud478\ub294": 39, "solver\ub4e4": 39, "lcm\uc5d0": 39, "\ube44\uad50\uc640": 39, "schedule\uc758": 39, "iteration\uc5d0\uc11c\uc758": 39, "\uace0\uc815\ud574\uc11c": 39, "\ube44\uad50\ud588\ub2e4": 39, "\uc62c\ub838\uc744": 39, "\ud6e8\uc52c\ub354": 39, "dpm\uacfc": 39, "50\uc77c": 39, "ddim\ubcf4\ub2e4": 39, "error\ub97c": 39, "ddim\uc5d0": 39, "\uc801\uae30": 39, "\uc88b\uc544\uc9c0\uc9c0\ub9cc": 39, "\ub5a8\uc5b4\uc838": [14, 39], "quality\uc640": 39, "diversity\uc5d0": 39, "off\uac00": 39, "inference\ub294": 39, "\uac00\uc9c0\uc9c0\ub294": 39, "\uc54a\ub294\uac83\uc73c\ub85c": 39, "\ud655\uc778\ub41c\ub2e4": 39, "\uac1c\uc120\uc758": 39, "\uc788\ub294\uac83\uc744": [], "\ube44\uad50\ud574": 39, "\ubd24\uc744": 39, "\ud655\uc5f0\ud558\uac8c": 39, "\ub4e4\uc5b4\ub09c\ub2e4": 39, "\uc2dc\uc5d0\ub3c4": 39, "\uc99d\uba85\ud55c\ub2e4": 39, "\ud3ec\ucf13\ubaac": 39, "\ub370\uc774\ud130\uc14b\uacfc": 39, "\uc2ec\uc2a8": 39, "lcf\ub97c": 39, "\ub54c\ub97c": 39, "\uc644\ubcbd\ud558\uc9c4": 39, "catch\ud55c": 39, "\uc0c1\uc5d0": 39, "\uace0\ud654\uc9c8\uc758": 39, "\ub9cc\ub4e4\uc5c8\ub2e4": 39, "dataset\uc5d0\ub3c4": 39, "step\uc73c\ub85c\ub3c4": 39, "lu": 39, "method\ub4f1\uc758": 39, "\uc788\ub294\uac83": 39, "\ud55c\ub3d9\ud604": 43, "06025": 14, "grail": 14, "cs": 14, "washington": 14, "edu": 14, "\uc785\ucd9c\ub825": 14, "\uc2dc\ud000\uc2a4\uc5d0": 14, "\ub4ef\ud55c": 14, "\uc2dc\ud000\uc2a4\uac00": 14, "\uc0ac\ub78c\uacfc": 14, "\uc637\uac10\uc758": 14, "\ud569\uc131\ud558\ub294": [14, 32], "dreampose\ub97c": 14, "\uc2a4\ud14c\uc774\ube14": 14, "\ub514\ud4e8\uc804\uc744": 14, "\ud0dc\uc2a4\ud06c\ub97c": 14, "\ud3ec\ucc29\ud558\uae30": 14, "\uc778\ucf54\ub354\uc640": 14, "\ub3c4\uc785\ud558\uc600\uace0": 14, "adapter\ub97c": 14, "\ub514\ud4e8\uc804\uc758": 14, "\ub123\uc5b4\uc92c\ub2e4": 14, "\uc2dc\ud000\uc2a4\ub97c": 14, "\ubc18\uc601\ud558\uae30": 14, "concat\ud558\uc5ec": 14, "\ub514\ub178\uc774\uc9d5": 14, "unet\uc5d0": 14, "\ud53c\uc0ac\uccb4\uc5d0": 14, "\ub4c0\uc5bc": 14, "\ucda9\uc2e4\ub3c4\uc758": 14, "\uac15\ub3c4\ub97c": 14, "\uc870\uc815\ud55c\ub2e4": 14, "\ud328\uc158": 14, "\ud0dc\uc2a4\ud06c\uc5d0": 14, "dreampose\uac00": 14, "\uc628\ub77c\uc778\uc5d0": 14, "\ud37c\uc838": 14, "\uc804\ub2ec\ud560": 14, "\uc81c\ud55c\uc801\uc774\uba70": 14, "\uc785\uc5c8\uc744": 14, "\ub298\uc5b4\uc9c4": 14, "\ubaa8\uc591\uc774\ub098": 14, "\ud750\ub984": 14, "\ub258\uc559\uc2a4\ub97c": 14, "\ubcf4\uc5ec\uc8fc\uae30\uc5d0": 14, "\uc18c\ube44\uc790\uc758": 14, "\uacb0\uc815\uc5d0": 14, "\ub3d9\uc601\uc0c1\uc774": 14, "\uc0c1\ud488\uc740": 14, "\ub4dc\ubb3c\ub2e4": 14, "\uc560\ub2c8\uba54\uc774\uc158": 14, "\ube44\ub514\uc624\ub85c": 14, "\ubcf4\uc5ec\uc8fc\uc5c8\uc9c0\ub9cc": 14, "\uc5bb\uc9c0": 14, "\ubabb\ud588\uc73c\uba70": 14, "\ud14d\uc2a4\ucc98": 14, "\uc6c0\uc9c1\uc784\uc774\ub098": 14, "\uce74\ud230\uacfc": 14, "\ubaa8\uc591\uc73c\ub85c": 14, "\uc77c\uad00\uc131\uc774": 14, "jitter\uac00": 14, "\uc0ac\uc2e4\uc131": 14, "\ubb3c\uccb4": 14, "dreampose\uc758": 14, "\uc811\uadfc\ubc95": 14, "\ubaa8\ub378\ub9c1\ud558\ub294": 14, "\ud29c\ub2dd\ud558\uc600\ub2e4": 14, "\uc2e0\ud638\uc640": 14, "\ub2e8\uc21c\ud654": 14, "\uba54\ucee4\ub2c8\uc998\uc744": 14, "\uc7ac\uc124\uacc4\ud558\uc600\ub2e4": 14, "\uc2a4\ud14c\uc774\uc9c0": 14, "\uc560\ub2c8\uba54\uc774\uc158\uc744": 14, "\ud3ec\uc988\ub97c": 14, "\uac04\ub2e8\ud558\uc9c0\ub9cc": 14, "\ub192\uc5ec\uc8fc\ub294": 14, "\ud3ec\uc988\uc5d0": 14, "\ub9de\ucd94\ub294": 14, "\uc804\ub7b5": 14, "\ub514\ud4e8\uc804\uacfc": 14, "\uc0ac\ud56d\uacfc": 14, "\uccb4\ud06c\ud3ec\uc778\ud2b8\ub294": 14, "\ucd9c\uc2dc": 14, "\ub17c\ubb38\uc5d0\uc11c\ub3c4": 14, "subject\uc5d0": 14, "\ud0dc\uc2a4\ud06c": 14, "\ubc29\uc2dd\ub4e4\uc740": 14, "\uad6c\uc131\ub418\ub294": 14, "\ub2e8\uacc4\ub9c8\ub2e4": 14, "\ubaa8\uc158\uc774\ub098": 14, "depth\ub4f1\uc758": 14, "\ubd88\uc644\uc804\ud560": 14, "\ubcf5\uc7a1\ud560": 14, "groud": 14, "truth\uc5d0": 14, "\ub3c4\ucd9c\ud558\uae30": 14, "\ubc1c\uc0dd\ud558\uae30": 14, "\uc27d\ub2e4": 14, "\ubc29\ubc95\ub4e4\uc740": 14, "\uc5d4\ub4dc": 14, "\ud22c": 14, "\uc2f1\uae00": 14, "\ud0d0\uad6c\ud558\uace0": 14, "optic": 14, "warp": 14, "nerf": 14, "\uc560\ub2c8\uba54\uc774\uc158\uc774": 14, "\ud734\uba3c": 14, "flow\uc5d0": 14, "\uc758\uc874\ud574": 14, "\ubcc0\ud654": 14, "\uac00\ub824\uc9c4": 14, "\uc758\uc0c1": 14, "\ucd5c\uadfc\uc5d4": 14, "\uc5b4\ud150\uc158": 14, "\uc140\ud504": 14, "\ud06c\ub85c\uc2a4": 14, "\uc5b4\ud150\uc158\uc744": 14, "\ub9de\ucd94\ub824\uace0": 14, "difffashion": 14, "\ub808\ud37c\ub7f0\uc2a4": 14, "\ud2b8\ub79c\uc2a4\ud37c\ud558\uc5ec": 14, "\uc758\ub958": 14, "\uc544\uc774\ud15c\uc744": 14, "\ud3b8\uc9d1\ud558\ub294": 14, "\ub123\uc5b4": 14, "\ucd5c\uc801\ud654\ub294": 14, "\uae30\ub300\ud560\ub9cc": 14, "\ub098\uc624\uc9c0": 14, "\ubaa8\uc158\uc744": 14, "\uc2a4\ud06c\ub798\uce58\ubd80\ud130": 14, "\uac12\ube44\uc2fc": 14, "\ub9ac\uc18c\uc2a4": 14, "\ubc29\ub300\ud559": 14, "\uc624\ub79c": 14, "video\ub294": 14, "\ud30c\uc778\ud29c\ub2dd\ud55c\ub2e4": 14, "\ubc29\ubc95\ub4e4\uacfc": 14, "\uae5c\ube61\uac70\ub9bc": 14, "flicker": 14, "\uad6c\uc870\uc801\uc778": 14, "\ud574\uacb0\ud558\uc5ec": 14, "\uc12c\uc720\uc758": 14, "\uc6c0\uc9c1\uc784\uc758": 14, "\uc2f1\ud06c\ub97c": 14, "\uc0ac\uc6a9\ub418\uc5b4": 14, "\ucee8\ub514\uc154\ub2dd\uc740": 14, "\uc218\uc900\uc758": 14, "\ub370\ub294": 14, "\ud6a8\uacfc\uc801\uc774\uc9c0\ub9cc": 14, "\uc758\uc0c1\uc758": 14, "identity\ub098": 14, "\ud48d\ubd80\ud558\uace0": 14, "\uc0c1\uc138\ud55c": [14, 32], "\ub2e4\ub8e8\uace0": 14, "\ubaa8\ub378\uc5d0\ub294": 14, "\uc784\ubca0\ub529\uc774": 14, "\ud53c\uc0ac\uccb4\ubcc4": 14, "\ub3d9\uc601\uc0c1\uc758": 14, "\ud1b5\ud569\ud558\uae30\ub3c4": 14, "pidm\uc740": 14, "\ud14d\uc2a4\ucc98\ub97c": 14, "\uc5f0\uacb0\ud55c\ub2e4": 14, "dreampose\ub294": 14, "\ud53c\uc0ac\uccb4\uc758": 14, "\uc678\ud615\ubfd0\ub9cc": 14, "\uad6c\uc870\uc640": 14, "\uc6c0\uc9c1\uc784\uae4c\uc9c0": 14, "pidm\uacfc": 14, "\ud1b5\ud569\ud558\uc9c0\ub9cc": 14, "\ub178\uc774\uc988\uc5d0": 14, "\uc5f0\uacb0\ub41c": 14, "\ubd80\ub4dc\ub7fd\uace0": 14, "\uad6c\ud604\ud560": 14, "\uc548\uc815\uc131": 14, "\ub2a5\uac00\ud558\ub294": 14, "\uc815\uaddc": 14, "\ubd84\ud3ec\ub41c": 14, "\ub178\uc774\uc988\uc5d0\uc11c": 14, "\uc791\ub3d9\ud558\ubbc0\ub85c": 14, "\ud76c\uc0dd\ud558\uba74\uc11c": 14, "\uc808\uc57d\ud55c\ub2e4": 14, "vae\uc640": 14, "\uc624\ud1a0\uc778\ucf54\ub354": 14, "\ucef4\ud329\ud2b8\ud55c": 14, "\ud45c\ud604\uc5d0\uc11c": 14, "\uacb0\uc815\ub860\uc801": 14, "\ud504\ub85c\uc138\uc2a4\uc5d0": 14, "\ud0c0\uc784": 14, "\uc2a4\ud0ec\ud504": 14, "\ub514\ud4e8\uc988\ub418\uc5b4": 14, "\ub178\uc774\uc9c0": 14, "\ub9cc\ub4e6": 14, "\ubcf5\uad6c\ud558\uae30": 14, "\ud0c0\uc784\uc2a4\ud0ec\ud504\uc5d0": 14, "\uc2dc\uac04\uc73c\ub85c": 14, "\ucee8\ub514\uc154\ub2dd\ub41c": 14, "unet\uc774": 14, "cal": 14, "\uc138\uadf8\uba58\ud14c\uc774\uc158": 14, "\ub9c8\uc2a4\ud06c\ub4f1": 14, "\ub514\ud4e8\uc804\uc5d0\uc11c\ub294": 14, "\uc778\ucf54\ub354\ub85c\ubd80\ud130": 14, "\uc5bb\uc5b4\uc9d0": 14, "\ubcf5\uad6c\ud558\ub3c4\ub85d": 14, "\ubd84\ud3ec\ub85c": 14, "\ubc00\uc5b4\ubd99\uc774\ub294": 14, "\uba54\ucee4\ub2c8\uc998\uc774\ub2e4": 14, "\ub110": 14, "\ub4dc\ub86d\uc544\uc6c3\uc744": 14, "\ub2ec\uc131\ub41c\ub2e4": 14, "\uc778\ud37c\ub7f0\uc2a4\ud558\ub294": 14, "\uc2a4\uce7c\ub77c": 14, "s\ub97c": 14, "\uc870\uac74\ubd80\ub85c": 14, "\uac00\uc774\ub4dc\ud558\ub294": 14, "null\ub85c": 14, "\uc92c\uc744": 14, "\ubcf4\uac04\ud55c\ub2e4": 14, "\uc2dc\ud000\uc2a4\ub85c\ubd80\ud130": 14, "\ub3d9\uc601\uc0c1": 14, "\uceec\ub809\uc158\uc5d0\uc11c": 14, "\uceec\ub809\uc158\uc5d0": 14, "\uc2e0\ud638": 14, "\ucd9c\ub825\ud558\uae30": 14, "\uc870\uc815\ud558\ub294": 14, "p_1": 14, "p_n": 14, "_n": 14, "p_i": 14, "\ub178\uc774\uc988\ub85c": 14, "\uc2dc\uc791\ud558\uc5ec": 14, "\uc2e0\ud638\ub85c": 14, "\ucffc\ub9ac\ud558\uc5ec": 14, "latent\uc758": 14, "\uc81c\uac70\ud55c\ub2e4": 14, "\ub514\ub178\uc774\uc988\ub41c": 14, "\ub514\ucf54\ub529\ud558\uc5ec": 14, "\uc560\ub2c8\uba54\uc774\uc158\uc758": 14, "\uc81c\uacf5\ub41c": 14, "\ub2ec\uc131\ud558\uae30": 14, "\uad6c\uc131\ud558\uc600\ub2e4": 14, "\uc5b4\ub311\ud130": 14, "\ud544\uc694\uc131": 14, "\ub123\uae30": 14, "\ub4e4\uc5b4\uc624\ub294": 14, "\uc2e0\ud638\ub97c": 14, "net\uc5d0": 14, "concat\ud55c\ub2e4": 14, "\uc2e0\ud638\uc5d0": 14, "\uc870\uac74\ud654\uc5d0": 14, "\uc815\ub82c\ub418\uc9c0": 14, "\ud0dc\uc2a4\ud06c\uc5d0\ub294": 14, "\ub9de\ucda4\ud615": 14, "\uad6c\ud604\ud558\uc600\ub2e4": 14, "\uc5b4\ub311\ud130\ub294": 14, "\uc870\uac74\ud654\ub97c": 14, "\uacb0\ud569\ud55c\ub2e4": 14, "\uae30\uc6b8\uae30\ub97c": 14, "\uc774\uc720\ub85c": 14, "\uccb4\uacc4\ub294": 14, "\uc791\uc6a9\ud558\ub294": 14, "\ub514\ud4e8\uc804\uc774": 14, "clip\uc774": 14, "\uc2a4\ud398\uc774\uc2a4": 14, "share": 14, "\uc778\ucf54\ub529\ud55c\ub2e4\ub294": 14, "\uac10\uc548\ud560": 14, "\ucee8\ub514\uc154\ub2dd\uc744": 14, "\uac04\ub2e8\ud788": 14, "\uc790\uc5f0\uc2a4\ub7ec\uc6cc": 14, "\uc784\ubca0\ub529\ub9cc\uc73c\ub85c\ub294": 14, "\ucea1\ucc98\ud558\uae30\uc5d0": 14, "\ucda9\ubd84\ud558\uc9c0": 14, "vae\uc5d0\uc11c": 14, "\ub3c4\uba54\uc778\uacfc": 14, "\uc7a5\uc810\uc744": 14, "\uc544\ud0a4\ud14d\ucc98\ub294": 14, "\uc9c0\uc6d0\ud558\uc9c0": 14, "\ub124\ud2b8\uc6cc\ud06c\uc758": 14, "\uc5f0\uc0b0\uc5d0": 14, "\ud63c\ud569\ud558\uace0": 14, "\ubaa8\ub4c8\uc5d0\uc11c": 14, "\uc608\uc0c1\ud558\ub294": 14, "\ud30c\uc778\ud29c\ub2dd\uc5d0\uc11c": 14, "\uc5b8\uae09\ud588": 14, "\ub4ef\uc774": 14, "\ucda9\uaca9\uc744": 14, "\uc124\uc815\ub418\uc5b4": 14, "\uc784\ubca0\ub529\uc73c\ub85c\ub9cc": 14, "\uc2dc\uc791\ud55c\ub2e4": 14, "c_i": 14, "\ucee8\ub514\uc154\ub2dd\uacfc": 14, "\uc815\ub82c": 14, "c_p": 14, "\ucd94\uc815\ub41c": 14, "\ud3ec\uc988\uc758": 14, "\ud504\ub808\uc784\uc5d0\uc11c\uc758": 14, "\uadf9\ub300\ud654\ud558\uae30": 14, "\ub2e4\uc12f": 14, "\uc5f0\uc18d\ub41c": 14, "\ud3ec\uc988\ub85c": 14, "\ubd80\ub4dc\ub7ec\uc6c0\uacfc": 14, "\uc99d\uac00\ud55c\ub2e4": 14, "\uad6c\uc870\uc801\uc73c\ub85c": 14, "10\uac1c\uc758": 14, "\ubc1b\uc544\ub4e4\uc774\ub3c4\ub85d": 14, "\ucc44\ub110\uc740": 14, "\uac00\uc911\uce58\uc5d0\uc11c": 14, "\uc218\uc815\ub418\uc9c0": 14, "\uccb4\ud06c\ud3ec\uc778\ud2b8\ub85c": 14, "\ucd08\uae30\ud654\ub41c\ub2e4": 14, "\uccb4\ud06c\ud3ec\uc778\ud2b8\uc5d0\uc11c": 14, "\ub85c\ub4dc\ub41c\ub2e4": 14, "\uc2e0\ud638\uac00": 14, "\uae30\uc5ec\ud558\uc9c0": 14, "\ud30c\uc778\ud29c\ub2dd\ub41c\ub2e4": 14, "phase": 14, "\ubaa8\ub4c8\uc744": 14, "\ud29c\ub2dd\ud558\uc5ec": 14, "\ud569\uc131\ud55c\ub2e4": 14, "\ud30c\uc778\ud29c\ub2dd\ud55c": 14, "\uac1c\uc120\ud558\uc5ec": 14, "\ucd94\ub860\uc5d0": 14, "\uc720\uc9c0\ud558\ub824\uba74": 14, "\uc0d8\ud50c\ubcc4": 14, "\ud544\uc218\uc801\uc774\uc5c8\ub2e4": 14, "\ud6c8\ub828\ud558\uba74": 14, "\uace0\ucc29": 14, "stick": 14, "\ud06c\ub86d\uc744": 14, "\ud3ec\uc988\uc30d\uc744": 14, "\uc99d\uac15\ud55c\ub2e4": 14, "\ud30c\uc778\ud29c\ub2dd\ud558\ub294": 14, "\uc120\uba85\ud558\uace0": 14, "\ubcf5\uad6c\ud558\ub294": 14, "\ud30c\uc778\ud29c\ub2dd\uc758": 14, "\uc911\uc694\uc131": 14, "\ud3ec\uc988\uc5d0\uc11c": 14, "\ud504\ub808\uc784\ubcc4\ub85c": 14, "dual": 14, "\uc870\uc808\ud55c\ub2e4": 14, "\uc218\uc815\ub41c\ub2e4": 14, "_p": 14, "s_i": 14, "s_p": 14, "\uac00\uc774\ub358\uc2a4": 14, "\uc6e8\uc774\ud2b8": 14, "\ucee8\ub514\uc154\ub2dd\uc774": 14, "\uacbd\uc6b0\uc640": 14, "\uacc4\uc0b0\ud558\uace0": 14, "\uacc4\uc0b0\ud574\uc11c": 14, "\uc6e8\uc774\ud2b8\ub97c": 14, "\uc870\uc815\ud574\uc11c": 14, "\ubcf4\uc7a5\ud558\uace0": 14, "\uc815\ub82c\uc744": 14, "\ubcf4\uc7a5\ud55c\ub2e4": 14, "\uac00\uc774\ub4dc\ub97c": 14, "\uac15\ud654\ud558\ub294": 14, "\uc5d0\uc678\ub3c4": 14, "\ubc29\uc9c0\ud55c\ub2e4": 14, "1500": 14, "pndm": 14, "\uc0d8\ud50c\ub7ec": 14, "100step": 14, "339\uac1c\uc758": 14, "30\ud504\ub808\uc784\uc774\uba70": 14, "\uae38\uc774\ub294": 14, "12\ucd08": 14, "\ube44\ub514\uc624\ub85c\ubd80\ud130": 14, "densepose\ub97c": 14, "\uacc4\uc0b0\ud558\uc600\ub2e4": 14, "mraa": 14, "thin": 14, "plate": 14, "spline": 14, "mothion": 14, "tpsmm": 14, "\uc218\uce58\uc801": 14, "\uc815\uc131\uc801\uc778": 14, "\uc2a4\ud06c\ub9bd\ud2b8\uc640": 14, "\uad8c\uc7a5": 14, "\uc5d0\ud3ed": 14, "\ud559\uc2b5\ud558\uc600\ub2e4": 14, "avd": 14, "\ubaa8\ub4dc\uc5d0\uc11c": 14, "\uc2a4\ud06c\ub9bd\ud2b8\ub97c": 14, "pidm\uacfc\ub3c4": 14, "pidm\uc758": 14, "deepfashion": 14, "\uccb4\ud06c\ud3ec\uc778\ud2b8\ub97c": 14, "\uc2a4\ud15d\uc744": 14, "\uc2e4\ud589\ud558\uc600\ub2e4": 14, "50\ud504\ub808\uc784": 14, "\uc774\uc0c1": 14, "50\uac1c\uc758": 14, "\ud14c\uc2a4\ud2b8\ud558\uc600\ub2e4": 14, "mraa\uc640": 14, "tpsmm\uc740": 14, "drive": 14, "video\uc5d0\uc11c": 14, "feautre\uc5d0": 14, "\uc758\uc874\ud558\ub294": 14, "uv": 14, "\uc2dc\ud000\uc2a4\uc5d0\ub9cc": 14, "\uc758\uc874\ud55c\ub2e4\ub294": 14, "\uc720\uc758\ud558\ub77c": 14, "\ub124": 14, "\ucde8\ud560": 14, "\uc637\uac10": 14, "\uc8fc\ub984": 14, "\ud328\ud134\uc774": 14, "\ubcc0\uacbd\ud558\ub294": 14, "mraa\ub294": 14, "\ud314": 14, "\ub2e4\ub9ac\uac00": 14, "pidm\uacfc\uc758": 14, "\uc5bc\uad74\uc758": 14, "\ud328\ud134": 14, "\uc5bc\uad74\uc744": 14, "\ud569\uc131\ud558\uc9c0\ub9cc": 14, "\uc77c\uce58\ud558\uc9c0": 14, "\uc637\ucc28\ub9bc\uc774": 14, "\ud504\ub808\uc784\ub9c8\ub2e4": 14, "\ub2ec\ub790\ub2e4": 14, "pidm\uc774": 14, "\ud569\uc131\uc5d0\uc11c\ub294": 14, "NO": 14, "\ud30c\uc778\ud29c\ub2dd\ud558\uc9c0": 14, "\ubc84\uc804": 14, "\ud3ec\uc988\ub9cc": 14, "\uc5f0\uacb0\ud55c": 14, "identity\uc5d0": 14, "\uc778\ucf54\ub354\ub85c": 14, "\uad50\uccb4\ud55c": 14, "\ub514\ud14c\uc77c\uc740": 14, "\ucea1\ucc98\ud560": 14, "\uc678\ud615\uc5d0": 14, "\ud30c\uc778\ud29c\ub2dd\ud558\uba74": 14, "\ub514\ud14c\uc77c\uc758": 14, "\uc120\uba85\ub3c4\uac00": 14, "\ud5a5\uc0c1\ub418\uace0": 14, "\uc624\ubc84\ud53c\ud305\uc774": 14, "\ubc1c\uc0dd\ud558\uc9c0": 14, "\uc785\ub825\ud558\uba74": 14, "\ud314\uacfc": 14, "\uba38\ub9ac\uce74\ub77d": 14, "\uc8fc\ubcc0\uc5d0\uc11c\uc758": 14, "\ud615\ud0dc\uac00": 14, "\ub098\ud0c0\ub0ac\ub2e4": 14, "\ub123\uc5b4\uc11c": 14, "\ud30c\uc778\ud29c\ub2dd\ud560": 14, "\ud5a5\uc0c1\ub41c\ub2e4": 14, "\uc2e4\ud328": 14, "\uc0ac\ub840": 14, "\ub4dc\ubb38": 14, "\uacbd\uc6b0\uc9c0\ub9cc": 14, "\ud314\ub2e4\ub9ac\uac00": 14, "\uc637": 14, "\uc18d\uc73c\ub85c": 14, "\uc0ac\ub77c\uc9c0\uace0": 14, "feature\uac00": 14, "\ud3ec\uc988\uac00": 14, "\ub4a4\ub97c": 14, "\ud5a5\ud560": 14, "\ubc29\ud5a5\uc774": 14, "\uc798\ubabb": 14, "\uad00\ucc30\ub41c\ub2e4": 14, "\ud328\ud134\uc758": 14, "\uc637\uc5d0\uc11c": 14, "\ud328\ud134\uc5d0\uc11c": 14, "\uae5c\ubc15\uc784": 14, "\ub3d9\uc791\uc744": 14, "vae\uc5d0": 14, "\ud30c\uc778\ud29c\ub2dd\uc740": 14, "18\ucd08\uc758": 14, "\ub80c\ub354\ub9c1": 14, "\uc678\uc758": 14, "10\ubd84": 14, "\ub514\ucf54\ub354\uc758": 14, "20\ubd84\uc774": 14, "\uc18c\uc694\ub41c\ub2e4": 14, "\uc2a4\ud2f8": 14, "\uc12c\uc720": 14, "\ud559\uc2b5\ud558\uc9c0\ub9cc": 32, "\ub85c\uc758": 32, "collect": 32, "transfigur": 32, "season": 32, "enhanc": 32, "\ub123\uc73c\uba74": 32, "section": 32, "\ucc38\uc870\ud558\uba74": 32, "\ud559\uc2b5\ud574\uc11c": 32, "\ub098\uc624\ub3c4\ub85d": 32, "\ubcc0\ud658\ud558\uace0": 32, "\ucc98\uc74c\uc758": 32, "\uc6d0\ubcf8\uc73c\ub85c": 32, "\uc77c\uc885\uc758": 32, "\uc21c\ud658": 32, "\ud504\ub85c\uc138\uc2a4\uac00": 32, "\uc548\uc815\uc801\uc774\uac8c": 32, "gram": 32, "\uc77c\uce58\ub97c": 32, "\ub4e0": 32, "\ud604\uc0c1\uc785\ub2c8\ub2e4": 32, "\ud544\uc694\ud574\uc84c\uc2b5\ub2c8\ub2e4": 32, "\ud45c\uae30": 32, "d_x": 32, "d_y": 32, "\uad6c\ubd84\ud558\uace0": 32, "\ubaa9\uc801\uc2dd\uc73c\ub85c": 32, "\ub098\uc635\ub2c8\ub2e4": 32, "norm": 32, "\uc5c6\uc5c8\ub2e4\uace0": 32, "\uc640\uc758": 32, "\uacb0\uc815\ub429\ub2c8\ub2e4": 32, "\ub85c\uc11c": 32, "1603": 32, "08155": 32, "\ucc44\ud0dd\ud569\ub2c8\ub2e4": 32, "\ucc38\uace0\ud588\uc73c\uba70": 32, "\uc5c5\ub370\uc774\ud2b8\uc2dc": 32, "\uc2e4\ud5d8\uc5d0": 32, "0002": 32, "\uc124\uc815\ud588\uace0": 32, "\ud558\uc600\uc2b5\ub2c8\ub2e4": 32, "fcn": 32, "\uc88b\uc744": 32, "\uacb0\uacfc\uc5d0\uc11c": 32, "\uc5c6\uc5c8\uc2b5\ub2c8\ub2e4": 32, "\ub2a5\uac00\ud569\ub2c8\ub2e4": 32, "\uc81c\uac70\ud558\uba74": 32, "\ud55c\ucabd": 32, "reconctruct": 32, "\uc608\uc2dc\ub4e4\uc785\ub2c8\ub2e4": 32, "\ub9ce\uc558\uc2b5\ub2c8\ub2e4": 32, "facad": 32, "\uc2e0\ubc1c": 32, "\ube44\ub86f\ud558\uc5ec": 32, "\uc785": 32, "\uad6c\uc870\uc5d0": 32, "diffinject": 43, "revisit": 43, "debia": 43, "dongjun": 43, "namjun": 43, "jaekwang": 43, "workshop": 43, "\uc774\ucc3d\ud658": 43}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"inform": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "synthet": [0, 2, 27], "data": [0, 5, 11, 13, 27], "stabl": [0, 3, 14, 29, 41], "diffus": [0, 3, 8, 11, 12, 14, 16, 18, 19, 23, 25, 27, 28, 29, 30, 31, 34, 35, 37, 39, 40, 41], "foliar": 0, "diseas": 0, "classif": [0, 27], "1": [0, 2, 3, 5, 8, 10, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 25, 27, 29, 31, 33, 34, 39, 40, 41], "\uac1c\uc694": 0, "2": [0, 2, 3, 5, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 24, 25, 27, 29, 31, 33, 34, 39, 40, 41], "baselin": [0, 32], "\uad6c\ucd95": 0, "3": [0, 2, 3, 5, 8, 10, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 24, 25, 27, 29, 31, 33, 34, 39, 40, 41], "fine": [0, 5, 8, 16, 27, 29, 35, 39], "tune": [0, 5, 8, 16, 27, 29, 35, 39], "4": [0, 2, 3, 5, 8, 10, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 24, 25, 27, 29, 31, 34, 39, 40, 41], "\uc131\ub2a5": 0, "\ube44\uad50": [0, 28], "5": [0, 2, 3, 8, 10, 12, 13, 14, 18, 20, 21, 22, 24, 25, 27, 31, 34, 40], "discuss": [0, 8], "6": [0, 10, 12, 14, 18, 27, 31, 34], "appendix": [0, 1, 35], "train": [1, 3, 5, 7, 8, 11, 13, 16, 21, 22, 24, 27, 31, 32, 33, 36, 40, 42], "dreambooth": [1, 17, 29, 35], "naver": 1, "webtoon": 1, "face": [1, 25], "dataset": [1, 2, 14, 21, 32, 39], "introduct": [1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 23, 24, 25, 27, 28, 31, 33, 34, 35, 36, 37, 39, 40, 41, 42], "ablat": [1, 3, 14, 32, 35, 37, 41], "studi": [1, 2, 3, 14, 32, 35, 37, 39, 41], "prior": [1, 33], "preserv": 1, "loss": [1, 11, 32, 40], "neg": [1, 6], "prompt": 1, "instanc": 1, "guidanc": [1, 5, 14, 16, 22, 34, 37, 39], "scale": [1, 11, 15, 18, 27, 39], "A": [2, 21, 22], "evalu": [2, 5, 6, 21, 32, 37], "gener": [2, 3, 5, 6, 8, 10, 12, 23, 27, 29, 31, 39], "model": [2, 3, 5, 8, 11, 12, 13, 14, 16, 18, 19, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 34, 35, 37, 39, 40, 41], "\ud559\uc2b5": 2, "\uc790\ub8cc": 2, "0": [2, 20], "abstract": [2, 3, 5, 8, 10, 12, 13, 15, 16, 18, 20, 23, 24, 25, 28, 29, 32, 34], "background": [2, 10, 11, 12, 14, 16, 27, 32, 33, 34, 40], "kl": 2, "diverg": 2, "kullback": 2, "leibler": 2, "incept": 2, "score": [2, 23, 27], "IS": [2, 27], "fid": [2, 27], "fr\u00e9chet": 2, "distanc": 2, "kernel": 2, "clean": 2, "benchmark": 2, "comparison": [2, 3, 6, 12, 14, 17, 18, 32, 41], "between": 2, "metric": [2, 21], "Is": 2, "all": 2, "we": 2, "need": 2, "anim": [3, 14], "anyon": 3, "relat": [3, 6, 8, 14, 17, 23, 25, 27, 28, 32], "work": [3, 6, 8, 14, 17, 21, 23, 25, 27, 28, 32, 33, 34], "imag": [3, 5, 7, 8, 12, 14, 15, 16, 21, 29, 31, 32, 34, 35, 39], "video": [3, 14, 21, 29], "human": [3, 21, 37], "method": [3, 6, 8, 14, 15, 17, 20, 21, 23, 25, 28, 32, 41], "preliminari": [3, 39, 41], "network": [3, 21, 26, 32], "architectur": [3, 13, 14, 22, 32, 34], "strategi": [3, 5], "experi": [3, 6, 8, 10, 11, 12, 14, 15, 17, 19, 20, 21, 23, 25, 29, 31, 35, 36, 39, 40, 41, 42], "implement": [3, 7, 14, 32, 41], "qualit": [3, 6, 14, 21, 37], "result": [3, 5, 6, 7, 14, 16, 21, 22, 27, 32, 33, 34, 36, 37, 39], "limit": [3, 6, 8, 14, 28, 32, 33, 34, 35], "bbdm": 4, "cm3leon": 5, "pretrain": [5, 37], "token": [5, 22], "retriev": 5, "augment": [5, 39], "object": [5, 6, 11, 32, 40], "function": [5, 11, 32], "text": [5, 8, 15, 16, 21, 22, 28, 29, 35, 39], "To": [5, 21, 39], "import": 5, "decod": [5, 11, 22], "temperatur": 5, "sampl": [5, 10, 11, 18, 27, 40], "topp": 5, "classifi": [5, 14, 16, 22, 30, 34, 37], "free": [5, 14, 16, 22, 37], "cfg": 5, "contrast": 5, "topk": 5, "cd": 5, "k": 5, "quantit": [5, 6, 12, 14, 21], "supervis": 5, "instruct": 5, "guid": [5, 16, 28, 39], "edit": [5, 8, 12, 31], "ground": 5, "spatial": 5, "caption": 5, "visual": [5, 33], "question": 5, "answer": 5, "task": 5, "conceptlab": 6, "prelimiari": [6, 17], "The": [6, 39], "constraint": 6, "regular": [6, 26], "adapt": [6, 8, 34, 41], "evolutionari": 6, "creativ": 6, "concept": [6, 8], "mix": [6, 26], "setup": [6, 28], "conclus": [6, 12, 14, 17, 25, 27, 33, 37, 39], "controlnet": 7, "addit": [7, 20, 32], "control": 7, "base": [7, 22, 23], "condit": [7, 14, 16, 24], "block": [7, 13], "zero": [7, 30, 31], "convolut": [7, 21], "custom": [8, 39], "deep": 8, "transfer": 8, "learn": [8, 33], "singl": 8, "multipl": [8, 14], "composit": 8, "detail": [8, 14, 32, 33, 41], "dall": [9, 28, 33], "e": [9, 28, 33], "ddim": [10, 12, 34], "ddpm": [10, 11, 12, 18, 34, 40], "variat": [10, 26, 42], "infer": [10, 13, 20, 22], "For": 10, "non": 10, "markovian": 10, "forward": [10, 11], "process": [10, 11, 12], "from": [10, 27, 37], "code": 10, "q": [11, 22], "mathbf": 11, "x": 11, "_t": 11, "_": 11, "t": [11, 20], "revers": [11, 12], "p": 11, "l": 11, "denois": [11, 12, 18], "encod": [11, 14, 22], "l_t": 11, "l_": 11, "l_0": 11, "simplifi": 11, "qualiti": [11, 12, 27, 32], "alreadi": 12, "have": 12, "semant": [12, 22], "latent": [12, 19, 28, 29, 39], "space": [12, 39], "probabl": [12, 40], "implicit": 12, "manipul": 12, "clip": [12, 14, 16], "discov": 12, "In": 12, "problem": [12, 20], "asymmetr": 12, "asyrp": 12, "h": 12, "neural": 12, "direct": 12, "design": [12, 41], "With": 12, "boost": 12, "stochast": [12, 26, 42], "nois": [12, 16], "inject": 12, "overal": 12, "versatil": 12, "analysi": [12, 14, 32], "dreamov": 13, "collect": 13, "preprocess": 13, "motion": 13, "content": [13, 43], "guider": 13, "gigagan": [], "\uc8fc\uc694": 15, "\uc9c8\uc758\uc751\ub2f5": 15, "glide": 16, "inpaint": 16, "hyperdreambooth": 17, "contribut": [17, 21, 22, 37], "lightweight": 17, "lidb": 17, "hypernetwork": 17, "rank": [17, 20], "relax": 17, "fast": [17, 40], "finetun": [14, 17, 22, 29], "follow": 17, "up": [15, 17], "i": 18, "probabilist": 18, "improv": [18, 24, 27, 34], "log": 18, "likelihood": 18, "improc": 18, "speed": 18, "gan": [15, 18, 28, 34, 36], "size": 18, "lora": 20, "terminolog": 20, "convent": 20, "statement": 20, "aren": 20, "exist": 20, "solut": 20, "good": 20, "enough": 20, "our": 20, "low": 20, "parameter": [20, 40], "updat": 20, "matric": 20, "No": 20, "latenc": 20, "appli": 20, "transform": [20, 33], "empir": 20, "ia3": 20, "aa": 20, "\uc0ac\uc6a9\ubc95": 20, "refer": 20, "make": 21, "\uc81c\uc548": 21, "\ubc30\uacbd": 21, "\ud2b9\uc131": 21, "previou": [21, 33], "spatiotempor": 21, "layer": 21, "pseudo": [21, 28], "3d": 21, "psuedo": 21, "attent": 21, "frame": [21, 29], "interpol": [21, 29], "set": 21, "automat": 21, "evaluaton": 21, "msr": 21, "vtt": 21, "evluat": 21, "ucf": 21, "101": 21, "\uacb0\ub860": 21, "muse": 22, "mask": 22, "pre": 22, "us": [22, 43], "vqgan": 22, "super": [22, 37], "resolut": [22, 29, 37], "7": [14, 22, 34], "8": [14, 22, 34], "iter": 22, "parallel": 22, "sdedit": 23, "sde": 23, "smld": 23, "sdxl": 24, "micro": 24, "crop": 24, "paramet": [24, 27, 34], "multi": 24, "aspect": 24, "autoencod": [24, 29], "put": 24, "everyth": 24, "togeth": 24, "refin": 24, "stage": [24, 33, 39], "styo": 25, "styliz": 25, "framework": 25, "stylegan": 26, "map": 26, "style": 26, "adain": 26, "\uc2e4\ud5d8": 26, "\uacb0\uacfc": [26, 28], "imagenet": 27, "imagen": [27, 37, 38], "protocol": 27, "accuraci": 27, "differ": 27, "merg": 27, "real": 27, "textual": 28, "invers": 28, "cf": 28, "\uc774\ud574": 28, "\ubabb\ud568": 28, "ldm": 28, "embed": 28, "\uc131\ub2a5\ud3c9\uac00": 28, "2\uc640": 28, "synthesi": [14, 15, 28, 29, 34], "word": 28, "\ub450": 28, "\uac1c": 28, "\uc0ac\uc6a9": 28, "bia": 28, "reduct": 28, "\uc815\ub7c9\ud3c9\uac00": 28, "\ud3c9\uac00": 28, "\uc8fc\ubaa9\ud560": 28, "\uc810": 28, "\uc0ac\uc6a9\uc790\ud3c9\uac00": 28, "\ub9c8\ubb34\ub9ac": 28, "videoldm": 29, "turn": 29, "tempor": 29, "predict": 29, "long": 29, "term": 29, "high": 29, "rate": 29, "sr": 29, "drive": 29, "person": 29, "your": 30, "secretli": 30, "shot": [30, 31], "consist": [31, 32, 39], "via": [14, 31], "distil": [31, 39, 40], "isol": 31, "few": 31, "step": [31, 39], "cyclegan": 32, "\ucc38\uace0": 32, "translation\uc774\ub780": [], "mode": 32, "collapse\ub780": [], "\uad00\ub828": [], "\uc5f0\uad6c": [], "formul": [], "adversari": 32, "cycl": 32, "full": 32, "\uc804\uccb4": [], "\ubaa9\uc801\uc2dd": [], "least": 32, "squar": 32, "\ucd94\uac00": 32, "\uc124\uba85": 32, "\uae30\ud0c0": [], "against": 32, "fcn": [], "\ub4f1": [], "reconstruct": 32, "pair": 32, "dataset\uc5d0": [], "\ub300\ud55c": [], "applic": [35, 41], "transfigur": [], "season": [], "photo": [], "paint": [], "enhanc": [], "gati": [], "discusss": 32, "gpt": 33, "vq": 33, "vae": [14, 33, 42], "methodolog": [33, 37], "overview": [14, 32, 33, 41], "an": 33, "autoregress": 33, "pipelin": 33, "\uc608\uc2dc": 33, "equat": 33, "\ud559\uc2b5\uacfc\uc815": 33, "codebook": 33, "beat": 34, "group": 34, "normal": 34, "algorithm": [34, 42], "impact": 34, "s": 34, "9": 34, "futur": [14, 34], "procedur": 36, "theoret": 36, "summari": [36, 42], "t5": 37, "xxl": 37, "cascad": 37, "larg": 37, "weight": 37, "sampler": 37, "static": 37, "threshold": 37, "dynam": 37, "drawbench": 37, "tabl": 37, "editor": 38, "progress": 40, "continu": 40, "time": [39, 40], "definit": 40, "ancestr": 40, "flow": 40, "od": [39, 40], "parametr": 40, "t2i": 41, "optim": 41, "intract": 42, "sgvb": 42, "gradient": 42, "bay": 42, "reparameter": 42, "trick": 42, "feat": [], "contributor": 43, "about": 43, "One": 39, "solv": 39, "pf": 39, "acceler": 39, "skip": 39, "abul": 39, "solver": 39, "schedul": 39, "effect": 39, "omega": 39, "downstream": 39, "dreampos": 14, "fashion": 14, "still": 14, "mechan": 14, "split": 14, "modifi": 14, "unet": 14, "pose": 14, "input": 14, "translat": 32, "collaps": 32, "welcom": 43, "pseudodiffus": 43, "public": 43, "tech": 43, "blog": 43}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["docs/experiments/js_exp", "docs/experiments/swjo_exp", "docs/review/A_Study_on_the_Evaluation_of_Generative_Models", "docs/review/Animate_Anyone", "docs/review/BBDM", "docs/review/CM3leon", "docs/review/ConceptLab", "docs/review/ControlNet", "docs/review/CustomDiffusion", "docs/review/DALLE2", "docs/review/DDIM", "docs/review/DDPM", "docs/review/Diffusion_models_already_have_a_Semantic_Latent_Space", "docs/review/DreaMoving", "docs/review/DreamPose", "docs/review/GIGAGAN", "docs/review/GLIDE", "docs/review/HyperDreamBooth", "docs/review/I-DDPM", "docs/review/Latent_Diffusion_Model", "docs/review/LoRA", "docs/review/Make_A_Video", "docs/review/Muse", "docs/review/NeRF", "docs/review/SDEdit", "docs/review/SDXL", "docs/review/StyO", "docs/review/StyleGAN", "docs/review/Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification", "docs/review/Textual_Inversion", "docs/review/VideoLDM", "docs/review/Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier", "docs/review/consistency_models", "docs/review/cycleGAN", "docs/review/dalle", "docs/review/diffusion_beats_GANs", "docs/review/dreambooth", "docs/review/gan", "docs/review/imagen", "docs/review/imagen_editor", "docs/review/latent_consistency_models", "docs/review/progressive_distillation", "docs/review/t2i_adapter", "docs/review/vae", "intro"], "filenames": ["docs\\experiments\\js_exp.md", "docs\\experiments\\swjo_exp.md", "docs\\review\\A_Study_on_the_Evaluation_of_Generative_Models.md", "docs\\review\\Animate_Anyone.md", "docs\\review\\BBDM.md", "docs\\review\\CM3leon.md", "docs\\review\\ConceptLab.md", "docs\\review\\ControlNet.md", "docs\\review\\CustomDiffusion.md", "docs\\review\\DALLE2.md", "docs\\review\\DDIM.md", "docs\\review\\DDPM.md", "docs\\review\\Diffusion_models_already_have_a_Semantic_Latent_Space.md", "docs\\review\\DreaMoving.md", "docs\\review\\DreamPose.md", "docs\\review\\GIGAGAN.md", "docs\\review\\GLIDE.md", "docs\\review\\HyperDreamBooth.md", "docs\\review\\I-DDPM.md", "docs\\review\\Latent_Diffusion_Model.md", "docs\\review\\LoRA.md", "docs\\review\\Make_A_Video.md", "docs\\review\\Muse.md", "docs\\review\\NeRF.md", "docs\\review\\SDEdit.md", "docs\\review\\SDXL.md", "docs\\review\\StyO.md", "docs\\review\\StyleGAN.md", "docs\\review\\Synthetic_Data_from_Diffusion_Models_Improves_ImageNet_Classification.md", "docs\\review\\Textual_Inversion.md", "docs\\review\\VideoLDM.md", "docs\\review\\Your_Diffusion_Model_is_Secretly_a_Zero_Shot_Classifier.md", "docs\\review\\consistency_models.md", "docs\\review\\cycleGAN.md", "docs\\review\\dalle.md", "docs\\review\\diffusion_beats_GANs.md", "docs\\review\\dreambooth.md", "docs\\review\\gan.md", "docs\\review\\imagen.md", "docs\\review\\imagen_editor.md", "docs\\review\\latent_consistency_models.md", "docs\\review\\progressive_distillation.md", "docs\\review\\t2i_adapter.md", "docs\\review\\vae.md", "intro.md"], "titles": ["Synthetic Data with Stable Diffusion for Foliar Disease Classification", "Training DreamBooth on Naver Webtoon Face Dataset", "A Study on the Evaluation of Generative Models", "Animate Anyone", "BBDM", "CM3leon", "ConceptLab", "ControlNet", "Custom Diffusion", "DALL-E 2", "DDIM", "DDPM", "Diffusion Models already have a Semantic Latent Space", "DreaMoving", "DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion", "Scaling up GANs for Text-to-Image Synthesis", "GLIDE", "HyperDreamBooth", "I-DDPM", "Latent Diffusion Model", "LoRA", "Make A Video", "Muse", "NeRF : Representing Scenes as Neural Radiance Fields for View Synthesis", "SDEdit", "SDXL", "StyO", "StyleGAN", "Synthetic Data from Diffusion Models Improves ImageNet Classification", "Textual Inversion", "VideoLDM", "Your Diffusion Model is Secretly a Zero-Shot Classifier", "Consistency Models", "CycleGAN", "DALL-E", "Diffusion Models Beat GANs on Image Synthesis", "DreamBooth", "GAN", "Imagen", "Imagen Editor", "Latent Consistency Models", "Progressive Distillation for Fast Sampling of Diffusion Models", "T2I-Adapter", "VAE", "Welcome to PseudoDiffusers!!"], "terms": {"titl": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "author": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "jisu": [0, 7, 27, 44], "kim": [0, 4, 7, 9, 27, 31, 44], "last": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "updat": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "jul": [0, 1], "05": [0, 2, 25], "2023": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 38, 39, 41, 42], "\uc0ac\uacfc": 0, "\ub098\ubb34\uc758": 0, "\uc78e\uc5d0": 0, "\uc0dd\uae30\ub294": [0, 28], "\uc9c8\ubcd1\uc744": 0, "\uc774\ubbf8\uc9c0\ub85c": [0, 1, 6, 8, 17, 23, 25, 26, 38, 39, 42], "\ud310\ubcc4\ud558\ub294": 0, "kaggl": 0, "competit": [0, 31, 32, 35], "\ub9c1\ud06c": [0, 7], "\uc5d0\uc11c": [0, 2, 4, 6, 7, 9, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 28, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43], "\uc544\uc774\ub514\uc5b4\ub97c": 0, "\uc5bb\uc5b4\uc11c": 0, "\uc9c4\ud589\ud55c": [0, 16, 41], "\ud504\ub85c\uc81d\ud2b8\uc785\ub2c8\ub2e4": 0, "\ud574\ub2f9": [0, 2, 3, 6, 8, 11, 14, 16, 17, 19, 21, 22, 23, 24, 28, 29, 31, 32, 33, 36, 42, 43], "competition\uc740": 0, "\uc0ac\uacfc\ub098\ubb34": 0, "\uac78\ub9b0": 0, "\uc9c8\ubcd1\uc5d0": 0, "\ub530\ub77c": [0, 2, 3, 4, 5, 6, 9, 12, 14, 16, 17, 18, 20, 22, 23, 25, 28, 29, 31, 32, 33, 34, 35, 36, 40, 43], "\uc78e": 0, "\uc774\ubbf8\uc9c0\ub97c": [0, 2, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 38, 40, 42], "4\uac1c\uc758": [0, 9, 21, 23, 29, 41, 42], "class\ub85c": 0, "\ubd84\ub958\ud558\ub294": [0, 16, 42], "task\uc785\ub2c8\ub2e4": 0, "class": [0, 7, 8, 10, 11, 15, 16, 18, 21, 27, 28, 31, 33, 35, 36, 37, 38, 42, 43], "leav": [0, 31], "competition\uc744": 0, "\uc124\uba85\ud55c": [0, 21, 42], "articl": 0, "\uc804\uccb4\uc801\uc778": [0, 9, 12, 27, 32, 43], "accuracy\ub294": 0, "97": [0, 31], "\uc774\uc9c0\ub9cc": [0, 23], "multipl": [0, 15, 22, 42], "class\uc758": [0, 2, 35], "\uacbd\uc6b0": [0, 1, 4, 6, 7, 8, 12, 14, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 37, 40, 42, 43], "accuracy\uac00": 0, "51": 0, "\uc5d0": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "\ubd88\uacfc\ud588\ub2e4\uace0": 0, "\uc5b8\uae09\ud569\ub2c8\ub2e4": 0, "\uc774\ubbf8\uc9c0": [0, 2, 3, 5, 6, 7, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "\uac1c\uc218\uac00": 0, "\ub2e4\ub978": [0, 2, 3, 4, 6, 8, 10, 11, 12, 14, 16, 17, 18, 20, 21, 22, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 38, 39, 41, 42, 43], "class\uc5d0": [0, 12, 16], "\ube44\ud574": [0, 4, 5, 7, 8, 10, 12, 14, 16, 17, 18, 22, 26, 28, 32, 35, 39, 40, 43], "\uc801\uc740": [0, 2, 5, 7, 8, 10, 11, 16, 18, 20, 21, 29, 30, 31, 35, 40], "\uc810\uc5d0": [0, 14], "\uc8fc\ubaa9\ud588\uace0": 0, "diffusion\uc744": [0, 3, 6, 14, 24, 40], "\uc0ac\uc6a9\ud558\uc5ec": [0, 6, 11, 12, 14, 17, 21, 23, 27, 28, 32, 33, 34, 36, 37, 38, 40, 41], "\ud074\ub798\uc2a4\uc758": [0, 6, 28], "\ub370\uc774\ud130": [0, 2, 3, 21, 23, 24, 25, 28, 29, 30, 31, 33, 34, 37, 38, 40, 43], "\uac1c\uc218\ub97c": [0, 11], "\ub298\ub824\uc11c": 0, "classifi": [0, 12, 28, 30, 37, 39, 40, 42], "\ud559\uc2b5\uc5d0": [0, 5, 14, 15, 18, 20, 28, 30, 40], "\uc0ac\uc6a9\ud558\uba74": [0, 18, 22, 29, 30, 34], "\ub354": [0, 1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43], "\uc88b\uc740": [0, 1, 2, 4, 8, 12, 14, 15, 16, 21, 24, 25, 26, 28, 32, 33, 35, 36, 37, 38, 40, 41, 42], "\uc131\ub2a5\uc758": [0, 28], "classifier\ub97c": [0, 12, 14, 16], "\uc5bb\uc744": [0, 6, 12, 25, 28, 29, 31, 32, 33, 40], "\uc218": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "\uc788\uc744": [0, 1, 3, 4, 7, 11, 20, 22, 23, 27, 28, 31, 33], "\uac83\uc73c\ub85c": [0, 14, 16, 20, 21, 23, 28, 29, 30, 31], "\uae30\ub300\ud588\uc2b5\ub2c8\ub2e4": 0, "\ubb38\uc81c": [0, 3, 42], "\uc0c1\ud669\uc744": [0, 32], "\uc7ac\ud604\ud558\uae30": 0, "\uc704\ud574": [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 25, 26, 27, 29, 30, 32, 33, 34, 36, 39, 40, 41, 42], "\uae30\uc874": [0, 5, 6, 7, 8, 12, 14, 16, 17, 18, 19, 20, 21, 23, 25, 26, 27, 28, 29, 30, 32, 35, 38, 40, 41, 42], "\ub370\uc774\ud130\ub85c": [0, 1, 2, 7, 25, 28, 30, 31, 33, 40], "imag": [0, 1, 2, 4, 6, 9, 10, 13, 17, 19, 22, 23, 24, 25, 26, 27, 28, 29, 31, 34, 37, 38, 39, 41, 42, 43, 44], "\ud559\uc2b5\ud558\uc5ec": [0, 34, 35, 40, 41], "baseline\uc73c\ub85c": 0, "\uc7a1\uc558\uc2b5\ub2c8\ub2e4": 0, "\ubaa8\ub378\uc740": [0, 3, 4, 5, 6, 9, 14, 17, 18, 19, 20, 22, 23, 24, 25, 27, 28, 29, 33, 37, 40, 41, 42], "pretrained\ub41c": 0, "resnet18\uc5d0": 0, "linear": [0, 2, 4, 11, 12, 16, 18, 20, 27, 35, 37, 43], "layer\ub97c": [0, 3, 15, 20, 21, 22, 27, 30], "\ubd99\uc5ec\uc11c": 0, "\uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4": [0, 9, 17, 33, 39], "\uc804\uccb4": [0, 3, 4, 6, 7, 8, 12, 14, 16, 17, 18, 21, 30, 40], "7": [0, 1, 2, 3, 4, 5, 10, 11, 18, 23, 24, 32, 38, 40, 42], "class\ubcc4": 0, "healthi": 0, "99": 0, "73": [0, 29], "rust": 0, "scab": 0, "98": 0, "class\ub294": [0, 15], "\uac1c\uc218": 0, "91\uac1c\ub85c": 0, "\ud074\ub798\uc2a4\ub4e4\uc5d0": 0, "\ube44\ud574\uc11c": [0, 9], "\uc801\uc2b5\ub2c8\ub2e4": 0, "imbalance\uac00": 0, "\uc131\ub2a5\uc744": [0, 2, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42], "\ub0ae\ucd94\ub294": 0, "\uc6d0\uc778\uc77c": [0, 28], "\uac83\uc774\ub77c": [0, 20], "\uac00\uc815\ud558\uace0": [0, 32], "diffusion\uc73c\ub85c": [0, 28], "data\ub97c": [0, 8], "\ucd94\uac00\ub85c": [0, 5, 14, 18, 21, 25, 26, 33], "\uc0dd\uc131\ud574\ubcf4\uae30\ub85c": 0, "\ud588\uc2b5\ub2c8\ub2e4": [0, 1, 9, 27, 28, 37], "\uc608\uc2dc": [0, 3, 5, 14, 21, 23, 33, 38, 39, 41, 42], "pretran": 0, "diffusion\uc758": [0, 15], "\ub300\ud55c": [0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23, 25, 26, 28, 29, 30, 32, 33, 36, 37, 40, 41, 42, 43], "\uc815\ubcf4\uac00": [0, 9, 14, 17, 26, 30, 36], "\uc5c6\uc5b4\uc11c": [0, 14], "\uc0dd\uc131\ud560": [0, 1, 5, 6, 7, 9, 15, 17, 21, 22, 24, 25, 28, 30, 32, 33, 36, 40], "\uc544\ub798\uc640": [0, 4, 6, 7, 12, 14, 19, 27, 28, 33, 35, 43], "\uac19\uc774": [0, 4, 6, 7, 8, 9, 11, 12, 14, 15, 17, 19, 21, 22, 27, 29, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43], "\uad00\ub828\uc5c6\ub294": 0, "\uc774\ubbf8\uc9c0\uac00": [0, 7, 9, 11, 14, 15, 17, 18, 21, 22, 24, 25, 26, 28, 29, 33, 35, 37, 38], "\uc0dd\uc131\ub429\ub2c8\ub2e4": [0, 6], "prompt": [0, 3, 7, 8, 9, 13, 15, 16, 17, 22, 26, 29, 30, 31, 36, 38, 39, 42], "photo": [0, 1, 4, 6, 8, 29, 33], "\ub530\ub77c\uc11c": [0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 17, 18, 22, 24, 25, 26, 28, 29, 30, 31, 33, 39, 40, 41, 42], "model": [0, 4, 6, 7, 9, 10, 15, 17, 20, 23, 33, 34, 37, 39, 44], "\uc815\ubcf4\ub97c": [0, 3, 7, 9, 11, 12, 14, 17, 21, 22, 26, 28, 29, 30, 33, 36, 42], "\ub123\uc5b4\uc8fc\uae30": 0, "dreambooth": [0, 8, 13, 14], "\ub97c": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "tuning\ud588\uc2b5\ub2c8\ub2e4": 0, "training\uc5d0": [0, 10, 35], "\uc0ac\uc6a9\ud55c": [0, 5, 12, 14, 17, 21, 23, 25, 27, 28, 29, 35], "prompt\ub294": [0, 17], "disea": 0, "leaf": 0, "\uc774\uba70": [0, 4, 29, 32, 40], "\uc0dd\uc131\ud55c": [0, 7, 9, 21, 33, 34, 36, 38, 41, 42], "\uc774\ubbf8\uc9c0\uc758": [0, 1, 2, 7, 8, 9, 11, 14, 15, 26, 27, 28, 29, 33, 34, 36, 38], "\uc608\uc2dc\ub294": [0, 38, 42], "\uac19\uc2b5\ub2c8\ub2e4": [0, 1, 7, 9, 22, 27, 28, 32, 33, 36, 37, 42, 43], "\uc0dd\uc131": [0, 2, 3, 5, 6, 9, 10, 11, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 40, 41, 42], "engineering\uc744": 0, "\uc218\ud589\ud558\ub358": 0, "\uc911": [0, 3, 5, 6, 8, 10, 13, 17, 18, 20, 24, 25, 26, 27, 28, 32, 33, 34, 35, 36, 37, 38, 42, 43], "\uc758\ub3c4\ud558\uc9c0\uc54a\uc740": 0, "\uacb0\uacfc\ub97c": [0, 3, 4, 5, 6, 7, 9, 10, 12, 14, 16, 17, 18, 21, 22, 23, 25, 26, 27, 28, 29, 30, 32, 33, 38, 39, 40, 41], "\ubc1c\uacac\ud588\uc2b5\ub2c8\ub2e4": [0, 1, 9], "\uc544\ub798\ub294": [0, 7, 24, 43], "\uc774\uc5d0": [0, 3, 4, 6, 7, 12, 13, 17, 23, 26, 28, 32, 36, 41, 42, 43], "\uc608\uc2dc\ub85c": [0, 31], "\uc804\uc758": [0, 25], "model\uc758": [0, 2, 3, 7, 8, 11, 12, 17, 18, 20, 28, 29, 35, 40], "\uacb0\uacfc\uc640": [0, 9, 23, 41], "\ube44\uad50\uc785\ub2c8\ub2e4": 0, "\uc0c1\ud6691": 0, "\uc804": [0, 11, 20, 23, 25, 28, 35], "\ud6c4": [0, 1, 2, 4, 5, 9, 11, 12, 13, 14, 16, 20, 22, 23, 24, 25, 30, 32, 33, 34, 36, 38, 39, 42], "\uc0c1\ud6691\uc744": 0, "\ubcf4\uba74": [0, 2, 4, 8, 12, 15, 16, 18, 25, 27, 28, 29, 33, 34, 37, 40], "\ub2f4\uc740": 0, "uniqu": [0, 1, 36], "identifi": [0, 1, 26, 36], "\uac00": [0, 1, 4, 6, 7, 9, 11, 12, 14, 16, 17, 18, 20, 21, 22, 23, 25, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43], "\uc5c6\uc74c\uc5d0\ub3c4": [0, 16], "diseases\uc758": 0, "\uc78e\ub4e4\ub9cc": 0, "\uc774\ub294": [0, 2, 3, 5, 6, 7, 10, 12, 14, 17, 23, 25, 27, 28, 29, 30, 32, 33, 37, 39, 40, 41, 42, 43], "\uac19\uc740": [0, 1, 3, 4, 5, 6, 7, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 27, 28, 29, 31, 32, 33, 35, 36, 39, 40, 41, 42, 43], "\uc18d\ud558\ub294": [0, 6], "\uc774\ubbf8\uc9c0\ub4e4\uc744": [0, 1, 2, 4, 7, 9, 23, 32, 36, 39], "\uc0dd\uc131\ud574\ub0b4\uc9c0": [0, 8], "\ubabb\ud558\uace0": [0, 11], "\uc788\ub2e4\ub294": [0, 16, 17, 20, 27, 29, 32, 38, 39, 40], "\uac83\uc785\ub2c8\ub2e4": [0, 7, 9, 17, 27, 28, 33, 39, 41], "\uc774": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 42, 43], "\ud604\uc0c1\uc744": [0, 8, 27, 41], "languag": [0, 5, 8, 9, 20, 21, 28, 29, 34, 36, 38], "drift\ub77c\uace0": 0, "\ud558\uba70": [0, 4, 34], "\ubaa8\ub378\uc774": [0, 1, 3, 5, 6, 7, 8, 10, 11, 14, 15, 17, 21, 22, 23, 25, 26, 27, 28, 30, 32, 35, 36, 37, 39, 41, 42], "leaf\uac00": 0, "\uc544\ub2cc": [0, 1, 4, 6, 7, 10, 12, 14, 20, 29, 33, 35, 37, 40, 41], "\uc77c\ubc18\uc801\uc778": [0, 5, 8, 14, 17, 25, 29, 31, 35], "\uad00\ud55c": [0, 18, 26, 27], "\uc78a\uc5b4\ubc84\ub838\uae30": 0, "\ub54c\ubb38\uc785\ub2c8\ub2e4": 0, "\uc0c1\ud6692": 0, "\uc0c1\ud6692\ub97c": 0, "photo\ub77c\ub294": 0, "prompt\ub9cc": [0, 13, 26], "\uc0ac\uc6a9\ud558\uc600\ub294\ub370\ub3c4": 0, "\uc774\ubbf8\uc9c0\ub4e4\uc5d0": [0, 9], "\ud2b9\uc9d5\ub4e4\uc774": 0, "\ub098\ud0c0\ub0a9\ub2c8\ub2e4": 0, "dreambooth\uc5d0\uc11c\ub294": 0, "drift\ub97c": 0, "prior": [0, 6, 9, 14, 21, 36, 43], "preserv": [0, 36, 41], "loss\ub97c": [0, 5, 11, 12, 15, 22, 29], "\uc0ac\uc6a9\ud574\uc11c": [0, 4, 7, 9, 12, 16, 22, 34, 35, 38], "\ud574\uacb0\ud558\uc600\uc73c\ubbc0\ub85c": 0, "\ubc29\ubc95\uc744": [0, 3, 4, 5, 6, 12, 14, 16, 17, 18, 23, 25, 27, 28, 29, 31, 33, 35, 40, 42], "\ud574\uacb0\ud558\uae30": [0, 4, 6, 12, 20, 25, 29, 30, 32, 36, 39, 40, 41, 42], "train": [0, 2, 4, 9, 10, 12, 14, 15, 17, 18, 20, 23, 26, 27, 29, 30, 31, 35, 36, 38, 40, 42], "prompt\uc5d0\uc11c": 0, "\uc81c\uc678\ud558\uace0": [0, 20, 25], "\ucd5c\ub300\ud55c": [0, 14, 25, 29, 33, 42, 43], "\ub2e8\uc21c\ud55c": [0, 8, 14, 41], "model\uc744": [0, 2, 3, 6, 7, 8, 10, 12, 14, 15, 16, 17, 18, 20, 25, 26, 29, 32, 35, 40], "\ub2e4\uc2dc": [0, 4, 11, 12, 20, 23, 24, 27, 32, 33, 36, 37, 40, 41, 42, 43], "\uacb0\uacfc": [0, 1, 2, 3, 4, 5, 8, 9, 14, 17, 18, 19, 21, 25, 28, 30, 31, 32, 35, 38, 39, 41, 42], "\uc7ac\ud6c8\ub828": 0, "\uc774\ud6c4\uc5d0\ub3c4": 0, "model\ub85c": [0, 2, 16], "\uc0dd\uc131\ud558\uc600\uc744": 0, "\ub54c\uc640": [0, 33], "\ube44\uc2b7\ud55c": [0, 4, 5, 8, 12, 18, 21, 29, 33, 35, 36, 41], "\uc758": [0, 1, 2, 4, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 23, 25, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "\uacbd\uc6b0\uc5d0\ub294": [0, 12, 14, 21, 28], "\uc5ec\uc804\ud788": [0, 4, 6, 8, 14, 15, 17, 23, 38], "\uc601\ud5a5\uc744": [0, 2, 3, 5, 6, 11, 12, 18, 26, 27, 28, 35, 38], "\ubc1b\uc740": [0, 29], "\uac83\uac19\uc740": 0, "\uc774\ubbf8\uc9c0\ub4e4\uc774": [0, 4, 7], "photo\uc758": 0, "\uc5ec\ub7ec": [0, 2, 4, 6, 14, 17, 19, 21, 22, 23, 28, 29, 31, 32, 36, 42], "\ub300\uc0c1\ub4e4\uacfc": 0, "\uc0ac\uc6a9\ub418\ub294": [0, 14, 17, 23, 28, 29, 32, 33, 36, 40], "\ud2b9\uc131\uc744": [0, 6, 12, 14, 17, 21, 32, 33], "\uac00\uc9c0\uace0\uc788\uc5b4\uc11c": 0, "\uadf8\ub7f0": [0, 24, 27], "\uac83\uc774\ub77c\ub294": [0, 28], "\uc0dd\uac01\uc774": [0, 28], "\ub4e4\uc5c8\uace0": 0, "\uc774\ub97c": [0, 2, 3, 4, 6, 7, 11, 12, 14, 17, 19, 20, 21, 25, 27, 28, 29, 30, 31, 32, 33, 36, 37, 39, 40, 41, 42, 43], "\uccb4\ud06c\ud574\ubcf4\uae30": 0, "\ud2b9\uc815\ud55c": [0, 9, 23, 27, 29, 31, 40], "photo\uc640": 0, "\uc6a9\ub3c4\ub85c": 0, "prompt\ub4e4\ub85c": 0, "\uc0dd\uc131\ubcf4\uc558\uc2b5\ub2c8\ub2e4": 0, "\ub300\uc0c1": [0, 12, 14, 33], "\uc138\uac00\uc9c0\ub85c\ub294": 0, "cat": [0, 11, 32, 39, 42], "sea": 0, "pirate\uc744": 0, "\uc0ac\uc6a9\ud588\uace0": [0, 5, 16, 25, 40], "\ube44\uc2b7\ud558\uac8c": [0, 4, 29], "\ud14d\uc2a4\ud2b8": [0, 5, 6, 9, 14, 17, 21, 22, 28, 29, 38], "\uc138\uac00\uc9c0\ub294": 0, "illustr": [0, 12], "anim": [0, 34], "wallpaper\ub97c": 0, "\uc774\ubbf8\uc9c0\ub294": [0, 3, 6, 8, 13, 17, 25, 26, 38], "\uae00": 0, "\ub9c8\uc9c0\ub9c9": [0, 2, 3, 4, 11, 13, 16, 27, 28, 32], "\ubd80\ubd84\uc758": [0, 2], "appendix\uc5d0": 0, "\uc788\uc2b5\ub2c8\ub2e4": [0, 1, 6, 7, 9, 17, 27, 28, 32, 33, 36, 37, 39, 41, 42, 43], "\ub300\uc0c1\uc744": [0, 33], "\uc9c0\uce6d\ud558\ub294": 0, "\ud14d\uc2a4\ud2b8\uc758": [0, 21], "\ub300\uc0c1\uc758": [0, 36], "\ud2b9\uc9d5\uc774": 0, "\uc798": [0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 14, 16, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33, 36, 37, 40, 43], "\ub4dc\ub7ec\ub098\ub294": 0, "\uc0dd\uc131\ub418\uc5c8\uc9c0\ub9cc": 0, "\ub300\uc0c1\uacfc": [0, 17, 33], "\ud568\uaed8": [0, 6, 14, 15, 16, 17, 20, 22, 23, 25, 30, 31, 33, 43], "\uc4f0\uc774\ub294": [0, 2, 28, 33, 37], "\uc78e\uc0ac\uadc0\uc758": 0, "\ud2b9\uc9d5\uc744": [0, 7, 14, 36], "\uac00\uc9c0\ub294": [0, 1, 3, 12, 27, 40], "\uc77c\ubd80": [0, 5, 6, 12, 14, 16, 17, 20, 21, 27], "\uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4": 0, "tuning\ud55c": 0, "400\uc7a5": 0, "\uc0dd\uc131\ud558\uc5ec": [0, 6, 21], "\ud6c8\ub828\ud588\uc2b5\ub2c8\ub2e4": 0, "result_bas": 0, "\ucd94\uac00": [0, 3, 6, 8, 11, 13, 14, 15, 17, 21, 23, 24, 25, 31, 42], "\ud65c\uc6a9\ud55c": [0, 3, 6, 9, 16, 30, 31, 36, 37], "9": [0, 2, 4, 5, 18, 23, 24, 25, 33, 40], "84": 0, "result_now": 0, "kaggle\uc5d0\uc11c": 0, "\uc81c\uacf5\ud558\ub294": [0, 3, 9, 14, 29], "test": [0, 2, 3, 4, 14, 21, 23, 29, 31, 38], "set\uc5d0": [0, 21, 28], "\uc801\uc6a9\ud588\uc744": [0, 32, 40], "\ub54c\ub294": [0, 28, 40], "baseline\uc774": [0, 29], "94": 0, "\uacbd\uc6b0\uac00": [0, 7, 10, 12, 14, 33], "93": 0, "\uc5ec\uc11c": 0, "baseline\ubcf4\ub2e4": 0, "\uc5bb\uc9c0\ub294": 0, "\ubabb": 0, "\ud6c8\ub828": [0, 3, 6, 7, 13, 14, 21, 25, 28, 33, 38], "\uc911\uac04\uc911\uac04\uc5d0": 0, "\uc77c\uc815": [0, 15], "step\ub9c8\ub2e4": 0, "\uc0dd\uc131\ud558\uac8c\ud574\uc11c": 0, "\ud6c8\ub828\uc5d0": [0, 6, 27], "\ubaa8\ub2c8\ud130\ub9c1\uc774": 0, "\uc788\uc73c\uba74": 0, "\uc88b\uaca0\ub2e4\ub294": 0, "\uc0dd\uac01\uc744": 0, "\ud6c8\ub828\uc2dc": 0, "hyperparamet": [0, 10, 13, 17, 26, 32, 35, 41, 42], "tuning\uc744": [0, 7, 17, 20, 28, 29, 40], "\uc880": [0, 7, 9, 26, 38], "\ucca0\uc800\ud558\uac8c": 0, "\ud574\uc57c\uaca0\ub2e4\ub294": 0, "\uc2e4\uc81c\ub85c": [0, 2, 4, 5, 15, 18, 21, 25, 27, 28, 30, 33, 37, 43], "\uc870\uac74\uc744": [0, 6, 14, 17, 29, 32], "\ub9cc\uc871\ud558\ub294\uc9c0": 0, "\uac80\uc218\ud560": 0, "\ubc29\uc548\uc774": 0, "\ud544\uc694\ud569\ub2c8\ub2e4": [0, 32], "\ub0b4\uc5d0\uc11c\ub3c4": 0, "\uce74\ud14c\uace0\ub9ac\ub97c": [0, 6], "\ub098\ub20c": 0, "\uc788\ub2e4\uba74": [0, 9, 11, 21, 31, 33], "\ub098\ub220\uc11c": [0, 12, 38], "\uac01\uac01\uc5d0": [0, 9, 27, 28], "tuning\ud560": [0, 8, 20], "\uc218\ub3c4": [0, 6, 9, 12, 27, 31, 32, 33, 40, 42], "\ud65c\uc6a9\ud574\ubcfc": 0, "submiss": 0, "score\uc5d0\uc11c": [0, 28], "baseline\uc744": 0, "\uc774\uae30\uc9c0": 0, "\ud588\uc9c0\ub9cc": 0, "text": [0, 1, 2, 3, 4, 6, 7, 9, 11, 12, 13, 14, 17, 19, 23, 25, 26, 27, 28, 31, 34, 38, 39, 41, 42], "\uc774\uc6a9\ud55c": [0, 21, 26, 28], "data\uc758": [0, 18, 26], "\uac00\ub2a5\uc131\uc744": [0, 10], "\ubcfc": [0, 1, 4, 6, 9, 12, 14, 17, 25, 27, 28, 29, 33, 34, 35, 37, 39, 41], "\uc788\uc5c8\ub2e4\uace0": [0, 20, 32, 33, 39, 42], "\uc0dd\uac01\ud569\ub2c8\ub2e4": [0, 27, 41], "\uc55e\uc5d0\uc11c": 0, "\uc5b8\uae09\ud55c": [0, 7, 25, 39], "prompt\uc5d0": [0, 8, 16], "\uc608\uc2dc\uc785\ub2c8\ub2e4": [0, 1], "nsfw\ub85c": 0, "\ud310\ub2e8\ub418\uc5b4": 0, "\uac80\uc740\uc0c9\uc73c\ub85c": 0, "\ub098\uc654\uc2b5\ub2c8\ub2e4": [0, 27], "pirat": 0, "wallpap": 0, "sangwoo": [1, 32, 36, 37, 39, 41, 42, 43, 44], "jo": [1, 32, 36, 37, 39, 41, 42, 43, 44], "09": [1, 31, 37], "\uc774\ubc88": [1, 39, 42], "\ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294": [1, 9], "\uc9c1\uc811": [1, 4, 6, 12, 14, 18, 21, 23, 24, 31, 37, 43], "\ud559\uc2b5\ud574\ubcf4\uace0": 1, "\uc2e4\ud5d8\ud55c": [1, 17, 32], "\uacb0\uacfc\ub4e4\uc744": [1, 9, 36, 42], "\uacf5\uc720\ud560\ub824\uace0": 1, "\ud569\ub2c8\ub2e4": [1, 6, 7, 9, 17, 28, 32, 33, 36, 37, 39, 41, 42, 43], "\uc6b0\uc120\uc801\uc73c\ub85c": [1, 32, 33, 34, 42, 43], "\ud559\uc2b5\ub370\uc774\ud130\ub294": 1, "bryandle": 1, "data": [1, 3, 20, 21, 23, 27, 31, 32, 33, 37, 40, 41, 44], "\uacf5\uac1c\ub41c": [1, 20, 39], "yolov5": 1, "\ubaa8\ub378": [1, 3, 4, 5, 6, 8, 9, 10, 14, 15, 16, 17, 18, 20, 21, 22, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "\ubc0f": [1, 5, 6, 9, 12, 14, 17, 20, 21, 23, 25, 28, 29, 33, 35, 37, 38, 39, 40, 41, 42], "waifu2x": 1, "\ud6c4\ucc98\ub9ac": [1, 25], "\uae30\ubc95\uc744": [1, 2, 6, 8, 16, 18, 23, 32, 39, 41], "\ud65c\uc6a9\ud558\uc5ec": [1, 6, 14, 16, 17, 21, 25, 32, 34, 35, 36, 37, 43], "\ud504\ub9ac\ub4dc\ub85c\uc6b0\uc5d0": 1, "\ub4f1\uc7a5\ud558\ub294": 1, "\uc778\ubb3c": [1, 3, 13, 33], "\uc0ac\uc9c4\ub4e4\uc744": [1, 23, 36], "\uc218\uc9d1\ud588\uc2b5\ub2c8\ub2e4": 1, "\ub17c\ubb38\uc5d0\uc11c\ub294": [1, 2, 4, 6, 7, 9, 11, 12, 14, 16, 17, 19, 20, 23, 27, 28, 29, 31, 32, 33, 34, 35, 36, 39, 40, 41, 42, 43], "3": [1, 4, 9, 15, 19, 29, 31, 33, 36, 37, 38, 43], "5": [1, 4, 11, 16, 17, 24, 31, 37, 40, 42, 43], "\uc7a5\uc73c\ub85c": 1, "fine": [1, 3, 7, 9, 12, 13, 17, 20, 22, 23, 26, 27, 29, 34, 38, 44], "tune": [1, 9, 13, 17, 20, 32, 34, 38, 44], "\uac00\ub2a5\ud558\ub2e4\uace0": [1, 27], "\uc81c\uc2dc\ub418\uc5b4\uc788\uc9c0\ub9cc": 1, "\uc0ac\uc9c4": [1, 4, 8, 29, 33, 38], "\ub9ce\uc740": [1, 3, 6, 7, 9, 12, 14, 16, 21, 22, 23, 25, 28, 29, 30, 32, 33, 34, 38, 41], "\ud559\uc2b5\ud558\uba74": [1, 11, 14, 36], "\uc131\ub2a5\uc774": [1, 4, 11, 12, 15, 18, 20, 21, 23, 25, 28, 31, 32, 33, 35, 39, 40, 41, 42], "\uc88b\uc544\uc838\uc11c": 1, "15": [1, 2, 3, 5, 17, 23, 40], "20": [1, 2, 3, 5, 6, 16, 18, 36, 40], "\uc7a5\uc758": [1, 9, 14, 31], "\ud559\uc2b5\ud558\uc600\uc2b5\ub2c8\ub2e4": 1, "\ud559\uc2b5\ud55c": [1, 8, 9, 16, 18, 20, 26, 28, 31, 32, 36, 38, 39, 41], "\uc774\ubbf8\uc9c0\ub4e4": [1, 25], "\uc2e4\ud5d8\ud558\uba74\uc11c": 1, "\ub300\ud45c\uc801\uc73c\ub85c": [1, 32, 36, 37, 42, 43], "\uadf8\ub9ac\uace0": [1, 4, 12, 15, 17, 28, 29, 32, 33, 36, 37, 39, 41, 42, 43], "\ub9c8\uc9c0\ub9c9\uc73c\ub85c": [1, 14, 17, 27, 32, 36, 39, 41, 42], "\ubc18\uc601\ud558\ub294": 1, "\uc815\ub3c4\ub97c": [1, 10, 18], "\uc870\uc808\ud558\ub294": [1, 7, 10, 14, 17, 28], "prior_loss_weight": [1, 36], "\ubc14\uafd4\uac00\uba74\uc11c": 1, "\ud559\uc2b5\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4": 1, "\uc0ac\uc804\ud559\uc2b5\ub41c": [1, 3, 28, 32, 36, 41], "\ubaa8\ub378\ub85c": [1, 3, 8, 14, 15, 17, 27, 28, 34, 37, 39, 41, 42], "\ucc98\uc74c\uc5d0\ub294": [1, 5, 14, 20, 28], "hakurei": 1, "waifu": 1, "diffus": [1, 2, 4, 6, 7, 9, 10, 13, 15, 17, 20, 21, 22, 23, 25, 37, 39, 44], "\ubaa8\ub378\uc744": [1, 2, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 41, 42, 43], "\uc2dc\ub3c4\ud574\ubd24\uc9c0\ub9cc": 1, "\uacb0\uacfc\uac00": [1, 4, 11, 16, 21, 22, 28, 30, 33, 35, 37], "\ub9cc\uc871\uc2a4\ub7fd\uc9c0": 1, "\ubabb\ud574": 1, "runwayml": 1, "stabl": [1, 6, 7, 15, 17, 18, 20, 25, 28, 31, 36, 39, 40, 41], "v1": [1, 13, 17], "\uc791\uc5c5\uc744": [1, 23, 29, 32, 42], "\uc9c4\ud589\ud588\uc2b5\ub2c8\ub2e4": [1, 6, 17, 37, 39, 41, 42], "\uc81c\uc678\ud55c": [1, 2, 3, 32], "\ub3d9\uc77c\ud55c": [1, 3, 5, 6, 14, 17, 18, 21, 22, 23, 25, 28, 31, 32, 33, 36, 39, 41, 42], "configur": [1, 35, 37], "\uc73c\ub85c": [1, 4, 9, 12, 14, 17, 20, 21, 22, 23, 29, 30, 31, 32, 33, 34, 36, 38, 39, 40, 41, 42], "\uacb0\uacfc\uc785\ub2c8\ub2e4": [1, 19, 28, 32, 41, 42], "model_nam": 1, "instance_prompt": 1, "A": [1, 4, 5, 6, 7, 8, 9, 13, 14, 17, 20, 27, 29, 30, 31, 33, 36, 38, 42, 43], "sk": [1, 26, 29], "girl": 1, "class_prompt": 1, "python3": 1, "train_dreambooth": [1, 36], "py": [1, 31, 36], "pretrained_model_name_or_path": [1, 36], "pretrained_vae_name_or_path": 1, "stabilityai": 1, "sd": [1, 3, 13, 25, 31, 40, 42], "vae": [1, 2, 3, 4, 8, 18, 32, 36, 37, 41], "ft": [1, 14], "mse": [1, 11], "output_dir": 1, "revis": [1, 36], "fp16": 1, "with_prior_preserv": [1, 36], "1": [1, 4, 6, 7, 9, 15, 17, 19, 25, 27, 29, 31, 33, 36, 37, 38, 43], "0": [1, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 19, 21, 22, 24, 25, 27, 28, 30, 31, 32, 33, 34, 36, 37, 40, 41, 42, 43], "seed": [1, 41], "1337": 1, "resolut": [1, 4, 13, 14, 15, 16, 18, 19, 21, 25, 28, 31, 32, 33, 35, 39, 40, 41], "512": [1, 15, 22, 23, 25, 30, 37, 40], "train_batch_s": 1, "train_text_encod": [1, 36], "mixed_precis": 1, "use_8bit_adam": 1, "gradient_accumulation_step": [1, 36], "gradient_checkpoint": 1, "learning_r": 1, "1e": [1, 3, 13, 14, 26], "6": [1, 2, 3, 4, 5, 8, 22, 24, 25, 26, 31, 33, 40], "lr_schedul": [1, 36], "constant": [1, 15, 18, 23, 35], "lr_warmup_step": 1, "num_class_imag": 1, "200": [1, 4, 23, 25, 38], "sample_batch_s": 1, "4": [1, 4, 9, 15, 19, 27, 31, 37], "max_train_step": 1, "800": [1, 23], "save_interv": 1, "100": [1, 3, 18, 23, 28, 31, 33], "save_sample_prompt": 1, "concepts_list": 1, "json": 1, "w": [1, 2, 3, 4, 7, 8, 11, 15, 19, 20, 21, 23, 27, 30, 34, 38, 41], "o": [1, 2, 15, 21, 23, 26, 39], "\uc544\ub798": [1, 4, 6, 7, 9, 12, 14, 18, 21, 27, 28, 32, 33, 34, 36, 37, 38, 41, 42, 43], "\uadf8\ub9bc\ucc98\ub7fc": [1, 9, 20, 37, 38, 43], "infer": [1, 3, 4, 11, 15, 21, 25, 30, 31, 40, 42, 43], "\uc785\ub825\ud588\uc744": 1, "\ub54c": [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 40, 41, 43], "\uc81c\uc678\ud568\uc73c\ub85c\uc368": 1, "input": [1, 3, 4, 5, 7, 8, 9, 13, 15, 20, 21, 22, 23, 27, 29, 31, 33, 34, 36, 37, 39, 41, 42], "\uac00\uae4c\uc6b4": [1, 5, 6, 15, 29, 34], "\uc6f9\ud230": 1, "\uc788\uc5c8\uc2b5\ub2c8\ub2e4": [1, 6, 7, 9, 17, 28, 33, 39], "\ub610\ud55c": [1, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 16, 17, 19, 20, 21, 25, 28, 30, 32, 33, 36, 37, 39, 40, 41, 42, 43], "\ud551\ud06c\uc0c9": 1, "\uba38\ub9ac\ub97c": 1, "\ud55c": [1, 2, 3, 4, 9, 11, 12, 14, 16, 17, 18, 20, 21, 22, 23, 25, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "\uc774\ubbfc\uc9c0": 1, "\uce90\ub9ad\ud130\ub97c": 1, "\uc5b4\ub290": [1, 27, 28, 29], "\uc815\ub3c4": [1, 5, 10, 18, 20, 27, 28], "\uc0dd\uc131\ud558\ub294": [1, 5, 6, 7, 9, 11, 14, 15, 16, 17, 19, 21, 22, 24, 27, 28, 30, 33, 36, 37, 38, 39, 41, 43], "\ubd80\ubd84\ub3c4": [1, 39], "\ud655\uc778\ud560": [1, 4, 12, 18, 24, 25, 28, 32, 33, 36, 39, 40, 41, 42, 43], "pink": 1, "hair": [1, 26, 27], "With": 1, "without": [1, 20, 21, 26, 27, 41], "\ub3c4": [1, 4, 5, 9, 11, 15, 17, 22, 26, 30, 31, 32, 33, 36, 41, 42, 43], "\uce90\ub9ad\ud130\uc758": [1, 3, 36], "\ubd80\uc790\uc5f0\uc2a4\ub7ec\uc6b4": 1, "\ubd80\ubd84\uc774\ub098": 1, "\uc800\ud574\uc0c1\ub3c4": [1, 3, 21, 22, 30], "\uacbd\uc6b0\ub4e4\uc774": 1, "\uc885\uc885": [1, 14, 33], "\ubc1c\uc0dd\ud588\ub294\ub370": 1, "\ud1b5\ud574": [1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43], "\ud004\ub9ac\ud2f0\uc758": [1, 18, 24, 26, 28], "ugli": 1, "disfigur": 1, "deform": 1, "low": [1, 3, 9, 15, 17, 18, 22, 24, 30, 34, 42], "\ub17c\ubb38\uc5d0\uc11c": [1, 3, 4, 7, 14, 16, 19, 27, 28, 31, 32, 34, 36, 37, 41, 43], "\uc81c\uc2dc\ud55c": [1, 8, 9, 12, 16, 24, 31, 34, 37, 38], "\uc678\uc5d0": [1, 41], "style": [1, 4, 9, 15, 17, 26, 29, 33, 36, 41, 44], "\ub77c\ub294": [1, 7, 9, 17, 28, 29, 33, 35, 38, 40, 41], "\ub85c": [1, 4, 5, 6, 7, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "\ud559\uc2b5\uc744": [1, 8, 12, 14, 16, 19, 21, 25, 27, 28, 30, 33, 35, 39, 40], "\uc2dc\ub3c4\ud574\ubcf4\uae30\ub3c4": 1, "\ud2b9\uc815": [1, 2, 6, 8, 9, 10, 11, 14, 16, 17, 18, 20, 23, 25, 26, 28, 29, 33, 38, 40, 42], "\uc5ec\uc790": 1, "\uce90\ub9ad\ud130\uc5d0": [1, 3], "\uc815\ubcf4\ubfd0\ub9cc": 1, "\uc544\ub2c8\ub77c": [1, 4, 6, 8, 9, 11, 14, 16, 20, 22, 25, 27, 30, 33, 36, 40], "\ud504\ub9ac\ub4dc\ub85c\uc6b0": 1, "\uadf8\ub9bc\uccb4": 1, "\uc790\uccb4\ub97c": [1, 4, 9, 18, 23], "\ub2f4\uc544\ub0b4\uae30": 1, "\uc704\ud55c": [1, 2, 3, 4, 5, 6, 9, 12, 13, 14, 17, 18, 19, 20, 21, 22, 25, 28, 29, 33, 35, 40, 43], "\ubaa9\uc801\uc774\uc600\uc2b5\ub2c8\ub2e4": 1, "differ": [1, 3, 9, 20, 27, 40, 41], "\uc2dc": [1, 15, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "\ud504\ub9ac\ub4dc\ub85c\uc6b0\uc758": 1, "\uadf8\ub9bc\uccb4\uac00": [1, 9], "\ubc18\uc601\ub41c": [1, 9], "\ub0a8\uc790\uac00": 1, "\uc0dd\uc131\ub418\ub3c4\ub85d": 1, "boi": 1, "\uc785\ub825\ud588\uc744\ub54c\uc758": 1, "\ud639\uc740": [1, 2, 4, 8, 9, 14, 15, 19, 23, 25, 36, 40, 43], "\uc791\uac00\ub2d8\uc758": 1, "\uc7a5\uba74\ub4e4\ub85c": 1, "\uc804\uccb4\uc801\uc73c\ub85c": [1, 12], "\ud559\uc2b5\ud558\uac8c": [1, 3, 32, 39, 42], "\ub41c\ub2e4\uba74": [1, 25], "\ub2e4\uc591\ud55c": [1, 2, 5, 6, 8, 9, 12, 14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 28, 29, 32, 33, 34, 35, 36, 38, 40, 41, 42], "\uac83": [1, 3, 4, 9, 11, 14, 21, 22, 23, 28, 29, 31, 33, 38], "num_inference_step": [1, 42], "24": [1, 3, 22, 28], "step": [1, 3, 4, 8, 9, 10, 11, 12, 13, 14, 16, 18, 22, 23, 26, 28, 31, 35, 36, 37, 41, 42], "\uc744": [1, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 42, 43], "\ub298\ub824\uac00\uba74\uc11c": 1, "\ucd94\ub860\ub41c": 1, "\ud004\ub9ac\ud2f0\uac00": [1, 2, 5, 25, 42], "\uc0c1\uc2b9\ud558\ub294": 1, "\uc2e4\ud5d8\ub3c4": 1, "\uc9c4\ud589\ud588\ub294\ub370": 1, "\uc791\uc744\uc218\ub85d": [1, 28, 32, 40], "\uc640": [1, 4, 5, 6, 8, 9, 10, 11, 12, 14, 16, 17, 18, 19, 20, 21, 22, 23, 26, 27, 29, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43], "\ubb34\uad00\ud55c": [1, 39], "random": [1, 2, 3, 4, 8, 10, 11, 12, 13, 15, 17, 20, 22, 23, 24, 25, 29, 32, 36, 37, 39, 41, 42], "\uc0dd\uc131\ud558\uac8c": [1, 28, 36, 38, 42, 43], "\ub429\ub2c8\ub2e4": [1, 6, 7, 9, 17, 22, 27, 28, 32, 33, 36, 37, 39, 41, 42, 43], "\ucd5c\uc885\uc801\uc73c\ub85c": [1, 27, 28, 32, 41, 42], "num_infer": 1, "\uac12\uc740": [1, 4, 18, 28, 32, 35, 36], "\uac01\uac01": [1, 2, 3, 4, 5, 7, 8, 9, 12, 16, 17, 29, 31, 33, 36, 37, 40, 42, 43], "\uacfc": [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 14, 15, 18, 21, 22, 25, 26, 29, 30, 31, 32, 33, 34, 36, 38, 40, 41, 42], "\uc124\uc815\ud558\uc600\uc2b5\ub2c8\ub2e4": [1, 32, 41], "increas": [1, 9], "number": [1, 32, 35, 42], "guidance_scal": [1, 42], "\uc81c\uc678\ud574\ubcf8": 1, "\uc0dd\uc131\ub41c": [1, 2, 3, 4, 6, 9, 12, 13, 14, 15, 16, 17, 21, 24, 25, 27, 28, 29, 31, 32, 33, 35, 36, 37, 38, 39, 42, 43], "\ub0a8\uc790\uc758": 1, "\uba38\ub9ac\uce74\ub77d\uc774": 1, "\uae38\uc5b4\uc9c0\uace0": 1, "\uc5ec\uc131\uc2a4\ub7ec\uc6b4": 1, "\uc0dd\uae40\uc0c8\ub97c": [1, 29], "\ub180\ub77c\uc6b4": [1, 2, 9, 24, 28], "\uc0ac\uc2e4\ub3c4": 1, "\uadf8": [1, 4, 5, 6, 9, 11, 14, 15, 17, 19, 22, 24, 25, 27, 28, 29, 30, 32, 33, 41, 42], "\uc678": [1, 15, 24, 32, 33, 41], "\ub530\ub978": [1, 3, 7, 9, 18, 23, 28, 31, 34, 36, 39, 40, 43], "\uc7ac\ubbf8\uc788\ub294": 1, "\uc2e4\ud5d8\uacb0\uacfc\ub4e4\uc744": 1, "\uacf5\uc720\ud569\ub2c8\ub2e4": [1, 32, 36, 41, 42], "\uc544\uc9c1": [1, 2, 9, 29, 35, 40], "\uc190\uc758": [1, 3], "\ubaa8\uc591\uc744": [1, 14], "\uc0dd\uc131\ud558\uc9c0": [1, 30], "\ubabb\ud558\ub294": [1, 17, 30, 37], "\uc7ac\ucc28": [1, 32], "climb": 1, "up": [1, 5, 11, 41], "mountain": 1, "paint": [1, 3, 36, 39], "2": [1, 4, 6, 15, 17, 19, 27, 29, 31, 33, 36, 37, 38, 43], "hand": 1, "draw": [1, 26], "\ud558\ub2e8\uc758": [1, 32], "\uc88c\uce21\uacfc": 1, "\uc6b0\uce21": 1, "\uc0ac\uc9c4\uc740": [1, 14, 32, 41], "\uc774\ub77c\ub294": [1, 4, 33, 35, 38, 40], "\ub098\ube44\ub97c": 1, "\uc0dd\uc131\ud558\ub77c\ub294": 1, "\ucd94\ub860\ud574\ubcf8": 1, "\uc218\uc2dd\ud558\ub294": 1, "\uba85\uc0ac\uac00": 1, "\uc774\ub3c4\ub85d": 1, "\uc218\uc815\ud568\uc73c\ub85c\uc368": [1, 18, 32], "butterfli": 1, "\uc0ac\uc9c4\uc744": [1, 4, 14, 33, 35], "\uc0dd\uc131\ud560\ub54c": 1, "\uc870\uae08\uc774\ub098\ub9c8": 1, "\uc6f9\ud230\uc758": 1, "\uadf8\ub9bc\uccb4\ub97c": 1, "\ubc18\uc601\ud560": 1, "\uc788\uc5c8\ub358": [1, 33], "http": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "arxiv": [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "org": [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "pdf": [2, 5, 6, 9, 17, 22, 23, 24, 29, 31, 32, 34, 39, 40, 44], "2206": 2, "10935": 2, "gan": [2, 4, 8, 10, 14, 16, 22, 24, 26, 32, 33, 34, 42], "diffusion\ub4f1": [2, 15], "\ubaa8\ub378\uc758": [2, 3, 4, 5, 7, 8, 9, 14, 15, 16, 17, 18, 20, 21, 22, 25, 26, 27, 28, 29, 32, 35, 40, 41, 42], "\ubc1c\uc804\uc774": 2, "\uc774\uc5b4\uc9c0\uace0\uc788\ub2e4": 2, "\ub2e4\ub9cc": [2, 28, 31, 40], "\uc774\ub7ec\ud55c": [2, 4, 6, 8, 9, 12, 14, 15, 17, 18, 21, 22, 23, 25, 26, 28, 29, 30, 32, 33, 36, 41, 43], "\uc0dd\uc131\ubaa8\ub378\uc744": 2, "\ud3c9\uac00\ud558\ub294": [2, 9, 28], "\ucc99\ub3c4": 2, "\uc120\uc815\uc740": 2, "\uc5b4\ub824\uc6b4": [2, 8, 29], "\ubb38\uc81c\ub85c": [2, 41], "\ub0a8\uc544\uc788\ub2e4": 2, "\uadf8\ub098\ub9c8": 2, "\ub098": [2, 6, 25, 32, 36, 38, 40, 43], "score\ub97c": [2, 12, 16, 28], "\ud3c9\uac00\ud558\uace0\uc788\uc9c0\ub9cc": 2, "metric\ub4e4\ub3c4": 2, "\uc644\uc804\ud558\uc9c0": 2, "\uc54a\uc74c": [2, 3, 8, 11, 21, 23, 29, 38, 40], "\ub17c\ubb38\uc744": [2, 16, 17, 28, 35], "\ud3c9\uac00\uc758": 2, "\uc9c0\ud45c\uc5d0": [2, 28], "\ub300\ud574": [2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23, 25, 28, 29, 30, 31, 32, 33, 36, 37, 39, 40, 41, 42, 43], "\ud55c\ubc88\ub354": 2, "\uace0\ucc30\ud558\uace0": 2, "\ud604\uc874\ud558\ub294": 2, "metric\uc5d0": 2, "\ubc29\ud5a5\uc744": [2, 23], "\uc81c\uc2dc": [2, 4, 23, 29, 31, 35], "\ucd5c\uadfc": [2, 3, 6, 8, 14, 15, 18, 24, 26], "\ub4f1": [2, 8, 10, 14, 15, 16, 17, 20, 22, 26, 29, 36, 40], "implicit": [2, 10, 14, 23, 37, 42], "model\ub4e4\uc774": [2, 8, 10], "\ub6f0\uc5b4\ub09c": [2, 4, 8, 10, 18, 21, 28, 34], "\ubcf4\uc5ec\uc90c": [2, 3, 23, 29, 38], "\ud558\uc9c0\ub9cc": [2, 4, 6, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 21, 23, 24, 26, 28, 29, 31, 32, 33, 35, 36, 37, 43], "task": [2, 4, 9, 20, 23, 30, 32, 33, 34, 37, 38, 41], "classif": [2, 16, 31, 35, 37, 40], "segment": [2, 33, 42], "\uc640\ub294": [2, 32], "\ub2e4\ub974\uac8c": [2, 10, 12, 17, 25, 28, 36], "metric\uc744": 2, "\uc815\ud558\ub294\uac83\uc740": 2, "challeng": 2, "p": [2, 4, 6, 7, 9, 12, 14, 18, 21, 23, 35, 36, 41, 43], "r": [2, 3, 5, 11, 14, 15, 18, 19, 20, 23, 26, 30, 39], "f1": 2, "iou": [2, 33], "intersect": [2, 33], "over": [2, 4, 20, 33, 38], "union": [2, 33], "featu": 2, "map\uc774\ub098": [2, 14], "classfier": [2, 14], "\uc0ac\uc6a9\ud558\ub294": [2, 3, 5, 7, 9, 11, 14, 15, 23, 27, 35, 36, 37, 38, 39], "score\uac00": [2, 40], "\ucd94\uc138": [2, 8], "\uc704": [2, 3, 4, 6, 7, 9, 11, 12, 15, 17, 18, 20, 21, 26, 28, 29, 31, 32, 41], "metric\uc758": 2, "\ub2e8\uc810": [2, 24], "real": [2, 8, 12, 15, 21, 23, 24, 26, 30, 37], "\ubd84\ud3ec\uc758": [2, 28, 37], "space\uc5d0\uc11c": [2, 3, 6, 12, 14, 19, 29], "\uc218\uce58\uac00": [2, 18], "\uc815\ub9d0": [2, 9, 15], "\uc720\uc758\ubbf8\ud55c": 2, "\uc5f0\uad00\uc774": [2, 27], "\uc788\ub294\uc9c0": [2, 9, 23], "\uc99d\uba85\ub418\uc9c0": [2, 18], "pretrain": [2, 3, 4, 6, 7, 8, 12, 13, 15, 16, 20, 21, 22, 24, 25, 26, 28, 29, 31, 34], "\uac70\ub300\ud55c": 2, "set\uc774": [2, 29], "specif": [2, 8, 14, 27, 36], "feature\uc5d0": [2, 3, 12, 22], "\uc5bc\ub9c8\ub098": [2, 8, 9, 11, 12, 15, 23, 24, 28, 29, 35, 41], "\ubbf8\uce58\ub294\uc9c0": 2, "\uc54c\uc218": 2, "\uc5c6\uc74c": [2, 4, 20], "net": [2, 3, 4, 5, 11, 12, 13, 19, 31, 36, 38, 41], "imagenet": [2, 16, 18, 25, 29, 31, 32, 40, 41], "ddpm": [2, 3, 4, 16, 28, 38, 40], "face": [2, 4, 9, 13, 17, 23, 27, 37, 43], "human": [2, 8, 9, 13, 16, 27, 29, 30, 39], "study\uc758": 2, "\uc9c1\uad00\uc801\uc778": [2, 29], "\ubc29\uc2dd\ub3c4": [2, 16, 37], "\uc788\uc9c0\ub9cc": [2, 10, 14, 15, 16, 33, 34, 35, 42], "time\uacfc": 2, "cost\ub97c": [2, 20, 40], "\ub9e4\uc6b0": [2, 4, 8, 9, 10, 11, 12, 14, 15, 20, 29, 31, 32, 33, 38, 40], "\ud544\uc694\ub85c\ud55c\ub2e4\ub294": 2, "\uc810\uacfc": 2, "diversity\ub294": 2, "\uce21\uc815\ud558\uae30": [2, 9], "\uc5b4\ub835\ub2e4\ub294": 2, "e": [2, 4, 5, 6, 8, 10, 11, 12, 14, 18, 19, 22, 24, 26, 27, 32, 36, 37, 38, 40, 41, 42, 43], "g": [2, 8, 10, 15, 16, 18, 23, 26, 27, 33, 36, 37, 40, 41, 42], "\ud558\ub098\uc758": [2, 4, 8, 11, 14, 15, 20, 21, 22, 23, 26, 27, 29, 33, 40, 43], "\uc774\ubbf8\uc9c0\ub9cc": [2, 5, 35], "\uc0dd\uc131\ud574\ub3c4": 2, "\ubc1b\uc744": [2, 38], "\uc788\uc74c": [2, 4, 8, 11, 15, 18, 20, 21, 22, 23, 28, 29, 34, 35, 38, 40], "gpt": [2, 20], "high": [2, 3, 7, 9, 12, 17, 18, 19, 22, 23, 24, 25, 27, 28, 32, 34, 37, 38, 40, 42], "quality\uc758": [2, 10, 16, 18, 24, 26, 40], "new": [2, 8, 10, 17, 27, 29], "dataset\uc744": [2, 26, 38, 40], "\uc704\uc758": [2, 4, 7, 9, 10, 12, 14, 16, 18, 22, 23, 28, 31, 32, 33], "\ud559\uc2b5\ud558\uace0": [2, 11, 28, 34, 37], "is\ub4f1": 2, "\uce21\uc815": [2, 6, 9, 29], "\uc2e4\uc81c": [2, 4, 6, 9, 12, 14, 17, 20, 21, 22, 23, 24, 28, 29, 33, 36, 37, 40], "revers": [2, 4, 10, 16, 18, 24, 31, 40, 41, 42], "\uac12\uacfc": [2, 10, 15], "\ube44\uad50\ud574\uc11c": [2, 27, 34], "\uc720\ud6a8\uc131\uc744": 2, "\uac80\uc99d": [2, 4, 40], "base": [2, 12, 13, 15, 16, 18, 21, 23, 25, 26, 27, 29, 31, 35, 37, 38, 39, 40, 42, 44], "v3\uacfc": 2, "clip": [2, 3, 5, 6, 8, 9, 13, 15, 17, 21, 22, 25, 29, 30, 31, 34, 36, 38, 39, 40, 42], "\ube44\uad50\ub97c": [2, 14, 16], "v3": 2, "\uc801\ud569\uc131\uc744": 2, "\ub450": [2, 3, 4, 5, 6, 7, 9, 11, 14, 15, 17, 18, 21, 22, 23, 25, 27, 28, 30, 31, 32, 33, 36, 40, 41], "\ud655\ub960\ubd84\ud3ec\uc758": 2, "\uc720\uc0ac\ub3c4\ub97c": [2, 6, 16, 32], "\uce21\uc815\ud558\ub294": [2, 6, 9, 12, 31, 36, 40], "\uc9c0\ud45c": [2, 14, 28, 35], "q": [2, 4, 5, 12, 16, 19, 34, 35, 41], "sum_": [2, 11, 12, 15, 16, 20, 23, 43], "x": [2, 3, 4, 5, 6, 7, 9, 10, 12, 14, 15, 16, 17, 19, 20, 21, 22, 23, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 42, 43], "log": [2, 5, 11, 20, 28, 32, 34, 35, 37, 40, 41, 43], "left": [2, 5, 6, 11, 17, 19, 20, 23, 25, 35, 38, 43], "frac": [2, 7, 11, 12, 19, 23, 27, 32, 35, 37, 40, 41, 43], "right": [2, 5, 6, 11, 17, 19, 20, 23, 35, 38, 43], "\ud2b9\uc9d5": [2, 6, 17, 24], "lower": [2, 11, 24, 25, 34, 38, 43], "better": [2, 24, 38], "symmetr": 2, "rkl": 2, "\ub300\ubd80\ubd84": [2, 8, 18, 21, 26, 28], "p\uac00": 2, "true": [2, 9, 10, 11, 20, 21, 37, 42], "distribut": [2, 4, 5, 9, 10, 11, 15, 31, 32, 33, 34, 35, 42, 43], "q\uac00": 2, "estim": [2, 3, 11, 32, 37, 43], "fidelity\uc640": [2, 14, 17], "diversity\ub97c": [2, 17, 26], "fidel": [2, 4, 13, 17, 22, 35, 36, 38], "label\uc758": 2, "\uc608\uce21\ud558\ub294\uc9c0": 2, "divers": [2, 4, 5, 9, 17, 18, 22, 35, 36], "\uace0\ub974\uac8c": 2, "\uc0dd\uc131\ud574\ub0b4\ub294\uc9c0": 2, "exp": [2, 11, 23, 41], "mathbb": [2, 4, 11, 14, 19, 20, 23, 32, 36, 37, 40, 42, 43], "_x": 2, "d_": [2, 4, 11, 15, 17, 20, 37, 43], "y": [2, 4, 6, 7, 9, 10, 11, 12, 20, 21, 23, 27, 33, 34, 35, 42], "higher": [2, 38], "\uc774\ubbf8\uc9c0\uc640": [2, 5, 6, 9, 10, 12, 14, 16, 17, 22, 23, 26, 29, 36, 39, 43], "featur": [2, 3, 4, 7, 8, 9, 11, 12, 13, 14, 15, 22, 23, 25, 26, 27, 31, 33, 36, 42], "vector\ub97c": [2, 22, 29], "\ucd94\ucd9c": [2, 13, 14, 22, 23, 42], "\ud3c9\uade0\uacfc": [2, 4, 28, 38], "\uacf5\ubd84\uc0b0\uc744": 2, "\uacc4\uc0b0": [2, 10, 11, 13, 14, 21, 23, 29, 31], "frechet": [2, 34], "\ud558\ub294": [2, 4, 5, 6, 7, 11, 12, 14, 16, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 35, 36, 37, 38, 40, 41, 42, 43], "\ud3c9\uac00\uc9c0\ud45c": 2, "lvert": 2, "mu_x": 2, "mu_g": 2, "rvert": 2, "tr": 2, "sigma_x": 2, "sigma_g": 2, "v3\uc758": 2, "pool": [2, 25], "layer\uc758": [2, 15, 23], "map\uc744": [2, 12, 15, 26], "\uc0ac\uc6a9": [2, 3, 4, 7, 8, 11, 13, 14, 15, 16, 18, 22, 23, 26, 34, 35, 38, 40], "quality\ub97c": [2, 12, 18, 29], "fid\uc5d0\uc11c": 2, "distance\ub97c": [2, 12], "\ub300\uc2e0": [2, 8, 11, 12, 14, 17, 18, 25, 26, 29, 34], "trick\uc744": [2, 26], "\uc0ac\uc6a9\ud574": [2, 9, 12, 15, 20, 22, 25, 26, 28, 29, 30, 38, 40], "\ud655\ub960": [2, 4, 11, 23, 24, 28, 37, 43], "\ub370\uc774\ud130\uc14b\uc758": [2, 5, 9, 16, 21, 23, 28, 31, 39], "\ud3c9\uac00\uc5d0": [2, 16], "\ud6a8\uacfc\uc801\uc784": 2, "metric\ubcf4\ub2e4": 2, "\uc18d\ub3c4\uac00": [2, 22, 24, 32, 41], "\uc624\ub798\uac78\ub9bc": 2, "n": [2, 4, 9, 11, 12, 14, 16, 19, 20, 23, 32, 34, 40, 41, 42, 43], "kid": [2, 8, 24], "\ub17c\ubb38": [2, 9, 11, 20, 22, 23, 28, 33, 34, 36], "fid\uc640": [2, 15, 16, 18, 21, 28, 35], "bias\uac00": [2, 7, 27], "\uc788\uc74c\uc744": [2, 6, 17, 18, 28, 29], "\uc99d\uba85\ud558\uace0": 2, "dataset\uc758": [2, 13, 40], "sampl": [2, 3, 4, 9, 12, 15, 19, 22, 26, 30, 31, 32, 35, 36, 37, 38, 40, 42, 43], "\ubcc0\uacbd": [2, 3, 4, 6, 33], "gaussian": [2, 3, 4, 11, 15, 20, 23, 27, 32, 35, 36, 40, 42, 43], "sobol": 2, "sequenc": [2, 3, 5, 9, 13, 20], "\ud558\uc5ec": [2, 4, 6, 30, 33, 38], "unbias": [2, 9, 32], "\uc81c\uc548": [2, 3, 8, 10, 13, 18, 23, 28, 29, 30, 34], "v3\uc5d0": 2, "\ud1b5\uacfc\ud558\uae30\uc704\ud574": 2, "resiz": [2, 3, 8, 13, 30], "\uacfc\uc815\uc774": [2, 6, 11], "\ud3ec\ud568\ub418\ub294\ub370": 2, "score\uac12\uc5d0": 2, "\uc904\uc218": 2, "\uc788\uc5b4": [2, 3, 12, 16, 33, 37, 40], "best": [2, 12, 18, 26, 34, 35], "percformance\uc758": 2, "one": [2, 4, 9, 26, 32, 33, 40, 41], "process\ub97c": [2, 10, 11, 12, 35], "imagenet\uc758": 2, "\ub370\uc774\ud130\ub97c": [2, 6, 8, 9, 11, 14, 16, 18, 21, 23, 25, 26, 28, 30, 32, 33, 37, 40, 43], "imagegpt\ub97c": 2, "\uc7ac\uc0dd\uc131": 2, "k": [2, 8, 11, 15, 19, 20, 24, 34, 37, 40, 42], "notimagenet": 2, "imagegpt": 2, "vision": [2, 9, 15, 24, 28, 33, 39, 44], "\ubd84\uc57c\uc5d0": [2, 32], "transform": [2, 5, 11, 16, 18, 22, 25, 28, 31], "label": [2, 4, 11, 33, 35, 38], "dataset\uc774": [2, 24], "\ud544\uc694\uc5c6\ub294": 2, "\uc790\uae30\uc9c0\ub3c4": 2, "\ubc29\uc2dd": [2, 8, 14, 22, 32, 40], "challenge\uc5d0\uc11c\ub3c4": 2, "\uc0c1\ub2f9\ud55c": [2, 5], "\ubcf4\uc784": [2, 3, 18, 34], "\uc0dd\uc131\ubaa8\ub378\uc5d0": 2, "\ud1b5\uacfc\ud55c": 2, "p_": [2, 4, 6, 11, 12, 14, 16, 20, 32, 33, 34, 35, 37, 40, 43], "hat": [2, 15, 17, 19, 21, 23, 32, 33, 36, 40, 41], "\ubd84\ud3ec\ub97c": [2, 11, 14, 15, 21, 25, 28, 33, 37, 43], "\ube44\uad50": [2, 3, 4, 9, 10, 14, 15, 18, 21, 28, 31, 34, 35, 38], "\ud55c\uacc4": [2, 3, 4, 23, 29, 40], "explicit": [2, 23, 37], "model\uc5d0\ub9cc": 2, "\uc801\uc6a9": [2, 4, 12, 14, 15, 18, 24, 25, 34, 40, 42], "\uac00\ub2a5\ud558\uace0": [2, 8], "model\uc5d0\ub294": 2, "\uc801\uc6a9\ud560": [2, 29, 32], "\uc0dd\uc131\ub418\ub294": [2, 6, 7, 24, 26, 27, 28, 35, 42], "\ub370\uc774\ud130\uc758": [2, 21, 28, 33, 37], "\uba85\uc2dc\uc801\uc73c\ub85c": [2, 6], "\ubaa8\ub378\ub9c1\ud558\uc5ec": [2, 34, 35], "\uc8fc\ub85c": [2, 14, 16, 17, 40], "noise\ub85c\ubd80\ud130": [2, 24], "\uacfc\uc815\uc5d0": [2, 6, 26], "\uc8fc\uc5b4\uc9c4": [2, 6, 9, 12, 14, 16, 17, 21, 22, 23, 29, 31, 32, 34], "\ubd84\ud3ec\ub85c\ubd80\ud130": 2, "\uc0d8\ud50c\ub9c1\ud558\uc5ec": 2, "volatil": 2, "rkl\uc740": 2, "\uc591\uc758": [2, 4, 7, 14], "epoch": [2, 14, 33, 36, 37, 42], "\ud6c4\uc5d0": [2, 3, 8, 15, 30, 35], "\ubc14\ub85c": [2, 8, 9, 11, 22, 25, 27, 31], "\uc218\ub834\ud558\ub294": [2, 41], "\ubc29\uba74": 2, "is\ub294": 2, "\ud070": [2, 3, 4, 6, 9, 11, 12, 14, 17, 18, 20, 21, 25, 27, 28, 29, 30, 31, 40, 41, 42], "\ubcc0\ub3d9\uc131\uc744": [2, 28], "capacity\uac00": 2, "\uc99d\uac00\ud560\uc218\ub85d": [2, 34, 41], "kl\uacfc": 2, "rkl\uc758": 2, "\uac1c\uc120\ub418\ub294": [2, 39], "\uac83\uc744": [2, 4, 5, 6, 7, 9, 11, 12, 14, 17, 18, 21, 22, 24, 25, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "\ud655\uc778": [2, 12, 18, 26, 31, 34, 38], "fid\ub098": 2, "is\uac00": [2, 28], "\uadf8\ub798\ud504\uc640": 2, "\ud615\ud0dc\ub97c": [2, 11], "\ub744\ub294\uac83\uc744": 2, "\ud2b9\ud788": [2, 3, 9, 25, 29, 32, 38, 40, 42], "neg": [2, 11, 12, 15, 16, 22, 26], "kl\uacfc\ub294": 2, "\ub192\uc740": [2, 3, 4, 6, 9, 11, 14, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38], "colleration\uc744": 2, "\ubcf4\uc774\uc9c0\ub9cc": [2, 12, 15, 26], "rkl\uacfc\ub294": 2, "\ub192\uc9c0": 2, "\uc54a\uc740": [2, 3, 6, 8, 9, 12, 14, 17, 18, 21, 25, 27, 28, 31, 32, 33, 43], "\ubcf4\uc778\ub2e4": [2, 12, 14, 16, 18, 21, 26], "capacity\uc5d0": 2, "\uc218\uce58": [2, 18], "\ubcc0\ud654\ub294": [2, 25], "\ud06c\uc9c0": [2, 15], "\ub370": [2, 6, 14, 16, 17, 23, 28], "\ubc18\ud574": [2, 18, 24, 40], "\uad49\uc7a5\ud788": [2, 15], "\uc218\uce58\uc758": 2, "\ubcc0\ud654\ub97c": [2, 12, 40], "\ubcf4\uc5ec\uc900\ub2e4": [2, 5, 10, 12, 15, 16, 25, 26, 29, 38, 40], "rank": [2, 5], "coller": 2, "\ubaa8\ub378\uc5d0": [2, 3, 5, 6, 8, 9, 11, 15, 16, 18, 21, 22, 25, 26, 28, 29, 31, 36, 39, 40, 41, 42], "\ubcc4\ub85c": [2, 29], "\uc21c\uc704\ub97c": [2, 29], "\ub9e4\uaca8": 2, "\uc21c\uc704\uc758": 2, "kendal": 2, "s": [2, 3, 4, 6, 9, 10, 12, 14, 15, 23, 26, 27, 29, 30, 32, 36, 37, 38, 39, 40, 41], "\u03c4": 2, "ranking\uc774": 2, "\ub9e4\uaca8\uc9c4": 2, "\uc218\uc5f4": 2, "\uc0ac\uc774\uc758": [2, 4, 6, 9, 11, 14, 15, 16, 21, 23, 40], "from": [2, 5, 9, 11, 22, 27, 37, 41], "scipi": 2, "import": [2, 10, 12, 18, 20], "stat": 2, "h": [2, 3, 7, 11, 19, 20, 21, 23, 30, 31, 34, 35, 42], "z": [2, 3, 6, 7, 11, 12, 13, 14, 19, 20, 23, 26, 32, 34, 35, 37, 40, 41, 43], "kendalltau": 2, "significanceresult": 2, "statist": [2, 33], "9999999999999999": 2, "pvalu": 2, "016666666666666666": 2, "19999999999999998": 2, "8166666666666667": 2, "result": [2, 9, 10, 12, 13, 17, 18, 20, 25, 32, 41, 43], "\uc720\uc0ac\ub3c4\ub294": 2, "\ub192\uc74c": [2, 28, 38], "889": 2, "kl\uacfc\uc758": 2, "\ube44\uad50\ud574\ubcf4\uba74": [2, 18], "infin": 2, "cleanfid": 2, "96": [2, 28], "\ub098\uba38\uc9c0": [2, 6, 15, 28, 29, 39], "metric\uac04": 2, "\ub0ae\uc74c": [2, 20], "network": [2, 6, 7, 10, 11, 15, 17, 23, 24, 30, 32, 37], "\uae30\ubc18\uc758": [2, 3, 5, 15, 17, 21, 22, 31, 39], "\uc911\uc5d0\uc11c\ub294": [2, 4], "infinity\uc774": 2, "\uac00\uc7a5": [2, 3, 4, 5, 6, 8, 9, 12, 13, 16, 17, 21, 22, 27, 28, 29, 31, 32, 33, 36, 41], "\ub192\uace0": [2, 5], "is\uc640": 2, "\ub300\ubd80\ubd84\uc758": [2, 4, 6, 14, 20, 40], "metric\uc774": 2, "\uce21\uc815\uc744": 2, "v3\ub97c": 2, "\uc0ac\uc6a9\ud558\ub294\ub370": [2, 6, 15, 17, 32], "\uacfc\uc5f0": [2, 9], "\uc801\uc808\ud55c\uac00": 2, "\uac00\uc815": [2, 11, 22], "infinity\ub294": 2, "space\uac00": [2, 12], "distribution\uc744": [2, 8, 26, 27, 34], "\ub530\ub978\ub2e4\ub294": 2, "\uac00\uc815\ud558\uc5d0": 2, "\uce21\uc815\ub418\ub294": 2, "\uc2e4\ud5d8": [2, 4, 9, 17, 28, 29, 31, 32, 35, 37], "10k\uc758": 2, "\uc0dd\uc131\ud558\uace0": [2, 4, 5, 6, 21, 22, 29, 34, 36], "\uc6d0\ubcf8\uc758": 2, "20k\uc758": 2, "\uac01\uac01\uc758": [2, 4, 8, 12, 15, 21, 23, 26], "network\uc640": [2, 21], "network\ub97c": [2, 3, 11, 27], "model\uc5d0": [2, 6, 12, 15, 16, 20, 24, 29, 40], "fit": 2, "\uc774\ub54c": [2, 3, 4, 6, 15, 22, 24, 30, 32, 33, 34, 36, 37, 39, 40, 41, 42, 43], "\uae30\ubc18\uc73c\ub85c": [2, 5, 6, 9, 13, 14, 17, 19, 22, 23, 24, 26, 32, 33, 36, 40, 41, 43], "\uac01": [2, 3, 4, 6, 11, 13, 14, 15, 17, 20, 21, 22, 23, 25, 27, 28, 29, 34, 35, 36, 39, 40, 41, 42], "\uc0d8\ud50c\uc758": [2, 25, 28], "\ud655\ub960\uac12\uc744": 2, "\uacc4\uc0b0\ud55c\ub2e4": [2, 12, 35], "8": [2, 4, 8, 11, 12, 13, 15, 18, 19, 20, 21, 24, 27, 33, 34, 37, 40, 41, 42], "\uac12\uc774": [2, 4, 5, 8, 10, 18, 22, 26, 33, 34, 35, 38, 40, 41, 43], "\ub0ae\uc740": [2, 3, 10, 11, 15, 17, 18, 25, 30, 31, 34, 36], "tail": 2, "vector\uc758": [2, 27], "\uc6d0\ubcf8": [2, 6, 9, 14, 15, 21, 24, 28, 29, 36, 40, 41, 42, 43], "\ub0ae\uc544\uc57c\ud568": 2, "\ud655\ub960\uc744": [2, 5, 9, 37], "\uac16\ub294": [2, 4, 8, 9, 16, 23], "\ud655\uc778\ud574\ubcf4\uba74": 2, "clip\uc744": [2, 3, 15], "\ud655\uc2e4\ud788": [2, 4], "\ub5a8\uc5b4\uc9c0\ub294": [2, 4, 9, 18, 28], "\ubc18\uba74": [2, 3, 4, 6, 12, 14, 16, 20, 35, 40, 41], "inception\uc758": 2, "\uc774\ubbf8\uc9c0\ub4e4\uc740": [2, 15, 24], "\ud004\ub9ac\ud2f0\ub97c": [2, 9, 22, 40], "\ubcf4\uc774\uace0": [2, 12, 14, 15, 33, 34], "\uac00\uc815\uc5d0": 2, "\uc704\ubc30": 2, "normal": [2, 5, 10, 11, 15, 23, 27, 32, 33, 37, 38], "latent": [2, 3, 4, 6, 8, 9, 14, 15, 17, 22, 24, 25, 26, 27, 31, 32, 36, 39, 41, 42, 43], "represent": [2, 4, 9, 14, 19, 34], "vector\ub4e4\uc744": 2, "dimension\uc5d0": [2, 20], "\ud22c\uc601\uc2dc\ucf1c": 2, "\ub530\ub974\ub294": [2, 21, 24, 42], "\uc9c0": 2, "\ud655\uc778\ud55c\ub2e4": 2, "\ucd94\ucd9c\ud55c\ub2e4": 2, "\uc5f0\uc0b0\uc744": [2, 5, 30], "d\ub85c": 2, "\ud22c\uc601\uc2dc\ud0a8\ub2e4": 2, "value\ub97c": 2, "\uad6c\ud55c\ub2e4": [2, 31, 35], "valu": [2, 8, 10, 20, 23, 41], "\uc5b4\ub5a0\ud55c": [2, 3, 12, 25, 27, 36, 40], "\uc0ac\uac74\uc774": 2, "\uc6b0\uc5f0\ud788": 2, "\uc77c\uc5b4\ub0a0": 2, "\ubc1c\uc0dd\ud560": [2, 5, 12], "\ud655\ub960\uc774": [2, 21, 23], "\uac70\uc758": [2, 9, 12, 16, 18, 33, 40], "\uc5c6\ub2e4": [2, 14, 15, 20, 24, 30, 35], "\uc778\uacfc\uad00\uacc4\uac00": 2, "\uc788\ub2e4": [2, 3, 4, 5, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 26, 29, 30, 31, 35, 38, 40], "\ud06c\ub2e4": 2, "distribution\uc740": 2, "random\uc744": 2, "\uae30\ubc18\uc73c\ub85c\ud558\uae30\ub54c\ubb38\uc5d0": 2, "\uc791\uc544\uc57c\ud55c\ub2e4": 2, "\uc989": [2, 4, 6, 8, 9, 11, 12, 14, 15, 16, 24, 29, 31, 32, 33, 34, 35, 38, 40, 42], "value\uac00": 2, "\ucee4\uc57c\ud55c\ub2e4": 2, "\ubaa8\ub4e0": [2, 3, 4, 5, 6, 8, 10, 12, 14, 15, 17, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 35, 40, 41, 43], "dataset\uc5d0": [2, 11, 16, 34, 40], "clip\uc758": [2, 3, 6, 29], "value\uac12\uc740": 2, "05\ub97c": 2, "\ub118\uc5b4": 2, "random\uc131\uc744": 2, "\uc720\uc9c0\ud558\uc9c0\ub9cc": 2, "inception\uc740": 2, "05\ubcf4\ub2e4": 2, "\uac12\uc744": [2, 4, 8, 10, 12, 15, 18, 21, 22, 23, 24, 26, 32, 34, 35, 38, 40], "\ubcf4\uc5ec": 2, "\uc720\uc9c0\ud558\uc9c0": 2, "\ubabb\ud55c\ub2e4": [2, 12, 14, 18], "net\uc744": 2, "\ud1b5\ud55c": [2, 3, 8, 13, 23, 24, 29, 32, 35, 41], "\uce21\uc815\ubcf4\ub2e4": 2, "\uc81c\uc548\ud55c\ub2e4": [2, 3, 12, 21, 25, 26, 29, 35, 40], "consist": [3, 10, 12, 30], "control": [3, 5, 13, 26, 27, 42], "synthesi": [3, 4, 6, 16, 19, 22, 24, 25, 27, 32, 36], "charact": [3, 36], "refer": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "paper": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "ab": [3, 4, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 41, 42, 43], "2311": [3, 13], "17117": [3, 13], "code": [3, 4, 5, 6, 7, 8, 11, 13, 15, 19, 20, 21, 22, 25, 27, 29, 31, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43, 44], "offici": [3, 6, 8, 10, 13, 15, 34, 35], "nonoffici": 3, "project": [3, 9, 13, 14, 19, 20, 22, 23, 35, 40, 42], "page": [3, 13, 29, 40], "humanaigc": 3, "github": [3, 13, 18, 20, 21, 29, 31, 33, 34, 36, 40, 44], "io": [3, 10, 11, 13, 18, 21, 29, 31, 33, 34, 40], "geonhak": [3, 13, 44], "song": [3, 12, 13, 32, 40, 41, 44], "march": [3, 13], "13": [3, 4, 13, 15, 22, 25, 38, 40], "2024": [3, 13, 15, 22, 23, 32, 33, 37, 40, 43, 44], "exampl": [3, 9, 10, 27, 29, 36, 39], "figur": [3, 4, 10, 13, 15, 18, 22, 23, 25, 26, 28, 29, 31, 33, 36, 38], "\ubaa8\ub378\ub4e4\uc774": [3, 8, 9, 15, 27, 28, 36, 42], "visual": [3, 12, 22, 29, 38, 41, 42], "\uc5f0\uad6c\uc5d0": 3, "\uc8fc\ub958\uac00": 3, "\ub418\uc5c8\uc9c0\ub9cc": 3, "\uc601\uc5ed\uc5d0\uc11c\ub294": 3, "\uc5b4\ub824\uc6c0\uc774": [3, 6, 18, 23], "animation\uc5d0\uc11c": 3, "\uc0c1\uc138": 3, "\uc815\ubcf4\uc758": [3, 14, 26], "\uc77c\uad00\uc131\uc744": [3, 14, 21, 33, 40], "\uc720\uc9c0\ud558\ub294": [3, 14, 20], "\uac83\uc740": [3, 6, 9, 11, 12, 14, 21, 22, 23, 28, 29, 31, 33, 37, 42], "\ubb38\uc81c\uc774\ub2e4": 3, "image\uc758": [3, 8, 12, 15, 16, 18, 19, 24, 26, 29], "\ubcf5\uc7a1\ud55c": [3, 4, 9, 14, 16, 23, 28], "appear": [3, 13, 36], "\ud2b9\uc9d5\uc758": 3, "\uc720\uc9c0\ud558\uae30": [3, 7], "\uc704\ud574\uc11c": [3, 4, 9, 13, 16, 27, 31, 32], "spatial": [3, 12, 14, 21, 22, 30], "attent": [3, 4, 8, 11, 13, 14, 15, 16, 17, 19, 20, 22, 25, 26, 30, 34, 35, 38, 42], "feature\uacfc": [3, 5, 25], "\ud1b5\ud569\ud560": 3, "referencenet": 3, "\uc124\uacc4": [3, 18], "controllability\uc640": 3, "continuity\uc744": 3, "\ud6a8\uacfc\uc801\uc778": [3, 14, 21, 22, 25], "pose": [3, 7, 13, 26, 27, 36, 42], "guider": 3, "\ub3c4\uc785": [3, 15, 18, 22, 23], "\ube44\ub514\uc624": [3, 13, 14, 21, 30], "\ud504\ub808\uc784\uac04": 3, "\ubd80\ub4dc\ub7ec\uc6b4": 3, "\uc804\uc774\ub97c": 3, "effect": [3, 12, 23, 26, 27, 39, 42], "tempor": [3, 13, 21], "\uc784\uc758\uc758": [3, 4, 12, 16, 29, 32], "\ub300\ud574\uc11c\ub3c4": [3, 4, 11, 12, 16, 21, 28, 29, 33, 35, 40], "animate\ud560": 3, "\uc788\uace0": [3, 12, 15, 16, 17, 22, 23, 24, 30, 32, 37, 39, 41, 42, 43], "\uc6b0\uc6d4\uc131\uc744": 3, "histori": 3, "animation\uc740": 3, "sourc": [3, 4, 11, 12, 13, 23, 26, 27, 29, 33, 34, 39], "\uc774\ubbf8\uc9c0\ub85c\ubd80\ud130": [3, 9, 14, 23], "\uc0ac\uc2e4\uc801\uc778": [3, 14], "\ube44\ub514\uc624\ub97c": [3, 13, 14, 21, 30], "animate\ud558\ub294": 3, "\uc791\uc5c5\uc73c\ub85c": 3, "gan\uc744": [3, 14, 15, 26, 27], "\uc2dc\uc791\uc73c\ub85c": 3, "\uc5f0\uad6c\uac00": [3, 5, 16, 17, 32], "\uc9c4\ud589\ub418\uc5b4\uc654\ub2e4": 3, "\uadf8\ub7ec\ub098": [3, 12, 13, 14, 29, 40, 41], "\ub610\ub294": [3, 5, 13, 14, 16, 17, 21, 23, 24, 29, 33], "\ube44\ub514\uc624\ub294": 3, "local": [3, 15, 23, 25, 26, 30], "distort": [3, 12, 23, 29], "blur": [3, 25], "detail": [3, 7, 9, 13, 15, 17, 22, 26, 31], "semant": [3, 4, 9, 17, 25, 29, 30, 33, 42], "inconsist": 3, "instabl": [3, 32], "\ubb38\uc81c\uac00": [3, 12, 17, 28, 30, 33, 37], "\ub110\ub9ac": [3, 14], "\uc0ac\uc6a9\ub418\uae30\uc5d0\ub294": 3, "\uc788\uc5b4\uc654\ub2e4": 3, "\uae30\ubc18": [3, 4, 5, 13, 14, 15, 17, 23, 24, 25, 28, 29, 34], "\uc6b0\uc218\uc131\uc5d0": 3, "task\uc5d0": [3, 5, 7, 19, 20, 29], "\ud65c\uc6a9\ud558\ub824\ub294": [3, 26], "\uc5f0\uad6c\ub4e4\uc774": [3, 8, 18, 26, 32], "\ubcf4\uc600\ub2e4": [3, 14, 18, 21, 25, 26, 40], "dreampos": 3, "23": [3, 10, 33], "04": 3, "\ud655\uc7a5\ud55c": 3, "fashion": 3, "\ud569\uc131\uc744": 3, "\uac00\ub2a5\ud558\ub294\ub370": 3, "\ucd08\uc810\uc744": [3, 29, 43], "\ub9de\ucdc4\ub2e4": 3, "\ubcf8": [3, 4, 6, 9, 11, 12, 14, 17, 20, 21, 23, 28, 31, 34, 35, 38, 40], "clip\uacfc": [3, 14], "feature\ub97c": [3, 15, 22], "\ud1b5\ud569\ud55c": [3, 9], "adpatar": 3, "module\ub97c": 3, "\uc81c\uc548\ud588\ub2e4": [3, 26, 40], "sample\uc5d0": [3, 23], "finetuning\uc774": 3, "\ud544\uc694\ud558\uace0": [3, 14, 22, 24], "\uc6b4\uc6a9": 3, "\ud6a8\uc728\uc774": 3, "\ub5a8\uc5b4\uc9c4\ub2e4": [3, 4, 14, 40], "disco": 3, "07": [3, 18], "\uc218\uc815\ud558\uc5ec": 3, "danc": [3, 13], "\uc9c4\ud589": [3, 4, 11, 13, 22, 26, 34, 35, 38, 41], "controlnet\uc744": [3, 13], "\ud1b5\ud569": [3, 4, 13], "\uad6c\ucd95": [3, 4, 30, 34, 42], "\ubcf4\uc874\uc5d0": [3, 14], "\uc5b4\ub824\uc6c0\uc744": [3, 13, 14, 16, 26, 34], "\uacaa\uace0": [3, 16], "frame\uac04": [3, 13], "jitter": 3, "issu": [3, 34], "\uc874\uc7ac": [3, 13, 23], "\uad00\uc810\uc5d0\uc11c\uc758": 3, "generation\uc5d0": [3, 6, 16], "\uc2dc\uac01\uc801": [3, 9, 14, 22, 25, 29], "\ud488\uc9c8\uacfc": [3, 14, 21], "\ub2e4\uc591\uc131\uc5d0": [3, 29], "\uc9c4\uc804\uc774": 3, "\uc788\uc5b4\uc654\uc9c0\ub9cc": 3, "detail\uc744": [3, 26, 29], "\uc0b4\ub9ac\ub294": 3, "\uac83\uc774": [3, 4, 6, 7, 9, 11, 12, 14, 16, 17, 20, 22, 27, 28, 29, 30, 32, 33, 35, 36, 38, 39, 40, 41, 42, 43], "\uc5b4\ub835\uace0": [3, 4, 13, 14, 33], "\uc815\ud655\ub3c4": [3, 33], "\uce21\uba74\uc5d0\uc11c\ub3c4": 3, "\ubd80\uc815\ud655\ud55c": [3, 12], "\ubd80\ubd84\uc774": [3, 12, 15, 27, 28], "\ub354\uc6b1\uc774": 3, "\uc2e4\uc9c8\uc801": 3, "\uc6c0\uc9c1\uc784\uc744": [3, 14], "\ub2e4\ub8f0": 3, "\uc77c\uad00\uc131": [3, 13], "\uce21\uba74\uc5d0\uc11c": [3, 14, 17, 27], "\uc548\uc815\uc801\uc774\uace0": 3, "\uc5f0\uc18d\uc801\uc778": [3, 14, 23, 30, 40], "\uc601\uc0c1\uc744": [3, 9, 30, 31, 40], "\ub9cc\ub4e4\uc5b4\ub0b4\ub294": 3, "\uc5b4\ub835\ub2e4": [3, 13, 14, 21], "\ud604\uc7ac\ub294": 3, "\uc77c\ubc18\uc131\uacfc": 3, "\ub3d9\uc2dc\uc5d0": [3, 5, 6, 8, 23, 25, 26], "\ub9cc\uc871\ud558\ub294": [3, 12, 40], "\ucc3e\uc744": [3, 29, 31], "\uc5c6\uc5b4": [3, 11, 38, 43], "\uad6c\uc870": [3, 9, 10, 15, 21, 23, 27, 28, 33, 41], "\uc694\uc57d": [3, 14, 21, 28, 31], "consistency\ub97c": [3, 40], "attention\ub97c": 3, "unet\uc73c\ub85c": 3, "\ud558\uc5ec\uae08": 3, "\uc77c\uad00\ub41c": [3, 6, 14, 21, 23, 30], "\uad00\uacc4\uc131\uc744": 3, "\uc885\ud569\uc801\uc73c\ub85c": 3, "\ud568": [3, 4, 11, 12, 13, 20, 21, 22, 28, 29, 31, 34, 35, 38], "controllability\ub97c": [3, 27], "lightweight": 3, "signal\uc744": 3, "denois": [3, 6, 10, 17, 20, 24, 25, 28, 30, 32, 40, 41, 42], "\uc808\ucc28\uc5d0": 3, "\ud1b5\ud569\ud568": 3, "stability\ub97c": 3, "layer": [3, 5, 7, 10, 11, 12, 15, 20, 22, 23, 27, 30, 31, 33, 37, 38, 42], "\uc5f0\uc18d\uc801\uc774\uace0": 3, "motion": [3, 4, 14, 32], "process\uc640": [3, 12, 16], "\uace0\ud574\uc0c1\ub3c4": [3, 5, 21, 22, 23, 25, 28, 33], "qualiti": [3, 7, 10, 22, 26, 30, 32, 34, 35, 37, 38, 40, 43], "\ubcf4\uc874\uc744": [3, 13], "\uad00\uacc4\uc131": 3, "\ud559\uc2b5": [3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 42, 43], "5k": [3, 13, 41], "\uc778\ud130\ub137": 3, "\uc138\ud2b8\ub85c": 3, "\uc7a5\uc810": [3, 15, 21], "appearance\uc758": 3, "consistency\uc744": 3, "\ud6a8\uacfc\uc801\uc73c\ub85c": [3, 6, 14, 32, 40], "\uc720\uc9c0": [3, 9, 42], "flickering\uacfc": 3, "\uc5c6\ub294": [3, 5, 12, 13, 14, 25, 26, 33, 35, 36, 38], "\uc2e0\ub8b0\ub3c4\uc758": [3, 22], "image\uc5d0\ub3c4": 3, "\uac00\ub2a5": [3, 4, 8, 11, 13, 15, 16, 22, 23, 35, 41, 42], "benchmark\uc5d0": 3, "\uc6b0\uc218\uc131": 3, "\uc99d\uba85": [3, 4], "t2i": [3, 5, 9, 17, 21, 22, 25], "ldm": [3, 4, 8, 13, 17, 19, 25, 26, 30, 40], "space\uc5d0\uc11c\uc758": [3, 12], "controlnet": [3, 5, 13, 42], "adapt": [3, 14, 15, 17, 20, 27], "mask": [3, 5, 21, 30, 34, 39, 42], "edg": [3, 4, 7, 33, 42], "depth\uc640": 3, "\uc870\uac74\ubd80": [3, 14, 21], "\uc0dd\uc131\uc744": [3, 6, 7, 13, 14, 17, 21, 22, 29, 30, 38, 40], "encod": [3, 4, 5, 9, 13, 15, 16, 19, 21, 34, 36, 37, 38, 39, 42, 43], "ip": [3, 13], "content": [3, 22, 26, 30, 33, 39], "objectstitch": 3, "edit": [3, 4, 15, 16, 17, 22, 24, 29, 31, 42], "\ubc29\ubc95": [3, 4, 5, 9, 14, 23, 31, 35, 37, 38, 40, 44], "tryondiffus": 3, "virtual": 3, "apparel": 3, "try": 3, "on\uc744": 3, "parallel": [3, 12], "u": [3, 4, 11, 12, 13, 14, 19, 21, 23, 31, 32, 36, 38, 41, 42], "t2v": [3, 21], "inter": 3, "frame": [3, 13], "modeling\uc744": 3, "\ub9ce\uc774": [3, 4, 9, 12, 14, 23, 28, 29, 30, 31, 35, 37], "\uc774\ub904\uc9d0": 3, "\uc0bd\uc785\ud55c": 3, "animatediff": [3, 13], "person": [3, 6, 8, 9, 17, 29], "module\uc744": 3, "data\ub85c": [3, 8, 13], "\ud559\uc2b5\uc2dc\ud0a8": [3, 7, 16, 31], "anyone\uc5d0\uc11c\ub294": 3, "modeling\uc5d0": 3, "\ubc1b\uc544": [3, 7, 11, 13, 21, 28, 35], "\ubc29\ubc95\ub860": [3, 20, 21, 40], "i2v": 3, "videocompos": 3, "condit": [3, 4, 5, 8, 9, 11, 15, 18, 21, 22, 24, 28, 30, 31, 32, 35, 36, 39, 40, 42], "latent\uacfc": 3, "nois": [3, 4, 8, 10, 11, 17, 18, 23, 24, 25, 27, 28, 30, 31, 32, 35, 36, 37, 40, 41, 42, 43], "\uac04": [3, 14], "weight": [3, 5, 8, 10, 12, 15, 17, 20, 22, 23, 28, 39, 41, 42], "mix": [3, 10, 15, 28], "videocraft": 3, "textual": [3, 8, 17, 36], "\ud1b5\ud569\ud558\uc5ec": 3, "cross": [3, 8, 13, 14, 15, 17, 22, 25, 26, 36, 38, 42], "attention\uc5d0": [3, 13, 15], "\uc8fc\uc785": [3, 4, 26], "\ubc29\ubc95\ub4e4": 3, "\ubaa8\ub450": [3, 5, 8, 9, 10, 12, 14, 15, 17, 18, 21, 22, 24, 25, 26, 27, 28, 29, 32, 33, 35, 36, 39, 40, 42], "\uc548\uc815\uc801\uc778": [3, 33], "\uc0ac\ub78c": [3, 13, 14, 21, 25, 33, 38], "\uc0dd\uc131\uc5d0\ub294": [3, 13, 15], "pidm": [3, 14], "lfdm": 3, "leo": 3, "\ubaa9\ud45c": [3, 8, 9, 14, 29, 33], "animation\uc744": 3, "guid": [3, 4, 6, 12, 14, 24, 32, 39], "\ud569\uc131": [3, 14, 23, 28], "eq": [3, 13, 40], "object": [3, 4, 9, 10, 22, 23, 29, 31, 32, 34, 36, 39], "epsilon_": [3, 4, 6, 11, 14, 19, 35, 40, 42], "theta": [3, 4, 6, 7, 11, 12, 14, 16, 17, 19, 20, 23, 32, 34, 35, 36, 37, 40, 41, 42, 43], "unet": [3, 10, 11, 25, 31, 36, 42], "func": 3, "c": [3, 6, 7, 8, 11, 12, 14, 15, 16, 17, 19, 21, 23, 26, 27, 31, 36, 40, 42], "embed": [3, 5, 7, 8, 9, 11, 14, 15, 16, 20, 21, 22, 26, 30, 34, 35, 36, 42], "t": [3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 19, 21, 22, 23, 30, 31, 32, 34, 35, 36, 40, 41, 42], "timestep": [3, 7, 8, 9, 12, 31, 36, 40, 42], "z_t": [3, 9, 12, 19, 40, 41, 42], "vit": [3, 5, 13, 15, 16, 25, 31, 36], "l": [3, 6, 8, 12, 14, 15, 16, 17, 19, 23, 31, 33, 40, 42, 43], "14": [3, 4, 15, 31, 40, 41], "downsampl": [3, 4, 11, 15, 21, 25, 35, 39, 41, 42], "middl": [3, 4, 27, 39, 42], "upsampl": [3, 11, 15, 16, 21, 22, 30, 35, 38, 42], "re": [3, 5, 22], "tran": 3, "block\ubcc4": 3, "2d": [3, 11, 21, 23], "convolut": [3, 15, 18, 22, 23, 27, 30, 33, 34, 42], "self": [3, 5, 7, 10, 11, 15, 17, 20, 21, 22, 27, 32, 37, 38, 40, 42, 43], "attention\ub85c": 3, "\uad6c\uc131": [3, 13, 17, 21, 22, 23], "overview": [3, 9, 12, 13, 32, 43], "3\uac00\uc9c0": [3, 9, 13, 17, 38, 39, 40, 42], "\uc911\uc694": 3, "\uc694\uc18c": [3, 17, 21], "image\ub85c\ubd80\ud130": [3, 16], "character\uc758": 3, "\uc81c\uc5b4\uac00\ub2a5\ud55c": [3, 13], "movements\ub97c": 3, "signal": [3, 9, 10, 41], "\uc5f0\uc18d\uc131\uc744": [3, 15], "relationship": [3, 16, 22], "text\ubcf4\ub2e4": 3, "image\uac00": [3, 12, 16, 33], "level": [3, 9, 12, 22, 24, 25, 27, 30, 42], "\ub0b4\ud3ec\ud568": 3, "encoder\uac00": 3, "encoder\ubcf4\ub2e4": 3, "\uc0ac\uc6a9\ub418\uc5c8\uc9c0\ub9cc": 3, "consistency\uc5d0\ub294": 3, "\uc5ed\ubd80\uc871": 3, "\uc774\uc720": [3, 4, 8, 18, 23], "encoder\ub294": [3, 25, 28, 43], "224x224\uc758": 3, "\uc774\ubbf8\uc9c0\ub4e4\ub85c": 3, "\uad6c\uc131\ub418\uc5b4": [3, 42], "\uc911\uc694\ud55c": [3, 5, 9, 10, 14, 18, 21, 27, 29], "\uc138\ubd80\uc815\ubcf4": 3, "\uc190\uc2e4\uc774": [3, 14, 40], "clip\uc740": [3, 12, 16], "text\uc5d0": [3, 29, 34], "\ub354\uc6b1": [3, 9, 21, 28, 34, 38], "\ubd80\ud569\ud558\uac8c": 3, "\ud6c8\ub828\ub418\uc5b4": [3, 17], "matching\uc5d0": 3, "\uac15\uc870\ub418\uace0": 3, "encoding\uc5d0": [3, 15], "\ubd80\uc871\ud568\uc774": 3, "extract": [3, 11], "network\uc778": [3, 12], "\uace0\uc548": 3, "\uc81c\uc678": 3, "referencenet\uc740": 3, "sd\ub85c": 3, "\ucd08\uae30\ud654\ud558\uace0": 3, "\ub3c5\ub9bd\uc801\uc73c\ub85c": [3, 14, 21, 32], "\uc218\ud589\ud558\uace0": 3, "unet\uacfc": [3, 14], "layer\ub85c": [3, 21], "map": [3, 4, 7, 9, 11, 14, 15, 22, 23, 26, 32, 33, 41, 42, 43], "x_1": [3, 11], "mathcal": [3, 5, 7, 11, 12, 14, 16, 19, 20, 23, 33, 40, 43], "time": [3, 4, 7, 8, 10, 11, 12, 15, 16, 18, 19, 20, 21, 22, 23, 25, 26, 31, 32, 34, 35, 38, 42], "x_2": 3, "\uc8fc\uc5b4\uc84c\uc744": [3, 4, 13, 14, 19, 21, 40], "t\ubc88": 3, "\uacf1\ud574": 3, "w\ucd95\uc5d0": 3, "concat": [3, 8, 9, 23, 25, 30], "attention\uc744": 3, "map\uc758": [3, 15, 26], "\ubc18\uc744": 3, "\uacb0\uacfc\ub85c": [3, 6, 21, 28], "\ubf51\uc74c": [3, 34], "2\uac00\uc9c0": [3, 6, 32, 34, 38], "\uc0ac\uc804": [3, 5, 6, 9, 14, 21, 29, 32, 36, 40], "\ud559\uc2b5\ub41c": [3, 6, 8, 14, 21, 23, 28, 29, 30, 31, 32, 33, 35, 38, 40], "sd\ub97c": [3, 25], "\uc0ac\uc6a9\ud568\uc5d0": 3, "\ucd08\uae30\uac12\uc774": 3, "\uc815\uc758": [3, 4, 10, 18, 41], "\ub41c": [3, 4, 6, 9, 17, 20, 22, 23, 25, 28, 31, 32, 33, 36, 40, 42], "\uc0ac\uc6a9\uac00\ub2a5": 3, "referencenet\uc758": 3, "\uacf5\uc720\ub418\uace0": 3, "\ub124\ud2b8\uc6cc\ud06c": [3, 14, 21, 23, 43], "\uad6c\uc870\ub97c": [3, 5, 7, 14, 19, 23, 27, 33, 34, 36, 38, 42], "\uac00\uc9d0\uc5d0": 3, "unet\uc740": 3, "space\uc5d0": [3, 12, 40], "\uc0c1\uad00\uad00\uacc4\uac00": [3, 28, 41], "\uc788\ub294": [3, 4, 5, 6, 7, 9, 12, 14, 15, 16, 17, 18, 21, 22, 23, 25, 27, 28, 29, 30, 31, 32, 33, 35, 36, 39, 40, 41, 42], "\uc120\ubcc4\uc801\uc73c\ub85c": 3, "\ud559\uc2b5\uc774": [3, 4, 8, 11, 15, 22, 26, 30, 33, 37, 42], "encoder\ub97c": [3, 12, 13, 25], "\uc81c\uacf5\ud568\uc5d0": 3, "\uc2e0\uc18d\ud55c": 3, "\ucd08\uae30\uac12": 3, "\uc124\uc815": [3, 4, 11, 20, 28, 34], "controlnet\uc740": 3, "target": [3, 8, 9, 11, 12, 13, 26, 29, 32, 33, 36, 41], "image\uc640": [3, 8, 12, 16, 33, 34], "\uacf5\uac04\uc801\uc73c\ub85c": [3, 14], "align\ub41c": 3, "\ud65c\uc6a9": [3, 4, 6, 30, 33, 34, 35], "\ubd80\uc801\ud569": 3, "\ubc29\ubc95\uc5d0\uc11c\ub294": 3, "\uacf5\uac04\uc801\uc73c\ub85c\ub294": 3, "\uad00\uacc4\ub418\uc5b4\uc788\uc9c0\ub9cc": 3, "align\ub418\uc9c0": 3, "\ud0c0": [3, 32, 33, 41], "generation\uc5d0\uc11c\ub294": [3, 5], "frame\uc5d0": 3, "denoising\uc744": [3, 12, 18, 24], "\ucd94\ucd9c\ud560": 3, "\ubc88\ub9cc": [3, 17], "\ud544\uc694": [3, 10, 21, 23, 35, 40], "\ud6a8\uacfc": [3, 13, 14, 23, 26, 33, 38], "\ub2e8\uacc4\uc5d0\uc11c": [3, 11, 14, 17, 25, 29], "\uacc4\uc0b0\ub7c9\uc774": [3, 37], "\uc99d\uac00\ud558\uc9c0": 3, "\uc54a\ub294\ub2e4": [3, 12, 14, 21, 29, 30, 35], "robust\ud55c": 3, "\uc785\uc99d\ud574\uc654\uc9c0\ub9cc": 3, "tuning\uc774": [3, 28, 40], "\ud544\uc694\ud588\uc5c8\ub2e4": 3, "\uc800\uc790\ub4e4\uc740": [3, 9, 12, 16, 23, 25, 28, 29, 34, 35, 38], "\ucd94\uac00\uc801\uc778": [3, 7, 8, 11, 14, 15, 16, 19, 20, 23, 24, 27, 29, 32, 40, 42], "\uacc4\uc0b0\ub7c9": 3, "\uc99d\uac00\ub97c": 3, "\ub9c9\uae30\uc704\ud574": 3, "\ud1b5\ud569\ud558\uc9c0": 3, "\uc54a\uace0": [3, 11, 12, 14, 20, 21, 23, 32, 37, 39, 41, 43], "latent\uc640": 3, "\ub3d9\uc77c": [3, 23, 26], "\ud574\uc0c1\ub3c4\ub97c": [3, 23, 25, 27, 30, 39], "align\uc744": 3, "four": 3, "kernel": [3, 15], "stride": [3, 15, 33], "us": [3, 6, 8, 9, 10, 23, 29, 30, 33, 34, 38], "16": [3, 4, 5, 11, 13, 14, 15, 19, 20, 21, 25, 27, 31, 33, 34, 35, 36, 40, 42], "32": [3, 5, 10, 11, 15, 20, 22, 27, 28, 31, 34, 35, 42], "64": [3, 15, 21, 23, 27, 28, 38, 41, 42], "128": [3, 15, 22, 23, 28, 33, 37, 41], "channel": [3, 7, 11, 21, 22, 27, 35, 39, 42], "\ucd08\uae30\ud654": [3, 5, 13, 14, 21], "final": [3, 11, 16], "layer\uc5d0\uc11c": [3, 15], "zero": [3, 5, 9, 16, 20, 21, 22, 23, 28, 34, 38], "\uc774\ubbf8": [3, 8, 33, 38], "\uacf3\uc5d0\uc11c": 3, "\ud1b5\ud569\ud588\uc744": 3, "dependency\uac00": 3, "\uac00\ub2a5\ud568\uc744": 3, "\ub0b4": [3, 9], "block": [3, 15, 33, 35, 37, 42], "\uc548\uc5d0": [3, 26, 38], "attention\uacfc": 3, "\uc21c\uc11c": 3, "reshap": 3, "b": [3, 4, 5, 7, 11, 12, 16, 17, 20, 21, 23, 27, 31, 33, 34, 38, 43], "\uc218\ud589": [3, 4, 9, 13, 14, 22, 23, 29, 34, 37, 40], "residu": [3, 11, 16, 17, 22, 33, 35, 36, 38, 42], "connect": [3, 21, 23, 32, 38], "details\uc5d0": 3, "smooth": 3, "continu": [3, 4, 23, 32, 36, 43], "\ub2e8\uacc4": [3, 6, 11, 14, 37], "\uccab": [3, 4, 6, 7, 12, 14, 22, 23, 25, 27, 33], "\ubc88\uc9f8": [3, 4, 6, 7, 14, 23, 25, 27, 28], "singl": [3, 15, 23, 26, 29, 32, 40, 42], "noise\ub97c": [3, 10, 11, 12, 15, 18, 22, 24, 27, 40], "\uc785\ub825\uc73c\ub85c": [3, 14, 15, 17, 21, 22, 23, 28, 40], "\ubc1b\ub294": [3, 9, 11, 14, 21, 27], "\ud074\ub9bd\uc5d0\uc11c": 3, "\ub79c\ub364\uc73c\ub85c": [3, 14, 15], "\uc120\ud0dd": [3, 11, 21, 23, 34], "\ucd08\uae30": [3, 17, 32], "weight\ub294": [3, 7, 14, 20], "guider\ub294": [3, 13], "decod": [3, 9, 21, 30, 34, 36, 42, 43], "\ub294": [3, 4, 5, 6, 7, 9, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43], "\uadf8\ub300\ub85c": [3, 9, 12, 16, 21, 31, 35, 42], "\ud6c8\ub828\ud55c": 3, "\uc18d": [3, 14], "layer\ub9cc": [3, 20], "\uc785\ub825": [3, 5, 6, 13, 14, 21, 22, 23, 28, 29, 33, 36, 39, 43], "24frame": 3, "10": [3, 4, 8, 11, 13, 17, 18, 22, 23, 24, 25, 28, 30, 31, 32, 33, 35, 37, 40, 41, 42], "second": [3, 9, 32], "long": [3, 11, 13, 36], "\uc778\ud130\ub137\uc5d0\uc11c": [3, 13], "\ub2e4\uc6b4\ub85c\ub4dc": 3, "dwpose": 3, "distil": [3, 15, 35], "whole": 3, "bodi": [3, 13, 42], "idea": [3, 24], "research": [3, 22, 28, 39, 41], "student": [3, 41], "head": [3, 9, 11, 21, 26, 35], "onli": [3, 5, 10, 23, 25, 26, 30, 34], "plug": [3, 13, 42], "plai": [3, 42], "gpu": [3, 13, 14, 15, 20, 23, 40, 42], "nvidia": [3, 14, 23, 36, 42], "a100": [3, 14, 15, 20, 36, 40], "768": [3, 15, 40], "\ud574\uc0c1\ub3c4": [3, 30], "center": [3, 13, 23, 35], "crop": [3, 13], "30": [3, 21, 28, 30, 39], "000": [3, 4, 25, 31, 40], "batch": [3, 5, 8, 13, 20, 21, 22, 23, 33, 36, 37, 41, 42], "size": [3, 5, 13, 15, 20, 22, 23, 25, 27, 33, 37, 38, 39, 41, 42, 43], "learn": [3, 5, 9, 13, 14, 15, 20, 21, 23, 26, 27, 28, 29, 33, 38, 41, 42], "rate": [3, 5, 8, 10, 13, 14, 21, 23, 26, 32, 33, 41, 42], "\uce90\ub9ad\ud130": [3, 17], "skeleton\uc758": 3, "\uae38\uc774\uc5d0": 3, "\uadfc\uc0ac\ud558\uae30": 3, "\uc720\ub3c4\ub41c": [3, 33], "\uae38\uc774": [3, 13, 30], "rescal": [3, 25, 32, 35], "ddim": [3, 4, 9, 16, 28, 29, 40, 41, 42], "sampler": [3, 28, 41], "\uae34": [3, 13, 27, 30], "\uc601\uc0c1": [3, 9, 14, 23, 30], "aggreg": 3, "\ucc44\ud0dd": [3, 8, 35], "evalu": [3, 4, 8, 9, 10, 15, 16, 30, 32, 39], "benchmark": [3, 33, 38, 39], "dataset": [3, 4, 12, 15, 18, 22, 29, 30, 31, 34, 35, 37, 38, 41], "2\uac1c": [3, 11, 14, 22], "ubc": [3, 14], "tik": 3, "tok": 3, "\uc804\uc2e0\uc774": 3, "\ub098\uc624\ub294": [3, 23, 26, 28, 33, 34, 35, 36, 40], "\uc808\ubc18": 3, "\uae38\uc774\uc758": 3, "portrait": [3, 9, 26], "cartoon": 3, "humanoid": 3, "characters\uc5d0": 3, "\uc720\uc0ac\ud55c": [3, 4, 8, 12, 17, 19, 29, 34, 36, 40, 41, 43], "\ubcf4\uc774\ub294": [3, 8, 10, 15, 18, 24, 33, 41], "ssim": 3, "psnr": 3, "lpip": [3, 4, 12, 15, 32], "fvd": [3, 21, 30], "fr\u00e9chet": 3, "distanc": [3, 15, 21, 23, 32, 34], "tabl": [3, 4, 8, 17, 18, 20, 22, 25, 26, 28, 30, 31, 33, 35, 42], "quantit": [3, 4, 16, 40, 42], "500": [3, 8, 14, 28], "videos\ub85c": 3, "\uc57d": [3, 14, 16, 17, 29, 33, 34], "bdmm\uc740": 3, "\uc637\uc758": [3, 14], "\uc783\uc5b4\ubc84\ub9ac\ub294": [3, 26], "\uc0c9\uacfc": 3, "\uc12c\uc138\ud55c": 3, "\uad6c\uc870\uc801": [3, 5, 13], "\uc694\uc18c\uc5d0": 3, "error": [3, 17, 31, 41, 43], "\ubc1c\uc0dd": [3, 20, 30, 36], "\ubc29\ubc95\uc740": [3, 4, 5, 6, 12, 13, 16, 17, 20, 29, 33, 36, 40], "\uc138\ubd80": [3, 17, 21, 29], "\ub0b4\uc6a9\uae4c\uc9c0": 3, "\uc77c\uad00\uc131\uc788\uac8c": [3, 9], "\ubcf4\uc874\ub428": 3, "tiktok": 3, "340": 3, "between": [3, 9, 16, 23, 34, 38, 41], "disco\uc5d0\uc11c\ub294": 3, "foreground": 3, "mask\ub97c": [3, 26], "sam": 3, "\ud65c\uc6a9\ud558\ub294": [3, 29, 30], "pipelin": [3, 35, 38], "\uc5c6\uc774": [3, 5, 8, 10, 11, 16, 17, 21, 22, 25, 26, 28, 29, 31, 32, 33, 34, 35, 38, 40, 42], "\uc790\uccb4\uac00": [3, 6, 18, 29], "subject": [3, 14, 17, 36], "motion\uc73c\ub85c\ubd80\ud130": 3, "\uc804\uacbd\uacfc": 3, "\ubc30\uacbd\uc758": 3, "\uad6c\ubd84": 3, "sequence\uc5d0\uc11c\ub3c4": 3, "\uc2dc\uac01\uc801\uc73c\ub85c": [3, 6, 34], "motion\uc744": 3, "robust": [3, 4, 9, 12, 31, 42], "gen": [3, 36], "image\uc5d0": [3, 11, 12, 16, 29], "\uc678\uad00": [3, 13, 14], "\uc2e0\ub8b0\ub3c4\ub9cc": 3, "\uc5bc\uad74\uc774": 3, "\uc77c\uad00\ub418\uac8c": [3, 6], "\uc720\uc9c0\ub418\ub294": [3, 9], "\ubb38\uc81c\uc5d0": [3, 11], "\ubd09\ucc29\ub41c": 3, "\uc0c1\ud669": 3, "\uc18d\uc5d0\uc11c": 3, "\ub300\ube44": [3, 40], "\uc2dc\uac04\ub3d9\uc548": 3, "apper": 3, "design": [3, 15, 27, 37, 43], "\ud6a8\uacfc\uc131": 3, "\uc99d\uba85\uc744": [3, 12], "encoder\ub9cc": 3, "finetun": [3, 5, 6, 8, 13], "\uc774\ud6c4": [3, 4, 6, 13, 14, 16, 17, 20, 22, 29], "\uacb0\ub860": [3, 28, 31], "referencenet\ub97c": 3, "\uc88b\uc558\ub2e4": [3, 31], "\uac83\uc5d0": [3, 7, 22, 29, 33], "\uac00\ub054": [3, 40], "\uc65c\uace1": 3, "\uce21\uba74\ub9cc": 3, "\ubcf4\uc774\uae30": 3, "\ub54c\ubb38\uc5d0": [3, 7, 9, 11, 13, 14, 15, 17, 20, 22, 23, 27, 28, 32, 33, 36, 37, 40, 41, 42, 43], "\ubcf4\uc774\uc9c0": 3, "\ubd80\ubd84\uc5d0": [3, 6, 15, 27, 28, 32, 43], "\ub300\ud574\uc11c\ub294": [3, 8, 12, 13, 16, 18, 21, 28, 41], "ill": 3, "problem\uc73c\ub85c": 3, "\ubd88\uc548\uc815": 3, "\ud65c\uc6a9\uc5d0": 3, "non": [3, 4, 9, 12, 15, 18, 22, 23, 31, 35, 42], "oper": [3, 21, 32], "effici": [3, 7, 9, 10, 20, 23, 31, 38], "translat": [4, 23], "brownian": [4, 32], "bridg": 4, "cvpr": [4, 8, 15, 18, 19, 22, 27, 36, 39, 44], "2205": [4, 38], "07680": 4, "xuekt98": 4, "seonhoon": [4, 9, 31, 44], "relat": [4, 9, 31, 44], "youtub": [4, 9, 20, 34], "video": [4, 9, 13, 32, 44], "nov": [4, 6, 12, 21, 30, 31, 41], "\uc740": [4, 5, 8, 9, 11, 13, 14, 15, 22, 25, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 42, 43], "\ub3c4\uc785\ud55c": [4, 17, 25], "\ucd5c\ucd08\uc758": [4, 9, 23], "\ubd84\uc57c\uc5d0\uc11c": [4, 10, 15, 17, 18, 26, 37, 40], "\ud55c\uacc4\ub97c": [4, 15, 21, 22, 26, 33], "\uadf9\ubcf5\ud568": 4, "\uc774\ud574\ud558\uae30": 4, "\uc704\ud574\uc11c\ub294": [4, 14, 29, 31, 34, 42], "process": [4, 9, 18, 24, 29, 31, 34, 36, 37, 41, 42], "\uc774\ud574\ud574\uc57c\ud568": 4, "stochast": [4, 9, 10, 16, 24, 32, 37, 40, 41], "\ud574\ub2f9\ud568": 4, "\uc2dc\uac04\uc758": 4, "\ud750\ub984\uc5d0": 4, "\ubd88\ud655\uc2e4\uc131\uc744": 4, "\uac00\uc9c0\uace0": [4, 5, 9, 12, 16, 17, 23, 25, 27, 30, 32, 34, 37, 40, 41, 42, 43], "\ubcc0\ud558\ub294": [4, 12], "\ubcc0\uc218\ub4e4\uc758": 4, "\uc9d1\ud569": [4, 23], "x_t": [4, 9, 11, 12, 16, 19, 31, 32, 35, 40, 42], "\ub098\ud0c0\ub0bc": [4, 23, 33, 40], "\uc788\ub294\ub370": [4, 12, 24, 25, 26, 31, 40, 42, 43], "\uc5ec\uae30\uc11c": [4, 7, 11, 17, 19, 27, 28, 29, 32, 40, 41, 43], "\ubcc0\uc218\ub97c": 4, "\ubcc0\uc218\uac00": 4, "\uad00\ucc30\ub41c": [4, 23], "\uc2dc\uac04\uc744": [4, 9, 14], "\ub098\ud0c0\ub0c4": [4, 11, 28], "discret": [4, 22, 32, 34, 41], "\uad6c\ubd84\ud560": 4, "variabl": [4, 12, 37, 41, 43], "wiener": 4, "\uc18c\uac1c": [4, 8, 9], "\uc720\uccb4\uc758": 4, "\ubbf8\uc18c\uc785\uc790\uac00": 4, "\ubd88\uaddc\uce59\ud558\uac8c": 4, "\uc6b4\ub3d9\ud558\ub294": 4, "\ud604\uc0c1": [4, 15, 23, 36], "\uad74\ub69d\uc5d0\uc11c": 4, "\ud37c\uc838\ub098\uac04": 4, "\uc5f0\uae30": 4, "\uc624\ub978\ucabd\uc73c\ub85c": 4, "90\ub3c4": 4, "\ud68c\uc804\uc2dc\ud0a8": 4, "\uc0ac\uc9c4\uc73c\ub85c\ubd80\ud130": 4, "\uc9c1\uad00\uc801\uc73c\ub85c": 4, "\uc774\ud574\ud574\ubcfc": 4, "\uc5f0\uc18d": [4, 14], "\uc2dc\uac04": [4, 6, 9, 11, 13, 14, 20, 21, 22, 30], "\uacfc\uc815\uc73c\ub85c": [4, 30, 31, 36], "\ubaa8\ub378\ub9c1\ud55c": [4, 34], "w_0": [4, 8, 20], "\uc774\uace0": [4, 9, 12, 37, 40, 42, 43], "max": [4, 6, 20, 40], "1000": [4, 10, 11, 23, 25, 28], "\uc778": [4, 5, 9, 12, 19, 31, 32, 40, 41], "100\ubc88": 4, "w_t": [4, 32, 36], "\ub098\ud0c0\ub0b8\ub2e4": [4, 12, 29], "\uc774\ud574\ud574\ubcf4\uc790": 4, "\uac00\uc815\ud574\ubcf4\uc790": 4, "\uc774\ub77c\uace0": [4, 7, 9, 12, 29, 32], "\ud558\uc790": 4, "\uc27d\uac8c": [4, 23, 25, 27, 29], "\ud558\ub2e4\uace0": 4, "\uc815\uc218": [4, 25], "requir": [4, 20], "\uc774\ub2e4": [4, 11, 12, 20, 22, 31, 35, 40], "\ub9c8\ub2e4": [4, 15, 22, 31, 33, 41, 42], "\ubd80\uc5ec\ub418\uc5b4\uc57c": 4, "\ud55c\ub2e4": [4, 5, 12, 14, 16, 19, 21, 29, 30, 31, 35, 38, 40], "\uac04\uaca9\uacfc": 4, "\ubcc0\ud654\ub7c9\uc774": [4, 8, 41], "\ube44\ub840\ud574\uc57c": 4, "\uc624\ub798": [4, 29], "\uc9c0\ub0ac\uc744\uc218\ub85d": 4, "\ubcc0\ud55c\ub2e4": 4, "notat": [4, 30, 41], "www": [4, 9, 20, 34], "com": [4, 9, 20, 29, 33, 34, 36], "watch": [4, 9, 20, 34], "v": [4, 5, 8, 9, 11, 17, 19, 20, 26, 29, 34, 36, 37, 40, 41, 42], "ld0rxwajpkm": 4, "ab_channel": [4, 9], "finrgb": 4, "delta": [4, 8, 12, 17, 20, 32], "\uac04\uaca9": 4, "\uc0b4\ud3b4\ubcf4\uace0\uc790": 4, "\uac04\uaca9\uc758": [4, 23], "i": [4, 8, 11, 12, 14, 15, 16, 19, 20, 23, 24, 25, 27, 30, 32, 34, 36, 37, 38, 40, 41, 42, 43], "d": [4, 11, 12, 14, 15, 19, 20, 21, 23, 27, 32, 37, 40, 41], "epsilon_t": [4, 12, 16], "sim": [4, 6, 11, 19, 23, 30, 32, 37, 40, 41, 42], "\uc2dc\uc810\uc5d0\uc11c": 4, "\ub2e4\uc74c": [4, 5, 6, 14, 21, 27, 29, 32, 33, 38, 40, 42], "\uac04\uaca9\uae4c\uc9c0": 4, "\uc99d\uac00\ud55c": [4, 28], "\uac12": [4, 15, 23, 32, 34], "w_": [4, 25, 36], "sqrt": [4, 11, 12, 16, 19, 32, 40, 42], "\uc774\ud574": [4, 9, 21], "\ub77c\uace0": [4, 8, 9, 12, 17, 20, 22, 29, 31, 38, 40, 43], "\uc815\uc758\ud574": 4, "\uadfc\uac70\ub97c": 4, "\ucc3e\uc544\ubcf4\uba74": 4, "\ubcc0\uc218": 4, "epsilon": [4, 6, 11, 12, 14, 16, 17, 19, 31, 32, 35, 36, 40, 41, 42], "\ub3c4\uc785\ud568\uc73c\ub85c\uc368": 4, "\ubd80\uc5ec": 4, "\uac04\uaca9\ub3c4": 4, "\uace0\ub824": [4, 35], "\uadf8\ub807\ub2e4\uba74": [4, 9], "\uc65c": [4, 7, 9, 12, 18, 31], "\ud558\ud544": 4, "\uacf1\ud588\uc744\uae4c": 4, "\uac00\uae4c\uc6cc\uc9c8": 4, "\ucc9c\ucc9c\ud788": 4, "\uc218\ub834\ud568": 4, "\ub9cc\uc57d": [4, 28], "\ud558\ub2e4\uba74": 4, "\uc791\uc740": [4, 5, 8, 11, 12, 17, 20, 21, 25, 28, 29, 31, 32, 33, 40], "\ub428": [4, 28, 31, 34], "\ub77c\uba74": 4, "\ub108\ubb34": [4, 12, 16, 18, 21, 25, 26, 34, 40], "\uc791\uc544\uc9d0": 4, "\ucee4\uc9c8": 4, "\ucee4\uc9d0": 4, "\uc8fc\uc758\ud560": 4, "\uc0ac\ud56d": 4, "\uc774\ubbc0\ub85c": [4, 9, 12, 23, 32, 35, 41], "w_1": 4, "\uc11c\ub85c": [4, 6, 9, 12, 27, 31, 33], "\ub3c5\ub9bd\uc778": 4, "\ub9de\uc9c0\ub9cc": 4, "\ub3c5\ub9bd\uc774\ub77c\ub294": 4, "\ub9d0\uc740": [4, 33], "\uc544\ub2d8": 4, "epsilon_0": 4, "var": 4, "\uacf5\ubd84\uc0b0\uc740": 4, "\ud30c\ub780\uc0c9": [4, 28], "\uc810\ub4e4\uc740": 4, "1\ubc88": [4, 33], "\uacb0\uacfc\uc784": 4, "\ubd80\ud130": [4, 5, 12, 16, 22, 23, 34, 41], "\uae4c\uc9c0": [4, 20, 23, 30, 31, 39, 40, 41], "\uc218\ud589\ud558\uba74": 4, "\ub9cc\ud07c": [4, 12, 25, 31, 34], "t_2": [4, 32, 40], "t_1": [4, 32, 40], "ex": [4, 9, 11, 14, 23, 33], "5\ubd84": [4, 36], "10\ubd84\uc73c\ub85c": 4, "\uc9c4\ud589\ud558\uba74": 4, "w_5": 4, "\uc544\ub2d0": 4, "\uc788\uc73c\ub098": [4, 21], "\ubcc0\ud654\ub7c9": 4, "t_": [4, 12, 15, 23, 24, 32, 40], "t_5": 4, "\ub530\ub978\ub2e4": 4, "standard": [4, 10, 15, 27, 31, 32, 33, 41], "\uc2dc\uc810\uacfc": 4, "\uc2dc\uc810\uc758": [4, 10, 14, 35], "\uc54c\uace0": 4, "\uc77c": [4, 9, 37, 40, 41], "\uc810\uc744": [4, 12, 14, 24, 26], "\uc120\ud615\uc73c\ub85c": 4, "\uc5f0\uacb0\ud558\ub294": 4, "\ub2e4\uc74c\uacfc": [4, 6, 7, 9, 12, 14, 16, 17, 19, 27, 29, 32, 33, 36, 37, 40, 41, 42, 43], "\uac19\ub2e4": [4, 12, 16, 29, 35, 38, 40], "\uc774\ud574\ub97c": [4, 12], "probabl": [4, 24, 32], "start": 4, "state": [4, 41, 42], "end": [4, 5, 11, 14, 27], "\uac12\uc5d0": [4, 23, 35, 40], "\ub418\uc5b4": [4, 9, 17, 22, 27, 32, 37, 42], "\uc815\uc758\ub420": 4, "\uc544\ub798\uc758": [4, 7, 9, 14, 19, 25, 33, 38], "\uadf8\ub9bc\uc744": [4, 9, 12, 25, 27, 28, 33], "\uc2dc\uc791\uac12\uacfc": 4, "123": 4, "\ubd84\uc0b0\uc740": 4, "\uc2dc\uc791\ud574\uc11c": [4, 11, 27], "\uc99d\uac00\ud558\ub2e4\uac00": 4, "\ucd5c\ub300\uac00": 4, "\ub418\uc5c8\ub2e4\uac00": 4, "\uc774\ud6c4\ub85c\ub294": 4, "\uac10\uc18c\ud558\uc5ec": 4, "\ub9c8\uc9c0\ub9c9\uc5d4": 4, "\uc218\ub834\ud558\uac8c\ub41c\ub2e4": 4, "w_1000": 4, "100\uac1c\uc758": [4, 14], "\uc0d8\ud50c\ub9c1\ud55c": [4, 32], "abstrcat": 4, "\uae30\uc874\uc758": [4, 7, 9, 12, 14, 21, 23, 24, 28, 33, 40, 42], "\ub4e4\uc740": [4, 9, 38], "\ubcc0\ud658\uc744": 4, "gener": [4, 7, 9, 13, 15, 16, 17, 18, 21, 22, 25, 26, 27, 29, 31, 33, 34, 35, 36, 37, 38, 41, 42, 44], "\ub2e4\ub8f8": [4, 23], "\uc774\ub85c": [4, 17, 38], "\uc778\ud574": [4, 13, 17, 22, 25, 30, 33, 38], "\uc0c1\uc774\ud55c": 4, "\ub3c4\uba54\uc778": [4, 17], "\ubcc0\ud658": [4, 23, 34], "\uc5d0\ub294": [4, 9, 11, 33, 38, 40], "\uc5b4\ub824\uc6c0": [4, 8, 13, 15, 37], "\ub17c\ubb38\uc740": [4, 17, 27, 28, 33, 36], "\uae30\ubc18\ud55c": [4, 5, 10, 23], "\ubaa8\ub378\ub9c1\ud558\ubbc0\ub85c": 4, "bidirect": 4, "\uc784": [4, 31], "\ubcc0\ud658\uc5d0": 4, "\uc811\ubaa9\ud55c": 4, "\ub17c\ubb38\uc784": 4, "\ud6cc\ub96d\ud55c": [4, 31, 34, 38], "\uc2e4\ud5d8\uc801\uc73c\ub85c": [4, 12, 27, 32, 38], "\uc99d\uba85\ud568": [4, 38], "introduct": 4, "i2i": 4, "\ubcc0\ud658\uc5d0\uc11c": 4, "pix2pix": [4, 33], "fideltii": 4, "\ub192\uc558\uc73c\ub098": 4, "output": [4, 5, 7, 9, 11, 13, 15, 20, 23, 30, 32, 33, 34, 36, 39, 41], "\ud559\uc2b5\ud558\uae30": [4, 6, 9, 14], "\ub54c\ubb38": [4, 15, 23, 31, 40], "\uc0dd\uc131\ud615": [4, 9, 37], "\ub9cc\ud07c\uc758": [4, 28], "\uc548\ub098\uc624\uace0": 4, "applic": 4, "\ubcf4\ub2e4": [4, 10, 11, 18, 20, 22, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 41, 42], "\uc2dc\ud0b4\uc73c\ub85c\uc368": 4, "\uc774\ub807\uac8c": [4, 7, 17, 28, 29, 31, 37], "desir": [4, 21], "\ucd94\ub860\ud574\ub0b8\ub2e4\ub294": 4, "\uba85\ub8cc\ud55c": 4, "\uc774\ub860\uc801": 4, "\uadfc\uac70\uac00": 4, "\uc548\ub418\ubbc0\ub85c": 4, "domain": [4, 12, 33, 41], "\uba87\uba87": [4, 12, 16, 18], "\uc5d0\uc11c\ub9cc": [4, 23], "\ud65c\uc6a9\ub420": [4, 9], "inpaint": [4, 22, 32, 39, 42], "super": [4, 10, 11, 15, 21, 27, 28, 30, 32, 33, 37, 39, 42, 43], "space": [4, 6, 9, 14, 15, 17, 21, 22, 25, 29, 30, 32, 34, 36, 41, 42, 43], "\uc218\ud589\ud568\uc73c\ub85c\uc368": 4, "\uac1c\uc120": [4, 15, 18, 23, 28, 35, 42], "\ud558\uae34": 4, "\ud588\uc73c\ub098": 4, "mechan": [4, 8, 21], "multi": [4, 5, 8, 9, 13, 14, 15, 29, 38, 42], "modal": [4, 5, 9, 29, 38], "\uc8fc\uc5b4\uc9c0\ubbc0\ub85c": 4, "\uc81c\uc2dc\ud558\uae30\uac00": 4, "\ud798\ub4e6": 4, "\uc81c\uc548\ud558\ub294": 4, "\uc544\ud0a4\ud14d\uccd0": [4, 9, 31, 34, 35, 38], "\uac04\uc758": [4, 6, 12, 14, 16, 21, 23, 26, 32, 33], "\uac00\uc18d\uc744": 4, "\uc218\ud589\ud568": [4, 21], "work": [4, 9, 31, 44], "\ucc38\uace0": [4, 5, 9, 21, 28, 31], "duffus": 4, "simplifi": 4, "\uc7a0\uae50": 4, "\uc0b4\ud3b4\ubcf4\uba74": [4, 17, 24, 40], "\uac19\uc74c": [4, 29], "\uc0bd\uc785\ub41c": 4, "\ub4dc\ub7ec\ub098": 4, "\uc788\uc9c0": [4, 17, 18, 30], "\uc54a\uc73c\ubbc0\ub85c": 4, "\ub3c4\ub2ec\ud560": 4, "\ubcf4\uc7a5\uc774": 4, "\ub3d9\uc548\uc758": 4, "\ubd84\ud3ec\uac00": [4, 23, 24, 33, 43], "\uc2dd": [4, 14, 35], "\uc55e\uc11c": [4, 32, 33], "\ubcf4\uc558\ub358": 4, "\ubd84\uc0b0\uc744": [4, 28, 38], "\uad6c\ud574\ubcf4\uc790": 4, "\uc2dd\uacfc": [4, 32], "\uc758\ubbf8\uc784\uc744": 4, "\uc54c": [4, 6, 12, 16, 28, 38, 40], "method": [4, 9, 10, 23, 27, 31, 32, 34, 35, 41], "\ud5a5\ud574": 4, "forward": [4, 7, 12, 15, 16, 18, 20, 21, 23, 24, 27, 33, 36, 37, 41, 42, 43], "vqgan": 4, "\uc601\uc0c1\uc758": [4, 40], "total": [4, 42], "\u03b4_t": 4, "\ubd84\uc0b0": [4, 11, 28, 35, 43], "\ub098\ud0c0\ub09c": 4, "\uc0ac\uc6a9\ud558\uac8c": 4, "\ub418\uba74": [4, 30], "\uac00\ub2a5\ud55c": [4, 5, 6, 10, 11, 14, 19, 23, 26, 31, 32, 37, 40, 42], "\ucd5c\ub300": [4, 6, 20, 23, 34], "\ubd84\uc0b0\uac12": 4, "\uc5d0\uc11c\uc758": [4, 15, 30, 31, 32, 41, 42], "\ubd84\uc0b0\uac12\uc778": 4, "\u03b4_": 4, "\ucee4\uc9c0\uba74": 4, "\ubd84\uc0b0\uac12\ub3c4": 4, "\ucee4\uc9c0\ub294\ub370": 4, "\ub2e4\ub8e8\uae30\uc5d0": 4, "\ud07c": [4, 8], "x_0": [4, 11, 12, 14, 16, 40], "\uc774\uba74\uc11c": 4, "\ub3c5\ub9bd\uc77c": 4, "schedul": [4, 11, 18, 22, 31, 32, 33, 35, 36, 41, 42], "\ud574\ubcfc": [4, 36], "\uc815\uc218\uc758": 4, "\ucd5c\ub313\uac12\uc778": 4, "\uc774\ub77c\uba74": [4, 9], "delta_t": 4, "\uadf8\ub9bc\uacfc": [4, 7, 22, 27, 34, 37, 38, 43], "\uac19\uac8c": 4, "\ub41c\ub2e4": [4, 10, 12, 14, 21, 22, 23, 31, 38, 40], "\uc2dc\uac01\ud654\ud55c": 4, "m_t": 4, "overt": 4, "\uc2dc\uc791\ud558\ub294": 4, "\uc5d0\uc11c\ub294": [4, 6, 9, 12, 16, 18, 22, 30, 31, 36, 37, 38], "m_0": 4, "\ud3c9\uade0\uc740": 4, "\ub05d\ub098\ub294": 4, "\ubd84\uc0b0\uc774": [4, 19], "\uc911\uac04": [4, 6, 14, 18, 29, 35], "\uc9c0\uc810\uae4c\uc9c0\ub294": 4, "\uc99d\uac00": [4, 15, 35], "\ud558\ub2e4\uac00": 4, "\uc9c0\uc810\ubd80\ud130": 4, "\uac10\uc18c": [4, 23], "\ubd84\uc0b0\uac12\uc5d0": 4, "\uc758\ud574": [4, 6, 14, 22, 23, 27, 32, 33, 36], "\uacb0\uc815": 4, "\uc2a4\ucf00\uc77c\ub9c1\ud558\ub294": 4, "\ub450\uc5b4": [4, 33], "\uc870\uc808": 4, "\ud560": [4, 5, 6, 7, 9, 11, 12, 14, 17, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 38, 40, 41, 42], "\uc870\uc808\uc744": 4, "\uacc4\uc218": 4, "\ud3ec\ud568\ub41c": [4, 23], "\ub514\ud3f4\ud2b8": 4, "margin": [4, 37, 43], "\ub9cc": [4, 8, 9, 11, 12, 20, 22, 30, 31, 33, 36, 40, 41], "\uc81c\uacf5": [4, 9], "\uc11c\ub294": 4, "transit": 4, "q_": [4, 12, 34, 40, 43], "bb": 4, "x_": [4, 8, 10, 11, 12, 15, 16, 26, 32, 35, 36, 40, 41], "\uc54c\uc544\uc57c\ud568": 4, "\ub54c\uc758": [4, 9, 12, 14, 25, 28], "\uc4f8": [4, 9, 12, 37], "m_ty": 4, "m_": 4, "\uc4f0\ub294": 4, "\uc633\uc74c": 4, "\ud558\uac8c": [4, 5, 9, 15, 25, 30, 31, 35, 37, 39, 41, 42, 43], "\ub300\uccb4": [4, 9, 15, 20, 23], "\ud558\uba74": [4, 7, 9, 15, 28, 31, 33], "\uc720\ub3c4\ub428": 4, "delta_": [4, 11], "\ub300\uc785": 4, "\uad6c\ud558\uba74": 4, "\ub420": [4, 14, 22, 27, 28, 29, 30, 41], "\uc778\ub370": [4, 7], "\uc544": 4, "\ub3c4\uba54\uc778\uc73c\ub85c\ubd80\ud130": 4, "\ub3c4\uba54\uc778\uc73c\ub85c\uc758": 4, "fix": [4, 10, 11, 17], "\uc815\uc758\ud558\ub294\uad6c\ub098": 4, "\ub85c\ubd80\ud130": [4, 5, 6, 7, 9, 16, 21, 23, 32, 33, 36, 37, 41, 42, 43], "\uc2dc\uc791": [4, 7, 21], "\ub9e4": [4, 11, 41, 42], "\uc2a4\ud15d\ub9c8\ub2e4": [4, 25], "\uc870\uae08\uc529": [4, 9, 28], "\uc81c\uac70\ud574\ub098\uac10": 4, "\ub460\uc73c\ub85c\uc368": 4, "\uc790\uccb4\uc5d0\uc11c": 4, "mu_": [4, 11, 12, 16], "\uc608\uce21\ub41c": [4, 14, 17, 22, 23], "\ub178\uc774\uc988": [4, 14, 17, 21, 25, 36], "\ud3c9\uade0\uac12\uc774\uba70": 4, "tild": [4, 11, 12, 14, 15, 17, 18, 30, 40, 41, 43], "\ub178\uc774\uc988\uc758": [4, 30], "\ucc98\ub7fc": [4, 9, 22, 27, 32, 33, 34, 39, 42], "paramet": [4, 7, 10, 11, 17, 20, 23, 26, 32, 34, 36, 38, 40, 41, 42], "\uc2e0\uacbd\ub9dd": [4, 7, 17], "\uc608\uc804": 4, "loss": [4, 7, 10, 15, 17, 18, 19, 22, 23, 24, 26, 31, 32, 34, 35, 36, 37, 40, 43], "\uac19\uc558\uc74c": 4, "\uc774\ub85c\ubd80\ud130": 4, "elbo": [4, 11, 34], "term": [4, 5, 18, 37, 43], "\uace7": [4, 9], "\ubb34\uc2dc\ud560": 4, "\uc138": [4, 5, 6, 9, 23, 25, 27, 30, 33, 36, 41], "\ub418\ubbc0\ub85c": [4, 7], "\ubca0\uc774\uc988": 4, "\uc774\ub860\uacfc": 4, "markov": [4, 10, 11, 37], "chain": [4, 9, 11, 35, 36, 37], "properti": [4, 22, 32, 36], "11": [4, 25, 38, 40], "\ub3c4\ucd9c": 4, "markovian": [4, 11, 12, 22, 35, 41], "\uc131\ub9bd\ub428\uc744": 4, "12": [4, 27, 40], "\uc815\ub9ac\ub428": 4, "\ud1b5\ud569\ud558\uace0": 4, "reparameter": [4, 34, 40], "mu_t": 4, "\ubcc0\ud615\ud560": 4, "\ubcc0\ud615": [4, 21], "\uc608\uce21\ud558\ub294": [4, 5, 11, 12, 16, 17, 22, 30, 40, 41], "\ub178\uc774\uc988\ub97c": [4, 11, 14, 28, 31], "\uc608\uce21\ud558\ub3c4\ub85d": [4, 11, 14, 18, 22, 23, 41], "\ud559\uc2b5\ub428": 4, "\ub0b4\uc6a9\uc744": [4, 6, 9, 13, 17, 21], "\uc2dd\uc5d0": [4, 32, 40], "\uba85\uc2dc\ud558\uae30": 4, "\uba85\uc2dc\ub41c": 4, "\uc368\ubcfc": 4, "combin": [4, 9, 12], "\uc368\ubcf4\ub294": 4, "\uac83\uc784": 4, "\uadf8\ub7f0\ub370": [4, 7, 27], "\ucc38\uace0\ud574\ubcf4\uba74": 4, "\uc6b0\ub9ac\ub294": [4, 9, 23, 43], "\uadfc\uc0ac\ud558\ub3c4\ub85d": 4, "\ud559\uc2b5\uc2dc\ucf1c\uc57c\ud568": 4, "mu": [4, 11, 27, 32, 35, 40, 41, 43], "_t": [4, 12, 14, 32, 40, 42], "\uc815\ub9ac\ub41c": 4, "\ud559\uc2b5\ub418\uc5b4\uc57c\ud558\ub294": 4, "kl": [4, 11, 19, 37, 43], "arg": [4, 31, 36, 43], "min_": [4, 43], "c_": [4, 6, 8, 14, 15, 25, 26, 32, 36, 40], "\ub2e8\uc21c\ud654\ub420": 4, "algorithm": [4, 11, 23, 31, 32], "\uc815\ub9ac": [4, 33], "\ub9c8\uce58": [4, 9], "\uadf8\ub7ec\ud588\ub4ef\uc774": 4, "\ube60\uc9c4": 4, "acceler": [4, 10, 35, 36], "\uac00\uc18d\uc2dc\ud0ac": 4, "\uae38\uc774\ub97c": [4, 21], "\ub450\uc5c8\uc744": 4, "varibal": 4, "subset": [4, 14], "\uc815\uc758\ub428": 4, "\uac12\uc758": [4, 14, 18, 40], "\ub450\uc5c8\uc74c": 4, "experi": [4, 44], "setup": [4, 24], "\ud558\uc774\ud37c\ub9c8\ub77c\ubbf8\ud130": 4, "\ud504\ub808\uc784\uc6cc\ud06c\ub294": 4, "\uc774\ub8e8\uc5b4\uc9d0": 4, "\uc0ac\uc6a9\ub41c": [4, 5, 6, 14, 33, 41], "\uac83\uacfc": [4, 7, 14, 16, 29, 39, 41], "stage": [4, 9, 13, 42], "fid": [4, 5, 9, 11, 16, 18, 19, 22, 25, 27, 32, 34, 35, 38, 40, 41, 42], "\uc0dd\uc131\ubb3c\uc758": [4, 6], "\ud3c9\uac00\ud558\uae30": [4, 9, 21, 28], "5\uac1c\uc758": [4, 6, 14, 15, 29], "\uc0d8\ud50c\uc744": [4, 5, 16, 17, 21, 23, 29, 33, 43], "\ud53d\uc140": [4, 14, 15, 22, 23, 25, 32, 38], "\ub9c8\ub2e4\uc758": 4, "\ud45c\uc900\ud3b8\ucc28\uc758": 4, "\ud3c9\uade0\uc744": [4, 5], "\uad6c\ud568": 4, "\ub370\uc774\ud130\uc14b\uc5d0": [4, 14, 28, 32, 40, 41, 43], "\ub300\ud574\uc11c": [4, 9, 14, 16, 17, 19, 21, 23, 27, 28, 29, 31, 32, 33, 36, 37, 41], "\ud3c9\uade0": [4, 5, 6, 11, 13, 21, 36, 43], "\ub0c4": [4, 22, 34], "\ub2a5\ub825\uc744": [4, 5, 6, 7, 9, 17, 28, 29, 30, 31], "\uc2e4\ud5d8\ud568": 4, "\ub2a5\ub825": [4, 9], "celebamask": 4, "hq": [4, 12, 17], "layout": [4, 19], "\uc8fc\uace0": [4, 13, 16], "photorealist": [4, 9, 16, 21, 28, 38], "\uc0dd\uc131\ud574\ub0b4\ub294": [4, 8, 9, 18, 24], "\ud3c9\uac00": [4, 5, 8, 21, 22, 23, 24, 30, 36], "sketch": [4, 42], "edges2sho": 4, "edges2handbag": 4, "realist": [4, 23, 24, 39], "transfer": [4, 20, 26, 29, 33, 36], "faces2com": 4, "\uc2e4\ud5d8\uc740": [4, 9], "\ud3c9\uac00\ud588\ub2e4\uba74": 4, "\uc2e4\ud5d8\uc5d0\uc11c\ub294": [4, 21], "qualit": [4, 8, 17, 34, 40, 42], "comparison": [4, 9, 16, 20, 24, 26, 35, 36, 38, 41], "\ucd94\ub860": [4, 9, 14, 31, 32, 34, 40], "\uc9c0\ub3c4": [4, 33], "\ubc29\uc2dd\uc73c\ub85c": [4, 6, 9, 11, 12, 17, 20, 22, 23, 26, 30, 32, 35, 37, 40], "\ud559\uc2b5\ud558\ubbc0\ub85c": 4, "\uad1c\ucc2e\uc740": [4, 29], "cyclegan": 4, "\uc2a4\ucf00\uc77c\uc758": 4, "\ub370\uc774\ud130\uc14b": [4, 9, 14, 20, 21, 30, 31, 32, 34, 38, 39, 41, 42], "\ub5a8\uc5b4\uc9d0": 4, "drit": 4, "\ubaa8\ub378\ub4e4": [4, 38], "\ub0c8\uc73c\ub098": 4, "\ubcc0\ud658\ub41c": 4, "oversmooth": 4, "\uc788\uc5c8\uace0": [4, 33], "ground": [4, 11, 13, 14, 22, 23, 32, 33, 37], "truth": [4, 11, 14, 22, 23, 32, 33, 37], "\uacfc\ub294": 4, "\uac70\ub9ac\uac00": [4, 33, 40], "\uba40\uc5c8\uc74c": 4, "cde": 4, "\ubaa8\ub378\ub4e4\ubcf4\ub2e4\ub294": 4, "\uc131\ub2a5": [4, 8, 9, 14, 15, 20, 23, 28, 31, 32, 33, 34, 35, 36, 37, 40, 41, 42], "\uc601\ud5a5": [4, 35], "\ubc1b\uc74c": [4, 38], "\uc904": [4, 12, 16, 25, 33, 35, 38], "rregular": 4, "occlus": [4, 14], "\ub098\ud0c0\ub098\ub294\ub370": 4, "\uc9c1\uc811\uc801\uc778": [4, 37], "\ud558\ubbc0\ub85c": [4, 11, 12, 43], "\ubb38\uc81c\ub85c\ubd80\ud130": 4, "\uc790\uc720\ub85c\uc6c0": 4, "\ud2b9\uc131\uc73c\ub85c": 4, "\uc0dd\uc131\ud574\ub0c4": 4, "\uc2e4\ud5d8\uc5d0\uc11c": [4, 16, 33, 43], "\uae30\ub85d\ud588\uc73c\uba70": 4, "\uae30\ub85d\ud568": [4, 34], "\uc131\ub2a5\uc740": [4, 14, 18, 28, 31], "\ub6f0\uc5b4\ub0a8": 4, "\uc810\uc218\uac00": [4, 5, 34, 38], "\ub6f0\uc5b4\ub0ac\uc74c": 4, "\ud558\uae30": [4, 6, 11, 14, 17, 30, 32, 34, 36, 40, 41, 42, 43], "\uc2e4\ud5d8\ud588\uc74c": 4, "\uc5d0\uc11c\ub3c4": [4, 33, 36], "campar": 4, "\uae30": 4, "\ub85d\ud568": 4, "\uc0c9\uc0c1\ud654": 4, "\ub4f1\uc758": [4, 11, 14, 17, 23, 29, 32, 33, 40, 41], "ablat": [4, 8, 17, 26, 35, 41], "studi": [4, 6, 8, 17, 26, 41], "pre": [4, 17, 20, 24, 26, 29, 30, 33, 36, 40, 42], "factor": 4, "\ud588\uc74c": [4, 35], "\ub450\uace0": [4, 15, 18], "down": [4, 11, 15, 42], "\uc791\uc744": [4, 42], "\uc774\ud558": [4, 25], "\uc870\uae08\ub9cc": 4, "\ub298\ub824\ub3c4": 4, "\ud06c\uac8c": [4, 6, 14, 17, 24, 28, 29, 31, 33, 37, 39, 40, 41, 42, 43], "\uc774\uc0c1\uc758": [4, 14, 28, 32], "\ud0a4\uc6cc\ub3c4": 4, "\ubcc0\ud654\uac00": [4, 12, 30, 33, 38], "\ubbf8\ubbf8\ud568": 4, "maximum": [4, 5], "varianc": [4, 10, 11, 12, 16, 23, 28, 32, 41, 43], "\uacc4\uc218\uc5d0": 4, "\ub418\uc5c8\uc74c": 4, "\uac83\ucc98\ub7fc": [4, 33], "scale": [4, 5, 8, 9, 12, 13, 16, 20, 22, 23, 27, 35, 38, 42], "\ud568\uc73c\ub85c\uc368": [4, 29, 39], "conclus": 4, "futur": 4, "\uc0c8\ub85c\uc6b4": [4, 5, 6, 8, 12, 13, 14, 17, 21, 23, 24, 25, 27, 28, 29, 30, 33, 35, 36, 37, 38, 39, 40, 41, 43], "\ubc29\ubc95\uacfc": [4, 14, 16, 25, 28, 37], "\ub2ec\ub9ac": [4, 14, 16, 24, 28, 37, 43], "\uc2e4\ud5d8\uc744": [4, 6, 9, 12, 16, 19, 23, 41], "\uc5d0\ub3c4": [4, 32], "\uc801\uc6a9\ud574\ubcfc": 4, "\uc608\uc815": 4, "\uc790\ub8cc": [4, 33], "sine": 4, "qua": 4, "none": [4, 7, 11, 21, 27, 31, 42], "tistori": [4, 29], "158": 4, "autoregress": [5, 22, 37], "scontent": 5, "gmp1": 5, "xx": 5, "fbcdn": 5, "t39": 5, "2365": 5, "358725877_789390529544546_1176484804732743296_n": 5, "_nc_cat": 5, "108": 5, "ccb": 5, "_nc_sid": 5, "3c67a6": 5, "_nc_ohc": 5, "plfu_ur_vyaax_nagu8": 5, "_nc_ht": 5, "oh": 5, "00_afdrhahxv1pcf0lqicjiynmorpvcgeq0emv5_ve2_tncvg": 5, "oe": 5, "652ff632": 5, "jun": [5, 22, 25, 30], "hyoung": [5, 22, 25, 30], "lee": [5, 22, 23, 25, 30, 33, 37, 43, 44], "oct": [5, 16, 17, 24, 28, 42], "\ubcf5\uc7a1\ud558\uac8c": 5, "\uad6c\uc131\ub41c": [5, 14, 21, 23, 42, 43], "\uac1d\uccb4": [5, 9, 23, 39], "\uc190": 5, "\uc0dd\uc131\ud55c\ub2e4": [5, 14, 21, 25, 30], "\ud14d\uc2a4\ud2b8\uc640": [5, 9, 14, 16, 17, 21, 29], "\ub458": [5, 12, 16], "\ub2e4": [5, 12, 14], "\uac00\uc9c4": [5, 16, 18, 23, 25, 26, 28, 29, 32, 33, 34, 36, 42, 43], "\uac80\uc0c9": 5, "\uc99d\uac15": 5, "\ud1a0\ud070": 5, "\ub514\ucf54\ub354": [5, 6, 14], "\uc804\uc6a9": [5, 38], "\uba40\ud2f0": [5, 14], "\ubaa8\ub2ec": 5, "\ubaa8\ub378\uc774\ub2e4": [5, 14, 16, 25, 40], "cm3": 5, "\uc544\ud0a4\ud14d\ucc98\ub97c": [5, 14, 25], "\uc0ac\uc6a9\ud558\uba70": [5, 12], "\uc2a4\ud0c0\uc77c": [5, 6, 14, 33], "\ub370\uc774\ud130\uc5d0": [5, 21, 25, 27, 28, 40], "tun": 5, "\uac00\uc84c\ub2e4": 5, "\ub9de\ub3c4\ub85d": [5, 25], "\ud559\uc2b5\ud588\ub2e4": [5, 25, 30], "larg": [5, 8, 28, 31, 42], "scale\uc758": [5, 15], "\ub2e8\uacc4\ub97c": [5, 12, 17, 25, 37], "\ud3ec\ud568\ud55c\ub2e4": [5, 25], "\ub370\uc774\ud130\ub294": [5, 21, 23], "\ub77c\uc774\uc13c\uc2a4\uac00": 5, "shutterstock\uc758": 5, "scale\ub85c": 5, "\ud559\uc2b5\ud55c\ub2e4": [5, 11, 12, 14, 21, 25, 30, 31, 40], "sft": 5, "\ub2e8\uacc4\ub85c": [5, 6, 14], "\uc9c4\ud589\ud588\ub2e4": [5, 30, 40], "\uc785\ub825\uacfc": 5, "\ucd9c\ub825": [5, 14, 23, 32, 33], "\ud1a0\ud070\uc744": [5, 6, 14, 22, 29], "\uc11e\uc744": 5, "\ud504\ub86c\ud504\ud2b8\uc5d0": [5, 6], "\ub9de\ub294": [5, 6, 21, 22, 33, 36], "\uc0dd\uc131\ud558\ub294\ub370": [5, 6, 42], "cm3leon\uc740": 5, "output\uc744": [5, 7, 16, 25], "contain": 5, "\uc18c\uac1c\ud55c\ub2e4": [5, 12, 14, 16, 21, 25], "iamg": 5, "segmentation\uae4c\uc9c0": 5, "\uac00\ub2a5\ud558\ub2e4": [5, 10, 11, 13, 15, 24, 26, 30, 35], "3\uc5b5": 5, "\uac1c\uc758": [5, 14, 17, 20, 21, 22, 23, 25, 27, 29, 30, 31, 32, 33, 34, 36], "\ud1a0\ud070\uc73c\ub85c": [5, 22, 34], "\ud559\uc2b5\ud588\ub294\ub370": 5, "generation\ub3c4": 5, "\uc218\ud589\ud55c\ub2e4": [5, 31, 40], "5\ubc30\ub85c": 5, "\uc904\uc600\ub2e4": 5, "shot": [5, 9, 16, 21, 22, 26, 28, 34, 38], "coco\ub85c": [5, 38], "fid\ub97c": [5, 10], "\uce21\uc815\ud55c": 5, "88": [5, 22], "\uc810\uc73c\ub85c": 5, "google\uc758": 5, "parti": 5, "\uc131\ub2a5\uacfc": [5, 24, 28], "\uc218\uc900\uc744": 5, "\ub2ec\uc131\ud588\ub2e4": [5, 40], "ra": 5, "cm3\ub97c": 5, "\ub3c4\uba54\uc778\uc5d0\uc11c": [5, 6], "\uc7a0\uc7ac\ub825\uc744": [5, 40], "\uc5f0\uad6c\ud588\ub2e4": 5, "gafni\uc758": 5, "tokenizer\ub97c": [5, 29], "\uc0ac\uc6a9\ud588\ub2e4": [5, 14, 25, 30, 40], "tokenizer\ub294": 5, "256x256": [5, 13, 16, 21, 22, 25, 28, 32, 39, 40], "8192\uac1c\uc758": 5, "vocabulary\uc5d0\uc11c": 5, "1024\uac1c\uc758": 5, "\uc778\ucf54\ub529\uc744": 5, "\uc9c4\ud589\ud55c\ub2e4": [5, 12, 30, 31], "\ud14d\uc2a4\ud2b8\uc5d0\uc11c\ub294": 5, "zhang\uc758": 5, "\ucee4\uc2a4\ud140": 5, "56320": 5, "vocabulari": 5, "\uc2a4\ud398\uc15c\ud55c": 5, "\ud1a0\ud070\uc778": 5, "break": 5, "figure_8_9": 5, "modality\uac04": 5, "transition\uc744": 5, "\ubaa9\uc801": [5, 14], "sequence\uc5d0": 5, "\ub9de\ucdb0": [5, 16, 34], "\uad00\ub828\uc131\uc774": 5, "\ubb38\uc11c": 5, "memori": [5, 20, 34, 38], "bank": 5, "\uac80\uc0c9\ud558\ub294": 5, "\uac83\uc774\ub2e4": [5, 12, 16, 21, 24, 31, 40], "dens": [5, 14, 20], "strategy\uc744": 5, "\ud3ec\ud568\ud558\uace0": [5, 30, 31], "\ucffc\ub9ac": [5, 23], "\uc608": [5, 14], "m": [5, 9, 10, 11, 14, 15, 19, 26], "\ud6c4\ubcf4": 5, "\uad00\ub828\uc131": [5, 6], "\uc810\uc218": [5, 38], "return": [5, 7, 8, 10, 11, 20, 21, 27, 31, 37, 42, 43], "\ud574\uc900\ub2e4": [5, 35], "retriv": 5, "\uae30\ubc18\uc778": 5, "bi": 5, "\ub530\ub790\ub2e4": 5, "karpukhin": 5, "\ubb38\uc11c\ub97c": 5, "\ud30c\ud2b8\ub85c": [5, 15], "\ubd84\ub9ac\ud558\uace0": 5, "\uc778\ucf54\ub354": [5, 6, 14], "\ubb38\uc11c\uc758": 5, "vector": [5, 9, 15, 19, 22, 23, 27, 29, 34, 36], "representation\ub85c\uc368": 5, "\uac1c\ub97c": [5, 23, 30], "\ub0b8\ub2e4": [5, 21, 29], "\ucd5c\uc885": [5, 11, 14, 15, 21, 23, 25, 31, 42], "\uac80\uc0c9\uc740": 5, "\uc810\uc218\uc5d0": [5, 38], "\uc815\ub82c\ub41c": [5, 14, 30], "\ubaa9\ub85d\uc744": 5, "\uc5bb\uae30": 5, "inner": [5, 20], "product": [5, 9], "search\ub85c": 5, "generator\ub97c": [5, 15, 27, 37], "\uc720\uc6a9\ud55c": [5, 14], "\ucd94\ucd9c\ud558\uae30": 5, "\uac00\uc9c0": [5, 6, 7, 9, 14, 17, 25, 27, 29, 30, 32, 33, 36, 41], "\uc694\uc18c\ub97c": [5, 17, 21, 28], "\uace0\ub824\ud588\ub2e4": 5, "relev": [5, 10], "\uac80\uc0c9\ub41c": 5, "\ubb38\uc11c\ub294": 5, "\uad00\ub828\uc788\uc5b4\uc57c": 5, "\uc810\uc218\ub97c": [5, 9, 16, 34, 38], "\uc0ac\uc6a9\ud55c\ub2e4": [5, 12, 14, 16, 21, 25, 40], "\ud14d\uc2a4\ud2b8\ub85c": [5, 7], "\ubb38\uc11c\ub85c": 5, "\ub2e4\uc591\uc131\uc740": 5, "\ubb38\uc11c\uc5d0\uc11c": 5, "\uc911\ubcf5\uc131\uc744": 5, "\ud53c\ud558\uae30": 5, "\ud544\uc218\uc801\uc778": 5, "\uc808\ucc28\ub2e4": 5, "\ub2e8\uc21c\ud558\uac8c": 5, "\uae30\ubc18\ud574": [5, 20], "top": [5, 6, 9, 25, 31], "\ubb38\uc11c\ub9cc": 5, "\uac00\uc838\uc628\ub2e4\uba74": 5, "\uc911\ubcf5\uc774": 5, "downstream": [5, 20], "\uc548\uc88b\uc740": 5, "\ub07c\uce60": 5, "\uc774\ud558\ub85c": 5, "queri": [5, 8, 13, 19, 20, 23, 29], "dropout": [5, 14], "\uac80\uc0c9\uc5d0": 5, "\ucffc\ub9ac\uc758": 5, "\uc0ad\uc81c": [5, 11], "\uc801\uc6a9\ud588\ub2e4": [5, 30], "\ub2e4\uc591\uc131\uacfc": [5, 28], "\uc815\uaddc\ud654\ub97c": [5, 27], "\uc2dc\ucf30\ub2e4": [5, 25], "\ud14d\uc2a4\ud2b8\ub97c": [5, 9, 14, 21, 27, 28, 29], "\uac80\uc0c9\ud55c\ub2e4": 5, "\ud559\uc2b5\uc5d0\uc11c\ub294": 5, "\ucea1\uc158": [5, 16], "\uc30d\uc5d0": [5, 6, 14, 32], "\uc0d8\ud50c": [5, 9, 14, 19, 21, 23, 27, 28], "3\uac1c\ub97c": 5, "\ubb34\uc791\uc704\ub85c": [5, 21, 23, 29], "\uc120\ud0dd\ud55c\ub2e4": 5, "\uc0ac\uc2e4\uc0c1": [5, 41], "\ud559\uc2b5\uc5d0\uc11c": [5, 14], "\uc0ac\uc6a9\ud560": [5, 7, 13, 14, 15, 16, 20, 21, 22, 28, 30, 40, 43], "\uc218\uc758": [5, 23, 31], "4\ubc30\uc774\ub2e4": 5, "chameleon": 5, "\ubcc0\ud615\uc2dc\ucf1c": 5, "infil": 5, "\ud45c\ud604\ud55c\ub2e4": 5, "\ucd94\uac00\ub418\uc5c8\uace0": 5, "\ub2e8\uc5b4\uc758": 5, "\uc7ac\ubc30\uce58\uac00": 5, "\uc9c4\ud589\ub410\ub2e4": 5, "\ud559\uc2b5\uc5d0\ub294": 5, "\ub2e4\uc6a9\ub3c4": 5, "\uac00\uc838\uc654\ub2e4": [5, 25, 30], "cm3\uac00": 5, "\ud504\ub86c\ud504\ud2b8\ub85c": [5, 21, 28], "cm3\ub294": 5, "\ud504\ub86c\ud504\ud2b8\ub97c": [5, 6, 17, 21, 22, 25, 28], "\ud65c\uc6a9\ud55c\ub2e4": 5, "\ub514\ucf54\ub354\ub9cc": 5, "\uc544\ud0a4\ud14d\uccd0\ub97c": [5, 9, 32, 41], "zhang\uc5d0": 5, "bia": [5, 9, 11, 21, 23, 32], "norm\uc758": 5, "\ud30c\ub77c\ubbf8\ud130\ub97c": [5, 17, 20, 23, 25, 28], "\uc81c\uac70\ud588\ub2e4": [5, 25], "length\ub97c": [5, 12, 13], "2048": [5, 30, 41], "4096\uae4c\uc9c0": 5, "\ud655\uc7a5\ud588\ub2e4": 5, "\ud45c\uc900": [5, 14, 23, 33], "\ud3b8\ucc28": 5, "006": 5, "truncat": [5, 15, 41], "3\uc73c\ub85c": [5, 38], "\uc798\ub9b0": [5, 25], "0\uc73c\ub85c": [5, 7, 12, 14, 28, 35, 39], "0\uc5d0": [5, 12], "0002\ub85c": 5, "posit": [5, 11, 15, 16, 21, 22, 26], "\ucd08\uae30\ud654\ud55c\ub2e4": [5, 14], "metaseq": 5, "\ud559\uc2b5\ub410\ub2e4": 5, "\uc0ac\uc774\uc988": [5, 30], "350m": 5, "760m": 5, "7b": 5, "4t": [5, 30], "trillion": 5, "9t": 5, "\uc8fc\uc694\ud55c": [5, 17, 30], "\ud558\uc774\ud37c": 5, "\ud30c\ub77c\ubbf8\ud130\ub294": [5, 42], "size\ub85c": 5, "\uba40\ud2f0\ubaa8\ub2ec": 5, "\ub9de\uac8c": [5, 9, 12, 14, 16, 20, 22, 25, 28], "\uc124\uc815\ud588\ub2e4": 5, "perplex": 5, "ppl": [5, 36], "\uc5b8\uc5b4": [5, 31], "\ud558\ub098\uc774\ub2e4": 5, "\ud5f7\uac08\ub9ac\ub294": 5, "\ub0ae\uc744": [5, 7], "\uc218\ub85d": 5, "\uc88b\ub2e4": [5, 9, 20, 35], "\ubaa8\ub378\uc5d0\uc11c": [5, 21, 25, 28, 29, 31, 35, 38, 41], "\uc54c\uace0\ub9ac\uc998\uc5d0": 5, "\uc9c4\ud589\ub418\uc5b4": [5, 22, 32], "\uc654\ub2e4": [5, 14, 18], "dall": [5, 15, 16, 17, 22, 36, 38, 39, 40], "e\ub294": [5, 34], "\uc544\uc6c3\ud48b\uc758": 5, "\ud5a5\uc0c1\ub418\ub294": [5, 28], "\uc0d8\ud50c\ub9c1\uacfc": 5, "512\uac1c": [5, 34], "\uc804\ub7b5\uc744": [5, 14, 17, 21], "\ucc44\ud0dd\ud588\ub2e4": 5, "make": [5, 20, 30], "scene": [5, 9, 30, 39], "guidance\ub85c": 5, "ranking\uc5d0": 5, "\uc624\uc9c1": [5, 6], "\uc0d8\ud50c\ub9cc": 5, "\ud544\uc694\ud558\uac8c": 5, "\ub428\uc73c\ub85c\uc368": [5, 39], "\ud6c4\ubcf4\uc758": 5, "\uc218\ub97c": [5, 14, 21, 23, 25, 30, 34], "\ud655\ub960\uc801": 5, "\uae30\uc220\ub85c": [5, 29], "\uc0ac\uc6a9\ub41c\ub2e4": [5, 11, 14, 25], "\uc0d8\ud50c\ub9c1\uc5d0\uc11c": 5, "softmax\uc758": 5, "temperature\ub97c": 5, "\uc218\uc815\ud574": [5, 9], "\uc608\uce21": [5, 9, 10, 11, 14, 17, 22, 23, 34, 40], "\ubb34\uc791\uc704\uc131\uc744": 5, "\uc81c\uc5b4\ud55c\ub2e4": 5, "nucleu": 5, "\uc0d8\ud50c\ub9c1\uc73c\ub85c\ub3c4": 5, "\ubd88\ub9ac\uace0": 5, "\ubbf8\ub9ac": [5, 14, 29], "\uc815\uc758\ud55c": [5, 18, 32], "\uc784\uacc4\uac12\uc744": [5, 38], "\ucd08\uacfc\ud558\ub294": 5, "\ub204\uc801": 5, "\uc0c1\uc704": 5, "\uc138\ud2b8\uc5d0\uc11c": [5, 21], "\uc0d8\ud50c\ub9c1\uc744": [5, 23, 28, 37], "begin": [5, 11, 14, 42], "align": [5, 8, 11, 14, 22, 28, 29, 30, 38, 39, 42], "operatornam": 5, "logit": [5, 22], "_": [5, 6, 7, 12, 14, 15, 17, 19, 20, 21, 27, 31, 32, 33, 36, 37, 40, 41, 42, 43], "cond": [5, 25], "t_y": 5, "mid": [5, 11, 20, 24], "t_x": 5, "uncond": 5, "bf": [5, 35], "mathrm": [5, 11, 12, 14, 23], "cf": [5, 21], "alpha_c": [5, 13], "cdot": [5, 12, 14, 19, 23, 32, 37, 40, 42], "cfg\ub294": [5, 40], "uncondit": [5, 11, 15, 16, 22, 35, 40, 41], "\uc0d8\ud50c\uc5d0": [5, 21, 25, 28, 32], "\uc758\ubbf8\ud55c\ub2e4": [5, 12, 24, 40], "text\ub97c": [5, 16, 34], "\ubaa9\ud45c\uc758": 5, "\ub9c8\uc2a4\ud06c": [5, 16, 21, 22], "\ub300\uccb4\ud55c\ub2e4": 5, "\ubaa9\ud45c\ub97c": [5, 14], "\ud559\uc2b5\uc758": [5, 15, 32, 33, 40], "\ud575\uc2ec": [5, 14, 17, 21, 24, 28, 31, 35], "\uc774\uc810": [5, 15], "\ud558\ub098\uc774\uba70": 5, "guidance\ub97c": [5, 13, 14, 16, 35, 38], "\uc218\ud589\ud560": [5, 9, 31, 32], "\ucd94\ub860\uc5d0\uc11c\ub294": 5, "stream\uc744": 5, "\ud14d\uc2a4\ud2b8\uc5d0": [5, 9, 14], "\ub2ec\ub77c\uc9c0\ub294": [5, 36], "stream\uacfc": 5, "\ud1a0\ud070\uc5d0": [5, 22], "condition\ub41c": 5, "stream": 5, "cfg\uc5d0\uc11c": 5, "logit\uc758": [5, 15], "\ube84\uc148": 5, "\uc5f0\uc0b0\uc774": [5, 19, 40], "\ud14d\uc2a4\ud2b8\uc5d0\uc11c": [5, 17, 21], "\ubc29\ubc95\uc758": [5, 6, 29], "probability\ub97c": 5, "\ube84\uc148\ud558\ub294": 5, "\uc5f0\uc0b0\uacfc": 5, "\ube44\uc2b7\ud558\ub2e4": [5, 25], "ms": [5, 15, 16, 34, 38], "coco": [5, 16, 22, 34, 38, 42], "30k": 5, "\uce21\uc815\ud588\ub2e4": [5, 31], "\ud6a8\uc728\uc131\uc774": 5, "\ucd94\ub860\uc5d0\uc11c": 5, "1\uac1c": [5, 34], "2\uac1c\ub85c": 5, "\uc608\uc81c\ub85c": 5, "\ub3d9\uc791\ud560": [5, 28], "\uc6b0\uc218\ud55c": [5, 10, 14, 17, 21, 25, 33, 34], "\uae30\ub85d\ud588\ub2e4": [5, 26], "\uace0\ud488\uc9c8": [5, 9, 13, 14, 17, 25], "\ud655\uc7a5\uc2dc\ud0a4\ub294": 5, "\uac80\uc0c9\uc758": 5, "\uc911\uc694\uc131\uc744": [5, 17, 33], "figure5": 5, "llm\uc5d0\uc11c": 5, "\ub2e8\uacc4\uc774\ub2e4": 5, "\uba85\ub839\uc5b4": 5, "\uc774\ud574\ud558\ub294": 5, "\ub3c4\uc640\uc8fc\uba70": 5, "task\uc5d0\uc11c\ub3c4": 5, "\uc5bb\uc5c8\ub2e4": [5, 25], "\ud29c\ub2dd\uc774": 5, "\ub208\uc5d0": [5, 14], "\ub744\uac8c": [5, 14], "\uc99d\ud3ed\uc2dc\ud0a4\ub294": 5, "\ubc1c\uacac\ud588\ub2e4": 5, "cm3leon\uc744": 5, "task\ub97c": [5, 20, 24, 29, 34, 40], "\uc11e\uc5b4": 5, "\ub113\uc740": 5, "\ubc94\uc704\uc5d0\uc11c": 5, "\ud588\ub2e4": [5, 25, 30, 31, 40], "\uacfc\uc815\uc740": [5, 43], "\ub530\ub974\uba70": 5, "instruction\uacfc": 5, "\ucd9c\ub825\uc744": [5, 14, 23], "\uacb0\ud569\ud574": 5, "objective\ub97c": [5, 20, 29], "figure6": 5, "initi": [5, 20, 32], "image\ub97c": [5, 8, 11, 12, 15, 16, 17, 19, 21, 24, 28, 29, 34], "\uc218\uc815\ud558\ub294": [5, 29], "task\uc774\ub2e4": 5, "instructpix2pix": [5, 14], "\ud558\ub298\uc758": 5, "\uc0c9\uc744": 5, "\ud30c\ub780\uc0c9\uc73c\ub85c": 5, "\ubcc0\uacbd\ud574\uc918": 5, "\ud3b8\uc9d1\uc774": 5, "\uc774\uac83\uc740": [5, 9, 17, 28], "cm3leon\uc774": 5, "\uc774\ud574\ud558\uace0": 5, "\uc788\uc5b4\uc11c": [5, 12], "\uc0dd\uc0b0\ud558\ub294": 5, "\uc0dd\uc131\uc5d0": [5, 6, 13, 15, 16, 17, 28, 29, 42], "\uacf5\uac04\uc801": [5, 21, 23], "\uc815\ubcf4": [5, 14, 21, 22, 23, 26], "\uc704\uce58": [5, 23, 30], "\ud1b5\ud569\uc2dc\ud0ac": [5, 9], "\uc788\ub3c4\ub85d": [5, 12, 17, 22, 25, 29, 30, 32, 33, 39, 40, 43], "figure16": 5, "flamingo": 5, "1000\uc5b5": 5, "openflamingo": 5, "400\uc5b5": 5, "30\uc5b5": 5, "\ud1a0\ud070\uc784\uc5d0\ub3c4": 5, "\ubd88\uad6c\ud558\uace0": [5, 9, 14, 16, 28, 30, 33, 41], "\ub3d9\ub4f1\ud55c": 5, "2307": [6, 17, 25], "06949": [6, 17], "site": 6, "hyoungseo": [6, 17, 44], "cho": [6, 17, 19, 44], "generation\uc758": [6, 16], "\uc77c\ud658\uc73c\ub85c": 6, "\uc0c8\ub86d\uace0": 6, "\ucc3d\uc758\uc801\uc778": 6, "\uac1c\ub150\uc744": [6, 29, 40], "\ub2e4\ub8f9\ub2c8\ub2e4": 6, "\uae30\uc220\uacfc": [6, 25], "\uae30\uc220\uc774": [6, 16, 28], "\ubc1c\uc804\ud568\uc5d0": 6, "\ubfd0\ub9cc": [6, 25, 30, 33], "\uac1c\uc778\ud654\ub41c": [6, 13, 17, 29], "\uc0dd\uc124\ud560": 6, "\uc788\uac8c": [6, 7, 9, 14, 21, 25, 28, 30, 32, 38], "\ub418\uc5c8\uc2b5\ub2c8\ub2e4": 6, "\uac15\ub825\ud55c": [6, 16], "\uc124\uba85\ub418\uc9c0": 6, "\ucc3d\uc758\uc801": 6, "\uc788\uc744\uae4c\uc694": 6, "sysnthesi": 6, "\uae30\uc220\uc740": 6, "\uc778\ucf54\ub354\uc5d0\uc11c": [6, 14], "\ucd94\ucd9c\ud55c": [6, 8, 15, 31], "\uc784\ubca0\ub529\uc744": [6, 14, 25], "conditioning\ud569\ub2c8\ub2e4": 6, "\ucc98\ub9ac\ud558\uc5ec": 6, "\ud1b5\ud569\ud558\ub294": [6, 14], "\ubc29\uc2dd\uc785\ub2c8\ub2e4": [6, 32, 41], "model\uacfc": [6, 7, 12, 16, 18, 19, 40], "\ud65c\uc6a9\ud574\uc11c": [6, 9, 35, 43], "generation\uc5d0\uc11c\uc758": 6, "\uc774\uc810\uc744": [6, 23], "\ubcf4\uc785\ub2c8\ub2e4": [6, 33], "\uc785\ub825\ub41c": [6, 14, 29, 39], "\ud574\ub2f9\ud558\ub294": [6, 7, 14, 16, 22, 23, 39], "\uc784\ubca0\ub529\uc73c\ub85c": [6, 14], "\ub9e4\ud551\ud569\ub2c8\ub2e4": 6, "\ub514\ucf54\ub354\ub294": 6, "\uc784\ubca0\ub529\uc5d0": [6, 14, 25], "condition\uc774": 6, "\ubd80\uc5ec\ub41c": 6, "\uc0dd\uc131\ud558\uae30": [6, 17, 29, 32, 33, 40], "\ud6c8\ub828\ub429\ub2c8\ub2e4": 6, "personalization\uc740": 6, "\ub9e5\ub77d\uc5d0\uc11c": 6, "\uc0ac\uc6a9\uc790\uac00": [6, 24, 25, 29], "\uc785\ub825\ud55c": 6, "\uc8fc\uc81c\ub098": 6, "\uc2a4\ud0c0\uc77c\uc744": [6, 14, 17, 26, 28], "\ud45c\ud604\ud558\ub294": [6, 11, 29, 30, 36], "\ubaa9\ud45c\ub85c": [6, 14, 17, 29, 33, 36], "\uc77c\ubc18\uc801\uc73c\ub85c": [6, 14, 23, 28, 29, 32, 40], "\ud559\uc2b5\uc2dc\ud0a4\uae30": 6, "\ucd5c\uc801\ud654\ud558\uac70\ub098": 6, "\ub124\ud2b8\uc6cc\ud06c\ub97c": [6, 14, 17, 21, 23], "\ud65c\uc6a9\ud569\ub2c8\ub2e4": [6, 32], "\uc5f0\uad6c\uc5d0\uc11c\ub294": [6, 16, 17], "\ucd08\ucca8\uc744": [6, 29], "\ub9de\ucd94\uace0": 6, "\uae30\ubc1c\ud55c": 6, "\uc7a5\uba74\uc744": [6, 23], "\uc811\uadfc": [6, 14, 17, 23, 29], "\ubc29\ubc95\uc774": [6, 12, 14, 16, 17, 21, 28, 33, 40], "xu": 6, "et": [6, 12, 16, 18, 32, 40, 41], "al": [6, 12, 16, 18, 32, 40, 41], "set": [6, 11, 13, 15, 20, 31, 33, 36, 38, 41], "evolut": 6, "\ud65c\uc6a9\ud574": [6, 9, 13, 25, 30, 31, 33, 35, 42], "3d": [6, 11, 14, 23, 30, 44], "\ud615\ud0dc\uc758": [6, 23, 25, 29, 36], "\ubaa8\ub378\ub9c1\uc744": [6, 21, 34], "\uc81c\uc548\ud588\uc2b5\ub2c8\ub2e4": [6, 27], "elgamm": 6, "gan\uc758": [6, 12, 29], "\ud0d0\uad6c\ud558\uba70": 6, "\uc2a4\ud0c0\uc77c\uc5d0\uc11c\uc758": 6, "\ud3b8\ucc28\ub97c": 6, "\uadf9\ub300\ud654\ud558\ub294": 6, "\ud559\uc2b5\ud588\uc2b5\ub2c8\ub2e4": [6, 9], "sbai": 6, "\uc190\uc2e4": [6, 34], "\ud568\uc218\ub97c": [6, 15, 23], "\ub3c4\ub9bd\ud588\uc2b5\ub2c8\ub2e4": 6, "\uce74\ud14c\uace0\ub9ac\uc640": 6, "\uc77c\uce58\ud558\ub3c4\ub85d": [6, 29], "\ucd5c\uc801\ud654\ud558\uba74\uc11c\ub3c4": 6, "\uce74\ud14c\uace0\ub9ac\uc758": 6, "\uac1c\ub150\ub4e4\uacfc": 6, "\ucc3e\ub294": [6, 12, 14, 29], "\uc811\uadfc\ud588\uc2b5\ub2c8\ub2e4": 6, "\uac1c\ub150\ub4e4\uc740": 6, "\ud63c\ud569\ub420": 6, "\uc788\uc73c\uba70": [6, 7, 17, 21, 28, 33, 34, 38], "\uc720\uc5f0\ud55c": 6, "\uacfc\uc815\uc744": [6, 10, 11, 14, 16, 17, 22, 24, 25, 29, 30, 31, 41, 43], "\uac16\uac8c\ub429\ub2c8\ub2e4": [6, 27], "bottom": 6, "model\uc5d0\uc11c\ub294": [6, 29], "\uc624\ud1a0\uc778\ucf54\ub354\uc758": [6, 14], "\ub0b4\uc5d0\uc11c": [6, 17, 23, 25, 29, 30, 39], "\uc9c4\ud589\ub429\ub2c8\ub2e4": [6, 41], "\uba3c\uc800": [6, 7, 17, 21, 23, 27, 28, 31, 34, 37], "\uc778\uace0\ub354": 6, "\ub9e4\ud551\ud558\ub294": [6, 33], "d\ub294": [6, 12], "\uc7ac\uad6c\uc131\ud558\ub3c4\ub85d": 6, "ddpm\uc758": [6, 10, 16, 18, 26, 35], "\uc190\uc2e4\uc744": [6, 14, 17], "\ucd5c\uc18c\ud654\ud558\ub3c4\ub85d": [6, 17, 32], "\ud559\uc2b5\ud569\ub2c8\ub2e4": [6, 33, 37, 41, 42], "e_": 6, "z_": [6, 14, 34, 40, 41, 42], "\uc7a0\uc7ac": [6, 28], "\ucf54\ub4dc": [6, 21, 27, 31], "zt": 6, "\ucd94\uac00\ub41c": [6, 7, 11, 12, 40], "\uc7a1\uc74c": 6, "\uc81c\uac70\ud569\ub2c8\ub2e4": 6, "\uacfc\uc815\uc5d0\uc11c": [6, 10, 11, 12, 15, 16, 17, 20, 23, 24, 26, 28, 29, 33, 37, 40], "\ud604\uc7ac": [6, 9, 10, 26, 28], "t\uc640": 6, "\uc870\uac74": [6, 14, 16], "\ubca1\ud130": [6, 14, 23], "c\ub3c4": 6, "\uace0\ub824\ub429\ub2c8\ub2e4": 6, "model\uc740": [6, 11, 12, 15, 16, 19, 20, 22, 29, 40], "\uc778\ucf54\ub529\uc5d0\uc11c": 6, "\ud30c\uc0dd\ub41c": [6, 14, 29], "\ud504\ub86c\ud504\ud2b8": [6, 21], "ramesh": 6, "\ubb38\uc81c\ub97c": [6, 8, 12, 14, 20, 23, 25, 29, 32, 38], "decompos": [6, 17], "\ud504\ub86c\ud504\ud2b8\ub85c\ubd80\ud130": 6, "\uc608\uce21\ud569\ub2c8\ub2e4": [6, 17, 33], "\ub2e4\uc74c\uc73c\ub85c": [6, 17], "\ubd80\uc5ec\ud558\uc5ec": 6, "decoder\ub85c": 6, "\ubcf4\ub0b4\uc9d1\ub2c8\ub2e4": 6, "\ub3c5\ub9bd\uc801\uc778": [6, 10, 32], "\uc774\ub8e8\uc5b4\uc9d1\ub2c8\ub2e4": 6, "l_": [6, 18, 24, 30, 32, 35, 40, 42], "\uc815\uc758\ub41c": [6, 23, 29, 41], "\uc784\ubca0\ub529": [6, 14, 21, 25, 29], "\uc811\uadfc\ubc95\uc740": 6, "\ub2e4\uc591\uc131\uc744": [6, 13, 28], "\ud5a5\uc0c1\uc2dc\ud0a4\uba70": 6, "\uc811\uadfc\ud558\uace0": 6, "\uacf5\uac04\uc5d0\uc11c": [6, 23, 29], "\uc81c\uc57d\uc744": [6, 33], "conceptlab\uc740": 6, "\uc0dd\uc131\ud558\uace0\uc790": [6, 24, 27, 37, 43], "\ub300\ud45c\ud558\ub294": 6, "\ub2e8\uc77c": [6, 14, 16, 23, 29, 32], "v_": [6, 15], "\ucd5c\uc801\ud654\ud569\ub2c8\ub2e4": 6, "\uce74\ud14c\uace0\ub9ac\uc5d0": [6, 21], "\uc720\uc0ac\ud558\uba74\uc11c\ub3c4": [6, 29], "\uba64\ubc84\ub4e4\uacfc": 6, "\uac00\uc9c0\ub3c4\ub85d": [6, 28], "\uc9d1\ud569\uc744": [6, 23], "\uacc4\uc0b0\ud569\ub2c8\ub2e4": [6, 32, 36], "\ud6c8\ub828\ud558\ub294": [6, 14], "\ub3d9\uc548": [6, 9, 12, 14, 21, 25, 37], "\ubc14\ud0d5\uc73c\ub85c": [6, 23, 33, 41], "contraints\ub97c": 6, "\ub354\ud558\uae30": 6, "blip": [6, 9], "vqa": 6, "\uae0d\uc815\uc801": 6, "\uc81c\uc57d": 6, "po": 6, "\ubd80\uc815\uc801": 6, "\uac00\uc9c0\ub97c": 6, "\uc870\uac74\uc740": 6, "\uc815\uc758\ub429\ub2c8\ub2e4": 6, "\ub450\uac00\uc9c0": [6, 35], "\uce21\uc815\ud569\ub2c8\ub2e4": [6, 9, 41], "\uc6b0\uc120": [6, 7, 9, 16, 25, 36, 41], "\ub2e8\uc5b4": [6, 21, 26, 29], "\ubb34\uc791\uc704": [6, 17], "\uc0d8\ud50c\ub9c1\ub41c": [6, 23], "y\uc5d0": 6, "\ud1b5\ud569\ud569\ub2c8\ub2e4": 6, "\ubb38\uc7a5\uc740": 6, "\uc778\ucf54\ub529\ub418\uba70": 6, "\uc774\uac83\uc774": [6, 9, 33], "\uc815\uc758\ud569\ub2c8\ub2e4": [6, 32, 36, 39, 41, 42, 43], "\ud1b5\uacfc\uc2dc\ud0a4\uba74": 6, "\ud504\ub86c\ud504\ud2b8\uc758": [6, 14], "\uc778\uc2a4\ud134\uc2a4\uac00": 6, "prior\ub97c": 6, "\ud1b5\uacfc\ud558\uba74": 6, "\uc870\uac74\uacfc": 6, "\uae0d\uc815": 6, "\ubd80\uc815": 6, "\uad11\ubc94\uc704\ud558\uac8c": 6, "\uc720\uc9c0\ud558\uace0\uc790": [6, 36], "\ud1b5\uacfc\ud558\uc9c0": 6, "\uc54a\uc2b5\ub2c8\ub2e4": [6, 9, 32, 33], "\uc5f0\uad6c\uc5d0\uc11c\uc758": 6, "\ud568\uc218\ub294": [6, 19, 23], "langl": 6, "rangl": 6, "lambda": [6, 11, 32, 33, 36], "v\uc5d0\uc11c": 6, "\uc870\uac74\uc5d0\uc11c": 6, "\uba40\uc5b4\uc9c0\uace0": 6, "\uc81c\uc57d\uc870\uac74\uc5d0": 6, "\uac00\uae4c\uc6cc\uc9c0\ub3c4\ub85d": [6, 12], "\uc815\uaddc\ud654\ub294": 6, "\uc9d1\ud569\uc774": 6, "\ud074": [6, 28], "\uba64\ubc84\ub85c\uc758": 6, "collapsing\uc744": 6, "\ubc29\uc9c0\ud558\ub294": [6, 14], "\uc0ac\uc6a9\ub429\ub2c8\ub2e4": [6, 7, 17], "\uc81c\uc57d\uc5d0": 6, "s_": [6, 14, 15, 26, 32], "max_": 6, "\uc720\uc0ac\ub3c4": [6, 16, 21], "\ubc29\uc2dd\uc740": [6, 8, 17, 20, 23, 29, 40, 41, 42], "\ud568\uc218\uc5d0": 6, "\ud1b5\ud569\ub418\uba70": 6, "\ub0c4\uc73c\ub85c\uc368": 6, "\uc870\uac74\uc5d0": 6, "\ud328\ub110\ud2f0\ub97c": [6, 33], "\ubd80\uc5ec\ud569\ub2c8\ub2e4": 6, "\uacfc\uc815": [6, 8, 11, 18, 21, 22, 23, 29], "\uac1c\ub150\uc5d0": [6, 29], "\ub2e8\uc5b4\ub97c": [6, 29], "\ucd94\ub860\ud558\uace0": [6, 31], "\ucd94\uac00\ud558\ub294": [6, 12, 14, 20, 21, 28, 42], "\uac70\uce69\ub2c8\ub2e4": 6, "\uc218\ub3d9\uc73c\ub85c": 6, "\uc801\uc6a9\ud558\ub294": [6, 11, 12, 20, 32, 36, 40, 41, 42], "\ud798\ub4e4\uace0": 6, "\uad11\ubc94\uc704\ud55c": 6, "\uba64\ubc84\ub4e4\uc744": 6, "\uc815\ud655\ud558\uac8c": [6, 14, 29], "\ub300\ud45c\ud558\uc9c0": 6, "\ubabb\ud560": [6, 17, 25], "\uc810\uc9c4\uc801\uc73c\ub85c": [6, 32, 40], "\ud655\uc7a5\ud558\ub294": [6, 21], "scheme\uc744": 6, "\uc81c\uc548\ud569\ub2c8\ub2e4": [6, 7, 9, 17, 32, 33], "\ud6c8\ub828\ub41c": [6, 7, 14, 17, 28, 29], "\uc9c8\uc758\ud558\uc5ec": 6, "\uc774\ubbf8\uc9c0\uc5d0": [6, 8, 10, 14, 15, 18, 21, 22, 23, 24, 26, 28, 29, 31, 33, 34], "\uc874\uc7ac\ud558\ub294": [6, 9, 23, 31], "\uba64\ubc84\uac00": 6, "\ubb34\uc5c7\uc778\uc9c0": [6, 36, 43], "\uc2dd\ubcc4\ud558\ub3c4\ub85d": 6, "\ub098\uc628": [6, 12, 16, 17, 19, 32, 34, 35, 38, 40, 41, 42, 43], "\uc778\uc2a4\ud134\uc2a4\ub97c": 6, "\ud6c8\ub828\uc758": 6, "\ucd94\uac00\ud569\ub2c8\ub2e4": 6, "\ub2e8\uacc4\uc5d0": [6, 32], "\uac78\uccd0": [6, 21, 29], "\ubcf4\uc5ec\uc90d\ub2c8\ub2e4": [6, 7, 33, 36, 42, 43], "\uc870\uac74\uc774": [6, 14, 17], "\uc9c0\uc18d\uc801\uc73c\ub85c": [6, 28], "\uc870\uc815\ub418\uace0": 6, "\ud655\uc7a5\ub418\uc5c8\uc74c\uc744": 6, "\uac1c\ub150": [6, 29, 36, 40], "\uc14b\uc5d0": [6, 14], "\ud63c\ud569": [6, 28], "\uac1c\ub150\uc5d0\uc11c": 6, "im": 6, "\ub9cc\ub4ed\ub2c8\ub2e4": [6, 33], "\ud1b5\uacfc\ud558\uc5ec": 6, "\uc138\ud2b8\ub97c": [6, 21], "\uc0dd\uc131\ud569\ub2c8\ub2e4": [6, 9, 17, 32, 42, 43], "\uac00\uae5d\uac8c": [6, 15, 33], "\ub9cc\ub4dc\ub294": [6, 11, 14, 16, 17, 21, 23, 33, 43], "\uc218\uc815\ub41c": 6, "\uc801\uc6a9\ud569\ub2c8\ub2e4": [6, 9, 33], "\uac1c\ub150\uc774\ub098": 6, "\uc801\uc6a9\ub420": 6, "\uacc4\uce35\u3147\uc801": 6, "\ubc18\ubcf5\uc801\uc73c\ub85c": [6, 14, 23], "\ub610": [6, 8, 12, 15, 18, 24, 25, 26, 31, 36, 39], "\uacb0\uacfc\ubb3c\uc5d0": 6, "\uac1c\ub150\uc758": 6, "\uc81c\uc5b4\ud558\uae30": [6, 13, 17], "\uac00\uc911\uce58": [6, 14, 17, 33, 38], "\ud56d\ubaa9\uc774": 6, "\ucd94\uac00\uc801\uc73c\ub85c": [6, 7, 9, 12, 16, 25, 28, 32, 41], "\uadf8\ub9bc\uc5d0\ub294": 6, "\uac1c\ub150\uc774": 6, "\uc67c\ucabd\uc5d0": [6, 21], "\ud45c\uc2dc\ub418\uc5b4": 6, "\uc5b4\ub5a4": [6, 7, 9, 11, 12, 14, 16, 20, 21, 22, 25, 28, 29, 31, 33, 40, 43], "\uc0dd\uc131\ud588\ub294\uc9c0\ub97c": 6, "\uacb0\uacfc\ub294": [6, 7, 12, 14, 16, 18, 28, 33], "\ud65c\uc6a9\ud588\uc2b5\ub2c8\ub2e4": [6, 17, 41], "conceptlab\uc774": 6, "\uc81c\uc548\ud55c": [6, 12, 14, 27, 28], "\ud504\ub86c\ud504\ud2b8\uc640": [6, 21], "\uc801\uc6a9\ud588\uc2b5\ub2c8\ub2e4": [6, 42], "\uac1c\ub150\ub4e4\uc744": 6, "\ud63c\ud569\ud558\uc5ec": [6, 14, 40], "\ub3c5\ud2b9\ud55c": 6, "\ucc3d\uc870\ubb3c\uc744": 6, "\ud559\uc2b5\ud560": [6, 15, 16, 21, 25, 28, 32, 33, 37], "\uadf8\ub9bc\uc758": [6, 7, 9, 12], "\uc717\uc904\uc5d0\uc11c\ub294": 6, "\uc801\uc6a9\ud558\uc5ec": [6, 21, 40, 41], "\uc774\uc5b4\uc9c0\ub294": [6, 29], "\uc904\uc5d0\uc11c\ub294": 6, "\uc5bb\uc5b4\uc9c4": 6, "conceptlab\uc758": 6, "\ud6a8\uacfc\ub97c": [6, 12, 38, 39], "\uc785\uc99d\ud558\uae30": 6, "\uc815\uc131\uc801": [6, 8, 14, 34], "\uc815\ub7c9\uc801": [6, 8, 14, 17, 22, 34], "\ud3c9\uac00\ub97c": [6, 14, 17, 21, 25, 33, 34, 37, 38, 40], "\uadf8\ub9bc\ub4e4\uc5d0\uc11c": 6, "\uc788\ub4ef\uc774": [6, 12, 28], "negative\ub97c": 6, "\uc801\uc6a9\ud558\uc600\uace0": 6, "\uc2dc\ub4dc\ub97c": 6, "\ub2ec\ub9ac\ud558\uba70": 6, "\ub2a5\ub825\uc774": [6, 9, 31], "\uc7a5\uba74\uc5d0": [6, 23, 29], "\ubc30\uce58\ud560": 6, "\uc0dd\uc131\ubb3c\ub4e4\uc740": 6, "\ubc30\uacbd": [6, 14, 15, 23, 25, 29], "\ucc3d\uc870\ub4f1": 6, "\ub2e4\uc591\ud558\uac8c": [6, 39, 41], "\uac00\ub2a5\ud569\ub2c8\ub2e4": [6, 9, 17, 32, 36, 41, 42], "conceptlab\uc744": 6, "mixing\uc758": 6, "mixing\uc740": 6, "\uac1c\ub150\ub4e4\uc758": 6, "\ud569\uccd0": 6, "\ud558\uc774\ube0c\ub9ac\ub4dc": 6, "\ud615\uc131\ud558\ub294": 6, "\uc870\uac74\ub9cc\uc744": 6, "\uc608\ub97c": [6, 12, 27, 31, 32, 33, 39], "\ub4e4\uc5b4": [6, 12, 27, 31, 32, 33], "\uc904\uc5d0\ub294": 6, "\ub78d\uc2a4\ud130\uc758": 6, "\uc8fc\uc694": [6, 13, 21, 25], "\uc0dd\uc0c1\uacfc": 6, "\uc9d1\uac8c\ubc1c": 6, "\uac70\ubd81\uc774\uc758": 6, "\ub4f1\uaecd\uc9c8": 6, "\uc735\ud569\ud558\ub294": 6, "\uadf8\ub9bc\uc740": [6, 7, 9, 12, 19, 25, 27, 28], "conceptlab\uc5d0": 6, "\uac1c\ub150\ub4e4\uc774": 6, "\uc138\ub300": 6, "\uc5b4\ub5bb\uac8c": [6, 7, 9, 11, 21, 22, 28, 29], "\ubc1c\uc804\ud558\ub294\uc9c0": 6, "diffusion2\uc640": 6, "kandinski": 6, "\ubaa8\ub378\uacfc": [6, 14, 15, 21, 28, 33], "\ud3c9\uac00\ud588\uc2b5\ub2c8\ub2e4": [6, 37], "kandinsky\uc758": 6, "\uc720\ub9ac\ud55c": 6, "\ud504\ub86c\ud504\ud2b8\ub294": [6, 17, 21], "model\uc774": [6, 12, 16, 18], "\ud1a0\uadfc\uacfc": 6, "\ubaa8\ub450\uc5d0": 6, "\ub9de\ucdb0\uc9c8": 6, "\ub2e4\uc911": [6, 25], "\ucc98\ub9ac\ud558\uace0": 6, "\ud45c\ud604\uc744": [6, 13, 14, 23], "\uac16\ucd94\uace0": [6, 9, 12], "\ud3ec\ud568\ud558\uba70": 6, "\uac1c\ub150\uacfc": 6, "\ub2ee\uc9c0": 6, "\uce21\uc815\ud588\uc2b5\ub2c8\ub2e4": 6, "\ud3c9\uac00\uc5d0\ub294": 6, "\uc560\uc644\ub3d9\ubb3c": 6, "\uc2dd\ubb3c": 6, "\uacfc\uc77c": 6, "\uac00\uad6c": 6, "\uc545\uae30\uc758": 6, "5\uac00\uc9c0": [6, 21, 42], "\ub3c4\uba54\uc778\uc5d0": 6, "\uc30d\uc744": [6, 14, 21, 32, 33], "\uace0\ub824\ud558\uace0": [6, 14], "\uc870\ud569\uc5d0": 6, "\ub79c\ub364": [6, 11, 14, 21], "\uc2dc\ub4dc\ub85c": 6, "\ud6c8\ub828\ud558\uc5ec": 6, "\ucd1d": [6, 9, 13, 15, 23, 26, 27, 28, 29, 33, 41], "75\uac1c\uc758": 6, "\uc5bb\uc5c8\uc2b5\ub2c8\ub2e4": 6, "32\uac1c\uc758": 6, "\uc0dd\uc131\ud588\uc2b5\ub2c8\ub2e4": [6, 39], "diffusionr\uacfc": 6, "\ubaa8\ub378\uc5d0\uc11c\ub294": [6, 17, 22], "\uc0ac\uc6a9\ud558\uace0": [6, 7, 8, 12, 15, 17, 20, 22, 26, 28, 29, 36, 39, 40], "160\uac1c\uc758": 6, "\uae30\uc900\uc73c\ub85c\ub294": [6, 28], "\uc720\uc0ac\uc131\uc744": [6, 29], "\ud0c0\uac9f": [6, 14, 25], "\uce74\ud14c\uace0\ub9ac\uc640\uc758": 6, "\uacf5\uac04": [6, 17, 21, 23, 29], "\uc720\uc0ac\uc131": 6, "\uacc4\uc0b0\uc744": [6, 15], "\ud2b9\uc815\ub429\ub2c8\ub2e4": 6, "\ub2e4\uc74c\uc73c\ub85c\ub294": [6, 28], "\uc81c\uc57d\uacfc": [6, 21], "\uac70\ub9ac\ub97c": [6, 15, 29, 40], "\uacb0\uacfc\uc801\uc73c\ub85c": [6, 17, 33], "\uc720\uc0ac\uc131\uc5d0\uc11c": 6, "\uc6b0\uc6d4\ud55c": [6, 32], "\ubcf4\uc600\uace0": [6, 18], "\uc2e0\ub8b0\uc131": [6, 17], "\uac70\ub9ac": 6, "\uce21\uc815\uc5d0\uc11c": 6, "\uce74\ud14c\uace0\ub9ac\uc5d0\uc11c": 6, "4\uac00\uc9c0": [6, 40], "kandinsky\ub97c": 6, "\ub2a5\uac00\ud588\uc2b5\ub2c8\ub2e4": 6, "user": [6, 17, 26, 29], "personalization\uacfc": [6, 13], "\uc720\uc0ac\ud558\uac8c": [6, 14, 19, 22, 25, 28, 32, 39, 42], "\ud3ec\ud568\ud558\ub294": [6, 8, 14, 21, 29, 33, 39], "\ud56d\uc0c1": 6, "\uc720\uc9c0\ud558\uc9c0\ub294": 6, "\ubabb\ud569\ub2c8\ub2e4": [6, 17], "\ucd5c\uc801\ud654": [6, 17, 23, 25, 29], "\uc6d0\ud558\ub294": [6, 7, 8, 9, 12, 14, 23, 24, 26, 27, 28, 33], "\uac00\uc838\uc624\uc9c0\ub294": 6, "\ube44\ud589\uae30": 6, "\ubb3c\uace0\uae30": 6, "2\uc5d0": [6, 25], "\uad00\ub828\uc774": 6, "\uc18c\uac1c\ud588\uc2b5\ub2c8\ub2e4": [6, 17], "\uc0ac\uc6a9\uc744": 6, "constraints\ub77c\ub294": 6, "\uc870\uac74\ub4e4\uc744": 6, "\ucd9c\ub825\uc5d0": [6, 14], "\uacfc\uc815\uc5d0\uc11c\ub294": [6, 22], "\ub3c5\ud2b9\ud558\uba74\uc11c\ub3c4": 6, "\uba64\ubc84\ub4e4\uacfc\uc758": 6, "\uba85\ud655\ud55c": [6, 16, 21], "\uad6c\ubcc4\uc744": 6, "\ubcf4\uc7a5\ud588\uc2b5\ub2c8\ub2e4": 6, "\ud6a8\uacfc\uc131\uc744": 6, "\uc785\uc99d\ud588\uc73c\uba70": 6, "\ub2e4\uc591\ud558\uace0": 6, "\ub9e4\ub825\uc801\uc778": 6, "ad": [7, 23, 42], "2302": [7, 42], "05543": 7, "lllyasviel": 7, "mai": [7, 14, 19, 23, 25, 29, 33, 35, 36, 40], "28": [7, 43], "\ubaa8\ub378\ub4e4\uc740": [7, 8, 9, 35], "prompt\ub85c": [7, 26, 29], "\uc870\uc808\ud560": [7, 27, 28], "\uc774\ub7f0": [7, 9, 27, 28], "control\ub9cc\uc73c\ub85c": 7, "\uc870\uc808\ud558\ub294\ub370": 7, "\ud55c\uacc4\uac00": [7, 26, 29, 30, 33, 38, 42], "condition\uc744": [7, 8, 25, 40], "\uc918\uc11c": 7, "controlnet\uc774\ub77c\ub294": 7, "profession": 7, "prompt\uc640": [7, 8, 16], "\uc67c\ucabd": [7, 14, 17, 21, 25, 28], "canni": 7, "edge\ub97c": 7, "input\uc73c\ub85c": [7, 15, 19, 23, 25, 27], "\ubc1b\uc544\uc11c": [7, 9, 17, 27, 43], "\uc624\ub978\ucabd\uc758": 7, "\uc2dd\uc73c\ub85c": [7, 12], "\uadf8\ub9bc\uc5d0\uc11c\ub294": [7, 22], "controlnet\uc774": 7, "\uc5ed\ud560\uc785\ub2c8\ub2e4": 7, "conrolnet": 7, "\uadf8\ub7ec\uba74": [7, 27], "\uac00\ub2a5\ud558\uac8c": [7, 12, 20, 22, 23, 27, 30, 40], "\ud588\uc744\uae4c\uc694": [7, 9], "\uc774\uc81c\ubd80\ud130": 7, "\uc54c\uc544\ubcf4\ub3c4\ub85d": [7, 27], "\ud558\uaca0\uc2b5\ub2c8\ub2e4": [7, 17, 27, 43], "controlnet\uc758": [7, 13], "\uad6c\uc870\ub294": [7, 27, 28, 42], "\uac00\uc9d1\ub2c8\ub2e4": [7, 19], "lock": 7, "copy\uc640": 7, "trainabl": [7, 10, 17, 18, 20], "copy\ub97c": 7, "\uc124\uacc4\ud588\ub294\uc9c0": 7, "\uc54c\uc544\ubd05\uc2dc\ub2e4": 7, "\uc774\uc720\ub294": [7, 11, 15, 25], "\uae30\uc874\uc5d0": [7, 8, 14, 19, 20, 24, 27, 28], "\ubc29\ub300\ud55c": 7, "\uc704\ud574\uc11c\uc785\ub2c8\ub2e4": 7, "\ub370\uc774\ud130\uac00": [7, 11, 14, 21, 25, 27, 28, 29, 37, 43], "\uc591\uc774": [7, 28], "\uacbd\uc6b0\uc5d0": [7, 14, 28, 33, 42], "\uc624\ubc84\ud53c\ud305\uc744": [7, 14], "\ud53c\ud560": 7, "\ud6a8\uacfc\ub3c4": 7, "convolution\uc774\ub780": 7, "weight\ub791": 7, "\ucd08\uae30\ud654\ud55c": 7, "1x1": 7, "convolution\uc744": [7, 21], "\ub9d0\ud569\ub2c8\ub2e4": [7, 33], "\ud6c8\ub828\uc774": [7, 14, 21], "\uc2dc\uc791\ub418\uae30": 7, "\uc804\uc5d0\ub294": 7, "input\uc5d0": [7, 34], "output\uc774": [7, 33], "\ub611\uac19\uc544\uc9d1\ub2c8\ub2e4": 7, "\ubaa8\ub378\uc774\ub791": 7, "\ub611\uac19\uc740": 7, "\uac00\uc9c0\uac8c\ub418\ubbc0\ub85c": 7, "\uc720\uc9c0\ud560": [7, 17, 24, 29, 33], "\ube44\uc2b7\ud558\ubbc0\ub85c": 7, "scratch\ubd80\ud130": [7, 40], "\ud559\uc2b5\ud558\ub294": [7, 11, 14, 18, 21, 23, 24, 27, 32, 33, 37, 40, 41, 43], "\ube60\ub974\uac8c": [7, 17, 18, 35, 38, 40, 43], "\ud6c8\ub828\uc2dc\ud0ac": 7, "\uc788\uac8c\ub429\ub2c8\ub2e4": 7, "convolution\uc740": 7, "\ud558\ub294\uc9c0": 7, "\uc790\uc138\ud788": [7, 9, 17, 27, 36, 41], "\uadf8\ub9bc\uc5d0\uc11c": [7, 9, 12, 27, 28, 33, 36], "\ubd80\ubd84\uc744": [7, 12, 15, 16, 23, 25, 28, 32, 33, 36, 39, 41, 42, 43], "\uc218\uc2dd\uc73c\ub85c": [7, 32, 40], "\ud45c\ud604\ud558\uaca0\uc2b5\ub2c8\ub2e4": 7, "mathbf": [7, 23, 27], "f": [7, 10, 11, 12, 16, 19, 20, 21, 31, 32, 33, 36, 37, 40, 41], "neural": [7, 10, 18, 30, 32, 33], "\uc758\ubbf8\ud569\ub2c8\ub2e4": [7, 17, 28, 37], "\ud45c\ud604\ud558\uae30\uc704\ud574": 7, "\ub9cc\ub4e4\uc5b4\uc11c": [7, 9, 29], "parameter\ub97c": [7, 8, 11, 15, 28, 34, 35], "theta_": 7, "\ub77c\uace0\ud558\uace0": 7, "\uace0\uc815\uc2dc\ucf1c\ub450\uaca0\uc2b5\ub2c8\ub2e4": 7, "\ud45c\ud604\ud558\uace0": 7, "convolution\uc758": 7, "z1": 7, "z2": 7, "\ub450\uaca0\uc2b5\ub2c8\ub2e4": 7, "\ud45c\ud604\ud560": [7, 17, 32, 40, 41], "weight\uc640": [7, 28], "bias\uc758": 7, "\ucd08\uae43\uac12\uc774": 7, "0\uc774\ubbc0\ub85c": 7, "\uc9c4\ud589\ub418\uc9c0": 7, "\uc54a\uc558\uc744": [7, 28], "\uc785\ub2c8\ub2e4": [7, 9, 17, 28, 32, 33, 37, 41, 43], "controlnet\uacfc": 7, "\ub0b4\ubbc0\ub85c": 7, "\ubcf4\uc874\ud560": [7, 14], "\uc804\ubd80": 7, "\ucd08\uae30\ud654\ub418\uc5b4\uc788\uc73c\uba74": 7, "gradient\uac00": 7, "0\uc774\ub77c\uc11c": 7, "\uc548": [7, 9, 13, 33], "\ub418\ub294\uac70": 7, "\uc544\ub2d0\uae4c\uc694": 7, "\ud655\uc778\ud558\uae30": [7, 16], "\uac04\ub2e8\ud55c": [7, 12, 13, 23, 25, 29], "\uacbd\uc6b0\ub97c": [7, 17], "\uc0dd\uac01\ud574\ubcf4\uc8e0": 7, "wx": 7, "gradient\ub294": 7, "partial": [7, 8, 11, 23], "0\uc774\uace0": [7, 28], "neq0": 7, "gradient": [7, 10, 11, 14, 15, 18, 20, 23, 32, 33, 35, 37], "step\uc5d0\uc11c": [7, 11, 12, 18], "0\uc774": [7, 10, 11], "\uac12\uc73c\ub85c": [7, 12, 16, 18, 20, 22, 40, 43], "\uac00\uac8c\ub418\uace0": 7, "\ud575\uc2ec\uc801\uc778": [7, 16, 23], "\uac00\uc815\uc774": 7, "\ubd80\ubd84\uc740": [7, 15, 16, 17, 19, 27, 28, 42], "\uc788\uae30": [7, 32, 33, 40], "\uc704\ubc30\ub420": 7, "\uac00\ub2a5\uc131\uc774": [7, 14, 18], "\uc9c0\uae08\uae4c\uc9c0": [7, 11, 23], "\uc598\uae30\ud55c": 7, "diffusion\uc5d0": [7, 40], "\uc801\uc6a9\ud55c": [7, 12, 16, 18, 21, 24, 25, 30, 32, 40, 41, 42], "overal": [7, 9, 15, 38], "structur": [7, 12, 19, 20, 27, 32, 42], "loss\ub294": [7, 11, 15], "diffusion\uc5d0\uc11c": 7, "\ud615\ud0dc\uc785\ub2c8\ub2e4": [7, 27], "training\uc744": [7, 12, 16], "50": [7, 11, 28, 29, 31], "\ud655\ub960\ub85c": [7, 14], "empti": [7, 16], "string\uc73c\ub85c": 7, "\ubc14\uafd4\uc8fc\uc5c8\ub2e4\uace0": 7, "prompt\uac00": [7, 8], "\uc8fc\uc5b4\uc9c0\uc9c0\uc54a\uc744": 7, "semantics\ub97c": 7, "\ubc30\uc6b0\ub294": [7, 21], "\uacbd\ud5a5\uc774": [7, 8, 9, 15, 26], "\ud5a5\uc0c1\uc2dc\ucf1c\uc904": 7, "\uc788\ub2e4\uace0": [7, 9, 11, 12, 16, 25, 28, 29, 32, 34, 41, 42, 43], "training\uc774": 7, "\ubc29\ubc95\ubcf4\ub2e4": [7, 14, 21], "\ud6a8\uc728\uc801\uc774\ub77c\ub294": 7, "\uacb0\uacfc\ub4e4\uc740": 7, "\uacb0\uacfc\ub4e4\uc785\ub2c8\ub2e4": 7, "\ub17c\ubb38\uc5d0": [7, 11, 21, 28, 43], "\uc788\uc73c\ub2c8": 7, "\ucc38\uace0\ud558\uc2dc\uae30": 7, "\ubc14\ub78d\ub2c8\ub2e4": 7, "limitation\uc774\ub77c\uace0": 7, "\uc774\ubbf8\uc9c0\uc785\ub2c8\ub2e4": [7, 9], "\uc8fc\uc5c8\uc74c\uc5d0\ub3c4": 7, "\uc0dd\uc131\ub418\uc9c0": 7, "\uc54a\ub294": [7, 9, 15, 17, 21, 23, 28, 32, 33, 36, 41, 43], "\ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4": 7, "limit": [7, 15], "\ucf54\ub4dc\ub294": 7, "\uacf5\uc2dd": 7, "\uad6c\ud604": [7, 31, 37, 43], "\uac00\uc838\uc654\uc2b5\ub2c8\ub2e4": 7, "\ucd08\uae30\ud654\ud558\ub294": 7, "\ucf54\ub4dc\ub85c": [7, 25], "\ub9cc\ub4e4": [7, 9, 29, 34], "def": [7, 10, 11, 20, 21, 27, 31, 37, 42, 43], "zero_modul": 7, "modul": [7, 11, 13, 15, 20, 21, 27, 37, 42, 43], "out": [7, 11, 15, 31, 32, 40, 42, 43], "detach": [7, 31, 37], "zero_": 7, "\uae30\ubcf8\uc801\uc73c\ub85c": [7, 12, 14, 15, 20, 26, 38, 42], "nn": [7, 11, 20, 21, 27, 37, 42, 43], "sequential\uacfc": 7, "\uac19\uc740\ub370": 7, "step\uac19\uc740": 7, "input\uc744": 7, "\ubc1b\uc544\uc904": 7, "\ub9cc\ub4e0": [7, 27, 28, 33], "timestepembedsequenti": 7, "sequenti": [7, 11, 27, 37, 42], "timestepblock": 7, "pass": [7, 9], "children": 7, "support": 7, "an": [7, 9, 27, 29, 43], "extra": [7, 9, 15], "emb": [7, 11], "context": [7, 9, 11, 20, 25, 26, 30, 34, 36], "isinst": 7, "elif": [7, 11, 31, 36], "spatialtransform": 7, "els": [7, 10, 11, 20, 21, 27, 31, 36, 42], "github\uc758": 7, "cldm": 7, "py\uc5d0": 7, "class\uc785\ub2c8\ub2e4": 7, "init": [7, 20], "\uae38\uc5b4\uc11c": 7, "\uc0dd\ub7b5\ud588\uc2b5\ub2c8\ub2e4": 7, "__init__": [7, 10, 11, 21, 27, 37, 42, 43], "make_zero_conv": 7, "conv_nd": 7, "dim": [7, 11, 21, 27, 31, 36, 42], "pad": [7, 11, 42], "hint": [7, 8], "kwarg": 7, "t_emb": 7, "timestep_embed": 7, "model_channel": 7, "repeat_onli": 7, "fals": [7, 10, 11, 20, 21, 31, 37, 42], "time_emb": 7, "guided_hint": 7, "input_hint_block": 7, "type": [7, 36, 37], "dtype": [7, 11, 31, 36], "zero_conv": 7, "zip": [7, 10, 11], "input_block": 7, "append": [7, 11, 27, 37, 42], "middle_block": 7, "middle_block_out": 7, "customizi": 8, "To": [8, 9, 10, 22], "2212": [8, 39], "04488": 8, "seunghwan": [8, 10, 15, 18, 24, 26, 44], "ji": [8, 10, 15, 18, 24, 26, 44], "aug": [8, 18, 26], "user\uc758": 8, "private\ud55c": 8, "concept\uc744": [8, 29], "\uc0dd\uc131\ud558\uace0\uc790\ud558\ub294": 8, "\uc695\uad6c\ub294": 8, "\ud480\uc9c0": 8, "\ubabb\ud568": 8, "diffusion\uc740": [8, 15], "partial\ud55c": 8, "\ubd80\ubd84\ub9cc\uc744": 8, "\ud559\uc2b5\uc2dc\ud0b4\uc73c\ub85c\uc368": 8, "\uae30\uc874\ubcf4\ub2e4": 8, "\ube60\ub978": [8, 17, 22, 32, 40], "\ubc29\uc2dd\uc744": [8, 12, 14, 16, 21, 24, 32, 42], "\ubfd0": 8, "concept\uc5d0": [8, 29], "compress\ud558\ub294": 8, "\ud65c\ubc1c\ud558\uac8c": 8, "\uc5f0\uad6c": [8, 14, 18, 21, 22, 24], "\ub418\uc5b4\uc9d0": 8, "\uc785\ub825\ub9cc\uc73c\ub85c": 8, "\uc218\uc900\uae4c\uc9c0": [8, 18], "\uc774\ub984": [8, 12], "general\ud55c": [8, 12], "\uc0dd\uc131\ud558\uc9c0\ub9cc": [8, 14, 17, 37], "user\uac00": 8, "concept\uc758": [8, 29], "\ud589\ubcf5\ud55c": 8, "\uc6b0\ub9ac": [8, 29], "\uac00\uc871": 8, "\uc6b0\ub9ac\uc9d1": 8, "\uac15\uc544\uc9c0": 8, "\ubf40\uc090\uac00": 8, "\ud30c\ub9ac\ub85c": 8, "\uc5ec\ud589\uc744": 8, "\ub5a0\ub098\ub294": 8, "\uacfc\uc815\uc911\uc5d0": 8, "\ubcf4\uc9c0": [8, 36], "\ubabb\ud588\uae30\ub54c\ubb38\uc5d0": 8, "model\uc5d0\uac8c\ub294": 8, "\ub2f9\uc5f0\ud55c": 8, "\uba87\uc7a5\uc758": 8, "\uc774\ubbf8\uc9c0\ub9cc\uc73c\ub85c": [8, 26], "finetuning\ud558\ub294": [8, 17], "In": [8, 31], "\ud559\uc2b5\ud558\uace0\uc790\ud558\ub294": 8, "\uc0dd\uc131\ud574\ub0b4\uc57c\ud568": 8, "\ud559\uc2b5\ub418\uc5c8\ub358": 8, "finetuning\ud55c": 8, "\ud6c4\uc5d0\ub3c4": [8, 17], "customization\uc774": 8, "\uc9c4\ud589\ud558\ub2e4\ubcf4\uba74": 8, "\ud559\uc2b5\ud588\ub358": 8, "\uc78a\uc5b4\ubc84\ub9ac\uac70\ub098": 8, "\uc65c\uace1\ud574\ubc84\ub9bc": 8, "draft": 8, "overfit": [8, 36], "\ub418\uc5b4\uc11c": 8, "\uacb0\uacfc\ubb3c\uc758": [8, 25], "variation\uc774": [8, 27], "\ub0ae\uc544\uc9d0": 8, "\uc880\ub354": [8, 10, 15, 18, 26, 40], "\ub098\uc544\uac00": 8, "text\ub85c": 8, "\uc720\uc9c0\ub97c": 8, "caption\uc744": 8, "regular": [8, 11, 23, 31, 43], "tuning\ub3d9\uc548": 8, "augment": [8, 26, 28, 30, 31], "\ubc29\uc2dd\uc758": [8, 10, 24, 25, 35], "\ubcf4\uc5ec\uc8fc\uace0\uc788\uc74c": 8, "\uac8c\ub2e4\uac00": [8, 9, 16, 25], "control\ub3c4": 8, "\uac00\ub2a5\ud568": [8, 20, 22, 29, 34, 38], "general\ud558\uc9c0": 8, "\uc0dd\uc131\uc740": [8, 22], "\ubd88\uac00\ub2a5\ud568": 8, "global\ud55c": 8, "\ud3ec\ud568\ud55c": [8, 13, 21, 22, 23, 24], "\uc18c\ub7c9\uc758": [8, 11], "\uae30\ubc95": [8, 20, 31, 32], "learning\uc740": 8, "\uc0dd\uac01\ubcf4\ub2e4": 8, "\ud6a8\uacfc\uc801\uc774\uace0": 8, "\uc720\uc6a9\ud568": 8, "\uc2dc\uc5d0\ub294": [8, 11, 14, 18, 34, 42], "\uc804\uccb4\ub97c": [8, 12, 39], "\ud559\uc2b5\ud558\uac70\ub098": 8, "\ucd94\uac00\ud574": [8, 11, 12, 15, 24, 25, 30, 40], "\uc7ac\ud559\uc2b5": [8, 10, 35], "\uc704\uc5d0\uc11c": [8, 16, 17, 21, 24, 25], "customization\uc758": 8, "\uc77c\uc73c\ud0a4\uae30": 8, "\uc26c\uc6c0": 8, "etc": [8, 15, 24], "\uc544\uc8fc": [8, 12], "\uc77c\ubd80\ub9cc\uc744": 8, "\ub300\uc0c1\uc73c\ub85c": [8, 33], "\ucee8\uc149\uc73c\ub85c": 8, "finetuning\uc744": [8, 17], "invers": [8, 9, 24, 36], "vs": [8, 10, 12, 16, 23, 25, 33, 34, 35, 38, 39, 41, 42], "\ubaa8\ub378\ub4e4\uc744": [8, 39], "compress\ud560": 8, "finetuning\ud568\uc73c\ub85c\uc368": 8, "resourse\ub97c": 8, "\uc808\uc57d\ud560": 8, "backbone\uc73c\ub85c": 8, "dm\uc758": 8, "equat": [8, 9, 10, 13, 15, 16, 18, 24, 26, 32, 35, 40], "\uc2dc\uc810\uc5d0": 8, "noise\uac00": [8, 11, 12, 16, 18, 27], "\uc11e\uc778": 8, "text\ub098": 8, "\uc0ac\uc6a9\ud558\uc9c0\uc54a\uace0": 8, "space\ub85c": [8, 12, 15, 24, 29], "embedding\ub41c": 8, "\u03b5": [8, 10], "\u03b5_": 8, "\u03b8": 8, "\ub080": 8, "\u03b5\ub97c": 8, "\uc608\uce21\ud574\ub0b4\ub294": [8, 11], "tuning\ud560\ub54c\ub294": 8, "layer\uc5d0\ub300\ud574": 8, "update\ud558\ub294\uac8c": 8, "\uae30\ubcf8": [8, 14, 23, 25, 28], "resource\uac00": [8, 15], "\ube44\ud6a8\uc728\uc801\uc73c\ub85c": 8, "\ub9ce\uc774\ub4e4\uace0": 8, "overfitting\ub418\uae30": 8, "\ubcc0\ud654\ub7c9\uc744": [8, 40], "\uccb4\ud06c": 8, "while": 8, "\ubd80\ubd84\uc5d0\ube44\ud574": 8, "\uc5f0\uc0b0\uc758": [8, 19], "wegith": 8, "fig": [8, 10, 18, 23], "latent\uc5d0": [8, 14], "\uc8fc\uc785\ud558\ub294": [8, 12], "kei": [8, 19, 20, 22, 24, 26, 30], "parameter\uc5d0": 8, "\ub2e8": [8, 17, 24, 26, 32, 36], "\ucc28\uc9c0": 8, "\uc758\ubbf8\ud558\ub294": [8, 28, 43], "\ud3ec\ud568\ub418\ub294": 8, "\ub098\uba38\uc9c0\ub294": [8, 13, 26], "freez": [8, 13, 17, 20, 22, 30, 36, 38], "\uc2e4\uc81c\ub85c\ub294": [8, 10, 14], "\uc4f0\uc9c0\uc54a\ub294": 8, "\ub2e8\uc5b4\ub85c": 8, "\ud615\uc2dd\uc73c\ub85c": 8, "captioning\ud55c": 8, "finetuning\uc911\uc5d0": 8, "\uc78a\uc5b4\ubc84\ub9ac\ub294": 8, "\ud604\uc0c1\uc774": [8, 14, 27, 33, 39], "\uc788\uc744\uc218\uc788\uc74c": 8, "moon": 8, "\uc0dd\uc131\ud558\uba74": [8, 33], "finetuning\ud588\ub358": 8, "moongat": 8, "\uc0dd\uc131\ud574\ubc84\ub9bc": 8, "\ubc29\uc9c0\ud558\uae30\uc704\ud574": 8, "world\uc758": 8, "image\uc5d0\uc11c": [8, 12, 34], "200\uc7a5\uc758": [8, 26], "regul": 8, "\uc720\uc0ac\ud558\ub2e4": 8, "clip\uc5d0\uc11c": [8, 28], "space\uc0c1\uc758": 8, "vector\uac00": 8, "similar\ud558\ub2e4": 8, "joint": [8, 16, 34, 35], "trane": 8, "rare\ud55c": 8, "key\ub97c": 8, "\ubd80\uc5ec\ud574": [8, 42], "constrain": 8, "optim": [8, 10, 13, 17, 22, 26, 29, 34, 36, 43], "merg": [8, 20], "concept\uc73c\ub85c": 8, "weight\ub97c": [8, 15, 20, 28], "appendix": [8, 41], "a\uc5d0\ub294": 8, "\ub098\uc640\uc788\ub294\ub370": 8, "\uc624\ud0c8\uc790\uc77c": 8, "\uac00\ub2a5\uc131": 8, "reg": 8, "caption\uc758": 8, "\ubf51\uc544": [8, 35], "\uacf1\ud55c": 8, "\uac12\uacfc\uc758": 8, "norm\uc744": 8, "\uacc4\uc0b0\ud588\uc744\ub54c": 8, "n\uac1c\uc758": [8, 15, 34], "attention\uc774": 8, "\ub3d9\uc791\ud558\ub294": [8, 19], "\ucc3e\uc544": [8, 29], "\ud558\ub098\ub9cc": 8, "\uc0ac\uc6a9\ud558\uc790": 8, "250": [8, 31], "two": [8, 9, 14, 27, 29, 34, 36, 40, 41, 42], "veri": 8, "small": [8, 29, 39, 42], "far": [8, 23], "awai": 8, "zoom": 8, "techniqu": [8, 11, 15, 24, 38], "quant": [8, 29], "\ub300\uc751\ub418\ub294": 8, "\uc0dd\uc131\ud574\ub0c8\ub294\uac00": 8, "\ud45c\ud604\ud574\ub0c8\ub294\uac00": 8, "prefer": [8, 38], "baselin": [8, 34, 41], "customdiffus": [8, 17], "all": [8, 9, 20], "\uc120\ud638": 8, "inversion\uc740": [8, 29], "alignment\ub294": 8, "\uc120\ud638\ub3c4\uc640": 8, "\ube44\uc2b7\ud558\uc9c0\ub9cc": [8, 28], "alignment\uc218\uce58\ub97c": 8, "diffusion\uc774": 8, "\ub192\uc544": 8, "overfitting\ub41c": [8, 26], "\u314cgen": 8, "generate\ub41c": 8, "\uc218\uce58\ub294": [8, 18, 35], "regulat": 8, "world": [8, 15, 21, 30], "customizing\uc774": 8, "resourse\uac00": 8, "Of": 8, "category\uc758": 8, "object\uc5d0": [8, 21], "\ub3d9\uc791\ud558\uc9c0": [8, 14, 18], "hierarch": 9, "2022": [9, 12, 16, 19, 22, 32, 33, 38, 41], "2204": 9, "06125v1": 9, "sep": [9, 38, 39], "18": [9, 12, 32, 36], "dalle2": [9, 15], "2022\ub144\uc5d0": 9, "\uacf5\uac1c\ub418\uc5b4": 9, "\uc138\uc0c1\uc744": 9, "\ub180\ub77c\uac8c": 9, "\ub2a5\ub825\ub3c4": 9, "\ub6f0\uc5b4\ub0ac\uace0": 9, "\uc0ac\uc6a9\uc790": 9, "\uc785\ub9db\uc5d0": 9, "\uc870\uc791\ud560": 9, "\ub418\uc5c8\uc8e0": 9, "\uc774\ub984\uc740": 9, "\uc77c\uae4c\uc694": 9, "\ucd08\ud604\uc2e4\uc8fc\uc758": 9, "\ud654\uac00": 9, "salvador": 9, "dali": 9, "wall": 9, "\ud569\uc131\uc5b4\uc785\ub2c8\ub2e4": 9, "\uc0dd\uc131\ud574\ub0b8": 9, "\uacb0\uacfc\ubb3c\uc774": [9, 25, 34], "\uc5b4\ub5bb\uae38\ub798": 9, "\uacb0\uacfc\ubb3c": [9, 34], "\uc0dd\uc804": 9, "\ubaa8\uc2b5": [9, 22], "vibrant": 9, "robot": 9, "half": [9, 31], "\ubaa8\uc2b5\uc774": [9, 33], "\ubcf4\uc774\ub124\uc694": 9, "\ucd08\ud604\uc2e4\uc8fc\uc758\uc801": 9, "\uac19\uae30\ub3c4": 9, "corgi": 9, "\uc5b4\ub5a4\uac00\uc694": 9, "depict": 9, "explos": 9, "nebula": 9, "\ubaa8\uc2b5\uc744": [9, 23, 29, 40], "\uc131\uc6b4\uc758": 9, "\ud3ed\ubc1c\ub85c": 9, "\ubb18\uc0ac\ud574\ub2ec\ub77c\uace0": 9, "\ud588\uc744": [9, 12, 31, 36, 40], "\uadf8\ub9bc\uc785\ub2c8\ub2e4": [9, 43], "nasa": 9, "\ucd2c\uc601\ud55c": 9, "\ucd08\uc2e0\uc131": 9, "\ud3ed\ubc1c\uc758": 9, "\uc794\ud574\uc785\ub2c8\ub2e4": 9, "\uadf8\ub7f4\ub4ef\ud558\uc9c0": 9, "\uc54a\ub098\uc694": 9, "thi": [9, 10, 11, 13, 20, 23, 29, 36, 44], "mosaic": 9, "largest": 9, "ever": 9, "taken": 9, "hubbl": 9, "telescop": 9, "crab": 9, "six": 9, "light": [9, 23], "year": 9, "wide": 9, "expand": [9, 35, 42], "remnant": 9, "star": 9, "supernova": 9, "\uc8fc\uc758\uc0ac\ud56d": 9, "\ube44\uc120\ud615\uc801\uc73c\ub85c": 9, "\uc0b4\ud3b4\ubd05\ub2c8\ub2e4": 9, "\uc624\ud508\uc6d4\ub4dc": 9, "\uac8c\uc784\ucc98\ub7fc": 9, "\ub9d0\uc774\uc8e0": 9, "\ud575\uc2ec\uc774": 9, "\ub418\ub294": [9, 12, 14, 34, 35, 36, 37, 39, 42], "\uc9c8\ubb38\ub4e4\uc744": 9, "\ub358\uc9c0\uba70": 9, "\ud30c\ud5e4\uccd0": 9, "\uac81\ub2c8\ub2e4": 9, "\ud3ec\uc2a4\ud305\uc740": 9, "openai": [9, 32], "blog": [9, 29], "assemblyai": 9, "eden": 9, "meyer": 9, "\ucc38\uace0\ud588\uc2b5\ub2c8\ub2e4": 9, "\ubcf8\uaca9\uc801\uc73c\ub85c": 9, "\uc804\uc5d0": [9, 36], "\uc54c\uc544\uc57c\ud560": 9, "\ubaa8\ub378\uc785\ub2c8\ub2e4": [9, 19, 27, 37], "The": [9, 13, 27], "fundament": 9, "principl": 9, "ar": [9, 10, 11, 20, 25, 42], "quit": 9, "simpl": [9, 18, 35, 39, 42], "first": [9, 10, 20, 32], "associ": 9, "caption": [9, 16, 30, 31, 34, 38], "through": [9, 16, 29], "respect": [9, 35, 38], "dimension": [9, 11], "Then": [9, 20], "cosin": [9, 12, 22, 29, 35, 36, 41], "similar": [9, 30, 32, 34, 36], "each": [9, 27, 36], "pair": [9, 20, 22, 24, 30, 38, 42], "comput": [9, 10, 15, 20, 30, 32, 33, 35, 36, 38, 39, 40, 41, 42, 44], "simultan": 9, "maxim": [9, 34], "correct": [9, 36], "minim": 9, "incorrect": [9, 17, 36], "\ud1b5\ud569\uc2dc\ucf30\uc2b5\ub2c8\ub2e4": 9, "\ucd5c\ucd08\ub294": 9, "\uc815\ub2f5\uc740": 9, "\uc544\ub2d9\ub2c8\ub2e4": [9, 27], "22\ub144": 9, "5\uc6d4": 9, "\uc0ac\uc6a9\ud558\uc9c0": [9, 17, 31, 32, 40], "imagen": [9, 17, 21, 22, 31, 36, 40], "\uc5d0\uac8c": [9, 31], "sota": [9, 14, 15, 21, 22, 23, 26, 28, 30, 34, 38, 42], "\ub0b4\uc8fc\uc5c8\uc2b5\ub2c8\ub2e4": 9, "\ucc0d\uba39\ud558\uae30": 9, "\ub0b4\uc758": [9, 25], "\ud3ec\ucc29\ud574\ub0bc": 9, "\ud45c\ud604": [9, 11, 14, 23, 30, 41], "\ub04c\uc5b4\uc62c\ub9ac\uae30": 9, "\uc778\ub370\uc694": 9, "unclip": 9, "\ubd80\ub985\ub2c8\ub2e4": [9, 41], "architectur": [9, 10, 15, 17, 21, 23, 27, 29, 32, 37, 38, 39, 43], "\ubcf5\uc7a1\ud574\ubcf4\uc774\ub2c8": 9, "assembl": 9, "ai": [9, 17, 25, 33], "\ub2e8\uc21c\ud654\ub41c": 9, "\uc0b4\ud3b4\ubcfc\uac8c\uc694": 9, "f1x4fhzf4mq": 9, "360": [9, 23], "\ubaa8\ub378\uc778": [9, 24, 31, 33, 38], "\uac19\ub124\uc694": 9, "\ucea1\uc158\uc744": [9, 21], "\uc0c1\uc751\ud558\ub294": 9, "autogregress": 9, "\ube44\uad50\ud558\ub294": [9, 12, 17, 40], "\uc218\ud589\ud588\uc2b5\ub2c8\ub2e4": [9, 33], "computation": [9, 42], "\ud558\uace0": [9, 12, 19, 23, 25, 31, 32, 42], "\ud6c4\ubc18\ubd80\uc5d0\ub294": 9, "\uc2e4\ud5d8\ud569\ub2c8\ub2e4": 9, "\ubaa8\ub378\ub9cc": 9, "\uc774\ub791": [9, 34, 43], "\uc0ac\uc6a9\ud588\uc744\uae4c\uc694": 9, "\ud559\uc2b5\ud558\ub294\ub370": [9, 29, 36], "\uc131\uacf5\uc744": 9, "\uac70\ub450\uace0": 9, "shift": [9, 12, 31], "capabl": 9, "\ub6f0\uc5b4\ub0ac\uc2b5\ub2c8\ub2e4": 9, "\ub2ec\uc131\ud574\ub0c8\uc2b5\ub2c8\ub2e4": 9, "tak": 9, "\uac31\uc2e0\ud558\ub294": 9, "\uc911\uc774\uc5c8\uc8e0": 9, "determinist": [9, 10, 35, 41, 43], "\ub355\ubd84\uc5d0": 9, "\uc874\uc7ac\ud558\uc9c0": [9, 21, 33], "essenti": 9, "\ubcc0\uc8fc\ud558\uba74\uc11c": 9, "\uc788\uc8e0": 9, "variat": [9, 11], "\uc67c\ucabd\uc758": 9, "\ubcf4\uc874\ub429\ub2c8\ub2e4": 9, "\uadf8\ub4e4\uc774": 9, "\ud45c\ud604\ub418\ub294": 9, "\ubc29\uc2dd\uc774\ub098": 9, "\ubc14\ub01d\ub2c8\ub2e4": 9, "\uadf8\ub7fc\uc5d0\ub3c4": [9, 14, 30, 33], "\ud2b9\uc720\uc758": 9, "\ud654\ud48d\uc740": 9, "\ubcc0\uc8fc\uace1\ucc98\ub7fc": 9, "\ub9e4\ubc88": [9, 12, 20, 34], "\uc0c8\ub86d\uac8c": [9, 12, 29], "\uc5f0\uc8fc": 9, "\ud574\ub0bc": 9, "\uc788\ub294\uac81\ub2c8\ub2e4": 9, "\ud30c\ud5e4\uce58\uae30": 9, "\uc774\ubc88\uc5d0\ub294": [9, 33], "\uc0b4\ud3b4\ubcf4\uc8e0": 9, "\uc790\uccb4\uc758": 9, "\uc124\uba85": [9, 12, 21, 35], "\uc0ac\uc2e4": [9, 18], "\uc870\uac74\uc73c\ub85c": [9, 14], "\uc790\uccb4\ub3c4": 9, "\ubc1b\uc2b5\ub2c8\ub2e4": 9, "\ubb3c\ub860": [9, 28], "\ubc1b\uaca0\uc8e0": 9, "1\ub3001": 9, "\ub300\uc751\ub418\uae30": 9, "duel": 9, "\ubb38\uc81c\ub420": 9, "\uc5c6\ub2e4\uace0": [9, 27], "\ubcc0\ub860\ud569\ub2c8\ub2e4": 9, "\ub192\uc774\uae30": [9, 18, 22, 40], "2\uac1c\uc758": [9, 23, 40, 42], "dot": [9, 12, 15], "\uc0ac\uc6a9\ud588\ub2e4\uace0": [9, 16, 28, 36, 41], "modifi": 9, "glide": [9, 39, 40], "\uc8fc\uc7a5\ud569\ub2c8\ub2e4": [9, 41, 42], "\ud1b5\ud569\uc2dc\ud0a4\ub0d0\ud558\uba74": 9, "\ucd94\uac00\ud558\uace0": [9, 11, 15, 17, 21, 22], "token": [9, 15, 20, 21, 29, 34, 36, 42], "\ud558\ub294\uac70\uc8e0": 9, "\ubc29\ubc95\uc73c\ub85c": [9, 14, 28, 29, 33, 35, 37, 41], "\uc0ac\uc6a9\ud568\uc73c\ub85c\uc368": [9, 35, 39], "\uc788\ub358": 9, "\ud65c\uc6a9\ud560": [9, 29, 32], "\ud544\uc694\ud560\uae4c\uc694": 9, "obtain": 9, "full": [9, 11, 14, 18, 21, 26, 39], "we": [9, 23, 29, 36, 42], "which": [9, 29, 38], "possibl": [9, 41], "given": [9, 12, 13], "\ub531\ud788": 9, "\uc640\ub2ff\uc9c0\ub294": 9, "\uc2e4\ub9dd\ud558\uae34": 9, "\uc774\ub985\ub2c8\ub2e4": 9, "\uc720\ubb34\uc5d0": 9, "\ud488\uc9c8\uc744": [9, 14, 25, 28, 29], "\uc218\ud589\ud588\ub2e4\uace0": [9, 16], "\ud55c\ubc88": [9, 11, 32, 36, 43], "\uc0b4\ud3b4\ubcfc\uae4c\uc694": 9, "\ubaa8\ub378\ucc98\ub7fc": [9, 31], "\uc8fc\uc5b4": [9, 31, 33], "\ud6cc\ub96d\ud588\uc2b5\ub2c8\ub2e4": 9, "\uacbd\uc6b0\uc758": [9, 14, 33], "\uc544\ud0a4\ud14d\uccd0\uc5d0": 9, "same": [9, 20], "\uadf8\ub807\uc9c0\ub9cc": [9, 38], "\uc758\ubb38\uc774": [9, 28], "\ub9d0\ub054\ud788": 9, "\ud574\uc18c\ub418\uc9c0\ub294": 9, "\uc65c\ub0d0\ud558\uba74": [9, 12], "95": 9, "\ubc29\uc2dd\uc5d0": [9, 29], "\uc801\uc6a9\ud574": [9, 25, 40], "\uc2e4\ud5d8\ud588\uc2b5\ub2c8\ub2e4": [9, 41], "\uacf5\uc815\ud55c": 9, "\uc2e4\ud5d8\uc774\ub77c\uace0": 9, "\ubcf4\uae34": 9, "\uc5b4\ub824\uc6b8": [9, 22], "\ud559\uc2b5\uc2dc\ucf30\uc744": 9, "\uc5c6\uc2b5\ub2c8\ub2e4": [9, 42], "\uac1c\uc778\uc801\uc73c\ub85c": [9, 27, 28], "\uc800\ub294": [9, 27], "\ubcf4\uace0": [9, 11, 28], "\ubc18\ub4dc\uc2dc": [9, 24], "\uc368\uc57c\ud558\ub294": 9, "\uadfc\uac70\uc5d0": 9, "\uc124\ub4dd\ub825\uc774": 9, "\ub5a8\uc5b4\uc9c4\ub2e4\uace0": 9, "\uc0dd\uac01\ud588\uc2b5\ub2c8\ub2e4": 9, "\uc368\uc57c\ud560\uae4c\uc694": 9, "\uac1d\uccb4\ub97c": [9, 22], "\ubb18\uc0ac\ud55c": 9, "\uac1d\uccb4\uc758": 9, "\ubc1c\ud604": 9, "\uc758\ubbf8\ub860\uc801": 9, "\uad00\uacc4\ub97c": [9, 10, 18, 40], "\uc911\uc694\ud558\ub2e4\uace0": [9, 36], "manipul": [9, 24, 26, 32], "diff": 9, "appli": [9, 30], "interpol": [9, 15, 18, 32], "normalis": 9, "produc": 9, "descript": [9, 36], "\ud558\ub294\uc9c0\ub294": 9, "\uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4": [9, 37, 42], "\uadf8\ub798\uc11c": [9, 15, 16, 28, 37, 41], "\ubb50\uac00": [9, 22], "\uc88b\uc740\uac00\uc694": 9, "\uc0dd\uc131\ubb3c\uacfc": 9, "\uc0dd\uc131\ubb3c\uc744": 9, "\uc0ac\ub78c\ub4e4\uc5d0\uac8c": 9, "\uc81c\uc2dc\ud558\uace0": 9, "photor": [9, 16, 38], "\ub9e4\uae30\ub3c4\ub85d": 9, "when": [9, 27, 37, 38], "guidanc": [9, 13, 28, 30, 39, 42], "both": [9, 12, 31], "versu": 9, "\uacb0\ub860\uc740": 9, "compar": [9, 29], "\ud6e8\uc52c": [9, 12, 16, 17, 18, 21, 28, 31, 33], "bipartit": 9, "z_i": [9, 19], "\uc778\ucf54\ub529": [9, 19, 22, 23, 30], "\uc5bb\uc73c\uba70": 9, "\ubcf5\uc6d0\ud558\ub294\ub370": 9, "\ud544\uc694\ud55c": [9, 22, 23, 29, 30, 31, 33], "\uc794\uc5ec": 9, "\uc815\ubcf4\ub4e4\uc744": [9, 42], "\uc9c0\ub2d9\ub2c8\ub2e4": 9, "\ubcc0\uc8fc\ud558\uae30": 9, "\u03b7": [9, 10], "\ud574\uc9c0\uace0": 9, "\ubcf5\uc6d0\ud574\ub0c5\ub2c8\ub2e4": 9, "\ucee4\uc9c8\uc218\ub85d": [9, 10, 18, 26], "\uc0dd\uae30\uace0": 9, "\uadfc\ucc98\uc5d0\uc11c": 9, "perceptu": [9, 12, 33], "centere": 9, "\ub9cc\ub4e4\uc5b4\ub0bc": [9, 16], "\ud0a4\uc6b0\uba74": 9, "\uc874\uc7ac\ud558\uace0": [9, 32], "\uc720\uc2e4\ub418\uc5c8\ub294\uc9c0": 9, "\ud0d0\uc0c9": 9, "\ud0d0\uc0c9\ud574\ub0bc": 9, "\uc788\ub294\uac70\uc8e0": 9, "\uac83\ub3c4": [9, 11, 28, 43], "\ud574\uc11c": [9, 15, 22, 29, 35, 37, 40], "\uc900\ub2e4\uba74": 9, "\ucea1\uc158\uc774": 9, "\uc8fc\uc5b4\uc838\uc788\uc744": 9, "\uc6b0\ub9ac\uac00": [9, 11, 33], "z_t0": 9, "current": [9, 10, 11], "embd": 9, "\uc870\uc791\ub429\ub2c8\ub2e4": 9, "typograph": 9, "attak": 9, "attack": 9, "\uc0ac\ubb3c": 9, "\uc704\uc5d0": [9, 16, 23, 41], "\uae00\uc528\uac00": 9, "\uc4f0\uc5ec": 9, "\uacbd\uc6b0\uc785\ub2c8\ub2e4": [9, 27], "multimod": [9, 31, 38], "\uc0ac\ubb3c\uc744": 9, "\ud310\ub2e8\ud558\ub294": 9, "ipod": 9, "\uc885\uc774\uac00": 9, "\ubd99\uc740": [9, 33], "\uc0ac\uacfc\ub97c": 9, "\ubd84\ub958\ub97c": [9, 15], "\uc218\ud589\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4": 9, "\uc5ed\uc2dc": [9, 23, 43], "granni": 9, "smith": 9, "\uac00\uae5d\ub2e4\uace0": 9, "\ud310\ub2e8\ud588\uc2b5\ub2c8\ub2e4": 9, "\uc0ac\uacfc\uc758": 9, "\uc0ac\uc9c4\uc73c\ub85c": 9, "recov": 9, "\ud574\ub0c5\ub2c8\ub2e4": 9, "\uc774\ucc98\ub7fc": [9, 32, 43], "\ub2e8\uc810\uc740": 9, "\uc5c6\ub098\uc694": 9, "cube": [9, 23], "\uadf8\ub4e4\uc758": [9, 29], "\uc18d\uc131": [9, 22, 33], "color": [9, 23, 26, 32, 36, 39, 42], "\ub9e4\uce6d\uc2dc\ud0a4\ub294": 9, "\ub5a8\uc5b4\uc9d1\ub2c8\ub2e4": 9, "red": [9, 34], "blue": [9, 34], "\ud30c\ub780": [9, 31], "\ud050\ube0c": 9, "\ube68\uac04": [9, 28], "\ud050\ube0c\ub97c": 9, "\uadf8\ub824\ub2ec\ub77c\uace0": 9, "\ud050\ube0c\uc640": 9, "\ud050\ube0c\uc5d0": 9, "\uc0c9\uc0c1": [9, 22, 23], "attribut": [9, 12, 27, 39], "\ubd80\uc5ec\ud574\uc57c\ud560\uc9c0": 9, "\ud5f7\uac08\ub824\ud569\ub2c8\ub2e4": 9, "sign": 9, "sai": 9, "deep": [9, 18, 21, 23, 28, 32, 33, 38, 41], "\ub9cc\uc758": 9, "\ubb38\uc81c\ub294": 9, "\uc5b4\ub824\uc6cc\ud558\ub294": 9, "\ubb38\uc81c\uc785\ub2c8\ub2e4": 9, "\uc0c1\ud669\uc5d0\uc11c": [9, 11], "\ub514\ud14c\uc77c\uc744": [9, 14, 22, 29], "\ubb18\uc0ac\ud558\ub294": 9, "show": [9, 38], "some": 9, "complex": [9, 42], "\ub124\uc628": 9, "\uc0ac\uc778\ub4e4\uc758": 9, "\ub514\ud14c\uc77c\ub4e4\uc774": 9, "\ud655\uc778\ud558\uc2e4": 9, "\ub17c\ubb38\uc758": [9, 17, 21, 23, 24, 27, 28, 35, 40, 43], "\uc218\ud559\uc801": 9, "justifi": 9, "\ub77c": [9, 41, 42], "\ud569\uc2dc\ub2e4": [9, 27], "\uadf8\uc5d0": [9, 24, 33, 43], "\uc800\uc790\uc758": 9, "\uc8fc\uc7a5": [9, 35, 38], "\uc0d8\ud50c\ub9c1\ud560": [9, 32], "equal": 9, "hold": 9, "becaus": 9, "function": [9, 15, 22, 23, 29, 32, 37, 40, 41, 43], "rule": [9, 41], "\ud3ec\uc2a4\ud305\uc744": 9, "\ubd80\uac00": 9, "\uacf5\uc2dd\uc744": 9, "\ud480\uc5b4\uc11c": 9, "\ud574\uc124\ud574\ubcf4\uba74": 9, "\uc0d8\ud50c\ub9c1\ud558\uace0": [9, 31, 43], "\uc0d8\ud50c\ub9c1\ud568\uc73c\ub85c\uc368": 9, "\uc0d8\ud50c\ub9c1\uc774": 9, "\uac00\ub2a5\ud574\uc9c0\ub294": 9, "\uc5c6\ub294\uc9c0": 9, "\uad81\uae08\ud574\uc11c": 9, "\uacf5\ubd80\ud574\ubd24\uc2b5\ub2c8\ub2e4": 9, "\ud574\uc18c\ud558\uae30": 9, "\ub178\ub825\uc744": 9, "\ud558\uace0\uc788\ub294\uc9c0": 9, "\uc815\ub7c9\uc801\uc73c\ub85c": [9, 14], "\ud3c9\uac00\ud560": [9, 39], "\uc870\uc0ac\ud574\ubd24\uc2b5\ub2c8\ub2e4": 9, "\uacb0\uacfc\ubd80\ud130": 9, "\ub9d0\uc500\ub4dc\ub9ac\uba74": 9, "\uc6f9\ud06c\ub864\ub9c1": 9, "\uc874\uc7ac\ud55c\ub2e4\uace0": 9, "\ud558\uace0\uc788\ub294\uc9c0\ubd80\ud130": 9, "preview": 9, "safeti": 9, "\ub178\ub825": 9, "\ub370\uc774\ud130\uc5d0\uc11c": [9, 28], "violent": 9, "hate": 9, "adult": 9, "\uc81c\uac70\ud568\uc73c\ub85c\uc368": 9, "\ub178\ucd9c\ub418\ub294": 9, "\ucd5c\uc18c\ud654\ud588\ub2e4\uace0": 9, "polici": 9, "\uc704\ubc18\ud55c": 9, "\uc790\uc815\ud558\ub294": 9, "\uc2dc\uc2a4\ud15c\uc744": 9, "\ubcf4\uc720\ud558\uace0": 9, "\uc2e0\ub8b0\ud560": 9, "\uc804\ubb38\uac00\ub4e4\uacfc": 9, "\uac80\ud1a0\ub97c": 9, "\uc9c4\ud589\ud588\ub2e4\uace0": [9, 16, 39], "eval": [9, 10, 21], "\uae30\ubc95\uc774": [9, 16, 32], "2202": [9, 41], "04053": 9, "j": [9, 11, 15, 23], "min": [9, 10, 20, 40], "dallev": 9, "contribut": [9, 14, 15, 23, 35], "3\uac00\uc9c0\ub97c": 9, "\uc81c\uacf5\ud569\ub2c8\ub2e4": [9, 17, 32], "\ucd5c\uadfc\uc758": [9, 33], "recognit": [9, 28], "skill": 9, "\uc0c1\ub300\uc801\uc73c\ub85c": [9, 17, 35], "\ub6f0\uc5b4\ub098\uc9c0\ub9cc": [9, 15, 18], "count": [9, 39], "spaial": 9, "\ub2a5\ub825\uc740": [9, 31], "\ub5a8\uc5b4\uc9d0\uc744": 9, "gender": 9, "skin": 9, "tone": 9, "bias": 9, "metric": [9, 10, 11, 24, 30, 32, 33, 36, 39], "\ubd84\uc11d": [9, 29, 35], "web": 9, "\ud559\uc2b5\ud588\uc74c\uc744": 9, "\ubcf4\uc5ec\uc8fc\uc5c8\uc2b5\ub2c8\ub2e4": [9, 19], "social": 9, "sec": 9, "\uc790\uc138\ud55c": [9, 12, 28, 41, 42], "diagnost": 9, "who": 9, "nurs": 9, "252\uac1c\uc758": 9, "\ud0d0\uc9c0\ud569\ub2c8\ub2e4": 9, "autom": 9, "detect": 9, "verifi": 9, "reliabl": 9, "\uc8fc\uba74\uc11c": 9, "\uc0ac\ub78c\uc758": [9, 14, 21, 27], "\uc131\ubcc4\uc744": 9, "\ub9de\ucd94\uac8c": 9, "\ub2f5\ubcc0\uc744": 9, "\uc2e0\uacbd\ub9dd\uc73c\ub85c": 9, "facial": [9, 26], "landmark": 9, "\ucd94\ucd9c\ud558\uace0": [9, 25], "illumin": 9, "\ubcf5\uc7a5\uc744": 9, "\ud0d0\uc9c0\ub41c": 9, "uniform": [9, 10, 31, 42], "\uc73c\ub85c\ubd80\ud130": [9, 33], "skew": 9, "\ub418\uc5b4\uc788\ub294\uc9c0": 9, "expert": 9, "per": 9, "profess": 9, "averag": [9, 10, 32, 40, 41], "\ud3c9\uac00\ud558\ub294\ub370\uc5d0": 9, "\uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4": 9, "satbl": 9, "\uc6f9\ud06c\ub864\ub9c1\uc744": 9, "\uc874\uc7ac\ud588\uc2b5\ub2c8\ub2e4": 9, "\ub178\ub825\uc774": 9, "\uc9c0\uc18d\ub418\uace0": 9, "\ubbf8\ub798\uc5d0\ub294": 9, "\uc548\uc804\ud558\uac8c": 9, "\uc788\uae30\ub97c": 9, "\uae30\ub300\ud569\ub2c8\ub2e4": 9, "iclr": [10, 12, 20, 41, 43], "2021": [10, 12, 18, 20, 32, 34, 35, 41], "2010": 10, "02502": 10, "april": [10, 15], "\ub2e8\uc810\uc778": 10, "process\ub85c": [10, 11, 18, 35, 40], "\uc815\uc758\ud568\uc73c\ub85c\uc11c": 10, "deterministic\ud55c": 10, "sampling\uc774": [10, 35], "adversari": [10, 15, 17, 24, 27, 37], "\ubcf4\uc5ec\uc8fc\uace0\uc788\ub2e4": 10, "gan\uc740": [10, 15, 27, 33], "\ubd88\uc548\uc815\uc131\uc744": [10, 33], "\ub9ce\ub2e4": [10, 14], "generator\uc640": 10, "discriminator\uc758": [10, 15], "imbalanced\uc5d0": 10, "\uc758\ud55c": [10, 29], "mode": [10, 12, 20, 42], "collaps": 10, "\uadf8\ub7ec\ub358": 10, "ddpm\uacfc": [10, 12, 16, 24], "ncsn\uac19\uc740": 10, "training\uad6c\uc870\uac00": 10, "\ub4f1\uc7a5\ud558\uc600\uace0": 10, "\uc131\uacf5\uc758": 10, "\ubcf4\uc5ec\uc8fc\uc5c8\ub2e4": [10, 12, 26, 31, 40], "ddpm\uc740": [10, 35], "process\uc5d0\uc11c": [10, 12, 18, 24, 35], "\uac70\uce58\ub294\ub370": 10, "\uc774\ub54c\ubb38\uc5d0": 10, "gan\uc5d0": 10, "\ub290\ub9b0": [10, 40], "performance\ub97c": 10, "50k": [10, 41], "less": 10, "than": 10, "about": 10, "20h": 10, "256": [10, 12, 14, 22, 23, 25, 33, 34, 37, 38], "1000h": 10, "ddim\uc740": [10, 12, 35], "chain\uc5d0": 10, "\ub300\uccb4\ud558\uc600\uace0": 10, "\uacb0\uad6d": [10, 12, 16, 18, 22, 34, 35], "\ube60\ub974\uace0": [10, 12, 17, 40], "\ube44\uad50\uc801": [10, 15, 18, 42], "\uc0dd\uc131\ud574\ub0b4\uace0": [10, 26], "accel": 10, "ddpm\uacfc\ub294": 10, "consistency\ud55c": 10, "\ubcf4\uc5ec\uc90c\uc73c\ub85c\uc368": 10, "latent\uac04\uc758": 10, "interpolation\uc774": 10, "If": 10, "equival": 10, "process\ub294": [10, 12, 16, 40], "\ub3d9\uc791\ud55c\ub2e4": 10, "\ubbf8\ub798": 10, "\uc2dc\uc810\uc744": [10, 12], "\uc608\uce21\ud558\uae30\uc704\ud574": 10, "\uc774\uc6a9\ud55c\ub2e4": [10, 12, 16], "\uc2dc\uc810\uc740": 10, "\uacfc\uac70": [10, 32], "\uac12\uc5d0\ub294": 10, "\uac16\ub294\ub2e4": 10, "t\ub294": 10, "ddpm\uc5d0\uc11c": [10, 12, 16, 18, 35], "\uc88c\uc9c0\uc6b0\uc9c0\ud558\ub294": 10, "hyper": [10, 15, 18, 20, 26], "parameter\uc774\ub2e4": [10, 40], "\ub300\ucda9": 10, "\ubc88\uc758": [10, 22], "sequential\ud558\uac8c": 10, "\uac70\uccd0\uc57c\ud558\uace0": 10, "\ud604\uc800\ud788": [10, 18, 41], "\uc18d\ub3c4\ub97c": [10, 17, 21, 40], "\uc694\uc18c\uac00": [10, 13], "\uad6c\ud558\uae30\uc704\ud574": 10, "\ucc38\uc870": [10, 17], "\uac12\ub9cc\uc744": 10, "\u03c3\ub294": 10, "process\uc758": [10, 18], "stochastic\ud55c": [10, 12], "chap": 10, "And": 10, "unifi": 10, "\uc2dd\uc744": [10, 12, 35, 41], "\uc774\uc6a9\ud574": [10, 12, 14, 16, 24, 28, 29, 43], "\uc0d8\ud50c\ub9c1": [10, 14, 15, 21, 22, 23, 28, 30, 35, 38], "\uad00\uacc4": [10, 22], "t\uc2dc\uc810\uc758": [10, 12], "\uc608\uce21\ud55c": [10, 12, 16, 17, 40], "\u03c3": [10, 23], "\u03c3\uac00": 10, "\uac00\uc9c8": [10, 23], "\uc218\uc2dd\uacfc": 10, "\ub3d9\uc77c\ud558\ub2e4": 10, "explan": 10, "deterministic\ud558\uae30\ub54c\ubb38\uc5d0": [10, 35], "\uacc4\uc0b0\ud560": [10, 35], "subset\uc758": [10, 35], "\uc2dc\uc810\ub9cc\uc73c\ub85c": [10, 35], "method\ub294": [10, 29, 35], "\uc57d\uac04\uc758": [10, 14, 16, 35], "\uc800\ud558\uac00": [10, 17, 35], "efficiency\ub97c": [10, 35], "\ucda9\ubd84\ud788": [10, 17, 23, 32, 35, 40], "\uc99d\uac00\uc2dc\ud0ac": [10, 35], "ddim\uc758": [10, 35], "od": [10, 32], "encoding\uc774": [10, 23], "\uc720\ub3c4\ud560": 10, "table1": [10, 15], "euqat": 10, "simple\ud558\uac8c": 10, "control\ud558\uae30\uc704\ud55c": 10, "\ud69f\uc218": [10, 17], "3\uc758": [10, 34], "\u03b7\uac00": 10, "step\uc5d0": [10, 12, 18, 40], "step\uacfc": 10, "time\uc774": 10, "linear\ud55c": 10, "step\uc5d0\uc11c\ub3c4": 10, "\uc5b4\ub290\uc815\ub3c4\uc758": [10, 40], "object\ub97c": 10, "kera": 10, "diffusionmodel": 10, "image_s": 10, "width": [10, 15, 21, 35], "block_depth": 10, "get_network": 10, "denorm": 10, "convert": [10, 36], "pixel": [10, 23, 33, 34, 40, 42], "back": 10, "rang": [10, 23, 34, 36, 37, 42], "mean": [10, 11, 12, 16, 23, 31, 36, 41], "tf": 10, "clip_by_valu": 10, "diffusion_schedul": 10, "diffusion_tim": 10, "angl": 10, "start_angl": 10, "aco": 10, "max_signal_r": 10, "end_angl": 10, "min_signal_r": 10, "diffusion_angl": 10, "signal_r": 10, "co": [10, 11, 23, 41], "noise_r": 10, "sin": [10, 11, 23], "note": 10, "squar": [10, 36, 41], "sum": [10, 12, 20, 23, 43], "alwai": 10, "noisy_imag": 10, "exponenti": [10, 23, 25, 32, 40], "move": [10, 25, 32, 40], "ema_network": 10, "predict": [10, 11, 12, 17, 23, 36, 38, 40, 41, 42], "compon": 10, "calcul": 10, "pred_nois": [10, 11], "pred_imag": 10, "train_step": 10, "have": 10, "deviat": 10, "like": [10, 15], "shape": [10, 11, 21, 23, 27, 29, 36, 37, 39], "batch_siz": [10, 27, 31, 43], "minval": 10, "maxval": 10, "accordingli": 10, "gradienttap": 10, "tape": 10, "separ": [10, 21, 27, 36], "noisi": [10, 14, 42], "noise_loss": 10, "image_loss": 10, "trainable_weight": 10, "apply_gradi": 10, "noise_loss_track": 10, "update_st": 10, "image_loss_track": 10, "name": [10, 20], "reverse_diffus": 10, "initial_nois": 10, "diffusion_step": 10, "num_imag": 10, "step_siz": 10, "line": 10, "pure": [10, 41], "its": 10, "assum": 10, "nonzero": 10, "next_noisy_imag": 10, "ones": 10, "remix": 10, "next": 10, "next_diffusion_tim": 10, "next_noise_r": 10, "next_signal_r": 10, "generated_imag": 10, "probabilist": [11, 20, 28], "neurip": [11, 35, 38], "2020": [11, 12, 18], "2006": [11, 20], "11239": [11, 20], "pytorch": [11, 20, 21, 27, 34, 37, 43], "implement": [11, 20, 26, 31, 36, 37, 40, 43], "review": [11, 20, 29, 44], "pr": [11, 20, 36], "409": [11, 20], "beomsoo": [11, 20, 44], "park": [11, 12, 16, 20, 44], "apr": [11, 20, 27, 32, 37, 43], "19": [11, 20], "velog": [11, 33, 34], "yetsyl0705": 11, "what": 11, "inference\ub85c": [11, 40], "\ud559\uc2b5\uc2dc\ucf1c": [11, 20], "parameter": [11, 32], "markov\uac00": 11, "distribution\uc758": 11, "\ub54c\uae4c\uc9c0": [11, 12, 41], "\ub354\ud574\uac00\ub294": 11, "\uc5ed\uc73c\ub85c": 11, "\uac70\uce58\uba70": [11, 40], "\uad6c\uc131\ub428": 11, "\uc815\uc758\ud558\uae30": 11, "\uc27d\uace0": 11, "\ud559\uc2b5\uc2dc\ud0a4\ub294": [11, 16, 33], "\ud3b8\ub9ac\ud568": 11, "\ud488\uc9c8\uc758": [11, 14, 16, 33, 40], "\uc0dd\uc131\uc774": [11, 13, 17, 22, 26, 30, 34, 35, 38], "\ubcc0\ubd84\ucd94\ub860": [11, 43], "\uc0ac\ud6c4\ud655\ub960": 11, "posterior": [11, 34, 43], "\ubd84\ud3ec": [11, 34], "\ub2e4\ub8e8\uae30": [11, 43], "\uc26c\uc6b4": [11, 43], "\ud655\ub960\ubd84\ud3ec": [11, 40], "\uadfc\uc0ac": 11, "approxim": [11, 37, 40, 43], "\ud45c\ud604\uc2dd\uc5d0": 11, "\ubcf4\ud1b5": [11, 17, 20, 27, 28, 29, 33], "parameter\uc758": [11, 16], "\uc2dd\uc758": [11, 12], "\ucc28\uc218\ubcf4\ub2e4": 11, "\uc218\ub85c": 11, "3\ucc28": 11, "\ud45c\ud604\uc2dd": 11, "\ucc28\uc218\ub85c\uc758": 11, "\ud568\uc218": [11, 14, 15, 23, 32, 33, 34, 35], "\uc0c1\ud0dc\uc5d0\uc11c": [11, 17, 33], "\uc0c1\ud0dc\ub85c": [11, 17, 21, 36, 42], "\ub118\uc5b4\uac08": 11, "\ub2e8\uacc4\uc758": [11, 14, 29, 37], "\uc0c1\ud0dc\uc5d0\ub9cc": 11, "graphic": [11, 38], "_0": [11, 32, 40], "prod_": [11, 12], "quad": [11, 23, 32], "beta_t": [11, 12], "chain\uc73c\ub85c": 11, "data\uc5d0": [11, 12, 15], "\ucd94\uac00\ud560": 11, "beta_1": [11, 23], "\ub354\ud574\uc900\ub2e4": 11, "\uc774\uba74": [11, 24, 38], "mean\uc778": 11, "\uc774\uc804": [11, 12, 14, 15, 16, 20, 27, 37], "\uac16\uc9c0": 11, "\ub178\uc774\uc988\uac00": 11, "\uc99d\uac00\ud568": 11, "\ub2e8\uc21c\ud788": [11, 14, 15, 23, 24, 29, 33], "noise\ub9cc\uc744": 11, "\ub354\ud574\uc8fc\ub294\uac8c": 11, "scaling\ud558\ub294": 11, "variance\uac00": 11, "\ubc1c\uc0b0\ud558\ub294": 11, "\ub9c9\uae30": 11, "\uc704\ud568": [11, 33], "\uc644\uc804": [11, 23], "destroy\ub41c": 11, "\uc0c1\ud0dc": 11, "boldsymbol": 11, "sigma": [11, 12, 23, 27, 32, 35, 40, 41, 43], "\uac00\uc6b0\uc2dc\uc548": [11, 14, 30], "1994\ub144": 11, "process\uac00": [11, 24], "\uac00\uc6b0\uc2dc\uc548\uc774\uba74": 11, "process\ub3c4": 11, "\uac00\uc6b0\uc2dc\uc548\uc73c\ub85c": 11, "\uc4f0\uba74": 11, "\ub41c\ub2e4\ub77c\ub294": 11, "\uc99d\uba85\uc774": 11, "\ud574\uc57c": [11, 12], "sigma_": [11, 35, 36, 41], "hierarach": 11, "vae\uc5d0\uc11c\uc758": 11, "\uacfc\uc815\uacfc": 11, "\ube44\uc2b7\ud568": [11, 29], "\ubaa9\uc801\uc740": 11, "\uc81c\uac70\ud560": 11, "\uac83\uc778\uac00": 11, "\ub4e4\uc5b4\uc654\uc744": [11, 14, 28], "\uc608\uce21\ud560": [11, 22], "\uc608\uce21\uc774": 11, "\uac00\ub2a5\ud574\uc9d0": [11, 29], "leq": [11, 41], "_q": [11, 19], "geq": 11, "likelihood\ub97c": 11, "\ucd5c\uc18c\ud654": [11, 23], "\ubc29\ud5a5\uc73c\ub85c": [11, 12, 24, 26, 37, 41, 42], "\uc218\uc2dd\uc744": [11, 12, 24, 32, 33, 35, 40, 43], "evid": [11, 34], "bound": [11, 23, 43], "\uc6b0\ud56d\uacfc": 11, "\uc815\ub9ac\ud558\uace0": 11, "\ud480\uc5b4\ub0b4\uba74": 11, "elbo\uc758": 11, "\uc5ed\ud560\uc740": 11, "\uad00\ucc30\ud55c": 11, "\ud798\ub4e0": 11, "\uc774\ub8e8\uace0": 11, "\uc870\uae08": 11, "\ubd84\ud3ec\uc778": [11, 40], "\ud45c\ud604\ud558\ub824": 11, "\ucc28\uc774": [11, 24], "diverg": 11, "underbrac": [11, 12], "_1": [11, 14], "\ub098\uc628\ub2e4": [11, 35], "term\uc73c\ub85c": 11, "\ud559\uc2b5\uc2dc\ud0b4": 11, "reconstruct": [11, 23, 25, 29, 36, 41, 43], "\uc9c0\uc6b0\ub294": 11, "\uc9c0\uc6c0": 11, "ddpm\uc5d0\uc11c\ub294": [11, 12, 16, 18], "induct": 11, "bias\ub97c": [11, 27, 29], "\ub298\ub824": [11, 28], "stable\ud558\uace0": 11, "\uc131\ub2a5\ub3c4": [11, 28, 31, 39], "\uac1c\uc120\ud560": [11, 18, 40], "\uc788\uc5c8\uc74c": [11, 20, 29], "\ub9cc\ub098\ubcf4\uc9c0": 11, "\ubabb\ud588\ub358": [11, 36], "\uc815\ud655\ud55c": [11, 13, 14, 23, 29, 31, 32], "\uc608\uce21\uc744": [11, 14, 17], "\ud480\ub824\ub294": 11, "\uace0\uc815": [11, 13, 18, 29], "\ud588\ub354\ub2c8": 11, "\uc798\ub428": 11, "02\ub85c": 11, "linear\ud558\uac8c": 11, "\uac00\uae4c\uc6b8\uc218\ub85d": 11, "\uc801\uac8c": [11, 12, 34], "\uc8fc\ub294": [11, 12, 16, 21, 42], "parameter\uac00": 11, "\ub418\uae30": [11, 20, 23, 33], "beta": [11, 17], "progress": [11, 32, 40], "posterior\ub97c": 11, "\ub354\ud574": 11, "\ub9cc\ub4e4\uc5c8\uc744\ub54c": 11, "\ubcf5\uc6d0": [11, 14], "simplic": 11, "sjina0722": 11, "\ub9ac\ubdf0": [11, 20, 23], "\uc0c1\uc218\ub85c": 11, "\uac00\uc815\ud588\uace0": 11, "\ubc1b\uae30": [11, 26], "\ud559\uc2b5\uc2dc\ud0a4\uc9c0": 11, "\uc54a\uc544\ub3c4": [11, 37, 42], "\ub41c\ub2e4\uace0": 11, "\uc0dd\uac01\ud574": 11, "term\uc744": 11, "\uc81c\uac70": [11, 17, 22, 25], "\uad6c\ud558\uc9c0": [11, 37], "\uad6c\ud574": 11, "\uc815\ud655\ub3c4\ub97c": [11, 28], "\ub192\uc784": 11, "int_": [11, 23], "sigma_1": 11, "arrai": 11, "ll": [11, 20, 36], "infti": 11, "255": 11, "case": [11, 15, 39], "\uc0ac\uc774\ub85c": [11, 23], "linearli": [11, 12, 22, 41], "\ub2e8\uacc4\uc5d0\ub294": 11, "\ucd94\uac00\ud558\uc9c0": 11, "divergence\ub97c": 11, "\uc88c\ud45c": [11, 23], "\uc704\uc640": [11, 12, 20, 21, 31, 32, 33, 35, 41], "\ub098\ud0c0\ub09c\ub2e4": [11, 14], "output\uac04": 11, "\uc904\uc774\ub294": [11, 17, 41], "denoising\uacfc": 11, "\ube44\uc2b7\ud574": 11, "ddpm\uc774\ub77c\ub294": 11, "\uc774\ub984\uc774": [11, 38], "\ubd99\uc74c": 11, "objective\uc744": 11, "\uc5d0\uc11c\ubfd0\ub9cc": 11, "t\uc5d0": [11, 40], "\uac00\ub2a5\ud558\uae30": 11, "\ud6a8\uacfc\uc801": 11, "psuedo": 11, "\ub354\ud574\ub098\uac00\ub294": 11, "\uc5bc\ub9c8\ub9cc\ud07c": 11, "\ub354\ud574\uc84c\ub294\uc9c0\ub97c": 11, "step\uc758": [11, 12, 16, 40], "\ucd94\uac00\ub418\uc5c8\ub294\uc9c0\ub97c": 11, "\ud559\uc2b5\ub41c\ub2e4": [11, 29], "\ucf54\ub4dc\uc5d0\uc11c\ub294": [11, 20], "\ub178\uc774\uc988\uc640": [11, 14], "t\ub85c": [11, 12, 16], "\uc5bb\uace0": 11, "p_loss": 11, "x_start": 11, "default": [11, 20, 23], "torch": [11, 20, 31, 36, 42, 43], "randn_lik": [11, 36], "q_sampl": 11, "do": [11, 27, 29, 42], "slow": 11, "25": [11, 20, 22, 25, 28, 31, 37], "seem": 11, "significantli": [11, 38], "x_self_cond": 11, "self_condit": 11, "no_grad": 11, "model_predict": 11, "pred_x_start": 11, "detach_": 11, "take": 11, "model_out": 11, "pred_x0": 11, "pred_v": 11, "predict_v": 11, "rais": [11, 31, 36], "valueerror": [11, 36], "unknown": [11, 36], "loss_fn": 11, "reduct": [11, 31, 36], "reduc": [11, 36], "loss_weight": 11, "\ub098\uba74": [11, 17], "noise\uc5d0\uc11c": 11, "\uc21c\ucc28\uc801\uc73c\ub85c": [11, 34, 42], "p_sampl": 11, "int": [11, 31, 37, 40, 42, 43], "devic": [11, 23, 31, 36], "batched_tim": 11, "model_mean": 11, "model_log_vari": 11, "p_mean_vari": 11, "clip_denois": 11, "pred_img": 11, "backbon": [11, 25, 30], "\ub2e8\uacc4\ub294": 11, "resnet": [11, 28, 31, 35, 42], "convnext": 11, "\ube14\ub85d": 11, "groupnorm": [11, 35], "upsampling\uc73c\ub85c": 11, "block_klass": 11, "resnetblock": 11, "group": 11, "resnet_block_group": 11, "modulelist": [11, 42], "dim_in": 11, "time_emb_dim": 11, "time_dim": 11, "prenorm": 11, "linearattent": 11, "dim_out": 11, "is_last": 11, "conv2d": [11, 20, 42], "init_dim": 11, "out_dim": 11, "dim_mult": 11, "learned_vari": 11, "learned_sinusoidal_cond": 11, "random_fourier_featur": 11, "learned_sinusoidal_dim": 11, "determin": 11, "dimens": [11, 20, 21, 42], "input_channel": 11, "init_conv": 11, "in_out": 11, "list": [11, 31, 42], "random_or_learned_sinusoidal_cond": 11, "sinu_pos_emb": 11, "randomorlearnedsinusoidalposemb": 11, "fourier_dim": 11, "sinusoidalposemb": 11, "time_mlp": 11, "gelu": 11, "num_resolut": 11, "len": [11, 31, 37, 42], "ind": 11, "enumer": [11, 36, 37, 42], "mid_dim": 11, "mid_block1": 11, "mid_attn": 11, "mid_block2": 11, "default_out_dim": 11, "final_res_block": 11, "final_conv": 11, "zeros_lik": 11, "clone": [11, 42], "block1": [11, 42], "block2": [11, 42], "attn": [11, 15, 26], "pop": 11, "resolution\uc5d0": [11, 28], "conv\uc5d0\uc11c": 11, "\ucc28\uc6d0\uc744": [11, 22, 30], "3\ubc30\ub85c": 11, "\ub298\ub9ac\uace0": 11, "v\ub85c": 11, "\ubd84\ud574": [11, 17], "dim_head": [11, 21], "hidden_dim": 11, "to_qkv": 11, "to_out": 11, "qkv": 11, "chunk": [11, 36, 42], "rearrang": [11, 21, 30], "einsum": 11, "softmax": [11, 19, 34], "layernorm": 11, "block\uc5d0": [11, 15, 16, 35], "sinusoid": [11, 30], "embedding\uc774": [11, 22, 29], "\ucd94\uac00\ub3fc\uc11c": 11, "\uad6c\ubd84\ub428": 11, "half_dim": 11, "math": 11, "10000": 11, "arang": 11, "score": [11, 15, 16, 21, 22, 32, 33, 34, 37, 38, 40, 41, 42], "is\ub85c": 11, "model\uc778\ub370\ub3c4": 11, "model\ubcf4\ub2e4": [11, 16, 24], "\uc6b0\uc6d4": 11, "codelength\uc5d0\uc11c": 11, "\ucc28\uc774\uac00": [11, 12, 18, 21, 28, 29, 40], "\uc5c6\uae30": [11, 22, 40], "overfitting\uc758": 11, "\uac00\ub2a5\uc131\ub3c4": 11, "\uc801\uc74c": 11, "incept": [11, 21, 28, 34, 41], "v3\uc73c\ub85c": 11, "\uacc4\uc0b0\ud55c": [11, 37], "\ud559\uc2b5\ub418\uba74": [11, 29], "\uacc4\uc0b0\ud558\ub294": [11, 23, 37, 43], "\uc131\uc801\uc774": 11, "\uc88b\uace0": [11, 40], "variance\ub97c": [11, 18], "\uc0ac\uc6a9\ud588\uc744": [11, 28, 29, 32, 35], "\ub54c\uc5d0\ub3c4": [11, 12], "\uac10\uc18c\ud558\uc9c0": 11, "2210": 12, "10960": 12, "sehwan": [12, 16, 44], "domain\uc5d0\uc11c": 12, "control\ud558\ub294": 12, "\ubd80\uc871\ud558\ub2e4": [12, 14, 30], "model\uc18d\uc5d0\uc11c": 12, "space\ub97c": [12, 25, 29], "\ubc1c\uacac\ud558\uae30": 12, "\uc81c\uc548\ud558\uace0": [12, 32], "space\ub77c\uace0": 12, "\uba85\uce6d\ud55c": 12, "space\uc758": [12, 29, 40], "\ud2b9\uc131": 12, "homogen": 12, "across": 12, "\ub4e4\uc744": [12, 31, 38, 43], "strength\uc640": 12, "deficiency\ub97c": 12, "\uae30\uc900\uc73c\ub85c": [12, 20, 28, 31, 32, 41], "\uc0bc\uace0": 12, "translation\uc744": 12, "design\uc744": 12, "approach": [12, 21, 43, 44], "guidance\ub294": [12, 14, 35], "unconditional\ud55c": [12, 14, 16], "variable\uc5d0": 12, "variable\uc744": 12, "\ud569\uce58\ub294": 12, "\uc774\uc6a9\ud558\uba74\uc11c": 12, "\uba85\ud655\ud558\uac8c": [12, 37], "control\ud558\uae30\uac00": 12, "\uc27d\uc9c0": 12, "\uc54a\ub2e4": [12, 14, 15, 24, 30, 40], "\ucd94\uac00\ud558\uc5ec": [12, 16], "\uac70\uce58\ub294": [12, 32], "variable\uc774": 12, "class\uc778\uc9c0": 12, "\ubd84\ub958\ud558\uace0": 12, "\ubd80\uc5ec\ud558\ub294": 12, "\uc791\ub3d9\ud55c\ub2e4": [12, 21], "variable\ub4e4\uc5d0": 12, "classify\ub97c": 12, "\uc2e4\ud589\ud574\uc57c": 12, "\ud558\uae30\uc5d0": 12, "\uc0ac\uc6a9\ud558\uae30\uac00": 12, "\ud798\ub4e4\uc5b4": 12, "\uc2dc\ucf1c\uc57c": 12, "\uc2dc\uac04\uc801\uc73c\ub85c": [12, 14, 30], "\ube44\uc6a9\uc801\uc73c\ub85c": 12, "\ubd80\ub2f4\uc774": 12, "diffusionclip": 12, "space\ub294": 12, "origin": [12, 23, 24, 25, 41], "edit\ud558\uae30": 12, "frozen": [12, 15, 28, 38], "model\uc5d0\uc11c": [12, 19, 40], "\ubc1c\uacac\ud558\uc600\uace0": 12, "\uce6d\ud55c\ub2e4": 12, "space\uc5d0\ub294": 12, "\ud2b9\uc131\ub4e4\uc774": 12, "\uc874\uc7ac\ud55c\ub2e4": 12, "editing\uacfc": 12, "boosting\uc744": 12, "design\ud558\uc5ec": 12, "space\ub85c\uc368\uc758": 12, "\ubc1c\uacac\uc0ac\ub840\uc774\ub2e4": 12, "\uaef4\uc788\ub294": [12, 16], "\uc5bc\ub9cc\ud07c\uc778\uc9c0": [12, 16], "\uc608\uce21\ud55c\ub2e4": [12, 16, 35], "\uc774\uc6a9\ud558\uc5ec": [12, 16, 21, 28, 34], "\uc81c\uac70\ub41c": [12, 16], "\uad6c\ud560": [12, 16, 41, 43], "constant\ud55c": [12, 16], "\uace0\uc815\uc2dc\ud0a8\ub2e4": [12, 16], "ddpm\uc5d0\uc11c\uc758": [12, 16], "sigma_t": [12, 36, 40, 41], "alpha_": [12, 16, 36], "alpha_t": [12, 16, 40, 41], "bigg": [12, 40], "ddim\uc5d0\uc11c\ub294": 12, "\uad00\uc810\uc758": 12, "\uc81c\uc2dc\ud558\uc600\uace0": 12, "general\ud558\uac8c": 12, "\uc801\uc6a9\ub418\ub294": [12, 32], "process\uc5d0": [12, 29], "eta": [12, 17], "1\uc778": 12, "ddpm\uc774": [12, 18], "\ub418\uace0": [12, 14, 15, 20, 21, 26, 32, 33, 36, 38, 41, 43], "stochastic\ud574\uc9c0\uba70": 12, "0\uc778": 12, "ddim\uc774": 12, "deterministic\ud574\uc9c4\ub2e4": 12, "cfrac": 12, "2i": [12, 32, 40, 41], "textrm": 12, "point": [12, 23, 30, 32], "encoder\uc640": [12, 22], "text\uac04\uc758": [12, 16], "embedding\uc744": [12, 21, 25, 29, 35], "\ud3b8\uc9d1\ub41c": 12, "\ucd5c\uc18c\ud654\ud558\ub294": [12, 29, 37, 41, 42], "collapse\uc5c6\uc774": 12, "\uade0\uc77c\ud55c": [12, 23], "editing\uc744": 12, "\ud588\ub2e4\uace0": [12, 16, 28, 35, 41], "_i": [12, 14, 23], "editiing\uc744": 12, "naiv": 12, "approach\ub97c": 12, "\ud1b5\ud574\uc11c\ub294": 12, "editing\uc774": [12, 15, 16], "\uc774\ub8e8\uc5b4\uc9c0\uc9c0": 12, "chapter\uc5d0\uc11c\ub294": 12, "\uc54a\ub294\uc9c0\uc5d0": 12, "\uc124\uba85\uc744": [12, 28, 29], "\ud574\uacb0\ud558\ub294": [12, 40], "controllable\ud55c": 12, "process\uc778": 12, "ddim\uc5d0\uc11c": [12, 35, 38], "\uc124\uba85\ud558\uc600\ub294\ub370": 12, "chapter\ubd80\ud130\ub294": 12, "\uc124\uc815\ud558\uace0": [12, 22, 28, 33, 36], "\uc124\uc815\ud558\uc600\ub2e4": 12, "variable\ub85c": 12, "\uc5ed\ud560\uc744": [12, 17, 18, 42], "\ub2f4\ub2f9\ud558\uace0": 12, "\ub3cc\uc544\uac00\uae30\uc5d0": 12, "\ub2f4\ub2f9\ud55c\ub2e4": 12, "prompts\uc5d0": [12, 16], "manipulate\uc2dc\ud0a4\ub294": 12, "3\uc5d0\uc11c": 12, "\uc18c\uac1c\ud55c": [12, 25, 32, 41], "optimize\ud558\ub3c4\ub85d": 12, "update\ud558\ub294": 12, "images\ub97c": 12, "\uc0dd\uc131\ud558\uac70\ub098": [12, 21], "manipulation\uc744": 12, "\ud55c\ub2e4\uace0": [12, 29], "\ub300\uc548\uc73c\ub85c": [12, 23], "manipulate\ud558\ub3c4\ub85d": 12, "shift\ud574\uc8fc\ub294": 12, "\uc81c\uc2dc\ub418\uc5c8\ub2e4": 12, "\uc644\uc804\ud788": [12, 24, 33, 41], "manipulate\ud558\uc9c0": 12, "\ub458\ub2e4": [12, 34], "shifted\ub41c": 12, "\uc0ac\uc6a9\ud558\uae30\uc5d0": 12, "cancel": 12, "out\ub418\uc5b4": 12, "variable\uc5d0\uc11c\ub294": 12, "\uae30\uc874\uacfc": [12, 40], "\ub2e4\ub984\uc774": 12, "\uc5c6\ub2e4\ub294": [12, 16], "\uc99d\uba85\uc740": 12, "proof": [12, 16], "theroem\uc744": 12, "theroem": 12, "defin": [12, 20], "beta_": 12, "ddim\uc5d0\uc11c\uc758": 12, "\uc2dd\uc774\uace0": 12, "\ud56d\ub9cc": 12, "\ub530\ub85c": [12, 22, 29, 33, 37, 40], "\ubb36\uc5b4\uc11c": 12, "\ud45c\ud604\ud558\uba74": [12, 36, 43], "root\ub97c": 12, "\ub0b4\ubd80\ub97c": 12, "\uacc4\uc0b0\ud558\uba74": [12, 34], "\uc815\ub9ac\ud558\uba74": [12, 33], "therefor": 12, "epsilon\uc744": [12, 16], "\uacb0\uacfc\uc774\ub2e4": [12, 16], "\ubd84\uc790\ub97c": 12, "\uc791\uae30\uc5d0": 12, "\uc218\ub834\ud558\uae30\uc5d0": 12, "\uc5c6\uc74c\uc744": [12, 18], "\ud6a8\uacfc\ub294": 12, "\uc88b\uc9c0": [12, 18, 23, 25, 26, 28, 32, 41, 42], "\uc54a\uc74c\uc744": 12, "No": 12, "chapter": 12, "1\uc5d0\uc11c": [12, 21, 23, 25], "asyrp\ub97c": 12, "\ube44\ub300\uce6d\uc801\uc778": 12, "\uc0ac\uc6a9\ud55c\ub2e4\ub294": [12, 28], "\uac83\uc778\ub370": 12, "\ub3cc\uc544\uac00\ub294": [12, 33], "\uc900\ub2e4\ub294": 12, "\ub9ccmodify\ud558\uace0": 12, "\uc720\uc9c0\ud55c\ub2e4": [12, 14], "loss\uc2dd": 12, "\uc7ac\uad6c\uc131\ud558\uc600\ub2e4": 12, "modify\ub97c": 12, "\ud558\uc9c0": [12, 14, 28, 29, 31, 41], "modifiy\ub97c": 12, "loss\uc2dd\uc740": 12, "lambda_": [12, 41], "ref": 12, "recon": 12, "\uc124\uacc4\uac00": 12, "\ub418\uc5c8\ub2e4": [12, 21, 29], "\uc774\uc81c": [12, 28, 41], "epsilon\uc778": 12, "\uac83\uc778\uc9c0\uc5d0": 12, "\ud544\uc694\ud558\ub2e4": [12, 14, 31], "\uac83\ubcf4\ub2e4": [12, 14, 20, 21, 31, 38, 42], "result\ub97c": [12, 16], "nice": 12, "properties\ub97c": 12, "models\uc758": 12, "backbone\uc778": 12, "net\uc5d0\uc11c": [12, 38], "\ub3c4\ucd9c\ub41c\ub2e4": 12, "net\uc758": [12, 13, 14, 21], "bottleneck": [12, 20, 34, 42], "\uae4a\uc740": [12, 23, 33], "map\uc778": 12, "h_t": 12, "\uc815\ud558\uc600\ub2e4": 12, "\ubd80\ub978\ub2e4": 12, "space\ubcf4\ub2e4": 12, "resolutions\uc744": 12, "semantic\ub97c": 12, "\uac00\uc9c4\ub2e4": [12, 35, 40], "space\uc5d0\uc11c\ub294": 12, "\ubc1c\uacac\ud560": 12, "nice\ud55c": 12, "\ud2b9\uc131\ub4e4\uc744": 12, "\ud06c\uae30\ub294": [12, 20, 25, 40, 42], "times512": 12, "times3": [12, 15], "control\uc774": [12, 27], "\uc9c0\ubc30\uc801\uc774\uace0": 12, "robust\ud568\uc744": 12, "\ucd94\uce21\ud560": 12, "skip": [12, 21, 23, 32, 36, 38], "connection\uc758": 12, "\ubc1b\uc9c0": 12, "\uc54a\uc73c\uba70": [12, 40], "\uc555\ucd95\ub41c": 12, "\uacf5\uac04\uc774\uba70": 12, "control\ud558\ub294\ub370\uc5d0": 12, "\uc9c0\uc815\ud558\uae30": 12, "\uc124\uc815\ud574\ub450\uace0": 12, "\ud574\ubcf4\uc558\ub294\ub370": 12, "8th": 12, "layer\uc774\uc804\uc758": 12, "\uc9c0\uc815\ud55c": [12, 24, 38], "manipulaton\uc774": 12, "\uc774\ub8e8\uc5b4\uc84c\uace0": 12, "\uc774\ud6c4\uc758": [12, 18], "\uacfc\ud55c": 12, "manipulation\uc774": 12, "\uc774\ub8e8\uc5b4\uc9c0\uac70\ub098": 12, "\uc544\uc608": [12, 38], "\uc0dd\uc131\ub418\uc5c8\ub2e4": 12, "space\ub9cc\uc758": 12, "\ud2b9\uc131\uc740": 12, "chapter5\uc5d0\uc11c": 12, "\uc124\uba85\ud55c\ub2e4": 12, "manipulating\ud558\ub294\ub370": 12, "\uc131\uacf5\ud588\uc74c\uc5d0\ub3c4": 12, "\uc218\ub9ce\uc740": [12, 32], "timestep\uc5d0\uc11c": 12, "optimizing\ud558\uae30\ub780": 12, "\ub300\uc2e0\uc5d0": [12, 14, 23, 41], "\uc785\ub825\ubc1b\uc544": [12, 41], "\ucd9c\ub825\ud574\uc8fc\ub294": 12, "\ucd94\uac00\ud558\uc600\ub2e4": 12, "optimizing\ud574\uc918\uc57c": 12, "\ubc29\ubc95\uc5d0": [12, 16, 30], "\uc2dc\uac04\ub3c4": 12, "setting\uac12\ub4e4\uc5d0": 12, "robust\ud558\ub2e4": 12, "timestep\uacfc": 12, "feature\uc778": [12, 14], "\ucd9c\ub825\ud558\ub294": [12, 23, 37], "\ud559\uc2b5\ud558\uae30\uc5d0": 12, "unseen": 12, "\uc77c\ubc18\ud654\ud560": 12, "accelerated\ud55c": 12, "\uacfc\uc815\uc5d0\uc11c\ub3c4": [12, 20], "\ubcf8\ub2e4": 12, "scheme\uc774": 12, "\uc5b4\ub5bb\ub4e0": 12, "\uac04\uc5d0": [12, 14], "\ubcf4\uc874\ub41c\ub2e4\uba74": 12, "\uc124\uacc4\ud574\ub3c4": 12, "manipulation\ud6a8\uacfc\ub97c": 12, "control\ud574\uc11c": 12, "\uc774\uc6a9\ud558\ub294": 12, "\uc2dd\uc740": [12, 18], "space\uc640": 12, "\ube44\uad50\ud558\uc600\ub2e4": [12, 14, 40], "intuit": [12, 27], "choos": 12, "interv": [12, 32], "percept": 12, "priorit": 12, "choi": 12, "earli": [12, 42], "stage\uc5d0\uc11c\ub294": 12, "context\ub97c": [12, 16, 29], "generate\ud558\uace0": 12, "later": 12, "impercept": 12, "details\ub97c": 12, "generate\ud55c\ub2e4\uace0": 12, "stage\uc5d0\uc11c": 12, "\uc9c4\ud589\ud558\ub294": [12, 32], "\uad6c\uac04\uc744": 12, "\uc81c\uc2dc\ud55c\ub2e4": [12, 16], "process\uc5d0\uc11c\ub294": 12, "context\uac00": 12, "generate\ub418\uc5b4\uc57c": 12, "interval\uc744": 12, "\uacb0\uc815\ud558\uae30": 12, "\uce21\uc815\uc9c0\ud45c\ub97c": 12, "t\uc2dc\uc810\uc5d0\uc11c": 12, "target\uc774": 12, "image\uac04\uc758": 12, "lpips\ub97c": 12, "\ub0a8\uc740": [12, 16, 31], "process\uc744": 12, "\uad6c\uc131\uc694\uc18c\ub97c": [12, 23], "\uc9c0\ud45c\ub77c\uace0": [12, 28], "t\uc758": 12, "lpips\ub85c": 12, "\uc2dc\uc810\uc5d0\uc11c\uc758": 12, "\ucc28\uc774\ub294": [12, 24, 38], "\uc5bc\ub9cc\ud07c\uc758": 12, "change\ub97c": 12, "\uc8fc\uc5c8\ub294\uc9c0\ub97c": 12, "strength": [12, 13], "\uc815\uc758\ud55c\ub2e4": [12, 14, 24, 30], "xi_t": 12, "interval\uc774": 12, "\uc791\uc73c\uba74": [12, 43], "\uc791\uc544\uc9c0\uba70": 12, "\uc77c\uc5b4\ub098\uc9c0": 12, "\ud06c\uba74": [12, 14], "\ucee4\uc9c0\uace0": 12, "\uc77c\uc5b4\ub09c\ub2e4": 12, "\ucda9\ubd84\ud55c": [12, 28], "\ud55c\uc5d0\uc11c": 12, "\ucd5c\uc18c\uc758": 12, "\uacb0\uc815\ud558\ub294": 12, "\ucd5c\uace0\uc758": [12, 31, 35], "\ubc29\ubc95\uc774\ub2e4": [12, 35], "\uc2e4\ud5d8\uc801\uc778": 12, "33\uc778": 12, "t\uc2dc\uc810\uc744": 12, "\uacb0\uc815\ud558\uc600\ub2e4": 12, "variou": [12, 27, 35, 41, 42, 44], "proper": 12, "\ud2b9\uc131\ub4e4\uc740": 12, "\ud2b9\uc131\ub4e4\uc5d0": 12, "\ud544\uc694\ub85c": [12, 29], "\uacbd\uc6b0\ub3c4": [12, 28, 33], "smile\ud55c": 12, "attribute\ub97c": 12, "\uacbd\uc6b0\ubcf4\ub2e4": 12, "pixar": [12, 17], "style\uc758": 12, "attribute\uc744": 12, "\uae38\uac8c": 12, "\uc124\uc815\ud574\uc57c": 12, "33": 12, "t\ub97c": 12, "\uc124\uc815\ud55c\ub2e4": [12, 16], "33d": 12, "y_": [12, 20, 35], "\uc758\ubbf8\ud558\uba70": 12, "\uc694\uad6c\ud558\ub294": 12, "attributes\uc5d0": 12, "\uc791\uc74c": 12, "\uae40": 12, "flexibl": [12, 42], "amount": 12, "chang": [12, 35], "\uc124\uc815\ud558\uba70": 12, "stochasticity\ub97c": 12, "\uc81c\uac70\ud558\uc5ec": [12, 40], "\uc644\ubcbd\ud55c": 12, "inversion\uc744": [12, 17], "\uac00\ub2a5\ucf00": 12, "\ud558\uc600\ub2e4": [12, 14, 21, 28], "elucid": 12, "diffusionbas": 12, "karra": [12, 32], "stochasticity\uac00": 12, "\uc99d\uac00\uc2dc\ud0a8\ub2e4\uace0": 12, "\uc99d\uba85\ud558\uc600\ub2e4": [12, 14], "interval\uc740": 12, "interval\uc5d0": 12, "control\ud560": 12, "\uae38\uac8c\ub418\uba74": 12, "quality\ub294": [12, 29], "\uc99d\uac00\ud558\uc9c0\ub9cc": 12, "interval\ub3d9\uc548": 12, "\uacc4\uc18d\ud574\uc11c": 12, "\uc8fc\uc785\ud574\uc57c": 12, "content\uac00": [12, 23], "\ub2ec\uc131\ud558\uba74\uc11c\ub3c4": 12, "content\uc5d0": [12, 26], "\ucd5c\uc18c\ud55c\uc758": [12, 14, 33], "\ubcc0\ud654\ub9cc\uc744": 12, "\uc124\uc815\ud558\ub294": [12, 41, 43], "\uc911\uc694\ud558\ub2e4": [12, 14], "\ud574\uacb0\ud574\uc57c": 12, "\ubd80\ubd84\uc73c\ub85c": [12, 43], "\ubcf4\uc558\uc73c\uba70": 12, "image\ub85c": [12, 16], "\uaef4\uc788\ub294\uc9c0\uc5d0": 12, "\uc9c0\ud45c\ub85c": [12, 24, 28], "defici": 12, "gamma_t": 12, "\uc5ec\uae30\uc11c\ub294": [12, 28, 29], "strength\uc640\ub294": 12, "\ud310\ub2e8\ud558\ub294\ub370\uc5d0": 12, "semantics\ubcf4\ub2e4\ub294": 12, "actual": [12, 20], "\uace0\ub824\ud588\uae30\uc5d0": 12, "\uc124\uc815\ud558\uc600\ub2e4\uace0": 12, "2\uc778": 12, "gamma_": 12, "presenc": 12, "model\uc5d0\uc11c\uc758": 12, "where": [12, 23, 35, 41, 42], "\ub418\uba70": [12, 21, 30, 36, 39], "\ub354\ud558\ub294": 12, "\uc0ac\ub77c\uc838": 12, "\ud2b9\uc131\uc774": 12, "assymetr": 12, "ddim\uc744": [12, 40], "control\ub41c": 12, "f_t": 12, "\ucc98\uc74c\ubd80\ud130": [12, 14, 21], "\uc2dc\uc810\uae4c\uc9c0\ub294": 12, "\uc9c4\ud589\ud558\ub2e4\uac00": 12, "\uc2dc\uc810\ubd80\ud130": 12, "\ub05d\ub0a0": 12, "celeba": [12, 17], "2018": 12, "lsun": [12, 18, 32, 40, 41], "bedroom": [12, 32, 41], "church": [12, 41], "yu": 12, "2015": 12, "\ub370\uc774\ud130\uc14b\uc5d0\uc11c": [12, 17, 29, 31, 38, 41], "2020b": 12, "meng": [12, 32, 40], "afhq": 12, "dog": [12, 36], "iddpm": 12, "nichol": [12, 41], "dhariw": [12, 41], "metfac": 12, "adm": [12, 16, 32, 35], "p2": 12, "\ud559\uc2b5\uc2dc\ucf30\ub2e4\uace0": [12, 16], "model\ub4e4\uc740": [12, 20, 40], "checkpoint\ub97c": [12, 20, 26], "\ud65c\uc6a9\ud588\uc73c\uba70": 12, "frozen\uc0c1\ud0dc\ub97c": 12, "\uc720\uc9c0\uc2dc\ucf30\ub2e4\uace0": 12, "attribute\ub4e4\uc758": 12, "\ubc18\uc601\ud574\uc11c": 12, "manipulate\ud588\ub2e4\ub294": 12, "\uc2ec\uc9c0\uc5b4": 12, "depart": 12, "factori": 12, "templ": 12, "attribute\uc740": 12, "\ud3ec\ud568\uc774": 12, "\ub418\uc5b4\uc788\uc9c0": 12, "\uc54a\uc558\uc74c\uc5d0\ub3c4": [12, 31], "tuning\ud558\uc9c0": 12, "inference\ud558\ub294": 12, "control\ud558\uace0": 12, "\ub0c8\ub2e4\ub294": 12, "\uc810\uc774": [12, 27, 28], "\uc7a5\uc810\uc774\ub2e4": 12, "model\ub4e4\uacfc": 12, "\uc9c4\ud589\ud558\uc600\ub294\ub370": [12, 19], "tuning\ud558\uc5ec": [12, 28], "image\uc744": 12, "editing\ud558\ub294": 12, "diffsionclip": 12, "asyrp\uc758": 12, "\uc88b\uc74c\uc744": 12, "seen": 12, "smile": 12, "\ucd94\uac00\ud558\uae30": 12, "\ucd5c\uc801\ud654\ub41c": [12, 37], "\uc801\uc6a9\uc2dc\ucf30\uc744": 12, "\ub098\ud0c0\ub0b4\uc5c8\ub294\ub370": 12, "\uc801\uc6a9\ud55c\uacbd\uc6b0": 12, "face\ub85c": 12, "\ubc14\ub00c\ub294": [12, 27, 32], "distortion\uc774": 12, "\ubc1c\uc0dd\ud568\uc744": 12, "delta_h": 12, "scaling\uc744": [12, 38], "\ud558\ub294\ub370\uc5d0": 12, "change\uc758": 12, "\uc591\uc5d0": 12, "\ubc18\uc601\ub41c\ub2e4": 12, "3\ubc30": [12, 25], "\ud568\uc5d0": 12, "\ubc18\uc601\ub418\ub294": [12, 33], "attribute\ub610\ud55c": 12, "\ubcc0\ud654\ud55c\ub2e4\ub294": 12, "\ud45c\ud604\ub418\uc5b4": 12, "scaling\uc5d0": 12, "\ub41c\ub2e4\ub294": 12, "\ud569\uccd0\uc11c": [12, 28], "\ubd80\uc5ec\ub97c": 12, "\uacbd\uc6b0\uc5d0\ub3c4": [12, 33], "attribute\ub4e4\uc774": 12, "\ubc18\uc601\uc774": [12, 36], "\uc8fc\uc785\ud588\uc744": 12, "\ube44\uad50\ud55c": [12, 16, 17, 39, 41], "\ucd94\uac00\ub418\uc5c8\uc5b4\ub3c4": 12, "\uc5c6\uc73c\uba70": 12, "\ucd94\uac00\ub418\uc5c8\uc744": 12, "distortion\uc740": 12, "\uc5c6\uace0": [12, 16], "change\ub9cc": 12, "\ubc1c\uc0dd\ud55c\ub2e4": [12, 14, 25], "\uc2ec\ud558\uac8c": 12, "robustness\ud55c\uc9c0": 12, "homogeneous\ud55c": 12, "\uc131\uc9c8\uc744": [12, 32], "attribute\uc5d0": 12, "\ub40c\uc744": 12, "\ud655\uc778\ud558\uc600\ub2e4": 12, "\ub4e4\uc5d0": 12, "\ud3c9\uade0\uc778": 12, "result\uac00": 12, "\ube44\uc2b7\ud568\uc744": 12, "chapter4\uc5d0\uc11c": 12, "\ube44\ucd94\uc5b4": 12, "\ubcf4\uc558\uc744": [12, 27, 33], "process\uc5d0\uc11c\ub9cc": 12, "\uc801\uc6a9\uc744": 12, "\uc2dc\ud0a8\ub2e4": 12, "global": [12, 15], "\uce6d\ud558\uba70": 12, "\ud06c\uae30": [12, 22, 25, 40], "\uc801\uc6a9\ub41c\ub2e4\uace0": 12, "\uac00\uc815\ud588\uc744": 12, "t_e": 12, "sum_t": 12, "\uc591\ub9cc": 12, "\uac19\ub2e4\uba74": 12, "\ube44\ub85d": 12, "\uc0ac\uc6a9\ud558\uc600\uc9c0\ub9cc": 12, "\uc5f0\uad6c\ub97c": [12, 17, 21], "\ud574": [12, 15, 30], "\uc5ec\uc9c0\uac00": [12, 40], "\ud310\ub2e8\ud55c\ub2e4": 12, "models\uc5d0\uc11c": 12, "space\uc778": 12, "\ubc1c\uacac\ud588\uace0": 12, "\uc131\uacf5\uc801\uc778": 12, "semantic\ud55c": 12, "\uc81c\uc548\uc744": 12, "\ub17c\ubb38\uc774\ub2e4": 12, "\ub300\ud45c\uc801\uc778": [12, 37], "\ud2b9\uc131\uc73c\ub85c\ub294": 12, "timesteps\uc774": 12, "framework": 13, "custom": [13, 14], "framework\uc778": 13, "identity\uc640": [13, 14, 26], "postur": 13, "sequence\uac00": 13, "ident": [13, 14, 21, 27, 36], "moving\uc774\ub098": 13, "\ubaa8\ub4c8": [13, 14, 21], "controlling\uc744": 13, "preserving\uc744": 13, "t2v\uc758": 13, "\uc9c4\uc804\uc5d0\ub3c4": 13, "\uc778\uac04": [13, 16], "\uc911\uc2ec": 13, "\uacaa\ub294": [13, 14], "open": [13, 15, 39], "\ubd80\uc871": 13, "\ubb18\uc0ac\uc758": 13, "\uc5b4\ub824\uc6c0\uc73c\ub85c": 13, "\uacaa\ub294\ub2e4": 13, "\uc81c\uc5b4\ub97c": [13, 29], "lora": [13, 17], "\uae30\uc220\ub4e4\uc740": [13, 17], "\uc81c\uc5b4\uac00": 13, "\ubd80\ub2f4": 13, "\ubc29\ubc95\ub860\uc778": 13, "network\ub85c": 13, "animatediff\uc5d0\uc11c": 13, "\uc601\uac10\uc744": [13, 21, 29], "block\uc744": [13, 16, 35], "1000\uc758": 13, "\uc601\uc0c1\uc73c\ub85c": [13, 40], "\ud6c8\ub828\uc740": 13, "\ubcc0\uc774\ub098": 13, "\ud2b9\ubcc4\ud55c": [13, 21], "\uc5f0\uc18d\uc801": [13, 23], "frame\uc774": 13, "\ud544\uc694\ud558\uae30": 13, "video\ub85c": 13, "split\ud558\uc5ec": 13, "6000\uac1c\uc758": 13, "\uc9e7\uc740": [13, 28], "\ud68d\ub4dd\ud55c\ub2e4": 13, "description\uc744": [13, 29], "minigpt": 13, "v2": [13, 39], "captioner\ub85c": 13, "describ": 13, "manner": 13, "\uba85\ub839\uc73c\ub85c": 13, "\ud68d\ub4dd": [13, 31], "subject\uc640": 13, "background": 13, "\ub0b4\uc6a9\uc5d0": 13, "\uc815\ud655\ud788": [13, 16, 33], "\ubb18\uc0ac": 13, "consistency\uc640": 13, "\ud5a5\uc0c1\uc744": [13, 15, 22, 33, 35], "net\uacfc": [13, 21], "controlnet\ub97c": 13, "block\uc73c\ub85c": 13, "block\uc740": 13, "animatediff\ub85c": 13, "\ud655\uc7a5": [13, 21, 34], "length\ub294": 13, "64\ub85c": 13, "mm_sd_v15": 13, "ckpt": 13, "\uac1c\uc778": 13, "\uc778\ubb3c\uc758": [13, 14], "appearance\uc640": 13, "\ubc30\uacbd\uc744": 13, "video\uc758": [13, 21], "\uace0\uc548\ub428": 13, "prompt\uc774\uc9c0\ub9cc": 13, "\ubb18\uc0ac\uac00": 13, "adapter\uc5d0": 13, "prompt\ub97c": [13, 16, 26, 29, 40], "\uc678\uad00\uc5d0": 13, "\ubc30\uacbd\uc5d0": 13, "\uc5bc\uad74": [13, 17], "feature\ub294": [13, 27], "embedding\uc5d0": 13, "concat\ub41c": 13, "\ubcf4\ub0c4": 13, "attentino": 13, "cloth": 13, "c_t": 13, "c_f": 13, "c_c": 13, "prime": [13, 23], "openclip": [13, 15, 25, 31], "h14": 13, "arcface\ub97c": 13, "\uc0c1\uad00": 13, "laion": [13, 19, 21, 26, 31, 40, 42], "2b\uc5d0\uc11c": 13, "\uc218\uc9d1": [13, 29, 39], "512x512": [13, 14, 22, 25, 31, 40, 42], "v100": [13, 23, 42], "100k": 13, "1\uc7a5": [13, 31], "adamw": 13, "decai": [13, 23, 32], "webvid": [13, 21, 30], "10m": [13, 21, 30], "valid": [13, 20, 28, 31, 37], "module\uc758": [13, 20], "16\uc5d0\uc11c": [13, 25], "\ud655\uc7a5\ud558\uae30": [13, 21], "18\ucd08": [13, 31], "13000": 13, "module\ub9cc": 13, "\ud6c8\ub828\ud558\uace0": 13, "controlnet\uc774\ub098": 13, "10k": [13, 21, 41], "\uc885\ub8cc": 13, "block\uacfc": 13, "unfreez": 13, "\uc218\uc9d1\ud55c": 13, "6k": 13, "dwpose\ub098": 13, "zoedepth\ub97c": 13, "depth\ub97c": 13, "352x352": 13, "25k": [13, 41], "express": 13, "\ub0ab\uac8c\ud558\uae30": 13, "\uad6c\uc870\uc5d0\uc11c": [13, 28], "weight\ub9cc": [13, 20], "5e": [13, 14], "20k": 13, "depth": [13, 23, 29, 33, 35, 42], "depth\uc5d0\uc11c\ub9cc": 13, "\ub3d9\uc2dc": 13, "1\uc758": 13, "alpha_f": 13, "\uc801\uc751\ud558\ub3c4\ub85d": 13, "styliz": 13, "2303": [15, 26, 31, 32], "05511": 15, "task\uc758": [15, 20], "\uafb8\uc900\ud788": 15, "\ubc1c\uc804\uc911": 15, "\uae30\uc874\uc5d0\ub294": [15, 30, 39], "stylegan\uacfc": 15, "\uc8fc\ub97c": [15, 26], "\uc774\ub918\uc9c0\ub9cc": 15, "\ubca0\uc774\uc2a4\ub85c": [15, 26], "\ucd94\uc138\uac00": 15, "\uae09\uaca9\ud558\uac8c": [15, 18], "\ubc14\ub00c\uc5b4\ubc84\ub9bc": 15, "\uc7a1\ub294\uac83\uc740": 15, "\ubb34\ub9ac\uc77c\uae4c": 15, "gigagan\uc740": 15, "\uc18d\ub3c4\uc810": 15, "\uc18d\ub3c4\uc801": 15, "512px\uc758": 15, "13\ucd08\ub9cc\uc5d0": 15, "megapixel": [15, 30], "1600\ub9cc": 15, "4k": 15, "66\ucd08\ub9cc\uc5d0": 15, "\ud65c\uc6a9\uc131": 15, "\uc0c1": 15, "\ubcf4\uc5ec\uc8fc\uace0": [14, 15, 16, 17, 21, 35, 36, 38], "\ud559\uc2b5\uacfc": [15, 33], "iteration\uc774": [15, 22], "\ub4e4\uc5b4\uac00\ub294\ub370": 15, "iteration\uc740": 15, "\uc548\uc815\uc131\uc744": 15, "\ud0a4\uc6cc\uc8fc\ub294": 15, "cost\uac00": [15, 20], "\ud55c\ub2e4\ub294": [15, 22, 33], "\ub2e8\uc810\uc774": [15, 16, 24, 26, 32], "\ubc18\uba74\uc5d0": [15, 32, 33, 37, 41, 43], "pass\ub9cc": 15, "\ud544\uc694\ud558\ubbc0\ub85c": 15, "\uc54a\ub2e4\ub294": 15, "object\uc758": [15, 29], "class\uac00": 15, "\uba85\ud655\ud788": [15, 37], "\uc815\uc758\ub418\uc9c0\uc54a\uc740": 15, "develop\ud55c\ub2e4\uba74": 15, "\ub118\uc5b4\uc124": 15, "\uc788\uc744\uae4c": [15, 28], "img": [15, 25, 37], "66": 15, "space\uc0c1\uc5d0\uc11c\uc758": 15, "stylegan2": 15, "stylegan2\ub85c": 15, "\uc120\uc815": 15, "distribution\uc5d0\uc11c\uc758": 15, "disentangle\ub41c": 15, "\uc2dc\ud0a4\ub294": [14, 15, 21], "gigagan\uc5d0\uc11c\ub294": 15, "network\uc758": 15, "z\uc640": 15, "\ud53c\ub77c\ubbf8\ub4dc": 15, "\uad6c\uc870\uc758": 15, "block\ub4e4\ub85c": 15, "\uac12\uc73c\ub85c\ubd80\ud130": 15, "vector\ub294": [15, 29], "layer\ub9c8\ub2e4": 15, "\ub4e4\uc5b4\uac00\uc11c": [15, 27, 29], "scaling\ud568\uc73c\ub85c\uc368": 15, "style\uc744": [15, 26, 29, 40], "\ubc18\uc601": [14, 15, 23], "demodul": 15, "select": 15, "size\ub9cc": 15, "up\uc744": 15, "\uc548\ub418\ub294": [15, 33], "\uc624\ud508": 15, "\ub54c\ubb38\uc774\ub2e4": [15, 25], "\uc5f0\uc0b0\uc740": 15, "\uad6c\uc870\uc0c1": 15, "\ub808\uc774\uc5b4\uc0c1\uc5d0": 15, "filter\uac00": 15, "\uc8fc\uc785\ubd80\ud130": 15, "\uc0dd\uc131\uae4c\uc9c0": 15, "\ucc38\uc5ec": [15, 44], "\ud558\ub294\ub370": [15, 22, 31], "\ud45c\ud604\ub825\uc744": 15, "\ub5a8\uc5b4\ud2b8\ub9b4": 15, "\ub808\uc774\uc5b4\ub9c8\ub2e4": 15, "k_": 15, "\ucc28\uc6d0\uc758": [15, 22, 30], "set\uc744": 15, "w\uc758": 15, "affin": 15, "\uac70\uce5c": [15, 16, 30, 34, 39], "kernel\uac12\uc5d0": 15, "summation\ud55c": 15, "filter\ub85c": 15, "\uacc4\uc0b0\uc5d0": 15, "softmax\ub97c": 15, "\uc598\ub294": 15, "differentiable\ud558\ubbc0\ub85c": 15, "kernel\uc744": 15, "\ub54c\ubcf4\ub2e4": [15, 28, 32], "\uc808\uc57d\ub41c\ub2e4\ub294": 15, "interleav": 15, "filter\ub294": 15, "recept": 15, "field": [15, 33, 39], "\ub0b4\ubd80\uc758": 15, "\ucea1\ucc98\uc5d0\ub294": 15, "\ud0c1\uc6d4\ud558\uc9c0\ub9cc": 15, "\uc678\ubd80\uc758": 15, "\ud55c\uacc4\uc810\uc744": [15, 32], "\uadf9\ubcf5\ud558\uae30\uc704\ud574": 15, "g_": [15, 43], "stylegan2\uc5d0": 15, "\ucd94\uac00\ud558\uba74": [14, 15, 20, 28], "\uc774\uc0c1\uc774": 15, "\uc0dd\uae40": 15, "\uc6d0\uc778\uc740": 15, "product\uac00": 15, "lipschitz\ud568\uc218\uac00": 15, "\uc544\ub2c8\uae30": 15, "lipschitz": 15, "\ud568\uc218\ub780": 15, "\uc810": [15, 31], "\ube44": 15, "\uc774\uc0c1\uc73c\ub85c": 15, "\uc99d\uac00\uc2dc\ud0a4\uc9c0": 15, "\ub9cc\uc871\ud558\uc9c0": 15, "\ubabb\ud568\uc73c\ub85c\uc368": 15, "unstabl": [15, 37, 41], "\uc2e4\ud328\ud55c\ub2e4": 15, "\ub9cc\uc871\uc2dc\ud0a4\uae30": 15, "attention\uc758": [15, 19], "product\ub97c": 15, "l2": [15, 31, 32], "distance\ub85c": 15, "advanc": [15, 39], "stylegan2\uacfc": 15, "\ucd08\uae30\uac12\uc744": 15, "unit": [15, 23], "attentnion": 15, "\uc790\uc2e0\uc758": [15, 21], "\ud559\uc2b5\uc6a9": 15, "\uc8fc\uc785\uc6a9": 15, "\uc720\uc5f0\uc131\uc744": [15, 29], "output\uc740": [15, 34], "size\uc640": 15, "\ub3d9\uc77c\ud558\uac8c": [15, 17, 28, 32, 39, 40, 41, 42], "\ub098\ub220": [15, 30], "word": 15, "index\uc758": 15, "catch": 15, "word\ub97c": [15, 29], "global\ud558\uac8c": 15, "embedding\ud558\ub294": 15, "generator\uc758": 15, "layer\ub294": [15, 16, 22], "discrimin": [15, 27, 30, 31, 33, 37], "branch\uc758": 15, "conditioning\uc744": [15, 16, 25], "generating\uc744": 15, "c\ub85c\ubd80\ud130": 15, "\ud1b5\uacfc\uc2dc\ucf1c": 15, "stylegan\uc5d0\uc11c\ub294": 15, "res\uc758": 15, "loss\uc5d0": 15, "\ubc18\uc601\ud558\uc9c0": 15, "\uc54a\uc558\uc9c0\ub9cc": [15, 31], "\ud45c\ud604\uc758": [15, 23], "extractor": 15, "phi": [15, 20, 23, 30, 32, 34, 35, 40, 42, 43], "phi_": [15, 40], "rightarrow": [15, 23, 34, 41], "conv": [15, 30], "level\uc5d0\uc11c\ub294": [15, 25], "level\uc5d0\uc11c\uc758": 15, "\uacf5\uc720": [14, 15], "resolution\uc5d0\uc11c": [15, 28], "\uacc4\uc0b0\uc774": [15, 37, 40, 43], "\uc77c\uc5b4\ub098\uae30\ub54c\ubb38\uc5d0": 15, "ij": 15, "match": [15, 32], "psi": [15, 34, 40], "conv_": [15, 21], "\uc2ec\uc740": 15, "\ud569": 15, "\uc55e\ubd80\ubd84\uc740": 15, "\ub4b7\ubd80\ubd84\uc740": 15, "awar": [15, 30], "\uc55e\uc758": 15, "\ub9ac\uc5bc\ud55c\uc9c0": 15, "\uac00\uae4c\uc6b4\uc9c0\uc5d0": 15, "\ucd08\ubc18\uc5d0\ub294": [15, 18, 22], "\uc0c1\uad00\uc5c6\uc774": [15, 23], "\ud004\ub9ac\ud2f0\ub85c\ub9cc": 15, "\ud574\ubc84\ub9bc": 15, "\uac15\uc81c\ub85c": 15, "\ub530\ub974\ub3c4\ub85d": [15, 32, 43], "\ud558\uae30\uc704\ud574": 15, "fake": [15, 37], "pair\ub85c": 15, "\uc9c0\uc815": 15, "contrast": [15, 16, 26, 34, 38], "constrast": 15, "\uba40\uac8c": 15, "\ubca1\ud130\uc640\ub294": 15, "condition\uc758": [15, 24], "vector\uc640\ub294": 15, "\ud559\uc2b5\ub418\uc5b4\uc57c\ud55c\ub2e4": 15, "aid": 15, "2112": [15, 16, 19], "09130": 15, "stylegan\uc5d0\uc11c": 15, "discriminator\ub294": 15, "overfitting\ub418\ub294": 15, "\uc774\ubd80\ubd84\uc744": 15, "\ud574\uacb0\ud558\uae30\uc704\ud574": 15, "sota\uc758": [15, 40], "\ubf51\uc544\ub0b8": 15, "discriminator\uc5d0": 15, "fake\ub97c": 15, "\ubd84\ub958": [15, 28, 33], "\uc801\uc6a9\uc774": [15, 17, 20, 27], "64x64\uc758": 15, "3\ubc88": 15, "6\ubc88": 15, "1024x1024\uc758": [15, 28], "gigagan\uc758": 15, "\uc801\uc6a9\ud560\ub54c\uc5d0\ub294": 15, "\uc0dd\uc131\uacfc\uc815\uc911\uc5d0": 15, "real\ud568\uc744": 15, "laion2d": 15, "en": 15, "coyo": 15, "700m": 15, "1024": [15, 23, 27, 30, 34, 37, 38, 41], "adob": 15, "intern": [15, 42], "stock": 15, "machin": [15, 28, 37], "method\uac00": 15, "\ud6a8\uacfc\uac00": [15, 27, 42], "\uc788\ub294\uac00": 15, "\ub2e8\uc21c": 15, "up\ubcf4\ub2e4": 15, "method\ub4e4\uc744": 15, "\uc218\uce58\ub97c": [15, 18, 24, 35], "text2imag": 15, "table2": 15, "time\uc744": 15, "\uc5b4\ub290\uc815\ub3c4": [15, 18], "\uade0\ud615\uc744": [14, 15], "\uc774\ub8e8\uba70": 15, "\uacbd\uc7c1\ub825\uc744": 15, "diffusion\uacfc": [15, 25, 40], "table3": 15, "diffutsion\uc758": 15, "\uc18d\ub3c4": [15, 17, 20, 21], "\uac1c\uc120\uc744": [15, 32], "distilation\ud55c": 15, "\uc218\uce58\uc801\uc73c\ub85c\ub3c4": 15, "\uc6b0\uc704\uc5d0": 15, "time\ub3c4": 15, "\ube60\ub974\ub2e4": 15, "upscal": [15, 25, 30], "md": [15, 22, 23], "table4": 15, "src": [15, 26], "pic": 15, "img14": 15, "png": [15, 37], "alt": 15, "bg": 15, "primari": 15, "mb": 15, "700px": 15, "stylegan\uc5d0": 15, "\uc5f0\uad6c\ub41c": 15, "runcat": 15, "trick": [15, 26], "\uc0c1\uc73c\ub85c\ub294": 15, "imagen\uacfc": 15, "\ube44\uad50\ud558\uba74": [15, 25], "develop\uc774": 15, "\ud544\uc694\ud568": [15, 35], "failur": [15, 39], "toward": 16, "icml": [16, 32, 34], "10741": 16, "e\ubcf4\ub2e4": 16, "\ud3c9\uac00\uac00": 16, "\uc6b0\uc218\ud558\ub2e4\uace0": 16, "powerful\ud55c": 16, "driven": [16, 36], "natur": [16, 32], "language\ub85c": 16, "realistic\ud55c": 16, "\ubc29\ubc95\ub4e4\uc774": [16, 27], "\uc0dd\uaca8\ub098\uace0": 16, "\ub300\uc751\ud558\ub294": [16, 33], "photorealistic\ud55c": 16, "\uc0dd\uc131\ud558\uae30\uc5d0\ub294": 16, "\uc0dd\uc131\ubaa8\ub378\uc758": [16, 28], "\uc911\uc2ec\uc73c\ub85c": 16, "\ub5a0\uc624\ub974\uba70": 16, "sota\ub97c": [16, 21, 24, 26, 28, 34, 35], "\ucc0d\uc5c8\ub2e4\uace0": 16, "\uc790\uc5f0\uc2a4\ub7fd\uac8c": [16, 26, 40], "conditional\ud55c": 16, "\uc774\ub8e8\uc5b4\uc84c\ub294\ub370": 16, "beat": 16, "synthesis\ub77c\ub294": 16, "noise\ud55c": 16, "class\ub97c": 16, "sampling\uacfc\uc815\uc5d0\uc11c": 16, "label\uc5d0": 16, "\uc0dd\uc131\ud558\ub3c4\ub85d": [16, 28, 29], "gradient\ub97c": [16, 34, 35], "control\uc2dc\ud0a4\ub294": 16, "classifier\uc5c6\uc774": 16, "\uc18c\uac1c\ub418\uc5c8\ub2e4": 16, "synthesis\ub97c": 16, "guidance\ub77c\ub294": 16, "\uc81c\uc2dc\ud558\uba70": 16, "guidance\uc640": 16, "\uacb0\uacfc\uc801\uc73c\ub85c\ub294": 16, "guidance\uac00": [16, 38], "\ubcf4\uc778\ub2e4\uace0": [16, 36], "shot\uc73c\ub85c": 16, "\uc0dd\uc131\ud558\ub294\ub370\uc5d0": 16, "\ubcf4\uc600\uc73c\ub098": 16, "photorealistc\ud55c": 16, "\uc0dd\uc131\ud558\ub294\ub370\ub294": [16, 37], "\uacaa\uc744": 16, "generation\ubfd0\ub9cc": 16, "\ud3b8\uc9d1\ud560": 16, "impainting\uae30\ub2a5\ub3c4": 16, "\uac00\ub2a5\ud558\ub3c4\ub85d": [16, 17, 43], "impaint": [16, 39], "differenti": [16, 24, 32, 40, 41, 43], "\uad6c\ud558\ub294": [16, 31, 37, 43], "\ubc29\ud5a5\uc131\uc744": 16, "\ub764\ub2e4\ub77c\uace0": 16, "\uc8fc\uc7a5\ud55c\ub2e4": 16, "proport": 16, "find": 16, "improv": [16, 38], "constant\uac12\uc73c\ub85c": 16, "\uace0\uc815\uc2dc\ud0a8": [16, 42], "learnabl": [16, 27, 36, 42], "parameter\ub85c": [16, 18], "\uc124\uc815\ud558\uc5ec": [16, 39], "step\ub9cc\uc73c\ub85c": 16, "sample\uc744": [16, 35], "dharwial": 16, "image\uc0dd\uc131\uc744": 16, "\ub17c\ubb38\uc5d0\uc11c\uc758": 16, "guidance\uc774\ub2e4": 16, "\uc720\uc9c0\ud558\ub418": 16, "\uc18d\ud558\ub294\uc9c0": 16, "\ubcc4\ub3c4\uc758": [14, 16, 25], "classifier\uc758": [16, 35, 38], "\uacfc\uc815\uc758": 16, "score\uc5d0\uac8c": 16, "guide\ub97c": [16, 24], "\uc18c\uac1c\ub418\uc5c8\ub294\ub370": 16, "classifiy\ub97c": 16, "\ud574\uc57c\ud558\ubbc0\ub85c": 16, "\uaddc\ubaa8\uac00": [16, 28], "heavy\ud574\uc9c0\ub294": 16, "\ubb38\uc81c\uc810\uc744": [16, 24, 26, 34, 36], "\uc788\uc5c8\ub2e4": [16, 25, 26, 31, 40], "\uac1c\uc120\uc810\uc744": [16, 23], "ho": [16, 18, 32], "\uae30\ubc95\uc73c\ub85c": [16, 36, 41, 42], "\uc2dd\uc5d0\uc11c": 16, "\ubcc0\ud615\uc744": [16, 29], "model\ub9cc\uc73c\ub85c": 16, "representation\uc744": 16, "\uc774\ub8e8\uc5b4\uc838": [16, 33, 43], "\uc30d\uc73c\ub85c": [16, 21, 39], "\uc774\ub8e8\uc5b4\uc9c4": [16, 21], "\ub300\uaddc\ubaa8": [16, 29, 30], "learning\uc744": [16, 34], "\uc9c4\ud589\uc2dc\ud0a8": 16, "\uc758\ubbf8\ub97c": [16, 22, 26, 28], "pair\uc5d0": 16, "\ucee4\uc9c0\ub3c4\ub85d": 16, "\uc791\uc544\uc9c0\ub3c4\ub85d": 16, "guidance\uc5d0\uc11c\ub294": 16, "guidance\uc5d0\uc11c": 16, "classifier\ub300\uc2e0\uc5d0": 16, "clip\ubaa8\ub378\uc744": 16, "classifier\ub300\uc2e0": 16, "\uad6c\ud55c": 16, "x\uc640": [16, 17], "billion": 16, "64x64": [16, 18, 21, 22, 28, 32, 38, 39, 40, 41, 42], "resolution\uc744": [16, 21, 35, 40], "\ub610\ub2e4\ub978": [16, 24], "256x256\uc73c\ub85c": [16, 28], "\uc99d\uac00\uc2dc\ud0a4\ub294\ub370": 16, "\uc0ac\uc6a9\ud558\uc600\ub2e4\uace0": [16, 28], "base\ub85c": 16, "\uc9c4\ud589\ud558\uc600\ub2e4": [16, 19, 21], "\uc218\ud589\ud574\uc57c\ud55c\ub2e4": 16, "condition\uc73c\ub85c": [16, 22, 25, 35], "\uc8fc\uae30": [16, 25], "k\uac1c\uc758": 16, "token\uc73c\ub85c": [16, 29], "encoding\ud55c": 16, "input\uac12\uc73c\ub85c": 16, "\ub123\uc5b4\uc900\ub2e4": 16, "output\uc758": 16, "token\uacfc": [16, 34], "encoding\uc744": 16, "token\uc744": [16, 34], "\uc5f0\uc0b0\ud558\uace0\uc790": 16, "\ud06c\uae30\uc5d0": [16, 39], "projection\ud558\uc5ec": 16, "\ub354\ud55c": 16, "adain\uae30\ubc95\uc744": 16, "block\uc758": 16, "\ub3c4\ucd9c\ud55c\ub2e4": 16, "block\ub4a4\uc5d0": 16, "\ubd99\ub294": 16, "\ub370\uc774\ud130\uc14b\uc740": [16, 31, 38, 43], "e\uc640": 16, "\ub370\uc774\ud130\uc14b\uc744": [14, 16, 17, 21, 27, 31], "\uc0ac\uc6a9\ud558\uc600\uace0": [16, 31, 32, 42], "architecture\ub85c\ub294": 16, "up\ub41c": 16, "2b": 16, "paremeters\ub97c": 16, "transformer\ub97c": 16, "upsampling\ud558\ub294": 16, "model\ub3c4": 16, "upsampler\uc640": 16, "\ube44\uc2b7\ud558\ub2e4\uace0": 16, "\ucc98\uc74c": [16, 27], "\uc9c4\ud589\ud588\uc744\ub54c\ub294": 16, "\uc900": [16, 27, 35], "condition\uc5d0": 16, "sequence\ub97c": 16, "impainting\uc744": 16, "\uac70\uce58\uc9c0": 16, "\uc54a\uc558\ub2e4": [16, 31], "sampling\uc744": [16, 18, 34], "\uc54c\ub824\uc9c4": 16, "\uc601\uc5ed\uc5d0": [16, 23], "\ub300\uccb4\ud558\ub294": [14, 16], "\uc0ac\uc6a9\ud588\uae30\uc5d0": 16, "\ucc38\uc870\ud560": [16, 39], "tuning\uacfc\uc815\uc5d0\uc11c": 16, "example\uc758": 16, "\uc9c0\uc6b4\ub2e4\uc74c": 16, "\uc815\ubcf4\ub85c\uc11c": 16, "\ucc44\ub110\uacfc": [16, 21, 23], "\uc785\ub825\ub418\ub3c4\ub85d": 16, "\uc124\uacc4\ud558\uc600\ub2e4": 16, "guidance\uc5d0": 16, "\uc801\ud569\ud558\uac8c": 16, "\ud6c8\ub828\uc2dc\ud0a4\uae30": [16, 17], "\ube44\uad50\ud588\uc74c\uc744": 16, "\uc5b8\uae09\ud588\ub2e4": 16, "\uc0ac\uc6a9\ud558\uae30": [16, 20, 40], "models\ub97c": 16, "\uc0ac\uc6a9\ud588\uc74c\uc744": 16, "\ubc1d\ud78c\ub2e4": 16, "\uc5b8\uae09\ud588\ub4ef\uc774": 16, "\uc88b\uc558\ub2e4\uace0": 16, "precision\uacfc": 16, "recal": [16, 18, 32], "IS": [16, 21, 25, 30, 32, 34], "score\uc640": [16, 28], "trade": [16, 22, 32, 35, 40], "off": [16, 22, 32, 35, 40], "\uad00\ucc30\ud558\uace0": 16, "\uc5b8\uae09\ud55c\ub2e4": 16, "\ucd5c\uc801\uc73c\ub85c": 16, "\uc218\ud589\ub418\uc5c8\uc73c\uba70": 16, "\ubc29\ubc95\uc784\uc744": 16, "\uc0c1\ub2f9\ud788": [16, 17, 20, 23, 29], "\ud5a5\uc0c1\uc2dc\ud0ac": 16, "\uc911\uc810\uc744": [16, 34], "caption\uacfc": 16, "\uc77c\uce58\uc2dc\ud0a4\ub294": [16, 41], "\ub6f0\uc5b4\ub098\uc9c0": 16, "\uc54a\uc744": 16, "\uac00\uc124\uc744": 16, "\ud3c9\uac00\uc790\ub97c": 16, "\uc9c4\ud589\ud558\uc600\uace0": 16, "\uc778\uac04\ub4e4\uc774": 16, "\uc810\uc218\uc640": [16, 19], "\uc758\uacac\uc744": 16, "\uac00\uc9c0\uba70": [16, 40, 42], "guida": 16, "nce\uac00": 16, "\uc77c\uce58\ud558\ub294": [14, 16], "\uc0dd\uc131\ud55c\ub2e4\uace0": [16, 33], "\ud310\ub2e8\ud588\ub2e4": 16, "table1\uc740": 16, "unguid": 16, "evaluation\uc744": [16, 21], "\ud56d\ubaa9\uc5d0": 16, "\uc555\ub3c4\uc801\uc778": [16, 34], "\ubcf4\uc784\uc744": 16, "table2\ub294": 16, "glide\uc640": 16, "model\ub4e4\uc744": 16, "\ud45c\uc774\ub2e4": 16, "\uad6c\ud558\uc600\ub2e4": 16, "coco\uc5d0": 16, "\uacbd\ud5d8\uc774": 16, "\ub5a0\uc624\ub974\uace0": 17, "\uc8fc\uc81c\uc785\ub2c8\ub2e4": 17, "identity\ub97c": [14, 17], "\uc720\uc9c0\ud55c": [17, 21, 36], "\ub9e5\ub77d\uacfc": 17, "\uc9c4\ud589\ub418\uc5c8\uae30": 17, "\uc77d\uc5b4": 17, "\ubcf4\uc2dc\uae30\ub97c": 17, "\ucd94\ucc9c\ub4dc\ub9bd\ub2c8\ub2e4": 17, "contribution\uc740": [17, 27], "3\uac00\uc9c0\ub85c": 17, "lighweight": 17, "dreambooth\uc758": 17, "\uc720\uc9c0\ud558\uba74\uc11c": [17, 21, 25, 27], "\ud06c\uae30\ub97c": [17, 25, 35, 42], "\uc904\uc774\uace0": 17, "\ub192\uc77c": [14, 17, 29], "hyperdreambooth\ub97c": 17, "\uad6c\ud604\ud588\uc9c0\ub9cc": 17, "e2": [17, 36, 39, 40], "fidelity\uac00": [17, 26, 29, 35, 38], "\ub5a8\uc5b4\uc9c0\uac70\ub098": 17, "\ubb38\ub9e5\uc744": 17, "\uc81c\uacf5\ud558\uc9c0": 17, "hypernetwork\ub97c": 17, "via": [17, 22, 44], "personalization\uc744": 17, "finetuning\uc5d0": 17, "svdiff": 17, "styledrop": 17, "dreamartist": 17, "\uc608\uc2dc\uac00": 17, "\ub290\ub9ac\ub2e4\ub294": [17, 41], "\ub2e8\uc810\uc744": [17, 37, 40, 41, 43], "\uad00\ub828": [17, 21, 27], "\uc5f0\uad6c\ub4e4\uc744": 17, "hyperdreambooth\ub294": 17, "\uc18d\ub3c4\uc640": 17, "\ud6a8\uc728\uc131": [17, 22], "\ubc1c\uc804\uc744": 17, "\uc774\ub8e8\uc5c8\ub2e4\uace0": 17, "\uc774\uc804\uc5d0": [17, 29, 35], "dreambooth\ub294": 17, "\uc8fc\uc81c\uc758": 17, "hyperdreambooth\uc758": 17, "\uc601\uac10\uc6d0": 17, "\ud558\ub098\ub85c": [17, 20, 29, 42, 43], "\ud65c\uc6a9\ub418\uc5c8\uc2b5\ub2c8\ub2e4": 17, "lora\ub294": [17, 20], "\uac00\uc911\uce58\ub97c": [14, 17, 22, 25, 28], "\ub7ad\ud06c\uc758": 17, "\ud589\ub82c\ub85c": 17, "\uadfc\uc0ac\ud654\ud558\uc5ec": 17, "\ud06c\uae30\uc640": [17, 18], "\ubcf5\uc7a1\uc131\uc744": [14, 17], "\ubc29\ubc95\uc785\ub2c8\ub2e4": [17, 27, 33], "\uae30\uc220\uc744": [17, 23, 25, 38], "\ud6a8\uc728\uc801\uc778": [17, 40], "personalization\uc774": 17, "\uc0b4\ud3b4": 17, "contribution\uc758": 17, "\uc0b4\ud3b4\ubcf4\ub3c4\ub85d": [17, 43], "\uae30\uc220": [17, 23, 25, 28], "\ud558\ub098\uc778": [17, 28], "\uc904\uc5ec\uc11c": 17, "lidb\uc5d0": 17, "\uc124\uba85\ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4": 17, "lidb\ub294": 17, "residuals\uc758": 17, "\uacf5\uac04\uc744": [14, 17], "\uc138\ubd84\ud654\ud558\ub294": 17, "\uc544\uc774\ub514\uc5b4\uc785\ub2c8\ub2e4": 17, "orthogon": 17, "basis\ub97c": 17, "lora\uc758": 17, "a\uc640": 17, "\ud589\ub82c\uc744": 17, "\ubd84\ud574\ud558\ub294": 17, "\uac83\uc73c\ub85c\ub3c4": 17, "\uc774\ud574\ud560": [17, 22], "\uad6c\uccb4\uc801\uc73c\ub85c": 17, "\ud589\ub82c\uc740": 17, "a_": 17, "aux": [17, 26], "\ubd84\ud574\ub418\uba70": 17, "b_": [17, 18], "\ubd84\ud574\ud560": 17, "\ub808\uc774\uc5b4\ub294": [14, 17, 23], "\ud589\ubcc4\ub85c": 17, "\uc9c1\uad50\ud558\ub294": 17, "\ubca1\ud130\ub85c": [17, 29], "\ucd08\uae30\ud654\ub418\uace0": [17, 21], "\ud559\uc2b5\ub418\ub294": 17, "\uac00\uc911\uce58\uc785\ub2c8\ub2e4": 17, "\uc120\ud615": [17, 40], "\ub808\uc774\uc5b4\uc758": 17, "residual\uc740": 17, "w_x": 17, "experiment": [17, 32, 37, 43], "\ub418\uc5c8\uc73c\uba70": [17, 21], "\uac1c\uc218\ub294": 17, "30k\uac1c": 17, "\uc0ac\uc774\uc988\ub294": 17, "120kb\ub85c": 17, "\uacbd\ub7c9\ud654": 17, "\ubcc0\uc218\ub9cc\uc73c\ub85c": 17, "\ub4f1\uc744": [17, 23, 33, 40], "\ud3ec\uc778\ud2b8\uc785\ub2c8\ub2e4": 17, "\ub2e4\uc74c\uc740": 17, "\uc0ac\uc804\uc5d0": [17, 32, 36, 37], "\ub098\ud0c0\ub0b4\uba70": [17, 23], "\ub808\uc774\uc5b4\uc5d0": [14, 17], "\uc544\uc774\ub514\uc5b4\ub294": 17, "x\ub97c": 17, "\ubc1b\uace0": [14, 17, 21, 38, 41], "lidb\uc758": 17, "residual\uc778": 17, "h_": [17, 25], "\ub3cc\uc785\ud558\ub294": 17, "hypernetwork\ub294": 17, "\ud2b9\ud654": [17, 34], "\ud6c8\ub828\ub418\uba70": 17, "\ud655\uc0b0": 17, "\uc190\uc2e4\uacfc": 17, "alpha": [17, 20, 23, 40, 42], "\ubaa9\ud45c\ub294": [17, 29], "paramters\uc785\ub2c8\ub2e4": 17, "\uac00\uc911\uce58\ub294": [14, 17], "\uad00\ub828\ub41c": [17, 29], "\uc870\uc815\ub429\ub2c8\ub2e4": 17, "\ub098\ud0c0\ub0c5\ub2c8\ub2e4": [17, 33], "supervisori": 17, "\uc124\uc815\ub41c": 17, "\uac1c\uc778\ud654\uc5d0": 17, "\uc0c1\ub300\uc801\uc778": 17, "loss\uc758": [17, 18], "\ud56d\ubaa9\uc758": 17, "\uc9c0\uc6d0\ud558\uae30": 17, "\uc785\ub825\uc785\ub2c8\ub2e4": 17, "\uc9c0\uc2dc\uc0ac\ud56d": 17, "hyperdreambooth\uc5d0\uc11c\ub294": 17, "\ub4dc\ubb3c\uc9c0\ub9cc": 17, "\uc758\ubbf8": [14, 17], "\uc218\uc815\uc744": [17, 21], "\uc0bd\uc785\ud560": [17, 29], "hyperdreambooth\uc5d0\uc11c": 17, "\uad6c\uc870\ub85c": [17, 37], "\uad6c\uc131\ub418\uba70": [17, 25], "\ud558\ub098\uc785\ub2c8\ub2e4": 17, "\uac00\uc911\uce58\uc5d0": 17, "\ub354\ud558\uc5ec": 17, "\uac1c\uc778\ud654\ub97c": 17, "\uc2e4\ud589\ud569\ub2c8\ub2e4": 17, "iter": [17, 23, 32, 41], "\ubc18\ubcf5\uc801": 17, "\uc218\ud589\ud569\ub2c8\ub2e4": 17, "hypernetwork\uac00": 17, "\ubc18\ubcf5\uc801\uc778": [17, 30, 40], "\uac1c\uc120\ud558\ub824\uace0": 17, "\uc2dc\ub3c4\ud558\ub294": 17, "\uc608\uce21\uc740": [14, 17], "\ubc29\ud5a5\uc131\uc774": 17, "\uc62c\ubc14\ub974\uace0": 17, "\uc5bc\uad74\uacfc": [17, 25], "\ubbf8\uc138\ub9cc": 17, "\uc7a1\uc544\ub0b4\uc9c0": 17, "tuning\ud558\uace0": 17, "\ub098\uc740": [17, 43], "\ub54c\uc5d0": 17, "encoding\uc740": 17, "\uc218\ud589\ub418\uba70": 17, "\ucd94\ucd9c\ub41c": [14, 17, 22, 31], "f\ub294": 17, "\uc2e4\ud589\ud558\uace0": 17, "\uc18d\uc131\uacfc": 17, "\ubc29\ud5a5\uc131\uc5d0": 17, "\uc62c\ubc14\ub974\uac8c": 17, "\ub418\uc9c0\ub9cc": [17, 40], "\uc138\ubd80\uc801\uc778": [14, 17, 27, 33], "detail\uc740": 17, "dreambooth\ubcf4\ub2e4": 17, "\ube60\ub974\uc9c0\ub9cc": 17, "\uac15\ud55c": [17, 26], "\ucd08\uae30\ud654\ub41c": [14, 17, 21], "\uc9c0\uc2dc\uc5b4": 17, "c\uc5d0": 17, "\uc870\uc815\ud569\ub2c8\ub2e4": 17, "\uc810\uc740": [17, 28, 29], "\uac1c\ub150\uc785\ub2c8\ub2e4": 17, "\uc644\ud654\ud558\uc5ec": 17, "rank\ub85c": 17, "hypernetwork\uc758": 17, "\uc8fc\uccb4\uc758": 17, "\uace0\uc8fc\ud30c\uc218": 17, "\uc0ac\ud56d\uc744": [17, 21], "\uadfc\uc0ac\ud654\ud560": 17, "\uc81c\ud55c\ub41c": [14, 17], "\uc5c5\ub370\uc774\ud2b8\ubcf4\ub2e4": 17, "\uc8fc\uc81c": 17, "\ucda9\uc2e4\ub3c4\ub97c": [14, 17], "\ub2ec\uc131\ud560": 17, "relaxed\uc758": 17, "\uac1c\ub150\uc740": 17, "\ubc29\uc2dd\ubcf4\ub2e4": 17, "\uc6b0\uc218\ud558\uac8c": [17, 27], "\uc694\uc778\uc785\ub2c8\ub2e4": 17, "\uc5ec\uae30\uc11c\ub3c4": 17, "\uc9c0\uc6d0\ud558\uba70": 17, "\uc5bc\uad74\uc5d0": 17, "\ud2b9\uc131\uacfc": 17, "\ucea1\ucc98\ud558\ub294": 17, "\ub3c4\uc6c0\uc774": [14, 17, 29, 34], "\uace0\ub824\ud560": 17, "40\ubc88\uc758": 17, "\ubc18\ubcf5\uc73c\ub85c": 17, "\uc644\ub8cc\ud560": 17, "dreambooth\uc640": 17, "\ube44\uad50\ud588\uc744": [17, 24, 28], "25\ubc30": 17, "\uc18d\ub3c4\ub77c\ub294": 17, "\uad6c\ud604\ud588\uc2b5\ub2c8\ub2e4": 17, "5\uc758": 17, "unet\uc758": [14, 17, 25], "\ud65c\uc6a9\ud558\uae30": 17, "\uc778\ucf54\ub354\ub3c4": 17, "\uac1c\uc778\ud654\ud558\uae30": 17, "\uc2dc\uac01\ud654\uc5d0": 17, "sfhq": 17, "synthet": [17, 23, 31, 32, 44], "headquart": 17, "000\uac1c\uc758": 17, "galleri": 17, "\uc624\ub978\ucabd": [14, 17, 21, 25, 28], "\uc544\ub798\ub85c": [17, 27, 42], "\uc778\uc2a4\ud0c0\uadf8\ub7a8": 17, "\uc140\uce74": 17, "bark": 17, "skin\uc758": 17, "\ub85d": 17, "\uc2a4\ud0c0": 17, "\uc804\ubb38\uc801\uc778": 17, "\ucd2c\uc601": 17, "inversion\uc758": 17, "\ud45c\uc785\ub2c8\ub2e4": 17, "dino\uc640": 17, "\uc9c0\ud45c\ub97c": [17, 28, 33], "\ud45c\ub294": 17, "\ubd80\ubd84\uc785\ub2c8\ub2e4": [17, 27, 28], "hyperparameter\ub97c": 17, "\uc870\uc815\ud558\uc5ec": 17, "\ube44\uad50\ud588\uc2b5\ub2c8\ub2e4": [17, 33, 42], "\ud559\uc2b5\ub960\uc744": 17, "\uc99d\uac00\uc2dc\ud0a4\uace0": 17, "\ubc18\ubcf5": [17, 41], "\uac10\uc18c\uc2dc\ud0a4\uba74": 17, "\uacb0\uacfc\uc758": [17, 29], "agg": 17, "1\uc740": [17, 35], "400\ubc88\uc758": 17, "\ubc18\ubcf5\uc744": 17, "\uc2dc\ud589\ud558\uace0": 17, "2\ub294": [17, 35], "1200\ubc88": 17, "\uc694\uc18c\ub85c": 17, "\ub098\ub204\uc5b4": 17, "\uc911\uc5d0\ub294": [14, 17], "\ud558\uc774\ud37c\ub124\ud2b8\uc6cc\ud06c\ub97c": 17, "\ud558\uc774\ud37c\ub124\ud2b8\uc6cc\ud06c": 17, "\uc608\uce21\ub9cc": 17, "1\ubc88\ub9cc": 17, "\ube44\uad50\ud569\ub2c8\ub2e4": [17, 32, 41, 43], "\uc9c0\ud45c\uc5d0\uc11c": 17, "\ub2ec\uc131\ud55c\ub2e4\ub294": 17, "\uc778\uc2dd": [17, 21], "\uba54\ud2b8\ub9ad": 17, "\uc2dc\ub098\ub9ac\uc624\uc5d0\uc11c": 17, "\uc57d\ud558\ub2e4\uace0": 17, "\ub124\ud2b8\uc6cc\ud06c\uac00": [14, 17], "\uc774\ubbf8\uc9c0\uc5d0\ub9cc": 17, "\uc2a4\ud0c0\uc77c\uc5d0\uc11c": 17, "\uc0ac\ub78c\uc744": [17, 33], "\uc778\uc2dd\ud558\ub3c4\ub85d": 17, "\uc54a\uae30": [14, 17, 28, 41], "\ub54c\ubb38\uc774\ub77c\uace0": [17, 32], "\uc8fc\uc7a5\ud558\uba70": 17, "\ubcf4\uc644\ud558\uae30": 17, "study\ub97c": 17, "\ube44\uad50\ud558\uace0": 17, "\uc0ac\uc6a9\uc790\ub4e4\uc758": 17, "\ubc1b\uc558\uc2b5\ub2c8\ub2e4": 17, "ups\uac00": 17, "\uc874\uc7ac\ud569\ub2c8\ub2e4": [17, 32, 33, 36, 37, 41], "direct": [17, 23, 32], "\uc608\uce21\uc5d0\uc11c": 17, "\uc798\ubabb\ub41c": 17, "\uc2dc\ub9e8\ud2f1": 17, "\ub098\uc62c": 17, "\uc5d0\ub7ec\uc785\ub2c8\ub2e4": 17, "\ub208": [17, 33], "\uc0c9\uae54\uc774\ub098": 17, "\ud5e4\uc5b4": 17, "\ud0c0\uc785": 17, "\uc131\ubcc4": [17, 29], "\ub4f1\uc774": [17, 28, 37, 42], "captur": [17, 22], "\uc624\ub958\uac00": [14, 17], "underfit": 17, "identity\ub294": 17, "\uc9c0\ucf1c\uc9c0\ub354\ub77c\ub3c4": 17, "\uc720\uc0ac\ud558\uc9c0": 17, "\uc0d8\ud50c\uc774": [17, 33], "\uc0dd\uc131\ub420": 17, "hypernetwork\uc640": 17, "\uc2a4\ud0c0\uc77c\uc5d0": 17, "\ubb38\uc81c\uc810\uc740": 17, "\ube5b": [17, 23], "\ud3ec\uc988": [14, 17, 23], "\ub4f1\uc73c\ub85c": 17, "ood\uc778": 17, "\uc0d8\ud50c\uc5d0\uc11c": 17, "\ub098\ud0c0\ub0a0": [17, 22], "hyperdreambooth\ub77c\ub294": 17, "\ubcc0\ud658\ud558\ub294": [14, 17, 23, 33], "\uac00\ubcbc\uc6b4": 17, "\uac1c\uc778\ud654\ud558\ub294": 17, "hypernetwork\ub77c\ub294": 17, "\ud30c\ub77c\ubbf8\ud130\uc778": 17, "\uc0dd\uc131\ud558\uba70": [17, 28], "\uc774\uc5b4\uc11c": 17, "\uae30\ud0c0": [17, 21], "\uac1c\uc778\ud654": 17, "\uc791\uc5c5\uc5d0": [14, 17], "\uc904\uc774\uba74\uc11c": [17, 19, 41], "\ubb34\uacb0\uc131\uc744": 17, "\uc2a4\ud0c0\uc77c\uacfc": [17, 29, 33], "\uc758\ubbf8\uc801": [17, 29], "\uc218\uc815\uc774": [17, 29], "\uc801\uc6a9\ub41c": [14, 17, 27, 28, 33], "\uc785\uc99d\ud558\uc600\uc2b5\ub2c8\ub2e4": 17, "2102": [18, 34], "09672": 18, "ddpm\uc744": 18, "\uc57d\uac04": 18, "\uc720\uc9c0\ud558\uace0": [14, 18, 27], "likelihood\uc218\uce58\ub3c4": 18, "\ud5a5\uc0c1\ub41c": [18, 25, 29], "sampling\uc2dc": 18, "step\uc73c\ub85c": [18, 25, 35, 40], "\ub0bc": [18, 35], "scale\uacfc": [18, 27], "quailty\uc640": 18, "\uc218\uce58\uac04\uc758": 18, "quality\uc5d0": 18, "\ubaa8\ub378\uc5d0\ube44\ud574": 18, "\ub5a8\uc5b4\uc84c\ub2e4": 18, "diversity\uac00": [18, 35], "cifar": [18, 28, 32, 37, 41], "\ub3d9\uc791\ud588\uc9c0\ub9cc": 18, "dataset\uc5d0\uc11c\uc758": 18, "\ub3d9\uc791\uc740": 18, "\ubabb\ud588\ub2e4": 18, "imagenet\uac19\uc740": 18, "dataset\uc5d0\uc11c\ub3c4": 18, "\ub3d9\uc791": [18, 21], "process\uc5d0\uc11c\uc758": 18, "\uc81c\uc548\ud558\uc600\ub2e4": [14, 18, 40], "\ub0b4\ub294": [18, 20, 29], "\uc5f0\uad6c\ub4e4\uc5d0\uc11c": 18, "loglikelihood": 18, "\uc218\uce58\uc640": 18, "sample\uc758": 18, "quality\uac04\uc758": 18, "\uc5f0\uad00\uc131\uc744": 18, "\ub9ce\uc558\ub2e4": [14, 18], "distribution\uc5d0": 18, "\uc218\uce58\ud654\ud55c": 18, "\ub290\ub08c": 18, "\uc88b\uc544\uc9c0\uba74": 18, "quality\ub3c4": 18, "\uc99d\uac00\ud558\ub294": 18, "\uacbd\ud5a5\uc744": [18, 26], "ddpm\uc5d0\uc11c\ub3c4": 18, "\uac1c\uc120\ud55c\ub2e4\uba74": 18, "\uc99d\uac00\ud560": 18, "\uc54a\uc744\uae4c": 18, "angeloyeo": 18, "17": [18, 35, 40], "mle": [18, 37], "html": [18, 33], "\uc785\ud78c": [18, 26], "\ud615\ud0dc": [18, 30], "denoising\uc5d0": 18, "noising\ud560": 18, "\uc544\ub798\uc640\uac19\uc774": 18, "\uc0ac\uc6a9\ud574\ub3c4": [18, 40, 42], "\ubcf4\uc5ec\uc11c": 18, "\ubb38\uc7a5": 18, "\uc758\ubb38\uc810": 18, "\uc815": 18, "\ubc18\ub300\uc758": 18, "parameter\uc778\ub370": 18, "fix\ub97c": 18, "\ud558\ub294\uac8c": 18, "\ub9de\uc744\uae4c": 18, "step\uac04": 18, "\ucc28\uc774\ub97c": [14, 18, 32, 36, 40], "step\uc774": [18, 35], "\ub450\uac1c\uc758": [18, 21, 23], "\ub3d9\uc77c\ud574\uc9c4\ub2e4": 18, "2\ub97c": [18, 25, 28], "\ucd08\ubc18\uc5d0": [18, 37], "\uacb0\uc815\ub418\ub294\ub370": 18, "\uacb0\uc815\ub418\ub294": 18, "\ubd80\ubd84": [14, 18, 23, 25, 34], "\ub450\ub294\uac83\uc740": 18, "\uc124\uacc4\uc758": 18, "miss": 18, "\ud559\uc2b5\ud558\uae30\uc5d0\ub294": 18, "\ubc94\uc704\uac00": 18, "\uc791\uc544\uc11c": 18, "predict\ud558\ub3c4\ub85d": 18, "hybrid": [18, 35], "hyprid": 18, "\u03bbl_": 18, "vlb": 18, "\uc774\ubbf8\uc9c0\uc5d0\ub300\ud574": 18, "\ub3d9\uc791\ud558\uc9c0\ub9cc": 18, "32x32": [18, 35, 41], "\uc54a\ub294\uac83\uc744": 18, "scheduling\uc5d0\uc11c": 18, "mode\uc758": 18, "limitation\uc774": 18, "\uc9c0\uc801": 18, "\uac70\ub4ed\ub0a0\uc218\ub85d": 18, "\uc0c1\ub2e8": [18, 25], "noisy\ud574\uc9d0": 18, "skip\ud574\ub3c4": 18, "\uc131\ub2a5\uc5d0": [18, 28, 40], "\uc601\ud5a5\uc774": 18, "mode\ub97c": 18, "noise\ub294": 18, "\uc758\ubbf8\uc788\ub294": [18, 21], "\ubbf8\uce58\uc9c0": 18, "equation\uc744": 18, "\uc0c8\ub85c": [18, 21, 39], "\ub2e8\uacc4\uc5d0\uc11c\ub294": [18, 25], "\uac15\ud558\uac8c": [18, 26], "\uc785\ud600\uc9c0\uc9c0\ub9cc": 18, "0\uacfc": 18, "\ubd80\uadfc\uc5d0\uc11c\ub294": 18, "\ub35c": [18, 35], "direct\ub85c": 18, "\ucd5c\uc801\ud654\ud558\ub3c4\ub85d": 18, "\uc124\uacc4\ud558\uba74": 18, "\uc774\ubbf8\uc9c0\uc640\uac19\uc774": 18, "unstable\ud574\uc11c": 18, "\ucd5c\uc801\ud654\uc5d0\ub294": 18, "\uc904\uc774\uae30\uc704\ud574": 18, "2\uc5d0\uc11c": [18, 25], "\ub9d0\uae30\ub294": 18, "\ubcc0\ud654\uc5d0": 18, "\uc5c6\uc73c\ubbc0\ub85c": 18, "\ud655\ub960\uc801\uc73c\ub85c": [18, 27], "\ucd08\ubc18\uc758": 18, "sampling\ud574\uc11c": 18, "\ud559\uc2b5\ud558\ub3c4\ub85d": 18, "\uc801\uc6a9\ud574\ubcf8": 18, "\uc801\uc6a9\ud558\uba74": [18, 41, 43], "\uc804\ubcf4\ub2e4": 18, "\ub2e4\uc18c": [18, 34], "\ucde8\uc57d\ud588\ub358": 18, "64x64\uc640": 18, "cidar": 18, "\uae30\uc900": [18, 34, 35], "\ubaa8\ub378\uc774\ub098": 18, "\ubaa8\ub378\uc911\uc5d0\uc11c\ub294": 18, "fulli": [18, 21, 23, 33], "\ube44\ud574\uc11c\ub294": 18, "\ubd80\uc871\ud55c": [18, 36], "\uba74\uc774": 18, "speed\ub97c": 18, "step\ub9cc": 18, "\uac00\ub3c4": 18, "fid\uac12\uc744": 18, "metric\uc73c\ub85c": 18, "biggan": [18, 35, 41], "big": 18, "\ubaa8\ub378\ubcf4\ub2e4": [18, 28, 33, 34, 39, 41], "\ud0c0\uac9f\uc5d0": 18, "\uc218\uce58\ub098": 18, "metric\uc5d0\uc11c": 18, "capacity\ub97c": 18, "nll": [18, 33], "\ud559\uc2b5\ub7c9": 18, "\ube44\ub840\ud568": 18, "10752": 19, "compvi": 19, "namkyeong": [19, 44], "31": [19, 25, 29, 36], "\uc624\ub298": [19, 27], "\uc54c\uc544\ubcfc": [19, 27, 39, 42], "model\uc785\ub2c8\ub2e4": 19, "\ub2e4\ub918\ub358": [19, 27], "\ucef4\ud4e8\ud130": 19, "\uc790\uc6d0\uc758": 19, "\uc18c\ubaa8\ub97c": 19, "\uc5bb\ub294\uac83\uc774": 19, "\ubaa9\ud45c\uc785\ub2c8\ub2e4": [19, 39], "\uc804\ubc18\uc801\uc73c\ub85c": [19, 28], "\uc8fc\uc5b4\uc84c\uc744\ub54c": 19, "\ud1b5\ud574\uc11c": [19, 27, 31], "\ub514\ucf54\ub529\uc744": 19, "\ub418\ub3c4\ub85d": [19, 26, 33], "\ud14c\uc2a4\ud2b8\ub97c": 19, "\ucee4\uc9c0\uc9c0": 19, "\uc54a\ub3c4\ub85d": [14, 19], "divergence\uc640": 19, "quantiz": [19, 22, 34], "vq": [19, 41], "\ud65c\uc6a9\ud558\uc600\ub2e4": 19, "\uc774\ubbf8\uc9c0\uc678": 19, "\ud14d\uc2a4\ud2b8\ub098": 19, "semat": 19, "map\uacfc": 19, "\uc815\ubcf4\ub294": [19, 30], "tau_": 19, "\uc804\ub2ec\uc744": 19, "\ud558\uc600\uace0": [19, 28], "phi_i": 19, "_k": 19, "_v": 19, "\uc815\uc758\ub418\uace0": [19, 41, 43], "\uc911\uac04\uc758": 19, "matrix\uc774\ub2e4": 19, "value\uc5d0": 19, "\ud574\ub2f9\ud558\uba70": 19, "qk": 19, "\uc9c4\ud589\ub41c\ub2e4": [19, 30, 31], "\uac19\uc774\ud45c\ud604\ub41c\ub2e4": 19, "\uc8fc\ubaa9\ud560\ub9cc\ud55c": [19, 40], "dm": [19, 30, 35], "function\uc73c\ub85c": [19, 21, 34, 35], "\uc9c4\ud589\uc2dc\ud0a4\ub294\ub370": 19, "\ubc14\uafb8\uba74\uc11c": 19, "\uc591\uc744": [19, 25], "\uc904\uc600\ub2e4\ub294": 19, "\uc810\uc774\ub2e4": [19, 25, 35], "\uadf8\uc911": 19, "\uc77c\ubd80\ub9cc": 19, "\uc18c\uac1c\ud558\ub3c4\ub85d": 19, "\ud558\uaca0\ub2e4": 19, "dataset\uc5d0\uc11c": [19, 26, 29, 34, 40], "\ubf51\uc740": [19, 23, 27], "\uc0d8\ud50c\uacfc": [19, 23, 33], "sample\ub4e4\uc785\ub2c8\ub2e4": 19, "\uc801\uc808\ud55c": [19, 24, 31], "\ud6a8\uc728\uc131\uc744": [19, 23], "layout\uc774": 19, "peft": 20, "effeci": 20, "\ud558\ub098": [14, 20, 34], "\uace0\uc815\ud55c": 20, "\ucc44\ub85c": 20, "\uba87": [20, 29, 32, 33, 37, 40], "fc": [20, 23], "\uc5f0\uc0b0\ub7c9\uc744": 20, "\uc904\uc77c": [14, 20, 21, 29, 30, 40], "3\uc744": 20, "parameter\ub294": [20, 28], "10000\ubc30": 20, "\uba54\ubaa8\ub9ac\ub294": 20, "3\ubc30\ub97c": 20, "latency\uac00": 20, "\ud29c\ub2dd\ud558\ub294": 20, "\ud30c\ub77c\ubbf8\ud130\ub9cc\uc744": 20, "\ud29c\ub2dd\ud568\uc73c\ub85c\uc368": 20, "\uc790\uc6d0\uc73c\ub85c\ub3c4": 20, "\ub192\uac8c": 20, "\ud558\ub294\uac83": 20, "upstream": 20, "\ud559\uc2b5\uc2dc\ud0a4\ub294\uac83": 20, "\uc694\uccad\uc758": 20, "\uc2dc\uc791\ubd80\ud130": 20, "\uc644\ub8cc\uae4c\uc9c0": 20, "\uac78\ub9ac\ub294": 20, "llm\uc740": 20, "\uc2dc\ud0b4": [20, 28], "tuning\uc5d0\uc11c": 20, "\ud559\uc2b5\uc2dc\ud0a4\uba74": [20, 31], "roberta": 20, "\ub2ec\uc774": 20, "\uac78\ub9bc": 20, "\uc5f0\uad6c\uc5d0\uc11c": [14, 20], "intrins": [20, 23], "\uae30\ubc18\ud558\uace0": 20, "\uc0ac\uc2e4\uc5d0": 20, "\uc800\uc790\ub294": [20, 29, 40], "\uac16\uace0": 20, "\uac00\uc815\ud568": [20, 34], "\uace0\uc815\ud558\uace0": [20, 34], "decomposit": [20, 21], "matrices\ub97c": 20, "\ucd5c\uc801\ud654\ud558\ub294": [20, 23, 37], "\uc2dc\ud0a4\uae30\ub85c": 20, "decomposition\ub41c": 20, "\ub354\ud574\uc90c": 20, "\uc791\uc544": 20, "3\ubc30\uae4c\uc9c0": 20, "\ubc14\uafd4\uc8fc\uba74": 20, "storag": [20, 42], "switch": 20, "overhead\ub97c": 20, "\uc678\uc5d0\ub3c4": [20, 21, 40], "\uae30\ubc95\ub4e4\uacfc": 20, "\uac00\ub2a5\ud558\ub2e4\ub294": [20, 40], "\uc7a5\uc810\uc774": [20, 37, 42], "transformer\uc758": [20, 28, 34], "w_q": [20, 42], "w_k": [20, 42], "w_v": [20, 42], "w_o": 20, "accumulated\ub41c": 20, "\uc5f0\uad6c\uc758": 20, "convention\uc744": 20, "optimizer\ub294": 20, "adam\uc744": 20, "\uc774\uc6a9": [20, 21, 23], "mlp": [20, 22, 23, 43], "feedforward": [20, 21], "ffn": 20, "agnostic\ud558\uc9c0\ub9cc": 20, "\uc9d1\uc911\ud568": 20, "agnost": [20, 34], "\uad6c\uc560\ubc1b\uc9c0": 20, "\ud574\uc11d\uc774": 20, "y_t": 20, "parameterized\ub41c": 20, "x_i": [20, 43], "y_i": 20, "target\uc30d\uc73c\ub85c": 20, "phi_0": 20, "maximize\ud558\uae30": 20, "\uc5c5\ub370\uc774\ud2b8\ub428": 20, "\ud06c\uae30\uc758": [20, 25], "\ud559\uc2b5\ud574": [20, 29, 30], "\uc5c4\uccad\ub09c": [20, 23, 41], "\uc804\uccb4\uac00": 20, "\uadf8\ubcf4\ub2e4": 20, "\ucc3e\uc544\ub0b4\ub294": 20, "\ubc14\ub00c\uae30": 20, "effecient\ud574\uc9d0": 20, "01": 20, "\uc791\uc544\uc9c8": 20, "\uae30\uc874\uc5d0\ub3c4": 20, "learning\uc5d0\uc11c": [20, 34], "effecient\ub97c": 20, "\uac00\uc9c0\uac00": 20, "perform": [20, 30, 34, 38, 42], "hardwar": 20, "parellelism\uc774": 20, "\uc5c6\ub2e4\uba74": 20, "\ucd94\uac00\ud574\ub3c4": 20, "\uc99d\uac00\ud574": 20, "\uc5b4\ub824\uc6e0\uc74c": 20, "prefix": 20, "tuning\uc740": [20, 28, 29], "optimize\uac00": 20, "ba": 20, "\uacf1\ud574\uc9c4": 20, "vector\ub07c\ub9ac": 20, "coordin": [20, 23], "wise\ud558\uac8c": 20, "\uc774\ub77c": [20, 41], "scaling\ub428": 20, "rate\ucc98\ub7fc": 20, "tuning\ud574\uc11c": 20, "r\uacfc": 20, "\uc774\ub098": [20, 40, 41], "\uc0ac\uc6a9\ud55c\ub2e4\uace0": [20, 31], "lora_a": 20, "new_zero": 20, "num_embed": 20, "lora_b": 20, "embedding_dim": 20, "lora_alpha": 20, "matrix": [20, 33], "requires_grad": [20, 37], "reset_paramet": 20, "hasattr": 20, "wai": 20, "zeros_": 20, "normal_": [20, 43], "bool": 20, "merge_weight": 20, "sure": 20, "transpos": [20, 21], "mark": 20, "tensor": [20, 31, 37, 42], "after_a": 20, "padding_idx": 20, "max_norm": 20, "norm_typ": 20, "scale_grad_by_freq": 20, "spars": [20, 34, 42], "w_0x": 20, "bax": 20, "lora\ub97c": 20, "\uc774\uc6a9\ud558\uba74": [20, 38], "inference\uc2dc": 20, "\ud558\ub77d\uc774": 20, "\uacbd\uc6b0\uc5d4": 20, "overhead\uac00": 20, "\ucd5c\uc18c\ud654\ud558\uae30": [20, 23, 33], "\uc801\uc6a9\ud558\uace0": 20, "module\uc740": 20, "\uace0\uc815\ud568": 20, "175b\ub97c": 20, "vram\uc740": 20, "2tb\uc5d0\uc11c": 20, "350gb": 20, "checkpoint": [20, 26], "size\ub294": [20, 40], "350gb\uc5d0\uc11c": 20, "35mb\ub85c": 20, "\uc904\uc784": 20, "\ube68\ub77c\uc9d0": 20, "bert": 20, "\uacbd\uc6b0\uc5d0\uc11c": 20, "\uc88b\uc74c": [20, 34], "accuraci": [20, 31], "transformer\uc5d0\uc11c": [20, 34], "matrix\uc5d0": 20, "r\uc744": 20, "matrices\uc5d0": 20, "\uc88b\uc558\uc74c": 20, "\ub274\ub7f4\ub124\ud2b8\uc6cc\ud06c\uc758": 20, "activation\uc744": 20, "\uc904\uc774\uae30\ub3c4\ud558\uace0": 20, "\ub298\ub9ac\uae30\ub3c4\ud558\ub294": 20, "\uc5b4\ub311\ud130\ub97c": [14, 20], "\uc911\uac04\uc5d0": 20, "\uc0bd\uc785\ud558\ub294": 20, "lora\ubcf4\ub2e4": 20, "\uc0ac\uc6a9\ud558\uba74\uc11c": [20, 29], "\uc54c\ub824\uc838\uc788\uc73c\uba70": 20, "3\ub97c": 20, "\ud588\uc744\ub54c": 20, "\ubcf4\ub2e4\ub3c4": [20, 38], "\uc8fc\uc7a5\ud558\uace0": 20, "\ud559\uc2b5\uc2dc\uac04\ub3c4": 20, "\uc9e7\uc544": 20, "30\ubd84\ub9cc\uc5d0": 20, "\ud29c\ub2dd\ud560": [20, 21], "loralib": 20, "\uc124\uce58": 20, "pip": 20, "instal": 20, "altern": [20, 37], "git": 20, "microsoft": 20, "befor": 20, "in_featur": 20, "out_featur": 20, "after": 20, "add": [20, 36], "parameter\ub9cc": 20, "bigmodel": 20, "string": 20, "lora_": 20, "mark_only_lora_as_train": 20, "loop": [20, 42], "dataload": [20, 37], "\uc800\uc7a5\ud560": 20, "\ub54c\uc5d4": 20, "state_dict": 20, "\uc800\uc7a5\ud558\uac8c": 20, "save": 20, "checkpoint_path": 20, "lora_state_dict": 20, "\ubd88\ub7ec\uc62c": 20, "load_state_dict": 20, "strict": 20, "load": [20, 25, 36], "ckpt_pretrain": 20, "pt": [20, 34], "ckpt_lora": 20, "llm": [20, 22, 38], "\ud29c\ub2dd": [20, 30], "gpu\ub85c": [20, 26], "\uac00\ub2a5\ud560\uae4c": [20, 28], "\uc18c\uac1c\ud569\ub2c8\ub2e4": [20, 28, 32, 36, 39, 42, 43], "da": 20, "nhctrrve": 20, "2209": 21, "14792": 21, "jeonghwa": [14, 21, 28, 44], "yoo": [14, 21, 28, 44], "26": [21, 23, 32, 43], "lucidrain": 21, "\uac00\uc18d\ud654": [21, 40], "\ud558\uc600\uc74c": 21, "\ud544\uc694\ud558\uc9c0": [21, 24, 32, 40], "\ubc29\ub300\ud558\ub2e4\ub294": 21, "\uc720\uc9c0\ud568": 21, "tensor\ub97c": 21, "\ubd84\ud574\ud558\uc5ec": 21, "\uadfc\uc0ac\ud654": 21, "\uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0": 21, "\uc801\uc6a9\ud558\uae30": 21, "pipeline\uc744": 21, "\uc124\uacc4\ud568": 21, "\ud0dc\uc2a4\ud06c\uc5d0\uc11c": [14, 21, 28], "\ub2ec\uc131": [14, 21, 22, 23, 28, 29, 30, 34], "\uc778\ud130\ub137\uc744": 21, "\ud655\ubcf4\ub420": 21, "\uaddc\ubaa8\uc758": [21, 25, 28, 29], "\uc218\uc9d1\ud558\uae30\ub294": 21, "\uc874\uc7ac\ud558\ub294\ub370": 21, "\ub0ad\ube44\uc77c": 21, "\ube44\uc9c0\ub3c4": 21, "\ub808\uc774\ube14\uc774": 21, "\uc9c0\uc815\ub418\uc9c0": 21, "\ud398\uc5b4\ub9c1\ub41c": 21, "\uc5c6\uc774\ub3c4": [21, 32, 38, 40], "\ube44\ub514\uc624\ub9cc\uc73c\ub85c": 21, "\uc138\uc0c1\uc758": 21, "\uac1c\uccb4\uac00": 21, "\uc6c0\uc9c1\uc774\uace0": 21, "\uc0c1\ud638": [14, 21], "\uc791\uc6a9\ud558\ub294\uc9c0": 21, "\ub514\ud4e8\uc804": [14, 21, 28], "t2v\ub85c": 21, "\ubc29\ubc95\uc778": [14, 21], "video\ub97c": [21, 30], "prior\ub85c": 21, "\ud544\uc694\uc131\uc744": 21, "\uc6b0\ud68c\ud55c\ub2e4": 21, "\uace0\ud654\uc9c8": [21, 34, 35], "\uace0\ud504\ub808\uc784\ub960": 21, "\uc2dc\uc2a4\ud15c\uacfc": 21, "\ube44\uad50\ud558\uc5ec": 21, "\ud3c9\uac00\ud55c\ub2e4": 21, "\uc81c\ub85c\uc0f7": 21, "300\uac1c\uc758": 21, "\ud14c\uc2a4\ud2b8": [14, 21, 33], "\uc218\uc9d1\ud558\uc5ec": 21, "\uacf5\uac1c\ud560": 21, "\uacc4\ud68d\uc774\ub2e4": 21, "\uc2e0\uacbd\ub9dd\uc758": 21, "\ube14\ub85d\uc744": 21, "\ucc28\uc6d0\uc73c\ub85c": 21, "\uc2dc\uacf5\uac04": 21, "\uc2e0\uacbd\ub9dd\uacfc": 21, "\ud504\ub808\uc784": [14, 21, 30], "\uc218\uc2dd": [21, 43], "sr_h": 21, "sr": [21, 38], "t_l": 21, "uparrow_": 21, "bpe": [21, 34], "c_x": 21, "understand": [21, 28, 34, 38], "\uacf5\uc720\ud558\uc600\ub2e4": 21, "\ub9cc\ub4e4\uae30": 21, "x_e": 21, "y_e": 21, "rgb": [21, 23, 33, 34], "_l": 21, "sr_l": 21, "d\uc5d0\uc11c": 21, "768x768": [21, 40], "\ud53d\uc140\ub85c": 21, "\uc99d\uac00\uc2dc\ucf1c": 21, "\ubcc0\ud658\ub41c\ub2e4": 21, "fp": [21, 30], "2\ucc28\uc6d0": [21, 23], "\uc2dc\uac04\uc801": [14, 21, 30], "\ub2e4\uc74c\uc758": [21, 31], "\uc218\uc815\ud55c\ub2e4": 21, "layers\ub294": 21, "\uc815\ubcf4\ub9cc": 21, "\ucd94\uac00\ud574\uc8fc\uba74": 21, "\uc218\uc815": 21, "\uc0ac\uc774\uc988\uc758": [21, 38], "frame\uc744": 21, "\ub9cc\ub4e4\uac8c": 21, "16\uac1c\uc758": 21, "\ud504\ub808\uc784\uacfc": [14, 21], "\uc0ac\uc774\ub97c": 21, "\ubcf4\uac04\ud558\uc5ec": 21, "\uc99d\uac00\uc2dc\ud0a8\ub2e4": 21, "\ub124\ud2b8\uc6cc\ud06c\uc5d0\ub294": 21, "hallucin": [14, 21], "\ud658\uac01": 21, "\ud3ec\ud568": [21, 22, 36], "\uae5c\ubc15\uc774\ub294": [14, 21], "\uc794\uc0c1\uc774": 21, "\uc0dd\uae30\uc9c0": [21, 33], "\uc54a\uc73c\ub824\uba74": 21, "\ud658\uac01\uc774": 21, "\uc804\uccb4\uc5d0": [21, 23, 43], "\uc720\uc9c0\ud574\uc57c": 21, "\uc815\ubcf4\ub098": 21, "\uac00\uc0c1\uc73c\ub85c": 21, "\ud504\ub808\uc784\ub2f9": [14, 21], "\uc218\ud589\ud558\ub294": 21, "\ubaa8\ub4c8\uc778": 21, "\ubaa8\ub4c8\ub85c": 21, "\ub9cc\ub4e4\uae30\uc5d4": 21, "\uba54\ubaa8\ub9ac": [21, 30, 40], "\ucef4\ud4e8\ud305": [14, 21], "\ubd80\uc871\uc73c\ub85c": 21, "\uc5b4\ub824\uc6e0\ub2e4": 21, "\ucc28\uc6d0\uc5d0\uc11c": [21, 30], "\ud504\ub808\uc784\uc5d0": [14, 21, 30], "\ucd08\uae30\ud654\ub97c": 21, "\uc804\ubc18\uc5d0": 21, "\ud658\uac01\uc744": 21, "\uc81c\uacf5\ud568": [21, 29], "\ucee8\ubc8c\ub8e8\uc158": 21, "\ub808\uc774\uc5b4": [14, 21], "\ub2e4\uc74c\uc5d0": [21, 27], "1d": 21, "\ucee8\ubc8c\ub8e8\uc158\uc744": 21, "\uc313\ub294\ub2e4": 21, "\ucee8\ubc8c\ub8e8\uc158\uc758": 21, "load\ub97c": 21, "\ucee8\ubcfc\ub8e8\uc158": 21, "\ub808\uc774\uc5b4\uc640": 21, "\uc0ac\uc774\uc5d0": [21, 40], "\uacbd\uacc4\ub97c": 21, "information\uc744": 21, "\ucc44": [21, 36], "\ud150\uc11c": 21, "height": 21, "2_d": 21, "1_d": 21, "\ud568\uc218\ub85c": [21, 23, 32], "layer\uc5d0": [21, 27], "\ud655\uc7a5\ud558\uc600\ub2e4": 21, "layer\ucc98\ub7fc": 21, "attenion": 21, "\uc313\uc544": 21, "\uadfc\uc0ac\ud654\ud558\ub294": [21, 43], "flatten": 21, "\ucd95\uc5d0": [21, 25], "flatten\ud558\ub294": 21, "\uc5f0\uc0b0": [21, 34], "hw": 21, "attn_": 21, "spatiotemporalattent": 21, "add_feed_forward": 21, "ff_mult": 21, "pos_bia": 21, "flash": 21, "causal_time_attn": 21, "assert": [21, 27, 31], "compat": 21, "spatial_attn": 21, "spatial_rel_pos_bia": 21, "continuouspositionbia": 21, "num_dim": 21, "temporal_attn": 21, "causal": [21, 34], "temporal_rel_pos_bia": 21, "has_feed_forward": 21, "ff": 21, "mult": 21, "enable_tim": 21, "is_video": 21, "ndim": 21, "bxf": 21, "hxw": 21, "space_rel_pos_bia": 21, "exist": 21, "rel_pos_bia": 21, "bxhxw": 21, "time_rel_pos_bia": 21, "\ube44\ub514\uc624\uc758": [14, 21], "\ucd08\ub2f9": [14, 21], "\ub098\ud0c0\ub0b4\ub294": [21, 23, 29, 33], "\ucee8\ub514\uc154\ub2dd": [14, 21], "\ud30c\ub77c\ubbf8\ud130": [21, 25, 32, 36, 37, 43], "\ucd94\uac00\ud55c\ub2e4": [14, 21, 25, 30], "\ub780": [21, 30], "\ubd80\ub4dc\ub7fd\uac8c": 21, "\ub9cc\ub4e4\uace0": [21, 28, 29], "\uc5f0\uc7a5": 21, "\uc2dc\ud0ac": [21, 28, 31], "\ud504\ub808\uc784\uc744": [14, 21, 30], "\ubcf4\uac04\ud558\uace0": 21, "extrapolation\uc744": 21, "extrapol": 21, "\ubbf8\ub798\uc758": 21, "\uc608\uce21\ud558\uac70\ub098": 21, "spatialtempor": 21, "\ucc98\ub9ac\ub41c": 21, "\uc81c\ub85c": 21, "\ud328\ub529\ud558\uace0": 21, "\uc5c5\uc0d8\ud50c\ub9c1\uc744": 21, "interpolation\uc744": 21, "\ud30c\uc778": [14, 21, 28, 30], "\ud29c\ub2dd\ud55c\ub2e4": 21, "\uc785\ub825\uc5d0": 21, "\ucc44\ub110\uc744": [14, 21], "\ub9c8\uc2a4\ud0b9": 21, "\uc785\ub825\uc744": [14, 21, 23, 28], "3\uac1c\uc758": 21, "\ub9c8\uc2a4\ud0b9\ub418\ub294": 21, "\ubc14\uc774\ub108\ub9ac": 21, "\ucc44\ub110": [21, 23, 25, 30], "skips\uacfc": 21, "\ud30c\uc778\ud29c\ub2dd\ud558\uc5ec": [14, 21, 28], "\ucd94\ub860\uc2dc": [14, 21], "rate\ub97c": [21, 29], "\uc81c\uacf5\ud55c\ub2e4": [21, 40], "f\ub97c": 21, "5\ub85c": 21, "16\ud504\ub808\uc784": 21, "76\ud504\ub808\uc784": 21, "x5": 21, "\uc5c5\uc0d8\ud50c\ub9c1": 21, "\ub05d": 21, "\ub9c8\uc2a4\ud0b9\ud558\uc5ec": 21, "\ucd94\uc815": [21, 23, 29, 40], "\uc560\ub2c8\uba54\uc774\uc158\uc5d0\ub3c4": 21, "\uc694\uc18c\ub4e4\uc740": 21, "\ub300\ud574\uc11c\ub9cc": [21, 28, 31, 33], "\ube44\ub514\uc624\uc5d0": [14, 21], "\ud29c\ub2dd\ud558\uc9c0": 21, "\ub9cc\uc73c\ub85c": [21, 32, 39, 40], "decoder\ub294": 21, "\uc911\uc5d0": [21, 34], "\ub4e4\uc5b4\uc628": 21, "\ubc1b\ub294\ub2e4": 21, "\ub05d\ub098\uba74": 21, "\ub808\uc774\uc5b4\ub97c": [14, 21, 25], "\ucd08\uae30\ud654\ud558\uc5ec": 21, "\ube44\ub514\uc624\uc5d0\uc11c": [14, 21], "16\ud504\ub808\uc784\uc774": 21, "\ub514\ucf54\ub354\ub97c": [14, 21], "\ucd08\uae30\uc5d0\ub294": 21, "\ubc94\uc704": [21, 38, 39, 41], "\ubaa8\uc158\uc774": [14, 21], "\uc2dc\uc791\ud558\uace0": [21, 41], "\uc774\ud6c4\uc5d0\ub294": 21, "\uc804\ud658\ud55c\ub2e4": [21, 30], "\ub124\ud2b8\uc6cc\ud06c\ub294": 21, "\ub514\ucf54\ub354\ub85c\ubd80\ud130": 21, "\ud29c\ub2dd\ub41c\ub2e4": 21, "5b": [21, 26, 31, 40], "3b\uc758": 21, "\uc0ac\uc6a9\ud558\uc600\ub2e4": [14, 21], "nsfw": 21, "\uc720\ud574\ud55c": 21, "\uc6cc\ud130\ub9c8\ud06c": 21, "5\ubcf4\ub2e4": 21, "\ud544\ud130\ub9c1\ud558\uc600\ub2e4": 21, "Not": 21, "safe": [21, 31], "For": [21, 23], "\uc120\uc815\uc801\uc774\uac70\ub098": 21, "\uc74c\ub780\ud558\uac70\ub098": 21, "\ud3ed\ub825\uc801\uc778": 21, "\ucf58\ud150\uce20": 21, "10m\uacfc": 21, "hd": 21, "vila": 21, "100m": 21, "10m\uc744": 21, "100m\uc744": 21, "\uc561\uc158": 21, "\uace0\uc548\ub418\uc5c8\uc73c\uba70": 21, "\ud658\uacbd\uc5d0\uc11c": 21, "\ucd2c\uc601\ub41c": 21, "\ud074\ub9bd": 21, "\ube44\ub514\uc624\uc640": 21, "\ud074\ub798\uc2a4\uc5d0": [21, 31], "\ud15c\ud50c\ub9bf": 21, "\ubb38\uc7a5\uc744": [21, 29], "\uc791\uc131\ud558\uace0": 21, "fretchet": 21, "\uce21\uc815\ud55c\ub2e4": 21, "train\uc14b\uacfc": 21, "\ud074\ub798\uc2a4": [21, 28, 31], "\uc138\ud2b8\uc758": 21, "59": 21, "794": 21, "\ucea1\uc158\uc5d0": 21, "clipsim": 21, "amazon": 21, "turk": 21, "amt": [21, 33], "\uc218\uc9d1\ud558\uc600\ub2e4": 21, "annotator\ub4e4\uc5d0\uac8c": 21, "\uc2dc\uc2a4\ud15c\uc774": 21, "\uc2f6\uc740\uc9c0": 21, "\ubb3c\uc5b4\ubd24\ub2e4": 21, "\ubd88\uc644\uc804\ud558\uac70\ub098": 21, "\ucd94\uc0c1\uc801\uc774\uac70\ub098": 21, "\ubd88\ucf8c\uac10\uc744": 21, "\ud544\ud130\ub9c1": 21, "\uce74\ud14c\uace0\ub9ac": 21, "\ub3d9\ubb3c": [21, 31], "\ud310\ud0c0\uc9c0": 21, "\uc790\uc5f0": [21, 29], "\ud48d\uacbd": [21, 25], "\uc74c\uc2dd": 21, "\uc74c\ub8cc": 21, "\uc2dd\ubcc4\ud558\uace0": 21, "\uc120\ud0dd\ud558\uc600\ub2e4": 21, "\ub3d9\uc601\uc0c1\uc744": [14, 21], "\ub370\uc5d0": 21, "\uc0ac\uc6a9\ub418\uc9c0": 21, "\uace0\uc815\ub41c": [21, 23, 25, 29, 32, 37, 40], "\uc720\uc9c0\ud588\ub2e4": 21, "imagen\uc758": [21, 28], "drawbench": 21, "\ud504\ub86c\ud504\ud2b8\ub3c4": 21, "vedio": 21, "faithfulness\ub97c": 21, "\ud3c9\uac00\ud558\uc600\ub2e4": 21, "\ud488\uc9c8": [14, 21, 28], "\uc21c\uc11c\ub85c": 21, "\ud488\uc9c8\uc774": [21, 27, 33], "\uc88b\uc740\uc9c0": 21, "annotator\uc5d0\uac8c": 21, "\ubb3c\uc5b4\ubcf8\ub2e4": 21, "vdeio": 21, "faith": [21, 24], "\ube44\ub514\uc624\uac00": 21, "\uc77c\uce58\ud558\ub294\uc9c0": 21, "\ubcf4\uac04": 21, "film\uc758": 21, "\ubaa8\uc158": [14, 21], "\uc0ac\uc2e4\uac10\uc744": 21, "\ube44\uad50\ud558\uae30": [21, 29], "\ud3c9\uac00\ub3c4": 21, "5\uba85\uc758": 21, "\uac01\uae30": 21, "annotator\uc758": 21, "\ub2e4\uc218": [21, 35], "\ub4dd\ud45c\ub97c": 21, "vtt\uc5d0": 21, "\ubcf4\uace0\ud558\ub294": 21, "godiva": 21, "nuwa": 21, "\uc911\uad6d\uc5b4\uc640": 21, "\uc601\uc5b4\ub97c": 21, "cogvideo": 21, "\ucd94\ub860\uc744": [21, 31], "\uc218\ud589\ud558\uc600\ub2e4": 21, "\uc0f7": 21, "\uc6b0\uc218\ud558\ub2e4": 21, "finetunning\uc744": 21, "\uacb0\uacfc\uc5d0\uc11c\ub3c4": 21, "\ub2ec\uc131\ud558\uc600\ub2e4": 21, "drawbench\uc640": 21, "\ud14c\uc2a4\ud2b8\uc14b\uc5d0": 21, "cogvideo\uc640": 21, "\ube44\uad50\ud55c\ub2e4": [14, 21, 40], "vdm\uc758": 21, "\uc6f9": 21, "\ud398\uc774\uc9c0\uc5d0": 21, "\ud45c\uc2dc\ub41c": [21, 28], "28\uac1c\uc758": 21, "\ub3d9\uc601\uc0c1\uc5d0": [14, 21], "8\uac1c\uc758": [21, 23], "8\ubc88": 21, "\ud3c9\uac00\ud558\uc5ec": 21, "76x256x256": 21, "\ud574\uc0c1\ub3c4\ub85c": [21, 30], "\ud3c9\uac00\uc790\uac00": 21, "\ub0ab\ub2e4\uace0": 21, "\ud22c\ud45c\ud55c": 21, "\ud37c\uc13c\ud2b8": 21, "\ube44\uc728": [21, 25], "\ubca4\uce58\ub9c8\ud06c\uc5d0\uc11c": 21, "video\uac00": 21, "film\uc744": 21, "drawbench\uc758": 21, "\uc800\ud504\ub808\uc784\ub960": 21, "4fps\uae4c\uc9c0": 21, "\uc5c5\uc0d8\ud50c\ub9c1\ud55c\ub2e4": 21, "\ud3c9\uac00\uc790\ub4e4\uc740": 21, "62": 21, "drawbench\uc5d0": 21, "54": 21, "\ucee4\uc11c": [21, 26, 33], "\ubb3c\uccb4\uac00": [21, 23], "\uc6c0\uc9c1\uc774\ub294\uc9c0\uc5d0": 21, "\uc9c0\uc2dd\uc774": 21, "\uad00\ucc30": 21, "\ub9e8": 21, "vdm": 21, "\uac00\uc6b4\ub370": 21, "\ubaa8\uc158\uc758": 21, "\ud48d\ubd80\ud55c": [21, 22], "\ucf58\ud150\uce20\ub97c": [14, 21, 23], "extrpol": 21, "\uc8fc\uc5b4\uc9c0\uba74": [14, 21], "\ub3d9\uc601\uc0c1\uc73c\ub85c": [14, 21], "\uc560\ub2c8\uba54\uc774\uc158\ud654": 21, "\uc0ac\uc6a9\uc790\ub294": [21, 27, 29], "\uac1c\uc778\ud654\ud558\uace0": 21, "\uc81c\uc5b4\ud560": [14, 21], "film": 21, "\uc6c0\uc9c1\uc774\ub294": [14, 21], "\uc804\ud658\ud558\uae30\ub9cc": 21, "\uc758\ubbf8\ub860\uc801\uc73c\ub85c": 21, "\ub9cc\ub4ec": 21, "\uc8fc\ubcc0": [21, 40], "\uc138\uacc4\ub85c\ubd80\ud130": 21, "\uc9c0\uc2dd\uc744": 21, "intelligence\ucc98\ub7fc": 21, "system\ub3c4": 21, "\uc778\uac04\uc758": 21, "\ubaa8\ubc29\ud560": 21, "\ucc3d\uc758\uc801\uc774\uace0": 21, "\uc720\uc6a9\ud560": 21, "\uc5f0\uad6c\uc790\ub4e4\uc740": 21, "\ub3d9\uc601\uc0c1\uc5d0\uc11c": 21, "\uc138\uacc4\uc758": 21, "dynamic\uc744": 21, "\ud559\uc2b5\ud568\uc73c\ub85c\uc368": [21, 26, 29, 32, 37], "\uadf9\ubcf5\ud560": [21, 29], "2301": 22, "00704": 22, "mar": 22, "t5": [22, 31, 36], "xxl": [22, 31, 36], "\uc8fc\uc5b4\uc9c0\uace0": 22, "\ub79c\ub364\ud558\uac8c": [22, 36], "\ube44\uad50\ud560": [22, 33], "\uc801\uc5b4": 22, "grain": [22, 26], "\ucd94\ucd9c\ud558\uc5ec": [14, 22], "concept": [22, 29, 38], "\uc790\uc138": 22, "900m": 22, "cc3m": 22, "06": [22, 39], "3b": 22, "\ud30c\uc778\ud29c\ub2dd": [14, 22, 25, 28], "outpaint": 22, "22": [22, 23, 34], "02": [22, 33], "maskgit": 22, "googl": [22, 39, 41], "\ub514\ucf54\ub529": [14, 22], "\uc2dc\uc5d0": [14, 22], "\ub9c8\uc2a4\ud0b9\ub41c": [22, 30], "\uc608\uce21\ud558\uc9c0\ub9cc": 22, "\uc2e0\ub8b0\ub3c4\uac00": 22, "\ud1a0\ud070\ub9cc": 22, "\ub514\ucf54\ub529\ub428": 22, "\uc904\uc5ec": [22, 40], "\ud5a5\uc0c1": [14, 22, 23, 26, 28, 34], "\uc778\ucf54\ub529\ub418\uace0": 22, "\ub514\ucf54\ub529\ub418\uc5b4": 22, "\ubcf5\uc6d0\ub418\ub294": [22, 33], "\ud559\uc2b5\uc740": 22, "16x16": [22, 35], "\ud30c\ub77c\ubbf8\ud130\uc758": [22, 37], "\ub300\ubd80\ubd84\uc774": 22, "\ud30c\ub77c\ubbf8\ud130\ub85c": [22, 25, 40], "unmak": 22, "\ud1a0\ud070\uacfc": 22, "t5xxl": 22, "\ubc14\uafb8\ub294\ub370": [22, 29], "noun": [22, 36], "action": 22, "verb": 22, "adject": 22, "preposit": 22, "\uac83\uc774\ub77c\uace0": [22, 28], "\uc120\ud589": 22, "4096": [22, 23], "\uc5bb\uc74c": 22, "transformer\uc5d0": 22, "\uc785\ub825\ub418\uac8c": 22, "\ub9de\ucda4": [22, 29], "\uc9c4\ud589\ub41c": 22, "codebook": 22, "\ub9e4\ud551\uc744": [22, 33], "\ub514\ucf54\ub529\uc774": 22, "\ud574\uc0c1\ub3c4\uc758": [14, 22, 25], "\uc778\ucf54\ub529\ud560": 22, "tame": 22, "\uc778\ucf54\ub529\ub41c": [14, 22, 30], "\ud1a0\ud070\uc774": 22, "\ubb34\uc2dc\ud558\uba74\uc11c": 22, "\ud568\uc744": [22, 23], "entropi": 22, "\uc788\uac8c\ub428": 22, "unmask": 22, "\ud1a0\ud070\uc740": [22, 29, 34], "\uad50\uccb4": 22, "\uc120\ud615\uc801\uc73c\ub85c": [22, 40], "hidden": 22, "\uc0ac\uc774\uc988\uc5d0": 22, "\ube14\ub7ed\uc774": 22, "\ubcc0\uacbd\ud558\ub294\ub370": 22, "\uc0ac\uc6a9\ub418\uace0": 22, "\uc624\ucc28\ub97c": [22, 23], "\uacc4\uc0b0\ud568": 22, "tokens\ub97c": 22, "\uc99d\uac00\ud558\uae30": 22, "\uad6c\uc131\ud588\uc744": 22, "\ud3ec\ucee4\uc2f1": 22, "\uc9c4\ud589\ub428": 22, "\uacc4\uce35\uc801\uc73c\ub85c": 22, "\uc124\uacc4\ud588\uc74c": 22, "\uc644\ub8cc\ub418\uba74": 22, "\uc774\ud6c4\uc5d0": 22, "\ub298\ub9bc": 22, "4\uac1c": 22, "\ud45c\uc9c0\ud310\uc774": 22, "\ubcf5\uc6d0\uc774": 22, "\ub410\uc74c": 22, "\ud004\ub9ac\ud2f0\uc640": 22, "ell_g": 22, "ell_c": 22, "ell_u": 22, "l_c": 22, "l_u": 22, "cfg": [22, 40], "\uc99d\uac00\uc2dc\ud0a4\ub294": [22, 28, 32], "\uac70\uccd0": [22, 23, 32, 33, 37, 41], "\uadf9\ubcf5": [22, 23], "\uc5c6\uac70\ub098": [14, 22, 27], "\ub0ae\uac8c": [22, 35], "\ud6c4\ubc18\uc5d0\ub294": 22, "\uc8fc\uac8c": [22, 28, 33], "\ub85c\ub3c4": [22, 43], "foward": 22, "\uc5f0\uc0b0\uc73c\ub85c": 22, "\ub3d9\uc791\ud568": 22, "condition": 22, "independ": 22, "\uc218\ud589\ub428": 22, "\uc608\uce21\ub418\ub294": 22, "\uc120\ud0dd\ud574": 22, "\ud574\uc81c\ub418\ub294": 22, "\uc808\ucc28\ub97c": [14, 22, 23], "rich": [22, 39], "\uc218\ubc31\ubc88\uc758": 22, "460m": 22, "1m": 22, "week": 22, "core": 22, "tpu": 22, "v4": 22, "chip": 22, "adafactor": [22, 28], "cardin": 22, "\ubc88": [22, 27, 31, 32], "\ud68c\uc804\ub41c": 22, "\ud004\ub9ac\ud2f0": [22, 30, 39], "\ub2e4\uc591\uc131": [14, 22, 28], "prompt\uc640\uc758": 22, "\uce21\uc815\ud588\uc74c": 22, "\uac00\uc838\uc62c": 22, "\uc788\ub098\uc694": 22, "\uc544\ubb34\ub798\ub3c4": 22, "\ubaa8\ub378\uc774\ub77c": 22, "\ubaa8\ub378\uc778\uac00\uc694": 22, "\uae30\uc900\uc810\uc774": 22, "\uc5b4\ub5bb\ub0d0\uc5d0": 22, "\uc544\ub2c8\ub2e4": [22, 31], "\uc815\ud558\uae30": 22, "vqgan\uc744": 22, "gan\uc774\ub77c\uace0": 22, "\uc0dd\uac01\ud560": 22, "\uacb0\uacfc\uc5d0": [22, 28, 31], "\ub2ec\ub77c\uc9c8": [22, 27], "\uad00\uc810\uc5d0\uc11c": [22, 40], "\uc0dd\uac01\ud558\uba74": 22, "\uc544\ub2c8\ub2e4\ub77c\uace0": 22, "\ub9d0\ud560": [22, 29], "\uac16\ub098\uc694": 22, "vqgan\uc5d0\uc11c": 22, "\uc778\ucf54\ub529\ud558\uace0": [14, 22], "\uc555\ucd95": [22, 34], "codebook\uc758": 22, "\uac00\uc838\uc640": [22, 25, 30], "\uad6c\uc131\ud558\ub294\ub370\uc694": 22, "\ud3ec\ud568\ub418\uc5b4": 22, "\ud3ec\uc778\ud2b8\uc5d0": 22, "token\uc774\ub77c\uace0": 22, "\uc0dd\uac01\ud558\uc2dc\uba74": 22, "\ub123\uc5c8\uc744\ub54c": 22, "\uc774\ub904\uc9c0\ub098\uc694": 22, "inference\uc5d0\uc11c\ub294": 22, "\uc5c6\ub294\ub370": 22, "token\ub300\uc2e0": 22, "\ub4e4\uc5b4\uac00\uac8c": [22, 27, 39, 41], "\ub418\ub098\uc694": 22, "\ub9c8\uc2a4\ud06c\ub41c": 22, "\ud615\ud0dc\ub85c": [22, 23, 25, 32, 35, 42, 43], "step\uc744": [22, 25, 29, 40], "\uc218\ud589\ub429\ub2c8\ub2e4": 22, "\uc218\uc2dd\uc5d0": 22, "\ub4e4\uc5b4\uac00\ub098\uc694": 22, "value\ub85c": 22, "\uc785\ub825\ub418\uc5b4": 22, "\uc218\ud589\ub418\uac8c": 22, "\uadf8\ub807\uac8c": [22, 28, 29], "feature\uc640": 22, "gt\uc758": 22, "\ub07c\ub9ac": 22, "2108": 24, "01073": 24, "03": [24, 42], "\ubd84\uc57c\uc5d0\uc11c\uc758": 24, "\uc9c4\ud654": 24, "\uacc4\uc18d": [24, 41], "\ub418\uc5b4\uc624\uace0\uc788\ub2e4": 24, "\uc774\ub04c\uc5b4\ub0b4\ub824\ub294": 24, "\ubd84\uc57c\ub3c4": 24, "\ud65c\ubc1c\ud788": [24, 26], "\uc9c4\ud589\ub418\uace0\uc788\ub2e4": 24, "\ubc29\uc2dd\uc73c\ub85c\uc758": 24, "editing\uc5d0\ub294": 24, "\uba87\uac00\uc9c0": 24, "sdedit\uc740": 24, "\ud574\uacb0\ud574\ub098\uc544\uac14\ub2e4\ub294": 24, "contribution\uc73c\ub85c": 24, "\uc81c\uc2dc\ud558\uc600\ub2e4": 24, "abstract\uc5d0\uc11c": 24, "\ub9d0\ud55c": 24, "editing\uc774\ub780": 24, "\uc720\uc800\uac00": [24, 29], "\uc81c\uc2dc\ud558\uba74": 24, "\ub450\uac00\uc9c0\uc758": 24, "\ud3c9\uac00\uc694\uc18c\uac00": 24, "\uc720\uc800\uc758": 24, "\ub530\ub974\ub294\uc9c0": 24, "real\ud55c\uc9c0": 24, "\uc5f0\uad6c\ubc29\uc2dd\uc740": 24, "\ub450\uac00\uc9c0\ub85c": 24, "\ub098\ub25c\ub2e4": 24, "\uc774\ub8ec": 24, "\uc774\ubbf8\uc9c0\uc5d0\uc11c": [14, 23, 24, 28], "edit\ub41c": 24, "condition\ub9c8\ub2e4": 24, "\uc7ac\ud559\uc2b5\uc744": 24, "\uc694\uad6c": [14, 23, 24], "inversion\ud55c": 24, "vactor\ub97c": 24, "\uc870\uc791\ud574": 24, "function\uc774": 24, "\uc815\uc758\ub418\uc5b4\uc57c\ud558\uace0": 24, "function\uacfc": 24, "\uc7ac\ud559\uc2b5\uc774": 24, "\ud55c\uac1c\uc758": 24, "weight\ub85c": 24, "\ubd84\ud3ec\uc5d0\uc11c": [24, 29], "\ub192\uc740\uacf3\uc73c\ub85c": 24, "\ud574\ub098\uac00\uba74": 24, "\uc5bb\uc5b4\ub0bc": 24, "score\ub294": [24, 28], "\ubc00\ub3c4": [23, 24], "\ud568\uc218\uc758": [23, 24], "\uc21c\uac04": 24, "\uae30\uc6b8\uae30": 24, "\ubbf8\ubd84\uac12": 24, "\uc8fc\uc785\ud558\ub294\ub370": 24, "\uc8fc\uc785\ud55c\ub2e4": 24, "ddpm\uacfc\uc758": 24, "\uc815\uc758\ud558\ub294": [24, 32], "equation\uc758": 24, "\uc815\ub3c4\uc774\ub2e4": 24, "1907": 24, "05600": 24, "level\uc744": 24, "\uc774\ubbf8\uc9c0\uc704\uc5d0": 24, "patch\ub97c": 24, "stroke\ub97c": 24, "coarse\ud55c": 24, "stroke\uc758": 24, "procedur": [23, 24, 41], "sde\uc758": 24, "noise\ud654\ub41c": 24, "\uc9c4\ud589\ud560": [24, 34], "\ud544\uc694\uac00": [24, 33, 36], "\uc815\uc758\ud574\uc57c\ud558\ub294\ub370": 24, "realistic\ud558\uc9c0\ub9cc": 24, "\ud558\uc9c0\uc54a\uc740": 24, "faithful\ud558\uc9c0\ub9cc": 24, "artistic\ud55c": 24, "\uc5bb\uac8c\ub41c\ub2e4": 24, "sdedit\uc758": 24, "\uacfc\uc815\uc774\ub2e4": 24, "\uc885\ud569\uc801\uc778": 24, "survey\ub97c": 24, "\ubc29\uc2dd\ub4e4\uacfc": 24, "stylegan": 24, "ada": 24, "sdedit\uc774": 24, "\uc790\uc5f0\uc2a4\ub7fd\uace0": [24, 26], "blend": 24, "\uc804\ud1b5\uc801\uc778": [23, 24, 41], "\uae30\ubc95\uacfc": 24, "\ube44\uad50\ud574\ub3c4": 24, "01952": 25, "stabil": 25, "sdxl\uc740": 25, "\ubc30": [25, 34], "unet\uc744": 25, "\ube14\ub85d\uacfc": 25, "sdxl\uc5d0\uc11c": 25, "encoder\ub85c": 25, "\uc0ac\uc6a9\ub418\uba74\uc11c": 25, "\ud30c\ub77c\ubbf8\ud130\uac00": 25, "\uc99d\uac00\ud588\ub2e4": 25, "\ub2e4\uc218\uc758": 25, "\ube44\uc728\uc5d0": 25, "sdxl\uc744": 25, "\uc124\uacc4\ud588\ub2e4": 25, "sdxl\uc758": 25, "\uc2dc\uac01\uc801\uc778": [23, 25, 29], "fidelity\ub97c": [14, 25], "\ud5a5\uc0c1\uc2dc\ud0a8": 25, "\ub300\ud3ed": [14, 25, 40], "\uae30\ub2a5\uc774\ub77c": 25, "\uac10\ub3c5": 25, "supervis": [25, 33], "\uac04\ub2e8\ud558\uba74\uc11c\ub3c4": 25, "\ucd94\uac00\uc758": 25, "\ud5a5\uc0c1\ud558\ub294": 25, "latent\ub97c": [14, 25], "\ubcc4\uac1c\uc758": 25, "\uadf8\ub9bc": [25, 28, 29], "\ub192\uc778": 25, "sdxl\uc774": 25, "sd\ubcf4\ub2e4": 25, "\uc2dc\uac01\ud654\ud588\ub294\ub370": 25, "128x128": [25, 41], "\ud65c\uc6a9\ud558\uace0": [14, 25], "sdedit\uc744": 25, "\uc801\uc6a9\ud55c\ub2e4": [14, 25, 30], "sdxl\uacfc": 25, "autoencoder\ub97c": 25, "sd\uc640": 25, "\ube14\ub85d\uc758": 25, "heterogen": 25, "\uc0ac\uc6a9\ud588\ub2e4\ub294": [25, 35], "\ud14c\uc774\ube14": [25, 35], "1\uc744": 25, "\ucc38\uace0\ud558\uba74": [25, 35], "highest": 25, "level\uc5d0\uc11c": 25, "\ube14\ub7ed\uc744": 25, "unet\uc5d0\uc11c": 25, "lowest": 25, "8x": 25, "l\uacfc": 25, "bigg\ub97c": 25, "encoder\uc758": [14, 25, 28, 29], "\uc0ac\uc6a9\ud588\uc73c\uba70": [25, 41], "openclip\ub85c\ubd80\ud130": 25, "\ucd94\uac00\ud588\ub2e4": [25, 30], "\uc0ac\uc774\uc988\uac00": 25, "6b\ub85c": 25, "817m": 25, "\uc2dc\ud0a4\uac70\ub098": 25, "upscale\ud558\uc5ec": 25, "\ucd5c\uc18c": [14, 25, 32], "\ud06c\uae30\uac00": 25, "\uc815\ud574\uc9c0\ub294": 25, "\ubb38\uc81c\uc810\uc774": 25, "\uc800\ud558\uc2dc\ud0a4\uac70\ub098": 25, "\uc77c\ubc18\ud654\ub97c": 25, "\uc14b\uc758": 25, "\uc2dc\uac01\ud654\ud574\uc8fc\ub294": 25, "\uadf8\ub9bc\uc774\ub2e4": 25, "\uc81c\uc548\ub41c": [14, 25], "conditiong": 25, "\ubbf8\ub9cc\uc758": 25, "39": 25, "\ub2ec\ud55c\ub2e4": 25, "\uc544\ud2f0\ud329\ud2b8\uac00": [14, 25], "\uc0dd\uae34\ub2e4": [25, 38], "\uc6d0\ub798\uc758": [14, 25], "\ud574\uc0c1\ub3c4\uc5d0\uc11c": 25, "\uc8fc\uc5c8\ub2e4": [14, 25, 29], "\ud06c\uae30\uc778": 25, "\uc81c\uacf5\ud574": 25, "\ucd94\uac00\ub41c\ub2e4": 25, "\uc815\ud560": 25, "\ud574\uc0c1\ub3c4\uc5d0": 25, "\uc758\uc874\uc801\uc778": 25, "\uc5f0\uad00\uc2dc\ud0a4\ub3c4\ub85d": 25, "imagenet\uc73c\ub85c": 25, "\uc9c4\ud589\ud574": [25, 30], "conditiong\uc5d0": 25, "\uc6b0\uc218\uc131\uc744": 25, "\uc785\uc99d\ud588\ub2e4": 25, "cin": 25, "\uc2dc\ucf30\uace0": 25, "70k": 25, "\uc7a5": [14, 25], "nocond": 25, "\ud45c": 25, "\ubcf4\ub2e4\uc2dc\ud53c": 25, "4\uc5d0\uc11c": 25, "\uace0\uc591\uc774": [25, 33], "\uba38\ub9ac\uac00": [25, 27], "\uc798\ub824\uc9c4": 25, "cropping\uc73c\ub85c": 25, "\uc0dd\uc131\ub418\uc5c8\uae30": 25, "\uade0\ub4f1\ud558\uac8c": 25, "\ub192\uc774": [25, 30], "\ub108\ube44": [25, 30], "\ucd95\uc744": 25, "\ubaa8\uc11c\ub9ac\uc5d0\uc11c": 25, "\ud53d\uc140\uc758": 25, "\uc9c0\uc815\ud558\ub294": 25, "\uc0d8\ud50c\ub9c1\ud55c\ub2e4": [25, 29], "fourier": 25, "\ud30c\ub77c\ubbf8\ud130\ub85c\uc368": 25, "\uc785\ub825\ud55c\ub2e4": [14, 25], "conditioning\uacfc": 25, "dm\uc5d0\uc11c\ub3c4": 25, "\uc0ac\uc6a9\ub420": [25, 28, 29], "\uac15\uc870\ud55c\ub2e4": 25, "conditioning\uc740": 25, "\uacb0\ud569\ub420": 25, "\ud0c0\uc784\uc2a4\ud15d": 25, "1024x1024": [25, 27, 28, 39], "\ud604\uc2e4": [23, 25], "\uc138\uacc4\uc5d0\uc11c": 25, "\ubd80\uc790\uc5f0\uc2a4\ub7fd\ub2e4": 25, "\uc138\uacc4\uc5d0\uc11c\ub294": 25, "\ube44\uc728\uc744": 25, "\ub9ce\uace0": [25, 28], "\ube44\uc728\uc758": 25, "\uc9c0\ub2c8\uace0": [25, 37, 39], "\ub2e4\ub8f0\uc218": 25, "\ud30c\uc778\ud29c\ub2dd\ud588\ub2e4": 25, "\ud53d\uc140\uc218\ub97c": 25, "64\uc758": 25, "\ubc30\uc218\ub97c": 25, "\uc9c0\ub2c8\ub3c4\ub85d": 25, "ratio": [25, 41], "\ubc30\uce58\ub294": 25, "\ubc84\ud0b7": 25, "\ubc88\uac08\uc544": [25, 37], "\uac00\uba70": 25, "conditioning\uc73c\ub85c": 25, "\uc8fc\uc5c8\uc73c\uba70": 25, "\uacf5\uac04\uc5d0": 25, "\uc784\ubca0\ub529\ub418\ub294": 25, "tgt": [25, 26], "\ud45c\ud604\ub41c\ub2e4": 25, "\ube44\uc728\ubc0f": 25, "pretraining\uc774": 25, "\ub9c8\uce5c": 25, "\ud559\uc2b5\ud588\uace0": [25, 30], "\ucd95\uc73c\ub85c": 25, "2\uc808\uc5d0\uc11c": 25, "\uacb0\ud569\ud588\ub2e4": 25, "sd\ub294": 25, "\ud558\ub098\uc774\uace0": 25, "autoencoder\uc758": 25, "composition\uc740": 25, "ldm\uc73c\ub85c\ubd80\ud130": 25, "\ud45c\ud604\ub418\uc9c0\ub9cc": 25, "frequenc": [23, 25, 34], "\ub514\ud14c\uc77c\ud55c": 25, "\ud5a5\uc0c1\ud558\uace0\uc790": 25, "\ud5a5\uc0c1\ud588\ub2e4": 25, "\ub05d\uc73c\ub85c": 25, "\uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c": 25, "\ubc30\uce58\uc0ac\uc774\uc988": [14, 25], "average\ub97c": 25, "\uba54\ud2b8\ub9ad\uc5d0": 25, "\uc815\ub9ac\ud574\uc8fc\ub294": 25, "\uc808\uc785\ub2c8\ub2e4": 25, "step\uc740": [25, 28, 40], "model\ub97c": [25, 29], "\ub0b4\ubd80": 25, "\uc14b\uc73c\ub85c": 25, "\ub098\uc640\uc788\ub294": 25, "\ubd84\ud3ec\uc5d0": [25, 29, 43], "600": 25, "\uc0ac\uc774\uc988\ub85c": 25, "2048\ub85c": 25, "\ud559\uc2b5\uc2dc\ucf30\uace0": 25, "\ub9c8\uce68\ub0b4": 25, "offset": 25, "\uc218\uc900\uacfc": 25, "\uc601\uc5ed\uc758": 25, "\ube44\uc728\ub85c": 25, "\uacbd\ud5d8\uc801\uc73c\ub85c": 25, "6\ucc98\ub7fc": 25, "\ucc3e\uc558\ub2e4": 25, "\uadf8\ub9bc\uc774": [25, 28], "stage\ub97c": 25, "\ud2b9\ud654\ub41c": [14, 25], "ldm\uc744": [25, 29, 40], "sdedit\uc5d0\uc11c": 25, "ediff": 25, "\ub530\ub790\uc73c\uba70": 25, "\uc2a4\ucf00\uc77c\uc5d0": 25, "inference\uc5d0\uc11c": 25, "diffuse\uc640": 25, "denoise\ub97c": 25, "\ub123\uc5c8\ub2e4": 25, "\uc2a4\ud15d\uc740": 25, "\uc120\ud0dd\uc774\uc9c0\ub9cc": 25, "\ub514\ud14c\uc77c\uc5d0\uc11c": 25, "your": [26, 30], "One": [26, 29, 32], "03231": 26, "sty": 26, "lize": 26, "ne": 26, "\ud55c\uc7a5\uc758": 26, "\uc785\ud788\uace0\uc790\ud558\ub294": 26, "\uc9c4\ud589\uc911\uc774\ub2e4": 26, "\uc774\uc804\uae4c\uc9c0\uc758": 26, "\uc5f0\uad6c\ub4e4\uc740": 26, "\ud55c\uc7a5\uc529\uc744": 26, "\uc2dd\uc774": 26, "\uc774\ub8e8\uc5c8\ub2e4": 26, "\ubc29\uc2dd\uc5d0\ub294": 26, "face\ub97c": 26, "\uc758\uc874\ub3c4\uac00": 26, "\uc785\ud788\uae30": 26, "\ud798\ub4e4\ub2e4": [26, 40], "space\uc548\uc5d0\uc11c": 26, "\uc815\ubcf4\uc640": [23, 26], "entangl": [26, 27, 36], "\ub418\uc5b4\uc788\ub2e4": 26, "styo\ub294": 26, "\ud3ec\uc6a9\ud558\ub294": 26, "base\ubaa8\ub378\ub85c": 26, "\ucc44\uc6a9\ud55c\ub2e4": 26, "stage\ub85c": 26, "\uad6c\uc131\ub418\ub294\ub370": 26, "disentangl": 26, "learner": 26, "idl": 26, "\ubd84\ub9ac": [14, 26], "fcc": 26, "idl\ub85c\ubd80\ud130": 26, "\ubd84\ub9ac\ub41c": 26, "content\uc640": 26, "\uc6d0\ud558\ub294\ub300\ub85c": 26, "\uc7ac\uc870\ud569": 26, "detail\ud55c": 26, "\uc720\uc9c0\ud558\uae30\uc704\ud574": 26, "\uc7ac\uc0ac\uc6a9\ud558\ub294": 26, "gan\uc774": [26, 29, 37], "\ubd84\uc57c\ub97c": 26, "\uc7a5\uc545\ud558\ub358": 26, "\ub4f1\uc7a5\uc73c\ub85c": [26, 28], "\uc8fc\ubaa9\uc744": [26, 38], "\uc2dc\uc791\ud588\ub2e4": 26, "\uac00\ub2a5\ud574\uc84c\uc9c0\ub9cc": 26, "\ubd80\ubd84\uae4c\uc9c0": 26, "control\ud558\uae30\uc5d0\ub294": 26, "fine\ud55c": 26, "\uc815\ubcf4\uae4c\uc9c0": 26, "model\uc774\ub2e4": 26, "\ubcf4\uc774\uba74\uc11c": 26, "stylegan\uc744": 26, "\uc758\uc874\uc131\uc774": 26, "\ucee4": 26, "artist": [26, 30], "\uc785\ud788\ub294\ub370": 26, "\uac1c\uc120\ud55c": 26, "transfer\ub97c": 26, "disentagl": 26, "\ubd84\ub9ac\ud558\ub294": 26, "\ubc18\ub300": 26, "a\uc758": [26, 27], "conext": 26, "\ubc30\uc81c\ud568\uacfc": 26, "\ud3ec\ud568\ud558\uae30\uc704\ud574": 26, "\uc55e\uc5d0": [26, 33, 35], "negat": 26, "\ubd80\uc815\uc758": 26, "except": 26, "auxiliari": [26, 38], "\uc14b\uc744": [23, 26, 29, 30], "\uad6c\uc131\ud574": [26, 30], "ffhq": [26, 27], "\uc784\uc758\ub85c": 26, "prompt\uac04": 26, "disentanglement\ub97c": 26, "\uc774\ubbf8\uc9c0\uc5d0\ub294": 26, "\uc774\ubbf8\uc9c0\ub9cc\uc758": 26, "style\uacfc": [26, 27], "\uad6c\ubcc4\ud558\ub294\ub370": 26, "\ub3c4\uc6c0\uc744": 26, "\uc90c": 26, "idl\uc758": 26, "\ud559\uc2b5\ub9cc\uc73c\ub85c": 26, "transfer\uac00": 26, "\uc774\ubbf8\uc9c0\ucc98\ub7fc": 26, "\uac1c\uc120\ud558\uae30\uc704\ud574": 26, "\ub3c4\uc785\ud558\uc600\ub2e4": 26, "idl\ub85c": 26, "\uc870\ud569": 26, "recombin": 26, "\uc720\uc9c0\ud558\ub3c4\ub85d": 26, "ldm\uc740": [26, 29, 30], "\uc8fc\uc785\ud558\uae30\uc704\ud574": 26, "mechanism\uc744": 26, "promt": 26, "paper\uc5d0\uc11c": 26, "m\uc758": 26, "layout\uc5d0": 26, "\ubbf8\uce5c\ub2e4": 26, "\uc8fc\uc785\ud569\uc73c\ub85c\uc368": 26, "\uc720\ub3c4": [26, 35], "replace\ud558\uc9c0\uc54a\uace0": 26, "index\ub9cc": 26, "\uc120\ud0dd\uc801\uc73c\ub85c": 26, "replac": 26, "index": [26, 29], "time\uc5d0\uc11c": 26, "n\ubc88": 26, "\uc0ac\uc6a9\ud568\uc73c\ub85c\uc11c": 26, "n_": 26, "\uc2e4\ud5d8\uc0c1": 26, "\uc774\ud558\uc758": [26, 36], "\ucd94\ucc9c": 26, "ak47": 26, "m4a1": 26, "adam": [23, 26, 28, 33, 42], "400": 26, "ldm\uacfc": 26, "styo\uac00": 26, "\uc720\uc9c0\ud568\uacfc": 26, "\uacb0\uacfc\ubb3c\uc744": 26, "\uc0dd\uc131\ud574\ub0b8\ub2e4": [26, 29], "study\ub3c4": 26, "\ubaa8\ub378\ub4e4\uc5d0": [26, 28], "templat": 26, "\ub123\uace0": 26, "\ud559\uc2b5\ud560\uacbd\uc6b0": 26, "overfitting\uc774": 26, "\uc2ec\ud558\uace0": 26, "\ubd84\ub9ac\uc5d0": 26, "set\uc758": 26, "trick\ub3c4": 26, "\uc801\uc6a9\ud558\ub294\uac83\uc774": 26, "\uc0dd\uc131\ud574\ub0c8\ub2e4": 26, "inference\ud560": 26, "fcc\ub97c": 26, "\ud3ec\ud568\ud560": 26, "\ub192\uc544\uc838": 26, "significant\ud55c": 26, "\uc0dd\uc131\ub418\ub294\uac83\uc744": 26, "photorealistic\uc5d0\uc11c": 26, "artistic\ud558\uac8c": 26, "\ubc14\ub00c\uace0": 26, "\ub9c8\ucc2c\uac00\uc9c0\ub85c": [14, 26, 28, 29, 40], "idl\uacfc": 26, "\ubaa8\ub378\ub4e4\ubcf4\ub2e4": [26, 42], "\uc0dd\uc131\ud574\ub0bc": 26, "10\ubd84\uc774": 26, "\uac78\ub9ac\ubbc0\ub85c": 26, "efficiency\uac00": 26, "\ubabb\ud558\ub2e4\ub294": 26, "2019": 27, "1812": 27, "04948": 27, "huangzh13": 27, "stylegan\uc785\ub2c8\ub2e4": 27, "gan\uacfc": 27, "\ubcc0\uacbd\ud568\uc73c\ub85c\uc368": 27, "\uc62c\ub9ac\uace0": 27, "feature\uc758": [14, 27], "loss\ub098": 27, "\uac1c\uc120\uc5d0": 27, "\ubcf4\ub3c4\ub85d": 27, "\ud558\uc8e0": 27, "\uc81c\uc548\ud558\uc5ec": 27, "\ub192\uc774\uba74\uc11c": 27, "\uac00\ub2a5\ud574\uc84c\uc2b5\ub2c8\ub2e4": 27, "\uc911\uc5d0\uc11c": [27, 34], "contribution\uc744": [27, 35], "abstract\uc5d0\ub294": 27, "\ubb38\uc7a5\uc774": 27, "lead": 27, "automat": [27, 39], "unsupervis": [27, 33], "freckl": 27, "enabl": [27, 29], "\uad6c\uc870\uac00": 27, "\uc77c\uc744": 27, "\uc124\uba85\ud558\ub294": [27, 28, 29, 33], "\ubcf4\uc2dc\uba74": 27, "attribute\uc758": 27, "separation\uc774": 27, "\uc598\uae30\ud558\uace0": 27, "stylegan\uc758": 27, "\ud2b9\uc9d5\uc774\ub77c\uace0": 27, "\ubaa9\uc801\uc744": 27, "\uc790\uc2e0\uc774": 27, "\ub9cc\ub4e4\uace0\uc790": 27, "\uc88b\ub354\ub77c\ub3c4": 27, "\uc0ac\uc6a9\uc790\uc758": 27, "\uc758\ub3c4\uc640": 27, "\uc0c1\uad00\uc5c6\ub294": 27, "\ub79c\ub364\ud55c": [14, 27, 28, 30, 43], "\ub0b4\ubc49\uc5b4\uc900\ub2e4\uba74": 27, "\uc2e4\uc6a9\uc131\uc774": 27, "\uc88b\ub2e4\uace0": [27, 28, 32, 41, 42], "\uc5c6\uc744": [27, 38, 39], "\uadfc\ub798\uc5d0": 27, "\uc778\uae30\ub97c": 27, "\uc5bb\uc5c8\ub358": 27, "\uc774\uc720\ub3c4": 27, "\ub204\uad6c\ub098": 27, "\uc810\ub3c4": 27, "\ud55c\ubaab\ud588\ub2e4\uace0": 27, "stylegan\uc740": 27, "\ubaa8\ub378\uc774\ub77c\ub294": 27, "\uc758\ubbf8\uc788\ub2e4\uace0": 27, "network\ub294": 27, "4x4\uc5d0\uc11c": 27, "1024x1024\uae4c\uc9c0": 27, "\ub192\uc5ec\uc90d\ub2c8\ub2e4": 27, "gan\ud558\uace0": 27, "\ud2b9\uc774\ud55c": 27, "z\ub97c": 27, "noise\uc640": 27, "\uc0dd\uac01\ud574\ubcf4\uba74": 27, "\uac70\uccd0\uc11c": 27, "\uad6c\uc870\uc785\ub2c8\ub2e4": 27, "z\ub294": 27, "distribution\uc5d0\uc11c": [27, 35], "\uc0d8\ud50c\ub9c1\uc73c\ub85c": 27, "\uc5bb\uc2b5\ub2c8\ub2e4": 27, "distribution\uc73c\ub85c": 27, "\ubcf4\ub0b4\ub294": 27, "\ubc30\uc6b0\uac8c": 27, "\uac83\uc774\uace0": 27, "\ubd84\ud3ec\ub294": 27, "\uc0dd\uae30\uac8c": 27, "\uc8fc\uc5b4\uc838\uc11c": 27, "\uc801\uc744": 27, "\ud53c\ubd80\uac00": 27, "\ud76c\uba74\uc11c": 27, "\uc0d8\ud50c\ub4e4\uc774": 27, "\ud574\ubd05\uc2dc\ub2e4": 27, "\ud53c\ubd80\uc0c9\uacfc": 27, "\uba38\ub9ac": 27, "\uae38\uc774\ub77c\ub294": 27, "\uc5bd\ud788\uac8c": 27, "\ud558\ub098\ub97c": [27, 38], "\ubc14\uafc0": 27, "\ud558\ub098\ub3c4": [27, 29], "\uc77c\uc5b4\ub098\uac8c": 27, "\uc644\ud654\ud558\uae30": [14, 27], "gaussian\uc5d0\uc11c": 27, "w\ub97c": 27, "\uc0ac\uc6a9\ud569\ub2c8\ub2e4": [27, 33, 36, 41, 43], "instanc": [27, 33, 36], "normalization\uc740": 27, "\ucc44\ub110\ub9c8\ub2e4": 27, "\ucde8\ud574\uc8fc\ub294": 27, "normalization\uc5d0": 27, "scale\uc744": [27, 35], "\uacf1\ud574\uc8fc\uace0": 27, "\ub354\ud574\uc8fc\ub294": 27, "transformation\uc73c\ub85c": 27, "\uc8fc\uc5b4\uc9c0\ub294": 27, "w\ub294": 27, "\ubcf4\ub0b4\uc9c0\uac8c": 27, "adain\uc758": 27, "\uc218\uc2dd\uc740": [27, 41], "adain\uc740": 27, "\ube14\ub85d\ub9c8\ub2e4": 27, "\uac1c\uc529": 27, "style\uc740": 27, "\uc5f4\uc5ec\ub35f": 27, "adain\uc744": 27, "generator\uc5d0": [27, 29], "localization\uc774\ub77c\ub294": 27, "\ud2b9\uc9d5\uacfc\ub3c4": 27, "\ub9d0\ud558\ub294": 27, "localization\uc774\ub780": 27, "\uc77c\ubd80\ub97c": 27, "\ubc14\uafc8\uc73c\ub85c\uc368": 27, "\ud2b9\uc9d5\ub4e4\uc744": 27, "\uc758\ubbf8\uc785\ub2c8\ub2e4": 27, "map\ub4e4\uc740": 27, "normalization\ub418\uace0": 27, "style\uc5d0": 27, "statistics\ub97c": 27, "\uac00\uc9c0\uac8c": [14, 27], "convolution\uc5d0": 27, "\uc801\uc6a9\ub418\uace0": 27, "convolution\uc5d0\uc11c": 27, "normalization\uc774": 27, "\uc218\ud589\ub418\uae30": 27, "style\uc774": 27, "\ubd84\ub9ac\ub418\uac8c": 27, "\ud559\uc2b5\ub420": [27, 28], "stylemod": 27, "latent_s": [27, 31], "use_wscal": 27, "lin": 27, "equalizedlinear": 27, "gain": 27, "n_channel": 27, "view": [27, 31, 36, 37, 43], "layerepilogu": 27, "thing": 27, "dlatent_s": 27, "use_nois": 27, "use_pixel_norm": 27, "use_instance_norm": 27, "use_styl": 27, "activation_lay": 27, "noiselay": 27, "activ": 27, "pixel_norm": 27, "pixelnormlay": 27, "instance_norm": 27, "instancenorm2d": 27, "top_epi": 27, "ordereddict": 27, "style_mod": 27, "dlatents_in_slic": 27, "b\uc758": 27, "style\ub85c": 27, "\ubcc0\uacbd\ud574\uc11c": 27, "\uc774\ubbf8\uc9c0\ub4e4\uc785\ub2c8\ub2e4": [27, 41], "18\uacf3\uc5d0\uc11c": 27, "\uc0ac\uc6a9\ub418\ub294\ub370": 27, "4\uacf3": 27, "coars": [23, 27], "\uadf8\ub2e4\uc74c": 27, "10\uacf3": 27, "\uc815\uc758\ud558\uc600\uc2b5\ub2c8\ub2e4": [27, 32], "\uc717": [27, 33], "\ubd80\ubd84\uc5d0\uc11c\ub294": 27, "\ud3ec\uc988\ub098": 27, "\uc2a4\ud0c0\uc77c\uac19\uc774": 27, "\uac08\uc218\ub85d": 27, "\ud2c0\uc744": 27, "\ubd80\ubd84\ub4e4\uc744": 27, "b\uc5d0\uc11c": [27, 38], "\uac00\uc838\uc654\uc74c\uc744": 27, "\uc548\uc5d0\ub294": 27, "\ubc14\ub014": 27, "\uc8fc\uadfc\uae68": 27, "\uba38\ub9bf\uacb0": 27, "\ud53c\ubd80": 27, "\ubaa8\ub378\ub9c1\ud558\uae30": 27, "\ub354\ud574\uc9d1\ub2c8\ub2e4": 27, "\uc548\uc5d0\uc11c\ub3c4": 27, "\ub514\ud14c\uc77c\ub4e4\uc740": 27, "deviation\uc744": 27, "\uad6c\ud574\ubd24\uc744": 27, "\uc5bc\uad74\ud615\uacfc": 27, "attribute\ub294": 27, "\ubcc0\ud558\uc9c0\uc54a\uc9c0\ub9cc": 27, "noise\uc5d0": 27, "\uc758\ud574\uc11c": [23, 27], "\uba38\ub9ac\uce74\ub77d\uacfc": 27, "\uc0dd\uae40\uc744": 27, "\uc8fc\uc9c0": 27, "\uc5d0\ub9cc": [27, 42], "\uba38\ub9ac\uce74\ub77d\uac19\uc740": 27, "\ub514\ud14c\uc77c\uc774": 27, "\uc81c\ub300\ub85c": 27, "\uc0b4\uc544\uc788\uc9c0": 27, "layers\uc5d0": 27, "\ub4e4\uc5b4\uac04": 27, "\uba38\ub9ac\uce74\ub77d\uc758": 27, "\uc138\ubc00\ud55c": [14, 27, 42], "\ub07c\uce5c\ub2e4\ub294": 27, "localization\uc774": 27, "\ub418\uac8c\ud558\uae30": 27, "mixing\uc774\ub77c\ub294": 27, "\uc55e": 27, "\ucabd": 27, "layer\uc5d0\ub294": 27, "\ub4a4": [27, 33], "generator\uac00": 27, "\uc778\uc811\ud55c": [27, 32], "style\ub07c\ub9ac": 27, "correlated\ub418\uc5b4\uc788\ub2e4\uace0": 27, "\ub9c9\uc544\uc11c": 27, "localization\uc744": 27, "\ub418\uac8c": 27, "\ubaa9\uc801\uc785\ub2c8\ub2e4": [27, 43], "\uc800\uc790\ub4e4\uc774": [27, 28, 38], "\uc788\uc5c8\ub294\uc9c0": 27, "\ud655\uc778\ud574\ubd05\uc2dc\ub2e4": 27, "\ud45c\uc640": 27, "\ubc29\ubc95\ub4e4\uc744": [27, 41], "fid\uac00": [27, 28, 35], "2304": [14, 28, 30], "08466": 28, "\uc774\ubc88\uc5d0": 28, "\ub9ac\ubdf0\ud560": 28, "\uad6c\uae00": [28, 38], "\ub9ac\uc11c\uce58": 28, "\uadf8\ub8f9\uc5d0\uc11c": 28, "tmlr": 28, "transact": 28, "2023\uc5d0": 28, "\uc81c\ucd9c\ud55c": 28, "\ub17c\ubb38\uc778": 28, "\uc18d\ub3c4\ub85c": 28, "\ubc1c\uc804\ud558\uace0": 28, "\uc788\ub294\ub370\uc694": [28, 42], "\uc218\uc900\uc774": 28, "\uc5bc\ub9cc\ud07c": 28, "\uc654\ub294\uc9c0": 28, "\ub370\uc774\ud130\uc778": 28, "\uc815\ub3c4\uac00": 28, "\ub418\uc5c8\ub294\uc9c0": 28, "augment\ub41c": 28, "\uc815\ub3c4\uae4c\uc9c0": 28, "\uc654\ub294\uc9c0\uc5d0": 28, "\uc2e4\ud5d8\uacfc": 28, "\ub2f5\uc744": 28, "\uc81c\uc2dc\ud569\ub2c8\ub2e4": [28, 33, 39, 41], "\uae00\uc758": 28, "\ubaa9\ucc28\ub294": 28, "\ub0b4\uc6a9\uacfc": [28, 40], "\uad6c\uc131\ud558\uc600\uc2b5\ub2c8\ub2e4": 28, "task\uc5d0\uc11c": [28, 40], "augmentation\uc73c\ub85c": 28, "imagenet\uc5d0": 28, "tuning\ub41c": 28, "\uc0ac\uc6a9\ud568": [28, 29, 34, 38], "\uc0ac\uc6a9\ud558\uc600\uc744": 28, "\uae30\uc220\uc801\uc73c\ub85c": 28, "\uc5c4\uccad": 28, "\ub0b4\uc6a9\uc740": 28, "\uc5c6\ub294\ub370\uc694": 28, "\uc0ac\uc6a9\ud558\ub358": 28, "\ubc29\ubc95\ub4e4\uacfc\ub294": 28, "imagen\uc744": 28, "\ud588\ub2e4\ub294": 28, "\uc0c8\ub86d\uc2b5\ub2c8\ub2e4": 28, "\ubc1c\uc804\ub418\uc5c8\uc2b5\ub2c8\ub2e4": 28, "\uc790\uc5f0\uc2a4\ub7ec\uc6b4": [23, 28], "\uc9c8\ubb38\uc774": 28, "\ub2f9\uc5f0\ud558\uace0": 28, "\ucc3e\uace0\uc790": 28, "\uc9c8\ubb38\uc5d0": 28, "\uc774\uc57c\uae30": 28, "imagen\uc774": [28, 38], "ca": [28, 41], "\ub370\uc774\ud130\uc640": [28, 36, 37, 43], "\uacb0\ud569\ud558\uc5ec": [14, 23, 28, 33, 40], "\uc2dc\uac04\uc774": [14, 28, 35], "\uae38\uc218\ub85d": 28, "\ud5a5\uc0c1\ub418\uc5c8\ub2e4": 28, "\ub370\uc774\ud130\ub85c\ub9cc": 28, "\uc9c4\uc9dc": [28, 33], "\uc815\ud655\ub3c4\uc640": 28, "\uc801\ub2e4\ub294": 28, "\ub354\ud574\uc11c": 28, "\ud559\uc2b5\ud588\uc744": 28, "\ubaa8\ub378\ub4e4\uc5d0\uc11c": 28, "\ud5a5\uc0c1\uc774": 28, "augmentation\uc744": 28, "\ud558\ub824\uace0": 28, "\ud588\ub358": 28, "\ubc29\ubc95\ub4e4\uc5d0": 28, "\uc9e7\uac8c": 28, "\ud590\ub824\uace0": 28, "\ucd5c\uadfc\uc5d0\ub294": 28, "\ubcf4\uac15\ud558\ub294\ub370": 28, "\uc0ac\uc6a9\ub418\uae30": 28, "\uc2dc\uc791\ud588\uc2b5\ub2c8\ub2e4": 28, "\uc608\ub85c": 28, "Is": 28, "readi": 28, "\ub17c\ubb38\uc774": 28, "glide\ub85c": 28, "shot\uacfc": 28, "few": [28, 34, 40], "\uc2dc\ucf30\uc73c\uba70": 28, "glide\ub97c": 28, "\uc138\ud2b8\uac00": [28, 33], "100\uc758": 28, "\uc2dc\ucf30\ub2e4\uace0": 28, "\ud3ec\ud568\ud574\uc11c": 28, "\ub17c\ubb38\ub4e4\uc740": 28, "\uc774\uc6a9\ud574\uc11c": [14, 28, 29], "\ud558\uc5ec\ub3c4": 28, "\uc2dc\ud0a4\uc9c0": 28, "\ubabb\ud588\uc2b5\ub2c8\ub2e4": 28, "\uc54a\uc558\uc2b5\ub2c8\ub2e4": [28, 32], "\ub17c\ubb38\ub4e4\uacfc\ub294": 28, "\ub3d9\uc791\ud558\uace0": 28, "\uc6cc\ub099": 28, "\uc4f0\uc5ec\uc11c": 28, "\uc124\uba85\uc740": [28, 33], "\uc0dd\ub7b5\ud558\uace0": 28, "cas\uc5d0": 28, "\uc368\uc838": 28, "\ub0b4\uc6a9\uc73c\ub85c": 28, "\uc18c\uac1c\ud558\uaca0\uc2b5\ub2c8\ub2e4": 28, "cas\ub294": 28, "\ub9cc\ub4e4\uc5b4\ub0b8": 28, "\uc9c0\ud45c\uc785\ub2c8\ub2e4": 28, "\ub85c\ub9cc": 28, "\ub9cc\ub4e4\uc5b4\ub0c5\ub2c8\ub2e4": 28, "\ub370\uc774\ud130\ub9cc\uc744": 28, "50\uc744": 28, "\uc2dc\ud0a4\uace0": 28, "cas\uac00": 28, "imagenet\uacfc": 28, "\ube44\uc2b7\ud558\ub2e4\uba74": 28, "\ubcf4\uc77c": [14, 28], "\uac00\uc815\uc744": [28, 35, 41, 43], "\uc774\ud574\ud558\uba74": 28, "\uc800\uc790\uc5d0": 28, "\uc758\ud558\uba74": 28, "\uadf8\ub3d9\uc548": 28, "\uc54a\uc558\ub2e4\uace0": 28, "\uc0d8\ud50c\ub85c\ub9cc": 28, "\ub5a8\uc5b4\uc84c\uace0": 28, "\ub2f9\uc5f0\ud574\ubcf4\uc785\ub2c8\ub2e4": 28, "\ub5a8\uc5b4\uc84c\ub2e4\uace0": 28, "\uc544\ub9c8\ub3c4": 28, "\ud558\uc600\ub294\uc9c0\uc5d0": 28, "\ubaa8\ub378\ub85c\ub294": [28, 37], "\uc0ac\uc6a9\ud558\uc600\uc2b5\ub2c8\ub2e4": [28, 32], "\ud074\ub798\uc2a4\uc640": 28, "\uc9c0\uc5d0": 28, "\uace0\ubbfc\uc774": 28, "\ud544\uc694\ud588\ub2e4\uace0": 28, "\ud558\uc600\ub294\ub370": 28, "imagen\uc5d0\uc11c": 28, "\ub2e4\uc591\uc131\uc774": [28, 30, 40], "\uc800\ud558": 28, "\ub418\uba74\uc11c": 28, "\ud604\uc0c1\uc77c": 28, "\ub450\ub2e8\uc5b4": 28, "\uc774\ub984\uc73c\ub85c": 28, "\uc218\uc815\ud558\uace0": [14, 28], "\uc774\ubbf8\uc9c0\uace0": 28, "\uc624\ub978\ucabd\uc774": 28, "\uc801\uc6a9\ub418\uc9c0": [28, 43], "imagen\uc785\ub2c8\ub2e4": 28, "\uc544\ub798\uc5d0\uc11c": [28, 33], "\ud074\ub798\uc2a4\uc778": 28, "schipperke\ub97c": 28, "\uc2a4\ud0a4\ud37c\ud0a4\ub77c\ub294": 28, "\uac1c": [28, 30, 31, 33], "\ud488\uc885\uc744": 28, "\uc758\ubbf8\ud558\ub294\ub370": 28, "\uacbd\uc6b0\ub294": [28, 33], "\uaf43\uacfc": 28, "\uc804\ud600": [28, 33], "\uc5c9\ub6b1\ud55c": 28, "\ud588\ub294\uc9c0\ub97c": 28, "\uc6d0\uc73c\ub85c": 28, "\uc6d0\ub798": [14, 28, 33, 35], "imagen\uc5d0\uc11c\ub3c4": 28, "\ubd80\ubd84\uc774\ub77c": 28, "\uc54a\uc558\uace0": 28, "\ucd9c\ub825\uc73c\ub85c": 28, "\uace0\ud574\uc0c1\ub3c4\uc758": [28, 30, 40], "\uc801\uc5b4\uc11c": 28, "210k": 28, "\ud559\uc2b5\ud558\uc600\uace0": 28, "optimizer\uc758": 28, "\uc0ac\uc6a9\ud558\uc600\ub358": 28, "optimizer\ub97c": 28, "490k": 28, "\ucd5c\uc801\uc758": [28, 40], "\uc120\ud0dd\uc758": 28, "sampler\uc640": 28, "1k": 28, "10k\uac1c\uc758": 28, "\uc0d8\ud50c\ub4e4\uc5d0": 28, "\uacc4\uc0b0\ud588\uc744": 28, "\uc120\ud0dd\ud588\ub2e4\uace0": 28, "\uc815\ud588\ub294\uc9c0\ub97c": 28, "\uc0d8\ud50c\ub9c1\uc758": [23, 28], "\uc18d\ub3c4\ub294": [14, 28], "\uc2a4\ud15d": 28, "free": [28, 30, 32, 39, 40, 42], "coeffici": [28, 32], "\ub4f1\uc5d0": 28, "\ubc1b\ub294\ub2e4\uace0": 28, "\uac04\ub2e8\ud558\uac8c": [28, 33, 40], "\uc124\uba85\ud558\uba74": 28, "\ud655\ub960\uc801\uc778": 28, "\ub3c4\uc785\ud558\uc5ec": [14, 28], "\uacf5\uac04\uc758": 28, "\ubcf4\uc774\uac8c": 28, "\ub9cc\ub4e4\uba70": 28, "\ucc38\uace0\ud574\uc8fc\uc138\uc694": 28, "\ubd84\ub958\uae30\ub098": 28, "\uc678\ubd80": 28, "\ubc18\uc601\ud560\uc9c0\ub97c": 28, "\uc758\ubbf8\ud560": 28, "\uc870\uc808\ud558\uc5ec": 28, "\ud2b9\uc131\uc774\ub098": 28, "\uacc4\uc218\ub97c": 28, "\uc870\uc808\ud568\uc73c\ub85c\uc368": 28, "\ub85c\uadf8": 28, "\uacc4\uc218\ub294": 28, "\uc0ac\uc6a9\ub418\uba70": 28, "\uc758\ubbf8\ud558\uace0": 28, "\uc758\ubbf8\ud568": 28, "\uc0dd\uc131\uc758": 28, "\uc124\uc815\ubc95\uc5d0": 28, "\uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4": [28, 35], "\uc804\ubc18\uc801\uc778": [14, 28, 29, 36], "\ud2b9\uc9d5\uacfc": 28, "\ub2e4\uc591\uc131\uc758": 28, "1\ucc28": 28, "sweep\uc73c\ub85c": 28, "\uc0d8\ud50c\ub7ec\ub97c": 28, "50k\uc5d0": 28, "\ud558\uc774\ud37c\ud30c\ub77c\ubbf8\ud130\ub97c": 28, "\ucc3e\uc2b5\ub2c8\ub2e4": 28, "sweep\uc758": 28, "\ud558\uc774\ud37c\ud30c\ub77c\ubbf8\ud130\uc758": 28, "\ubc94\uc704\ub294": 28, "75": 28, "sweep": 28, "fid\ub294": 28, "variance\ub294": 28, "1000\uc774\uc5c8\uc744": 28, "\ub54c\ub77c\uace0": 28, "sweep\uc774": 28, "\ub05d\ub09c": 28, "\ud6c4\uc5d0\ub294": 28, "weight\uc5d0": 28, "sweep\uc744": 28, "\ub54c\uc5d0\ub294": [28, 34], "2m": 28, "guidacn": 28, "cas\ub97c": 28, "\uce21\uc815\ud588\ub2e4\uace0": 28, "\ud558\uc774\ud37c\ud30c\ub77c\ubbf8\ud130\uc5d0": 28, "sweep\uc5d0": 28, "\uacb0\uacfc\uace0": 28, "\uac00\uc6b4\ub370\uc640": 28, "2\ucc28": 28, "\ub098\ud0c0\ub0b8": 28, "\uc120\ud0dd\ud558\ub294": [28, 34], "range\ub294": 28, "denos": 28, "129": 28, "\uadf8\ub798\ud504\ub294": 28, "\ubcc0\uacbd\ud588\uc744": 28, "cas\uc758": 28, "\uadf8\ub798\ud504\ub97c": [28, 40], "\uadf8\ub798\ud504\uc785\ub2c8\ub2e4": 28, "logvar": [28, 43], "coeff\uac00": 28, "3\uc77c": 28, "\ubcf4\uc600\uc73c\uba70": 28, "\ubcf4\uc778": [28, 34], "\ubd84\uc11d\ud574\ubcf4\uc790\uba74": 28, "weight\uac00": 28, "\ub192\uc544\uc9c0\uc9c0\ub9cc": 28, "score\uc5d0\ub294": 28, "\ubd80\uc815\uc801\uc778": 28, "\uc8fc\uba70": [28, 38], "augmentation\uc774": 28, "0\uc77c": 28, "\ud558\uc774\ud37c\ud30c\ub77c\ubbf8\ud130": 28, "\uc124\uc815\ud55c": 28, "\uac19\ub2e4\uace0": 28, "\ubca0\uc774\uc2a4": 28, "\ud569\uc131\uc740": 28, "\ud504\ub85c\ud1a0\ucf5c\uc744": 28, "\ub530\ub790\ub294\uc9c0\uc5d0": 28, "balance\ub97c": 28, "\uc720\uc9c0\ud558\uba70": 28, "\ud569\uc131\ud588\uc73c\uba70": 28, "\ud569\uc131\ub41c": 28, "\uaddc\ubaa8\ub294": 28, "1\ubc30\uc778": 28, "10\ubc30\uc778": 28, "12m": [28, 40], "\ubc94\uc704\ub97c": 28, "\ud569\uc131\ud588\ub2e4\uace0": 28, "\uc9c0\ud45c\uc778": 28, "is\uc758": 28, "\uad00\uc810\uc73c\ub85c": 28, "\ubd05\ub2c8\ub2e4": 28, "\ud45c\uc5d0\uc11c": 28, "\ud29c\ub2dd\ub41c": 28, "\ubca0\uc774\uc2a4\ubaa8\ub378\ub4e4": 28, "resolution\uacfc": 28, "\ud574\ub2f9\ub418\uc5c8\uc2b5\ub2c8\ub2e4": 28, "\ud655\uc778\ud558\ub294": 28, "5\uc5d0\uc11c": [28, 29], "\uc131\ub2a5\uc774\uace0": 28, "\ube68\uac04\uc0c9": 28, "\uc131\ub2a5\uc785\ub2c8\ub2e4": 28, "\ubca0\uc774\uc2a4\ub77c\uc778": 28, "cdm": 28, "\uadf8\ub9bc\uc774\uba70": 28, "\uac00\uc6b4\ub370\ub294": 28, "\uc624\ub978\ucabd\uc740": 28, "\ubd80\ubd84\ubcf4\ub2e4": 28, "\uc704\ucabd\uc5d0": 28, "\uc704\uce58\ud558\uba74": 28, "\ud574\uc11d\ud560": [28, 41], "\ubca0\uc774\uc2a4\ub77c\uc778\ubcf4\ub2e4": 28, "\ubcf4\uc778\ub2e4\ub294": 28, "2\uc5d0\uc11c\ub3c4": 28, "\uc8fc\ubaa9\ud560": 28, "\ub9cc\ud55c": [28, 31], "resnet50\uc774": 28, "\ub2e4\uc6b4\uc0d8\ud50c\ub9c1": 28, "\ud568\uc5d0\ub3c4": 28, "\uc88b\ub2e4\ub294": [28, 39], "our": [14, 28, 29, 34, 44], "resolution\ubcf4\ub2e4": 28, "resolution\uc758": 28, "\uc6d4\ub4f1\ud788": [28, 39], "\uc885\ub958\uc758": [14, 28], "\uc2dc\ucf30\uc744": 28, "cas\uc640": 28, "cas\uc5d0\uc11c\ub294": 28, "resnet50": 28, "\ud655\uc778\ud588\uc9c0\ub9cc": [28, 42], "\uc774\uc678\uc5d0": 28, "\ubaa8\ub378\ub85c\ub3c4": 28, "\ubcf8\ub2e4\ub294": 28, "\ucc28\uc774\uc810\uc774": [28, 33], "\uc0b4\ud3b4\ubcf8": 28, "\ub0ae\uc558\uc9c0\ub9cc": 28, "\ub370\uc774\ud130\ub9cc": 28, "onvnet\uae30\ubc18": 28, "\uc591\uc0c1\uc744": 28, "\ubcf4\uc600\uc2b5\ub2c8\ub2e4": 28, "\uaddc\ubaa8\uc5d0": 28, "50\uc758": 28, "\ubd84\uc11d\ud55c": 28, "\uc99d\uac00\ud568\uc5d0": 28, "8m": 28, "\ub54c\uae4c\uc9c0\ub294": 28, "\uc88b\uc558\uc73c\ub098": 28, "\ub418\uc5c8\uc744": 28, "\uc624\ud788\ub824": 28, "\ubcf4\uc790\uba74": 28, "sclae": 28, "\ub2ec\uc131\ud588\uc2b5\ub2c8\ub2e4": 28, "76": 28, "239": 28, "69": 28, "resnet\uacfc": 28, "accuracy\ub97c": 28, "\uc2dc\ucf30\uc2b5\ub2c8\ub2e4": 28, "\uc0dd\uac01\ud574\ubcfc\ub9cc\ud55c": 28, "\uac70\ub9ac\ub4e4\uc774": 28, "\uc788\uc5c8\ub294\ub370": 28, "\ud558\ub098\ub294": 28, "\uce21\uc815\ud560": 28, "256x256\ubcf4\ub2e4": 28, "\ub2e4\uc6b4\uc0d8\ud50c\ub9c1\uc744": 28, "\ud558\ub354\ub77c\ub3c4": 28, "resolution\uc774": [28, 40], "\ub2f4\ub294\ub2e4\ub294": 28, "\uac83\uc77c": 28, "\uc815\ud655\ub3c4\uac00": 28, "\uc99d\uac00\ud588\uc9c0\ub9cc": 28, "\ub370\uc774\ud130\uc5d0\uc11c\ub294": 28, "\uadf8\ub807\uc9c0": [28, 31], "\uc54a\uc558\ub358": 28, "\uace0\ud574\uc0c1\ub3c4\uc5d0": 28, "\uc815\uad50\ud55c": 28, "\ud544\uc694\ud560": [28, 33, 40], "\uc2dc\uc0ac\ud558\uace0": 28, "\ub9ac\ubdf0\ub97c": 28, "\ub9c8\uce58\uaca0\uc2b5\ub2c8\ub2e4": 28, "\ub290\ub080": 28, "\uc0b0\uc5c5\uc5d0\uc11c\ub294": 28, "shortage\ub098": 28, "imbal": 28, "\ubc1c\uc0dd\ud558\ub294\ub370": 28, "\ud574\uacb0\ubc95": 28, "\ud558\ub098\uac00": [28, 35], "\uac19\ub2e4\ub294": 28, "\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4": 28, "\ud30c\uc778\ud29c\ub2dd\uc774": [14, 28], "\ub418\uc9c0": [28, 30, 31, 33, 43], "\uc0b0\uc5c5\uc5d0\uc11c\ub9cc": 28, "\ud14d\uc2a4\ud2b8\uac00": 28, "\ud569\uc131\ud558\uace0\uc790": 28, "\ud30c\uc778\ud29c\ub2dd\uc744": [14, 28], "\ud574\uc57c\ud558\ub294": 28, "\uaf64\ub098": 28, "\ubd88\ud3b8\ud560": 28, "\uac19\uc544\uc11c": 28, "\uac16\ub294\uc9c0": 28, "\uc788\uc5c8\uc73c\uba74": 28, "\uc88b\uc558\uc744": 28, "\uac1c\uc778\uc801\uc778": 28, "\uc720\ucd94\ud574\ubcfc": 28, "\uc21c": 28, "\uc788\uc9c0\ub9cc\uc694": 28, "worth": 29, "2208": [29, 36], "01618": 29, "devocean": 29, "techboarddetail": 29, "id": 29, "164320": 29, "boardtyp": 29, "writer": 29, "searchdata": 29, "sam56903": 29, "subindex": 29, "idlist": 29, "pnwriterid": 29, "kwang": 29, "su": 29, "mun": [29, 33, 44], "5\uc7a5\uc73c\ub85c": 29, "\ucf58\uc149\ud2b8": 29, "\ubf51\uc544\ub0b4\ub294": 29, "\uc790\uc5f0\uc5b4\ub97c": 29, "creation\uc5d0": 29, "\uc804\ub840\uc5c6\ub294": 29, "\uc790\uc720\ub3c4\ub97c": 29, "contept\ub97c": 29, "\uadf8\uac83\uc758": 29, "\ubc14\uafb8\uac70\ub098": 29, "\uc5ed\ud560\uc774": 29, "\uc8fc\uc5b4\uc9c0\uac70\ub098": 29, "\ucc38\uc2e0\ud55c": 29, "\uc7a5\uba74\uc774": 29, "\uadf8\ub824\uc9c0\ub294\uac74": 29, "\ubd88\ubd84\uba85\ud558\ub2e4": 29, "\uc774\uac83\uc744": 29, "\uadf8\ub824\uc918": 29, "\uc774\uac83": 29, "\uac83\uc774\ub0d0\ub294": 29, "\ubb3c\uc74c\uc5d0\ub294": 29, "5\uac1c\ub9cc\uc73c\ub85c": 29, "\uc0ac\ubb3c\uc774\ub098": 29, "\uc790\uc5f0\uc5b4": 29, "\ubb38\uc7a5\uc5d0": [29, 33], "\ub179\uc544\ub4e4\uc5b4\uac00": 29, "\uc774\ub04c\uc5b4": 29, "\ub3c5\uc790\uc801\uc774\uba74\uc11c": 29, "\ucf58\uc149\ud2b8\ub97c": 29, "capture\ud558\uae30": 29, "\ucda9\ubd84\ud558\ub2e4\ub294": 29, "\uc54c\uac8c": 29, "\ub3c4\uc785\ud558\ub294": 29, "\uc77c\uc740": 29, "\uc77c\uc774\ub2e4": 29, "\ud655\uc7a5\ub41c": 29, "retraining\ud558\ub294": 29, "\uc5c4\uccad\ub098\uac8c": 29, "\ube44\uc6a9\uc774": [14, 29], "\ub4e4\uace0": [14, 29], "\uc608\uc81c\uc5d0": 29, "\uce58\uba85\uc801\uc778": [29, 32, 41], "\ub9dd\uac01\uc744": 29, "\ucd08\ub798\ud55c\ub2e4": 29, "figure\uc5d0\uc11c": 29, "\uc9c0\ub098\uba74\uc11c": 29, "508": 29, "701": 29, "set\uc73c\ub85c": [29, 34], "\ubcc0\ud658\ub418\uace0": 29, "\uc790\uccb4": 29, "\ubca1\ud130\ub294": [23, 29], "\ub2e4\uc6b4\uc2a4\ud2b8\ub9bc": 29, "\uc81c\uacf5\ub428": 29, "concept\ub97c": 29, "word\uc778": 29, "\ub2e8\uc5b4\uc640": 29, "\ucc98\ub9ac\ub418\uba70": 29, "query\ub97c": 29, "\uad6c\uc131\ud558\ub294\ub370": 29, "query\ub294": 29, "\uc758\ub3c4\ud55c\ubc14\uc640": 29, "\uadf8\ub9bc\uc774\ub77c\uace0": 29, "\uc0dd\uc131\ubaa8\ub378": 29, "ldm\uc774": 29, "\uc4f0\uc784": 29, "untouched\ub418\uc5b4": 29, "\ub4e4\uc5b4\uac00\uc9c0": 29, "\uc54a\ub294\ub4ef\ud568": 29, "\uc190\uc2e4\ub418\ub294": [14, 29], "\uc774\ud574\ub3c4\ub098": 29, "generalization\uc744": 29, "\uc720\uc0ac\ub2e8\uc5b4": 29, "\ucc3e\uae30": 29, "inversion\uc2dc\ucf1c": 29, "\ud504\ub808\uc784\ud654": 29, "\uc8fc\uc5b4\uc9c4\ub2e4": 29, "\uc124\uc815\ud574": [29, 31], "\uc7ac\uad6c\uc131": 29, "concept\uc778": 29, "found": 29, "palavra": 29, "\ubcf5\uad6c": [29, 33], "segmentation\uc744": 29, "palavra\ub294": 29, "\uac1c\uccb4\ub97c": 29, "\ucc38\uc870\ud558\ub294": 29, "\uc2dd\ubcc4\ud568": 29, "\uac80\uc0c9\uc744": 29, "\uc124\uba85\ud558\uac70\ub098": 29, "\uc7a5\uba74\uc5d0\uc11c": 29, "\ubd84\ud560\ud558\uae30": 29, "\uc0ac\uc6a9\ub428": 29, "\ubcf4\ub4ef\uc774": 29, "\uadf8\ub7f4\ub4ef\ud55c": 29, "\ud569\uc131\uc5d0": [29, 38], "\ucea1\ucc98\ud558\uc9c0": 29, "goal": 29, "specifi": 29, "\uc758\uc5ed": 29, "\uc758\ub3c4\ud55c": 29, "\ub9de\ucd98": 29, "embedding\uc73c\ub85c": 29, "\uac00\uc774\ub4dc\ud574\uc11c": 29, "\uc131\uacfc\ubb3c\uc744": 29, "representation\uc73c\ub85c": 29, "\uc778\ucf54\ub529\ud558\ub294\ub370": 29, "representation\uc5d0": 29, "\ud6c4\ubcf4\uad70\uc744": 29, "\ucc3e\ub294\ub2e4": 29, "understanding\uc744": 29, "\uc0dd\uc131\uc790\uac00": 29, "\uadf8\ub9b0\ub2e4": 29, "inversion\uc5d0\uc11c": 29, "\ucd9c\ucc98": [29, 33], "hyoseok": 29, "entri": 29, "vector\ub85c\ubd80\ud130": 29, "\uc774\uc758": 29, "\uc5ed\uacfc\uc815\uc73c\ub85c\uc368": 29, "inverting\uc2dc\ucf1c": 29, "\uc54c\uc544\uac00\ub294": 29, "\uc0dd\uc131\ubaa8\ub378\ub85c\uc11c": 29, "\ub9d0\ud588\ub4ef\uc774": [29, 33], "\uac74\ub4e4\uc9c0": 29, "\ubb38\uc790\uc5f4\uc758": 29, "\ud558\uc704": [29, 40], "\ub2e8\uc5b4\ub294": 29, "\ud1b5\uacfc\ud558\uba70": 29, "dictionary\uc5d0\uc11c": 29, "\ubcc0\ud658\ud568": 29, "\uace0\uc720\ud55c": [14, 29], "\ubca1\ud130\uc5d0": 29, "\uc5f0\uacb0\ub428": 29, "index\uc5d0": 29, "encoder\uc778": 29, "c_\u03b8\uc758": 29, "\uc77c\ubd80\ub85c": 29, "target\uc73c\ub85c": 29, "\uc0bc\uc558\uc74c": 29, "\ub098\ud0c0\ub0b4\uae30": 29, "\uc790\ub9ac\ud45c\uc2dc\uc790": 29, "\ubb38\uc790\uc5f4\uc778": 29, "\uc9c0\uc815\ud568": 29, "palavra\ub97c": 29, "\ucd94\uc815\ud568": 29, "\uac1c\uc785\ud574\uc11c": 29, "tokenize\ub41c": 29, "\ubb38\uc790\uc5f4\uacfc": 29, "\ub300\uccb4\ud558\uc5ec": 29, "\ubcf8\uc9c8\uc801\uc73c\ub85c": 29, "\uc5b4\ud718": 29, "\uc8fc\uc785\ud568": 29, "5\uc7a5": 29, "\ud3ec\uc988\uc640": [14, 29], "\uc124\uc815\uc5d0": 29, "\ubb18\uc0ac\ud568": 29, "v\ub97c": 29, "\ucd5c\uc801\ud654\ud568": 29, "\uace0\uc815\ud558\uae30": 29, "\ud15c\ud50c\ub9bf\uc5d0\uc11c": 29, "\uc911\ub9bd": 29, "\ucee8\ud14d\uc2a4\ud2b8": 29, "\uc5ec\uae30\uc5d0\ub294": 29, "rendit": [29, 36], "\ud615\uc2dd": 29, "\ud504\ub86c\ud504\ud2b8\uac00": 29, "\ud3ec\ud568\ub41c\ub2e4": [14, 29], "\uc544\ub9c8": [29, 38], "\uc6d0\ubcf8\uacfc": 29, "\ubaa9\uc801\uc774": 29, "\uc544\ub2d0\uae4c": 29, "\uc2f6\uc74c": 29, "\ubaa9\ud45c\uc2dd\uc740": 29, "loss\ud568\uc218\uc640": 29, "\uc720\uc0ac\ud568": 29, "c\u03b8\uc640": 29, "e\u03b8\ub294": 29, "\ubbf8\uc138\ud55c": [14, 29], "\ud3ec\ucc29\ud560": 29, "\uc788\uc744\uac83\uc73c\ub85c": 29, "\uae30\ub300\ud568": 29, "\ud3ec\ucc29\ud558\ub294": 29, "guide\uc5d0": 29, "\ub9de\ucdb0\uc11c": 29, "\uc9c4\ud589\ud568": 29, "\uc8fc\uc81c\uc5d0": 29, "\ubcf4\uc874\ud558\uace0": [14, 29], "\uc784\ubca0\ub529\uacfc": 29, "\ucea1\uc158\ub4e4\uc5d0": 29, "\ucd94\ub860\uc774": 29, "\uac00\ub2a5\ud588\uc74c": 29, "\ub370\uc774\ud130\uc14b\uc73c\ub85c\ub3c4": 29, "\ubcf4\uc874\ud558\uba74\uc11c": 29, "\ud45c\ud604\ud55c": [23, 29], "\uc0ac\uc9c4\uc5d0\uc11c\uc640": 29, "\uc758\uc0ac": [14, 29], "\ubc31\uc778": 29, "\ub0a8\uc131": 29, "\uc758\uc0ac\ub97c": 29, "\uadf8\ub824\ub0c8\uc74c": 29, "\ub9ce\uc558\uc74c\uc744": 29, "imageset\uc5d0\uc11c": 29, "\uc778\uc885\uc801": 29, "\uc778\uc2dd\uc744": 29, "embedding\uc758": 29, "y\ucd95": 29, "\ubcf5\uc81c\ud558\ub294\uc9c0": 29, "\uc0dd\uc131\ud558\ubbc0\ub85c": 29, "\uace0\ub824\ud558\uc5ec": [23, 29], "\ucee8\uc149\uc5d0": 29, "64\uac1c\uc758": 29, "x\ucd95": 29, "\ub09c\uc774\ub3c4\uc640": 29, "\uc124\uc815\uc758": 29, "\uc77c\ub828\uc758": [14, 29], "prompt\uc758": 29, "embedding\uc5d0\uc11c": 29, "similarity\ub97c": 29, "\uc2a4\ucf54\uc5b4\ub294": 29, "capability\uc640": 29, "\uc2e0\ub8b0\ub3c4\ub97c": 29, "\ud658\uacbd": 29, "\ub530\ub984": 29, "\uc0dd\ub7b5": 29, "evaluation1": 29, "baseline\uacfc": 29, "set\uc5d0\uc11c": 29, "\uc0d8\ud50c\ub9c1\ud558\ub294": 29, "\uc5c6\uc5c8\ub2e4": [14, 29], "\ub2ec\uc131\ud558\uace0": 29, "baseline\uc5d0\uc11c": 29, "editablity\uc744": 29, "\uc778\uc0c1\uc801\uc778": [14, 29, 33, 42], "\ub098\ud0c0\ub0b4\uace0": 29, "word\ub9cc": 29, "\uc815\ud655\ub3c4\ub85c": 29, "\ucea1\ucc98\ud558\ub294\ub370": 29, "tradeoff": 29, "\uace1\uc120\uc758": 29, "outline\uc744": 29, "\uadf8\ub9ac\uba70": 29, "\uc218\uc815\ub420": 29, "target\uc758": 29, "\ucea1\ucc98\ud558\uc9c0\ub294": 29, "\ubc18\ub300\ub85c": 29, "\uba40\ub9ac": 29, "\ubc97\uc5b4\ub098\uba74": 29, "editability\uac00": 29, "\uac10\uc18c\ud558\ub294": 29, "reconstruction\uc774": 29, "\ubcc0\uacbd\ud574": 29, "\uace1\uc120\uc744": 29, "\uc774\ub3d9\ud560": 29, "\uc788\uc73c\ubbc0\ub85c": 29, "\uc0ac\uc6a9\uc790\uc5d0\uac8c": 29, "tradeoff\uc5d0": 29, "\uc815\ub3c4\uc758": 29, "\ud3ec\ucc29\ud558\uc9c0": [14, 29], "\ubabb\ud558\uba74\uc11c\ub3c4": 29, "\uac10\uc18c\ud568": 29, "\uc124\ubb38\uc9c0": 29, "\uc81c\uacf5\ubc1b\uc558\uace0": 29, "\uc774\ubbf8\uc9c0\uc640\uc758": [29, 36], "\uc720\uc0ac\uc131\uc5d0": 29, "\ub9e4\uae40": 29, "\uc9c8\ubb38\ubcc4\ub85c": 29, "600\uac1c\uc529": 29, "200\uac1c\uc758": 29, "\uc751\ub2f5\uc744": 29, "\uc81c\uacf5\ud558\uc9c0\ub9cc": [14, 29], "\uc758\ubbf8\ub860\uc801\uc778": 29, "\ubcf8\uc9c8\uc744": 29, "\ud30c\uc545\ud558\uac70\ub098": 29, "shape\ub97c": 29, "\ucd5c\uc801\ud654\uac00": [23, 29], "\uac78\ub9b0\ub2e4": [29, 31], "2\uc2dc\uac04\uc774": 29, "\uc18c\uc694\ub428": 29, "\uc124\uc815\uacfc": [29, 32], "\uac1c\uc778\ud654\ub418\uba70": 29, "generation\uc744": 29, "\uc18c\uac1c\ud568": 29, "word\ub85c": 29, "inverse\ud558\uc5ec": 29, "\uc791\ub3d9\ud568": 29, "word\ub294": 29, "\uac04\ub2e8\ud558\uace0": 29, "\uc758\ubbf8\uc5d0\uc11c": 29, "\ud3b8\uc9d1\ud558\uae30": [14, 29], "\uc27d\ub3c4\ub85d": 29, "interpace\ub97c": 29, "\uc0ac\uc6a9\ud558\uc9c0\ub9cc": [29, 33], "\uc5b8\uc5b4\uc758": 29, "\ud55c\uacc4\uc5d0": 29, "\uc811\uadfc\ud560": 29, "\ub2e8\uc11c\ub97c": 29, "\uacf5\uac1c\uc801\uc73c\ub85c": [14, 29], "\uc0ac\uc6a9\uac00\ub2a5\ud55c": 29, "model\uc778": 29, "\uad6c\ud604\ub428": 29, "\uc544\ud0a4\ud14d\ucc98": 29, "\uc815\ubcf4\uc5d0": [23, 29, 30], "\uc758\uc874\ud558\uc9c0": [29, 32], "\uc0dd\uac01": 29, "\uac70\uae30\uc5d0\uc11c": 29, "preserav": 29, "\ud5a5\uc0c1\ub420": 29, "08818": 30, "resourc": 30, "\uc904\uc774\uae30": [30, 35], "\uc555\ucd95\ud558\uc5ec": 30, "\ubaa8\ub378\ub9c1\uc758": 30, "\ubd80\uc871\ud558\uba70": 30, "\uc774\uc720\uac00": 30, "cost": [30, 32, 40, 41], "\uc14b": 30, "temproal": 30, "\uc0d8\ud50c\ub4e4": 30, "\ub07c\ub9ac\uc758": 30, "\uc0dd\uc131\ud588\ub2e4": [30, 40], "\uac70\uce58\uac8c": 30, "\uc2dc\ud000\uc2a4\uc758": 30, "\uc2dc\uac04\ucd95\uc5d0": 30, "\ud588\uace0": [14, 30], "1280x2048": 30, "\uc2dc\ud000\uc2a4": [14, 30], "\uc778\ucf54\ub529\ud574": 30, "\uc815\ub82c\ud558\uc5ec": 30, "\uc77c\uad00\uc801\uc778": 30, "\ubcc0\ud658\ud55c\ub2e4": [14, 30, 40], "\uc790\uc728": 30, "\uc8fc\ud589\uc758": 30, "\uc2dc\ubbac\ub808\uc774\uc158": 30, "\uc5d4\uc9c4": 30, "512x1024": 30, "creativ": 30, "creation": 30, "\ubb38\uc81c\uc810": [14, 30], "\uac1c\ubcc4\uc758": 30, "\uc2dc\uac04\uc801\uc778": [14, 30], "\ud504\ub808\uc784\uc73c\ub85c": [14, 30], "\ub80c\ub354\ub9c1\ud574": 30, "\uacf5\uac04\uc801\uc778": 30, "\uc5f0\uad00\ub418\uba70": 30, "\uac1c\ubcc4": [14, 30, 33], "\uc815\ub82c\ud560": 30, "\uc778\uc2dd\ud560": 30, "einop": 30, "\uad6c\ud604\ud588\uc73c\uba70": 30, "\ubc30\uce58x\uc2dc\uac04": 30, "\uc778\ucf54\ub529\uc774": 30, "\ubc30\uce58": 30, "option": 30, "ii": 30, "\uad6c\uc131\ub41c\ub2e4": [14, 30], "\uc2dc\uac04\uc5d0": 30, "\ud65c\uc6a9\ud588\ub2e4": 30, "\uac00\uc911\ud569\uc744": 30, "\uacb0\ud569\ub41c\ub2e4": 30, "\uc2dc\ud000\uc2a4\ub85c": 30, "flickering\uc774": 30, "\ubc1c\uc0dd\ud558\ub294": [30, 41], "\uad6c\ucd95\ub41c": 30, "patch": 30, "wise": 30, "\ud504\ub808\uc784\uc758": [14, 30], "\uc778\ucf54\ub354\ub294": [14, 30], "\ub3d9\uc601\uc0c1\uc740": [14, 30], "\ud504\ub808\uc784\uc5d0\uc11c": [14, 30], "\uc608\uce21\ud558\uac8c\ub054": 30, "\ud504\ub808\uc784\ub4e4\uc740": 30, "\uc778\ucf54\ub354\ub97c": [14, 30], "\ucc28\uc6d0\uc5d0": 30, "\uc785\ub825\ub41c\ub2e4": 30, "\ucd5c\uc2e0": [14, 30], "\uc7ac": 30, "\ub3c4\uc785\ud574": 30, "\uc788\uc5b4\uc57c": [30, 40], "\ud0a4": 30, "\uc81c\uc57d\uc73c\ub85c": 30, "\uc50c\uc6b4\ub2e4": 30, "16t": 30, "\ud574\uc0c1\ub3c4\uae4c\uc9c0": 30, "\ubaa9\ud45c\uc774\ub2e4": 30, "cascad": [30, 39], "\uc601\uac10\ubc1b\uc544": 30, "4\ubc30": 30, "\ud0a4\uc6e0\ub2e4": 30, "\uad6c\ucd95\ud558\uae30": 30, "\ub2e8\uc704\ub85c": 30, "\uc5f0\uc0b0\ud558\uace0": 30, "main": [30, 36], "\ud6a8\uc728\uc801\uc73c\ub85c": [30, 40, 41], "\ubaa8\ub378\ub9c1\uc774": 30, "\uc218\ud589\ub41c\ub2e4": 30, "\uadf8\ub85c": 30, "\ud328\uce58": 30, "\uc9c4\ud589\ud558\uae30\uc5d0": 30, "rd": 30, "683": 30, "060": 30, "8\ucd08": 30, "dai": [30, 42], "night": 30, "crowded": 30, "7m": 30, "52k": 30, "hour": 30, "320": [30, 42], "1280": [30, 42], "\uac00\ub2a5\ud574\uc84c\ub2e4": 30, "113": 30, "24fp": 30, "7\ucd08": 30, "30fp": 30, "\uc81c\ud55c\uc801\uc778": 30, "\ud559\uc2b5\ud588\uc9c0\ub9cc": 30, "\uc14b\uacfc": 30, "entirely\ud558\uac8c": 30, "\uc704\ucabd\uc758": 30, "iccv": [31, 33], "16203": 31, "\uac70\ub300": 31, "\ubaa8\ub378\ub85c\ubd80\ud130": 31, "\ub098\uc058\uc9c0": 31, "composit": [23, 31], "reason": 31, "abil": [31, 37, 42], "\ud6cc\ub96d": 31, "\uc0b4\ud3b4\ubcf4\uae30": 31, "\uc2f6\ub2e4\uba74": 31, "\uc77c\ub2e8": [31, 40], "\ub3d9\ubb3c\uc758": 31, "\ud074\ub798\uc2a4\ub97c": 31, "37\uac1c\uc758": 31, "\ud074\ub798\uc2a4\uac00": 31, "pet": 31, "\uce58\uc790": 31, "\ud638\ub791\uc774": 31, "\uadf8\ub7fc": 31, "\ud68d\ub4dd\ud560": 31, "\uc218\ud589\ud574\uc11c": 31, "\ud310\ubcc4\ud55c\ub2e4": 31, "\ud074\ub798\uc2a4\uc774\ub2e4": 31, "\uc54c\uace0\ub9ac\uc998": [31, 43], "n_sampl": 31, "\uc9c0\uc815\ub41c": 31, "\uc0d8\ud50c\ub9c1\ud574": 31, "\ubca1\ud130\ub97c": [23, 31], "\ub9cc\ub4e0\ub2e4": [14, 31, 35], "\ud310\ubcc4\uc774": 31, "\ucd9c\ub825\ud55c\ub2e4": 31, "n_trial": 31, "\uc2dc\ub3c4\ud574\uc11c": 31, "\ud3c9\uade0\ub0bc": 31, "\ucd94\ub860\ud55c\ub2e4": 31, "\ud310\uc815\ud55c\ub2e4": 31, "\ucd94\ub860\ud560": 31, "\ub4e4\uc5b4\uc11c": [31, 39], "\uc218\ud589\ud558\uae30": [14, 31], "\ud559\uc2b5\ud558\uc9c0\ub294": 31, "\uc815\uc758\ub418\uc5b4": 31, "\ub370\uc774\ud130\uc14b\uc73c\ub85c": 31, "\uad6c\ud558\uace0": 31, "\uc18c\ubaa8\ub428": 31, "\uc904\uc778\ub2e4": 31, "\uac78\ub7ec\ub0b8\ub2e4": 31, "\uc18c\uc218\uc758": 31, "\ub0a8\uc558\ub2e4\uba74": 31, "\uc774\uc81c\ub294": 31, "oxford": 31, "iiit": 31, "bash": 31, "python": 31, "eval_prob_adapt": 31, "split": 31, "to_keep": 31, "l1": [31, 32, 33], "prompt_path": 31, "pets_prompt": 31, "csv": 31, "\uc774\ub807\uac8c\uae4c\uc9c0": 31, "\uc904\uc774\ub824\uace0": 31, "\uc2a4\ud06c\ub9bd\ud2b8": 31, "rtx": 31, "3090": 31, "\ub3cc\ub9ac\uba74": 31, "\ud558\ub824\uba74": 31, "\ucd08": 31, "all_nois": 31, "randn": [31, 36], "max_n_sampl": 31, "eval_error": 31, "ts": 31, "noise_idx": 31, "text_emb": 31, "text_embed_idx": 31, "float32": 31, "pred_error": 31, "cpu": 31, "idx": 31, "inference_mod": 31, "tqdm": 31, "trang": 31, "batch_t": 31, "noised_lat": 31, "alphas_cumprod": 31, "t_input": 31, "float16": 31, "text_input": 31, "noise_pr": [31, 42], "encoder_hidden_st": [31, 36, 42], "mse_loss": [31, 36], "l1_loss": 31, "huber": 31, "huber_loss": 31, "notimplementederror": 31, "\ucd94\ub860\ud558\uac8c": 31, "\ub420\ud150\ub370": 31, "\uc0ac\uc6a9\ud574\uc57c": 31, "\ubcc0\uc218\uc5d0": 31, "\ub2ec\ub77c\uc9c0\uae30": 31, "\ub2ec\ub77c\uc84c\ub2e4": 31, "intermedi": [31, 42], "\uc62c\ub77c\uac00\ub294\uc9c0": 31, "\uc2e4\ud5d8\ud574\ubcf4\uc558\ub2e4": 31, "addit": [31, 35], "knowledg": [31, 32, 42], "\ucd94\ucd9c\ud574\ub0b4\ub294": 31, "\ubc29\ubc95\ub4e4\ubcf4\ub2e4": 31, "\ub6f0\uc5b4\ub0ac\ub2e4": 31, "\uc0dd\uc131\ud574": 31, "\uad6c\ucd95\ud558\uace0": 31, "90": [31, 38, 40], "\ud559\uc2b5\uc2dc\ucf1c\uc11c": 31, "\uc218\ud589\ud55c": 31, "\ucd94\ucd9c\ud574": 31, "\uc804\ub2ec\ud574\uc11c": 31, "\ubaa8\ub378\ubcf4\ub2e4\ub3c4": 31, "\ub192\uc740\uc9c0": 31, "aesthet": [31, 40, 42], "\ud55c\uc9c0": 31, "\ud55c\uc9c0\uc5d0": 31, "filter": 31, "\uc774\uc640": 31, "cifar10": 31, "flower": 31, "stl10": 31, "\uc774\ub4e4": 31, "\uc644\uc804\ud55c": 31, "\ud544\ud130\ub9c1\uc774": 31, "\uc548\ub41c": 31, "\uc62c\ub77c\uac08": 31, "winoground": 31, "visio": 31, "linguist": 31, "\ub9e4\uce58\uc2dc\ud0a4\ub294": 31, "\uba85\uc0ac\uc808\ub07c\ub9ac": 31, "\ub4a4\ubc14\ub010": 31, "\ub3d9\uc0ac\ub07c\ub9ac": 31, "\ud615\uc6a9\uc0ac\ub07c\ub9ac": 31, "\ubd80\uc0ac\ub07c\ub9ac": 31, "\ud488\uc0ac\ub07c\ub9ac": 31, "\uc5ec\ub290": 31, "\ub9cc\uc744": 31, "\ud559\uc2b5\ud588\uc74c\uc5d0\ub3c4": 31, "\uc774\uc790": 31, "\ubcc0\ubaa8": 31, "dit": 31, "101": 31, "79": 31, "\uae30\ub85d\ud558\uba70": 31, "\ub2a5\uac00": 31, "\ub2a5\uac00\ud588\ub2e4": 31, "\uacb9\uce58\ub294": 31, "\uc2e0\ub8b0\uad6c\uac04": 31, "\ucc0d\ud600": 31, "\ubcc4": [23, 31], "\ubaa8\uc591\uc758": 31, "\ud68d\ub4dd\ud55c": 31, "\uae30\ub300\ub418\ub294": 31, "ood": 31, "\ud558\ub2e4": 31, "\ucd94\ucd9c\ud558\ub294": 31, "\uc6b0\uc218\ud568\uc744": 31, "\ub370\uc774\ud130\ub3c4": 31, "\ud559\uc2b5\uc2dc\ud0ac": [31, 43], "\uac1c\uc120\ub420": 31, "\ud65c\uc6a9\ud588\uc74c": 31, "\ub6f0\uc5b4\ub0a0": 31, "\uc608\uc0c1": [23, 31], "01469": 32, "consistency_model": 32, "audio": 32, "\uc654\uc2b5\ub2c8\ub2e4": 32, "flow": [14, 32, 40], "2000\ubc30": 32, "\uc5f0\uc0b0\uc791\uc5c5\uc744": 32, "\uc694\ud558\ub294": 32, "\uc0ac\uc9c4\ucc98\ub7fc": [32, 42], "pf": 32, "ordinari": [32, 40], "trajectori": 32, "\ub4e4\uc774": [32, 36], "\uc2dc\uc791\uc810\uc73c\ub85c": 32, "\ub9e4\ud551\ub418\ub3c4\ub85d": 32, "\ub9cc\uc871\uc2dc\ud0ac": 32, "\uccab\ubc88\uc9f8": [32, 41], "\ubc29\uc2dd\uc73c\ub85c\ub294": 32, "numer": 32, "solver": [32, 33, 41], "\ud55c\ubc88\uc758": [32, 40], "\ub9cc\uc73c\ub85c\ub3c4": [32, 40, 41], "\ub450\ubc88\uc9f8": [32, 41], "\uac1c\uc120\ub418\uace0": 32, "\ubaa8\ub378\ub85c\uc11c\ub3c4": 32, "stroke": 32, "\ubcf4\uc5ec\uc900\ub2e4\ub294": 32, "\ud655\uc778\ud558\uc600\uc2b5\ub2c8\ub2e4": 32, "sde": [32, 40, 41], "drift": [32, 36], "nabla": [32, 40], "p_t": 32, "\uc2dc\uc810": [23, 32], "solut": [32, 37], "\ubd84\ud3ec\ud569\ub2c8\ub2e4": 32, "\uc218\uc2dd\uc5d0\uc11c": 32, "pi": [14, 23, 32, 41], "\uc815\uc758\ud558\uace0": [32, 37, 41], "approx": [32, 33, 35, 37, 40], "\ub300\uc785\ud558\uba74": 32, "empir": [32, 40], "\uacfc\uc815\uc73c\ub85c\ub294": 32, "euler": [32, 40, 41], "heun": [32, 40], "\uc5ed\ubc29\ud5a5\uc73c\ub85c": 32, "\ud480\uc5b4": 32, "\uadfc\uc0ac\uac12\uc774\ub77c\uace0": [32, 35], "\ubc29\uc9c0\ud558\uae30": [14, 32, 33], "\uc591\uc218": 32, "\uba48\ucd94\uace0": 32, "\uadfc\uc0ac\uac12\uc73c\ub85c": 32, "\uac04\uc8fc\ud569\ub2c8\ub2e4": 32, "80": 32, "002": 32, "\uc124\uc815\ud569\ub2c8\ub2e4": [32, 43], "\uc18c\uac1c\ub4dc\ub9b0": [32, 41], "\uc791\uc5c5\uc774": [14, 32], "\uc9c4\ud589\ub418\uc5c8\uc9c0\ub9cc": 32, "\ud65c\uc6a9\ud574\ub3c4": 32, "10\ubc88": 32, "\uac70\uccd0\uc57c\ub9cc": 32, "\ubcf4\uc5ec\uc900\ub2e4\uace0": [32, 35, 36, 41], "\uae30\ubc95\ub4e4\uc5d0": 32, "\uc5f0\uad6c\ub4e4\ub3c4": 32, "saliman": [32, 40], "\uc81c\uc678\ud558\uace0\ub294": 32, "\ub300\ub7c9\uc758": 32, "\uc218\uc9d1\ud574\uc57c\ud55c\ub2e4\ub294": 32, "\ubc29\uc2dd\uacfc": [32, 40], "definit": 32, "mapsto": [32, 40], "\ub9cc\uc871\ud569\ub2c8\ub2e4": 32, "\uc608\uce21\ud558\uae30": 32, "\ub370\uc774\ud130\ub85c\ubd80\ud130": 32, "f_": [23, 32, 40, 42], "bilo": 32, "\uc720\uc0ac\ud558\uc9c0\ub9cc": 32, "invert": 32, "\ubd80\uc5ec\ud558\uc9c0\ub294": 32, "\ub9cc\uc871\ud574\uc57c": 32, "boundari": 32, "\ub9cc\uc871\ud558\uae30": 32, "\ucc28\uc6d0\uc774": [32, 43], "form": 32, "\ub9cc\uc871\uc2dc\ud0a4\ub294": 32, "\ubbf8\ubd84": [23, 32, 40], "\ud615\uc2dd\uacfc": 32, "\uc720\uc0ac\ud558\uc5ec": 32, "leverag": [32, 38], "\ud0dd\ud569\ub2c8\ub2e4": 32, "\ub354\ubd88\uc5b4": [32, 33, 38], "\ud558\ub2e8": [32, 42], "pseudo": 32, "\ubcf4\uc774\ub4ef\uc774": 32, "inject": [32, 44], "multistep": 32, "\uc720\uc5f0\uc131\ub3c4": 32, "\ub4e4\uac04\uc758": 32, "\ubcf4\uc644\ud558\uba74\uc11c": 32, "\uc608\uc2dc\ub4e4\uc744": 32, "\uccab\ubc88\uc9f8\ub85c": [32, 43], "t_n": [23, 32, 40], "t_i": [23, 32, 40], "rho": [32, 40], "\ud06c\ub2e4\uba74": 32, "\uc9c4\ud589\uc2dc\ucf1c": 32, "\uc608\uce21\uac12\uc744": [14, 32, 40], "ts_": 32, "\uc9c0\uc810": [23, 32], "\uc790\uc138\ud558\uac8c\ub294": [32, 36, 41, 42, 43], "2_": 32, "\ub85c\ubd80\ud130\uc758": [32, 33], "\ucd9c\ub825\uac12": 32, "\ub85c\ub294": [32, 41], "\ud655\uc778\ud574\ubcf8": [32, 41], "equiv": 32, "descent": [23, 32, 37], "ema": [32, 40], "\ud559\uc2b5\ud558\uc600\ub2e4\uace0": 32, "stopgrad": 32, "\uc124\uc815\ud560\ub54c\ubcf4\ub2e4": 32, "\uc548\uc815\uc801\uc73c\ub85c": 32, "\uc131\ub2a5\uc5d0\ub3c4": 32, "\uac1c\uc120\uc774": 32, "\uc808\ucc28\ub294": 32, "\uc815\ub9ac\ud560": [32, 40], "cd": [32, 40], "run": 32, "\uc218\ub834\ud560": 32, "\ub458\uc740": 32, "\uc77c\uce58\ud558\uac8c": 32, "onlin": 32, "\ubc29\uc2dd\uc5d0\uc11c\ub294": 32, "\uadfc\uc0ac\ud558\ub294": 32, "\uc758\uc874\ud588\ub2e4\uba74": 32, "\ub9d0\ud574": [32, 33, 41], "\uadfc\uc0ac\ud560": [32, 40], "ct": [23, 32], "\uc0ac\uc2e4\uc744": 32, "\uc788\uc2b5\ub2e4": 32, "t_nz": 32, "\uc815\uc758\ud558\uac8c": [32, 41, 42, 43], "\ubc30\uacbd\uc740": 32, "\ud074\uc218\ub85d": [32, 40], "\ube44\uad50\ud588\uc744\ub54c": [32, 36], "\uac10\uc18c\ud558\uc9c0\ub9cc": 32, "\uc99d\uac00\ud558\uac8c": 32, "\ucd08\uae30\uc5d0": [14, 32], "converg": [32, 37, 38, 41], "\uc774\ub974\ub294\ub370": 32, "\uc6a9\uc774\ud569\ub2c8\ub2e4": 32, "\uc99d\uac00\ud558\uace0": 32, "\uac10\uc18c\ud558\uac8c": 32, "\ubc14\ub78c\uc9c1\ud558\ub2e4\uace0": 32, "\uc2e4\ud5d8\ud558\uc600\uace0": 32, "\uc9c0\ud45c\ub294": [32, 40, 41], "precis": 32, "\ub370\uc774\ud130\uc14b\uc5d0\ub294": [32, 41], "ncsn": 32, "\uc9c4\ud589\ud558\uc600\uc2b5\ub2c8\ub2e4": 32, "\uc0ac\uc6a9\ud588\uc744\ub54c": [32, 41], "\uc88b\uc558\uace0": 32, "\ub4e4": 32, "\uce21\uc815\ud558\ub294\ub370": 32, "\ud2b9\ud654\ub418\uc5b4": 32, "\uc124\uc815\ud588\uc744\ub54c": 32, "\uc88b\uc558\uc2b5\ub2c8\ub2e4": 32, "\uc774\uc678\uc5d0\ub3c4": 32, "\ubcc4\ub3c4\ub85c": [23, 32], "\ube68\ub9ac": 32, "\uc218\ub834\ud558\uc9c0\ub9cc": 32, "\ud004\ub9ac\ud2f0\ub294": 32, "vice": [32, 35], "versa": [32, 35], "\uc810\ucc28\uc801\uc73c\ub85c": [32, 41], "\uc99d\uac00\uc2dc\ud0a4\uba74\uc11c": 32, "\ubcc0\ud654\uc2dc\ucf30\uc744\ub54c": 32, "pd": [32, 40], "\ube44\ub86f\ud55c": [32, 41, 42], "\uacac\uc904\ub9cc\ud55c": 32, "\uc0dd\uc131\ud568\uc73c\ub85c\uc368": 32, "\uc131\uc9c8\ub3c4": 32, "\uc54c\uace0\ub9ac\uc998\uc744": [32, 34], "pseudocod": [32, 41], "unpair": 33, "2017": 33, "1703": 33, "10593": 33, "tensorflow": 33, "tutori": 33, "\ub17c\ubb38\ub9ac\ubdf0": 33, "cyclegan\uc744": 33, "\uc0ac\ub78c\uc774": [14, 33, 38, 39], "\ud55c\uad6d\uc778\uc774\ub77c\uace0": 33, "\ub72f\uc5b4\ubcf4\uae30": 33, "kwangsu": [33, 44], "\ub3c4\uba54\uc778\uc744": 33, "\ub3c4\uba54\uc778\uc73c\ub85c": 33, "\ubcc0\ud658\uc2dc\ud0a4\ub294": 33, "vision\uc758": [], "translation\uc740": [], "input\uacfc": 33, "\uc9dd\uc774": 33, "\uc9c0\uc5b4\uc9c4": 33, "\uc5bb\ub294": [23, 33, 38], "\uc5b4\ub835\uc2b5\ub2c8\ub2e4": [33, 43], "\uc9dd\uc9c0\uc5b4\uc9c4": 33, "x\ub77c\ub294": [], "domain\uc73c\ub85c\ubd80\ud130": [], "\uc5bb\uc740": 33, "y\ub85c": [], "\ubc14\uafb8\ub294": [33, 36], "\uc5f0\uad6c\ub294": 33, "\ubd84\ud3ec\uc640": 33, "y\ub85c\ubd80\ud130\uc758": [], "\uad6c\ubd84\uc774": 33, "\ubd88\uac00\ub2a5\ud558\ub3c4\ub85d": 33, "y\ub85c\uc758": [], "mapping\uc5d0": [], "\uac00\ud574\uc11c": 33, "\uac15\uc81c\ud558\uae30": 33, "\uc5ed\ubc29\ud5a5": 33, "\uc9c4\ud589\ud558\uace0": [], "\uc720\uc0ac\ud574\uc9c0\ub3c4\ub85d": 33, "\uac15\uc81c\ud558\ub294": 33, "\ub3c4\uc785\ud588\uc2b5\ub2c8\ub2e4": 33, "pair\uac00": [], "\ubcf4\uc5ec\uc92c\ub2e4\uace0": 33, "\uadf8\ub9bc\uc73c\ub85c": 33, "\ubcc0\ud658\ud55c\ub2e4\uac70\ub098": 33, "\ub0ae\uc5d0": 33, "\ucc0d\uc740": [23, 33], "\ubc24\uc5d0": 33, "\ud754\ud788": 33, "output\uc73c\ub85c": 23, "\uc788\uc5c8\ub294\ub370\uc694": 33, "\ube44\uc2fc": 33, "\uc77c\uc774": 33, "\uc77c\ub300\uc77c\ub85c": 33, "\uc9dd\uc9c0\uc5b4\uc9c0\uc9c0": 33, "\ubaa8\uc74c\uc758": 33, "\ucea1\uccd0\ud558\uace0": 33, "\ubaa8\uc74c\uc73c\ub85c": 33, "\ubcc0\ud658\ud560": 33, "x\uc5d0": [], "\uc138\ud2b8": 33, "\uc81c\uacf5\ub418\uace0": 33, "output\uacfc": 35, "y\uac00": [], "\uad6c\ubcc4\ud560": 33, "\uc5c6\ub3c4\ub85d": 33, "y\ub97c": 35, "\uc774\uac8c": [], "\ubb34\uc870\uac74": 33, "\uc720\uc758\ubbf8\ud558\uac8c": 33, "\uc774\ub8ec\ub2e4\ub294": 33, "\ub73b\ud558\uc9c0\ub294": 33, "g\uac00": [], "image\uc5d0\ub294": [], "\ubb34\ud55c\ud55c": 33, "\uc218\uac00": [23, 33, 34], "collapse\uac00": [], "\uc77c\uc5b4\ub098\uae30\ub3c4": 33, "dl": 33, "blogspot": 33, "08": [14, 33], "problem": 33, "image\ub4e0": [], "\ub9e4\ud551\ud558\uba74\uc11c": 33, "\ucd5c\uc801\ud654\uc5d0": [23, 33], "\uc2e4\ud328\ud558\ub294": 33, "\ud604\uc0c1\uc740": 33, "\uc785\uc7a5\uc5d0\uc11c": 33, "discriminator\uac00": [], "\uc0ac\uc9c4\uc774": [33, 35], "y\uc778\uc9c0": [], "\uac00\uc9dc\uc778": 33, "\uc778\uc9c0": 33, "\uad6c\ubcc4\ud558\ub294": 33, "\uc18d\uc774\uae30\ub9cc": 33, "\uc6b0\ub9ac\uc758": 33, "\ubaa9\uc801\uacfc": 33, "\uc0c1\uad00\uc774": 33, "\ub9cc\ub4e4\ub354\ub77c\ub3c4": 33, "\uc54a\uc544\uc11c": 33, "\ubc1c\uc0dd\ud568": [], "\uc774\uc288\ub85c": 33, "\ud544\uc694\ud574": [], "\uc84c\uc2b5\ub2c8\ub2e4": [], "task\ub294": [], "\uc601\uc5b4": 33, "\ud504\ub791\uc2a4\uc5b4": 33, "\uc601\uc5b4\ub85c": 33, "\ubc88\uc5ed\ud588\uc744": 33, "\ub3c4\ub2ec\ud558\ub294": 33, "\uac19\uc544\uc57c": 33, "\uc758\ubbf8\uc758": 33, "cyclic": [], "consistency\uc774\ub77c\ub294": [], "\uc18d\uc131\uc744": [23, 33], "\uc774\uc6a9\ud569\ub2c8\ub2e4": 33, "\ubaa9\uc801\uc2dd\uc744": 33, "\uc815\ubc29\ud5a5": 33, "\ub17c\ubb38\uacfc": [], "\ub0b4\uc6a9\uc774\uc5c8\uc74c": [], "introduction\uc5d0\uc11c": [], "\uc124\uba85\ud588\uace0": [], "\uc2a4\ud130\ub514\uc640\ub294": [], "\uc2a4\ud0b5\ud588\uc74c": [], "\ub3c4\uc2dd\ud654": 33, "mapping\ud558\ub294": [], "function\uc744": 34, "\uc6a9\uc5b4": 33, "pdata": [], "\ud45c\uc2dc": [], "dx": 37, "dy\ub294": [], "dx\ub294": [], "y\uc640": [], "\ubaa9\uc801\uc2dd\uc740": 33, "\ub450\uac1c": [], "domain\uc758": [], "distribution\uacfc": [], "\uc77c\uce58\uc2dc\ud0a4\uae30": [33, 41], "g\uc640": [], "f\uac00": [], "\ubaa8\uc21c\ub418\ub294": 33, "dy\uc5d0": [], "l_gan": [], "gan\uc5d0\uc11c": [], "\uac08": [33, 35], "x\ub85c": [], "\uc218\uc2dd\uc774": 33, "\ub098\uc624\uba70": [], "dx\uc5d0": [], "dx\ub97c": [], "\ub123\uc740": 33, "\ub9d0\ud588\ub4ef": [], "\uc81c\ud55c\uc744": 33, "\uc218\uc2dd\uc73c\ub85c\uc11c": [], "\uc608\ube44": 33, "loss\ub85c": [], "\ub300\uccb4\ud574\ubd24\ub294\ub370": 33, "\uad00\ucc30\ud560": 33, "\uc5c6\uc5c8\uc74c": [], "loss\uc640\uc758": [], "\uc0c1\ub300\uc801": 33, "\uc911\uc694\ub3c4\uc5d0": 33, "\uacb0\uc815\ub428": [], "architecture\ub85c\uc11c": [], "transfer\uc640": [], "\ubcf4\uc5ec\uc900": [33, 42], "\ucc44\ud0dd\ud568": 35, "sever": 33, "fraction": 33, "rgb\ub85c": [], "\uc548\uc815\ud654\uc2dc\ud0a4\uae30": 33, "\ud14c\ud06c\ub2c9\uc744": [33, 40], "function\uc5d0\uc11c": [], "50\uac1c\ub97c": 33, "\uc800\uc7a5\ud574": 33, "\ud55c\uaebc\ubc88\uc5d0": 33, "\uc9c4\ub3d9\uc744": 33, "sjinu": 33, "ysbsb": 33, "lsgan": 33, "\uc5c5\ub370\uc774\ud2b8\ub97c": [], "lsgan\uc744": [], "\uc774\ud574\ub294": [], "\ubabb\ud588\uace0": [], "\uc774\ub7f0\uac8c": [], "\uc788\uad6c\ub098": [], "\uc815\ub3c4\ub85c\ub9cc": [], "\uc774\ubcf4\ub2e4": 33, "\uace0\ucc28\uc6d0\uc774\uc9c0\ub9cc": 33, "\uac04\ub7b5\ud788": [33, 41], "2\ucc28\uc6d0\uc744": 33, "\ud45c\ubc29\ud558\uba74": 33, "\uacb0\uc815\uacbd\uacc4\ub97c": 33, "\ucabd\uc774": 33, "\uac00\uc9dc": [33, 37], "\uc601\uc5ed": [14, 33], "\uc601\uc5ed\uc785\ub2c8\ub2e4": 33, "\uc544\ub798\uc5d0": 33, "\uba3c": 33, "\uc0ac\uc6a9\ud55c\ub2e4\uba74": 33, "\uc785\uc7a5\uc5d0\uc11c\ub294": 33, "discriminator\ub97c": [], "\uc18d\uc774\uace0": 33, "vanish": [33, 37], "\uc77c\uc5b4\ub098\uae30": 33, "\uc18d\uc778\ub2e4\ub294": 33, "\uc774\uc720\ub9cc\uc73c\ub85c": 33, "\uc5c6\uac8c": 33, "ls": [], "generator\ub294": [], "\uc18d\uc774\ub294": [], "\ub118\uc5b4\uc11c": [], "\uac00\uc9c0\uac8c\ub054": [], "\ud574\uc57c\ud569\ub2c8\ub2e4": [], "\ub78c\ub2e4\ub97c": [], "10\uc73c\ub85c": [], "\uc544\ub2f4\uc744": [], "\uc5d0\ud3ec\ud06c": [], "\ub3d9\uc548\uc5d0\ub294": 33, "ln\uc744": [], "\uc5d0\ud3ec\ud06c\ub9c8\ub2e4": [], "\uc870\uae08\uc2dd": 33, "\uc218\ub834\ud558\uac8c": 33, "\ucc38\uac00\uc790\ub4e4\uc740": 33, "\uc0ac\uc9c4\uc774\ubbf8\uc9c0": 33, "\uac00\uc9dc\uc774\ubbf8\uc9c0\uc5d0": 33, "\ub178\ucd9c\ub41c": 33, "\uc9c4\uc9dc\ub77c\uace0": 33, "\uc0dd\uac01\ub418\ub294": 33, "\uc120\ud0dd\ud558\uac8c": 33, "study\uac00": [], "\ud14c\uc2a4\ud2b8\uc5d0": 33, "\uae30\uc900\uc784\uc5d0\ub3c4": 33, "\uc2e4\ud5d8\uc774": 33, "\uc591\uc801\uc778": 33, "\uae30\uc900\uc744": 33, "\ucc3e\uc558\ub294\ub370": [], "score\uc784": [], "fcn\uc740": [], "\uc0ac\uc9c4\uc5d0": 33, "\ub808\uc774\ube14": 33, "\ub9f5\uc744": 33, "\ub9f5\uc740": 33, "\ubd84\ud560": [], "\uba54\ud2b8\ub9ad\uc744": [], "label\uacfc": [], "\ub3c4\ub85c": 33, "\uc0c1\uc758": [23, 33], "\uc790\ub3d9\ucc28": 33, "label\uc5d0\uc11c": [], "fcn\uc774": [], "\uac10\uc9c0\ud558\uba74": 33, "\uc131\uacf5\ud55c": 33, "\ub77c\ubca8\ub9c1": [], "pixel\ub2f9": [], "\ub2f9": [23, 33], "cityscap": 33, "benchmark\uc758": [], "cogan": 33, "simgan": 33, "aginst": 33, "6\uc5d0\uc11c": [], "baseline\uc5d0\uc11c\ub3c4": [], "cyclegan\uc740": [], "supervise\uc778": [], "pix2pix\uc640": [], "realism": [14, 33], "\uc9c0\ub3c4\uc5d0\uc11c": 33, "\ud56d\uacf5": 33, "\uc0ac\uc9c4\uc5d0\uc11c": 33, "\ubaa8\ub450\uc5d0\uc11c": [14, 23], "4\uc758": 33, "\ucc38\uac00\uc790\ub97c": 33, "\uc18d\uc77c": 33, "baseline\uc740": [], "\ub3c4\uc2dc": 33, "\ud48d\uacbd\uc5d0": 33, "\ud3c9\uac00\ud558\uace0": [], "3\uc740": [], "\ud3c9\uac00\ud568": 38, "cyclegan\uc774": [], "baseline\ub4e4\uc758": [], "\ub2a5\uac00\ud55c\ub2e4": [], "consistency\uc758": [], "\ubcf4\uc5ec\uc8fc\ub294": [33, 34, 36, 41, 42], "\uc5c6\uc560\uba74": [], "cycle\uc744": [], "\uc81c\uac70\ud558\ub294": [], "\uc800\ud558\ub428": [], "\uacb0\ub860\uc744": [], "\ub0b4\ub9b4": [], "\ubc29\ud5a5\uc5d0\uc11c\ub9cc": [], "\uba54\uc18c\ub4dc\ub97c": [], "cycle\ub9cc": [], "\ub3cc\ub838\uc744": 33, "backward": [33, 36, 37], "\uc774\ub530\uae08\uc529": [], "collapse\ub97c": [], "\uc720\ubc1c\ud558\ub294": 33, "\ubc1c\uacac\ud568": [], "\ub9e4\ud551\uc758": [], "\ubc29\ud5a5\uc5d0": [23, 33], "7\uc744": [], "\uc787\uc5c8\uc74c": [], "\uc7ac\uad6c\uc131\ub41c": 33, "\uc0ac\uc9c4\uacfc": 33, "\ub3c4\uba54\uc778\uc774": 33, "\ub9ce\uc558\uc74c": [], "8\uc740": [], "cmp": 33, "fa\u00e7ad": [], "database\uc758": [], "\uac74\ucd95": 33, "ut": 33, "zapoos50k": 33, "\uc2e0\ubc1c\uacfc": [], "pix2pix\uc5d0": [], "cyclegan\uc758": [], "\ud488\uc9c8\uc740": [], "\ub300\uc758": [], "\uc9f1\uc774\ub2e4": [], "\ub9ce\uc544": [], "\uc0dd\ub7b5\ud558\uaca0\uc2b5\ub2c8\ub2e4": [], "\u3160": [], "data\uac00": [], "data\uc5d0\uc11c": [], "transslation\uc774": [], "\ud55c\uac83\ubcf4\ub2e4": [], "\ub9e4\ub825\uc801\uc774\ub2e4": [], "application\uc740": [], "\uc6f9\uc0ac\uc774\ud2b8\uc5d0": [], "\uc2e0\uacbd": [], "\uc804\ub2ec": [], "\uc791\uc5c5\uacfc": [], "\uc120\ud0dd\ud55c": [], "\uc608\uc220": [], "\uc791\ud488\uc758": [], "\uc804\ub2ec\ud558\ub294": [], "\uc791\ud488": 33, "\uceec\ub809\uc158\uc758": [], "\ubaa8\ubc29\ud558\ub294": [], "\ubcc4\uc774": [], "\ube5b\ub098\ub294": [], "\uadf8\ub9ac\ub294": [], "\ubc18": [], "\uace0\ud750": [], "\ub530\ub77c\ud558\ub294": [], "\ub290\ub08c\uc744": [], "\ub530\ub77c\ud55c\ub2e4": [], "turmukhambetov": [], "\ubc94\uc8fc\uc758": [], "\uac1d\uccb4\ub85c": [], "\ubc94\uc8fc": [], "\ubcc0\ud615\uc5d0": 14, "\ub461\ub2c8\ub2e4": 43, "turn": 14, "hors": [], "zebra": [], "\uc0c9": [], "\uad6c\uc131\uc744": [], "\ubcf4\uc874\ud558\uae30": [], "\uc720\uc6a9\ud558\ub2e4\ub294": [], "taigman": [], "49": [], "\ucc44\ud0dd\ud558\uc5ec": 35, "\uc81c\ub108\ub808\uc774\ud130\uac00": [], "\ub3c4\uba54\uc778\uc758": [], "\uc81c\uacf5\ubc1b\uc744": [], "\uadfc\ucc98\uc5d0": [], "\uc815\uaddc\ud654\ud569\ub2c8\ub2e4": [], "lident": [], "ey_pdata": [], "lidentity\uac00": [], "\uc5c6\uc73c\uba74": [], "\uc0dd\uc131\uc790": [], "\uad73\uc774": [], "\uc0c9\uc870\ub97c": [], "\uc790\uc720\ub86d\uac8c": [], "\ubcc0\uacbd\ud560": 40, "monet\uc758": [], "flickr": [], "\uc0dd\uc131\uc790\ub294": [], "\uadf8\ub9b0": [], "\uc77c\ubab0": [], "\uc801\ub300\uc801": [], "\uc0ac\uc774\ud074": 33, "\ub9e4\ud551\uc774": [], "\ub3d9\ub4f1\ud558\uac8c": [], "\uc720\ud6a8\ud560": [], "\uc190\uc2e4\uc758": [], "9\uc5d0\uc11c": [], "\ubcf4\uc5ec\uc9d1\ub2c8\ub2e4": [], "9\ub294": [], "set\uc740": [], "set\uc73c\ub85c\ubd80\ud130": [], "\uadf8\ub824\uc9c4": [], "datqa\ub97c": [], "\uadf8\ub9bc\uc5d0": [], "\ud0c0\ub2f9\ud55c": [], "monet\uc774": [], "\uc0c8": 34, "\uadf8\ub9b4": [], "generalization\uc740": [], "press": [], "\uc595\uc740": 33, "\uae4a\uc774\uc758": [], "flickr\uc5d0\uc11c": [], "\ub2e4\uc6b4\ub85c\ub4dc\ud55c": [], "\uaf43": [], "\ud6c8\ub828\ud569\ub2c8\ub2e4": [], "\uc18c\uc2a4": [], "\ub3c4\uba54\uc778\uc740": [], "\uc2a4\ub9c8\ud2b8\ud3f0\uc73c\ub85c": [], "\ucc0d\ud78c": [], "\uc870\ub9ac\uac1c\ub85c": 33, "dof": [], "\ucd08\uc810": 33, "\uae4a\uc774": [], "\ub300\uc0c1\uc740": [], "\uc870\ub9ac\uac1c\uac00": 33, "dslr\ub85c": [], "\ud3ec\ud568\ud569\ub2c8\ub2e4": [], "\uc131\uacf5\uc801\uc73c\ub85c": [23, 40], "shallow": 33, "\ucd08\uc810\uc774": 33, "\ub9de\uc740": 33, "\ubc30\uacbd\uc774": 33, "\ud750\ub9bf\ud558\uac8c": 33, "\uad6c\ubaa9\ud558\uace0\uc790": 33, "\uac15\uc870\ud558\uae30": 33, "domain\uc740": 33, "\uc2a4\ub9c8\ud2b8\ud3f0\uc758": 33, "target\uc740": 33, "discuss": 33, "\ud765\ubbf8\ub85c\uc6b4": [33, 36], "\uade0\uc77c\ud558\uac8c": [14, 23, 33], "\uc544\ub2c8\uc5c8\uc2b5\ub2c8\ub2e4": 33, "\ud574\uc11d": [], "task\uc640": [], "\ubcc0\ud654\ub9cc": 33, "\ud615\uccb4\uac00": 33, "\uc560\ub9e4\ud574\uc9c4": 33, "\uc774\ub7f0\uac78": [], "geometri": 33, "\ubcf4\uc544": [], "\ucf54": 33, "\uc785\uc5d0": [], "\uad6c\ud604\ud558\ub294\ub370": 33, "\ub9d0": 33, "\uc5bc\ub8e9\ub9d0": 33, "\uc608\uc81c\uc758": 33, "\ud0c0\ub294": 33, "\ub9ce\uc558\ub294\ub370": 33, "\uc5bc\ub8e9\ub9d0\uc758": 33, "\uc5c6\ub2e4\ubcf4\ub2c8": 33, "\ubc30\uacbd\ub3c4": 33, "\uc5bc\ub8e9": 33, "\uadf8\ub9ac\uac70\ub098": 33, "\uc5bc\ub8e9\ub9d0\uc5d0\uc11c": 33, "\ub178\ub797\uac8c": 33, "\uce60\ud55c": 33, "\ub54c\ub54c\ub85c": [33, 40], "\ub098\ubb34\uc640": 33, "\uac74\ubb3c\uc758": 33, "label\uc744": [], "\ubaa8\ud638\uc131\uc744": 33, "\ud574\uacb0\ud558\ub824\uba74": 33, "weak": 33, "supervision\uc774": [], "\ub9c8\ubb34\ub9ac": [], "\ud48d\ubd80\ud558\uac8c": [], "\uc81c\uacf5\ub418\uba70": [], "\ud65c\uc6a9\ud574\uc57c": [], "setting\uc5d0\uc11c": [], "\uac83\uc758": [], "\ub298\ub9ac\ub294\ub370": 33, "\uae30\uc5ec\ud569\ub2c8\ub2e4": 33, "12092": 34, "unoffici": 34, "donggeun": [34, 35, 38, 44], "sean": [34, 35, 38, 44], "ko": [34, 35, 38, 44], "june": 34, "\ubaa8\ub378\uc774\uba70": 34, "120\uc5b5\uac1c": 34, "\uc218\uc640": 34, "5\uc5b5": 34, "\ud1b5\ud558\uc5ec": 34, "2021\ub144": 34, "diverse\ud55c": 34, "3\uc640": 34, "vae\ub97c": [14, 34], "transformer\uc744": 34, "architecture\uc744": [34, 35], "model\uba70": 34, "\uc218\ub294": 34, "shot\uc744": 34, "\ubd80\ubd84\ub9cc": [34, 35], "1750\uc5b5": 34, "\uac1c\uc218\uc758": 34, "2005": 34, "14165": 34, "jalammar": 34, "how": 34, "gpt3": 34, "encoder\uc5d0\uc11c": 34, "categor": 34, "\uac16\ub294\ub2e4\uace0": 34, "cnn": 34, "d\ucc28\uc6d0\uc758": 34, "\uc704\uce58\uc5d0": [23, 34], "\uadf8\ub9ac\ub4dc\ub85c": 34, "\ub098\ub204\uace0": 34, "\ud835\udc52_1": 34, "\ud835\udc52_\ud835\udc58": 34, "code\ub85c": 34, "e_j": 34, "\ucc3e\uc544\uc11c": 34, "\ubd80\uc5ec\ud568": 34, "p2yeong": 34, "explain": 34, "pixel\uc744": 34, "\uc9c1\uc811\uc801\uc73c\ub85c": 34, "\uc774\ubbf8\uc9c0\uc77c\uc218\ub85d": 34, "\uba54\ubaa8\ub9ac\ub7c9\uc774": 34, "\ud544\uc694\ud574\uc11c": 34, "\ube44\ud6a8\uc728\uc801": [23, 34], "short": 34, "depend": [23, 34, 36], "model\ub4e4": 34, "likelihood": [34, 35, 37, 43], "dependency\ub97c": 34, "\uac83\uc774\uba70": 34, "detail\uc5d0": 34, "\uc9d1\uc911\ud558\uac8c": 34, "recognizable\ud574\uc11c": 34, "\uadf9\ubcf5\ud558\uace0\uc790": 34, "192\uac1c\uc758": 34, "\ubc30\uc815": 34, "size\ub97c": 34, "\ub4e4\uacfc": [34, 38, 41], "\uc5f0\uc18d\uc801\uc73c\ub85c": 34, "\uc785\ub825\ud568": 34, "concaten": [14, 34, 39], "\ub4e4\uc758": [23, 33, 34, 41], "\uacb0\ud569": 34, "\uc2dc\uac01\ud654": [34, 35], "jiho": 34, "ml": [34, 43], "weekli": 34, "nlp": 34, "40": 34, "\ud30c\uc774\ud504\ub77c\uc778": 34, "cqom0r2kmvi": 34, "1729": 34, "\ud835\udc5e": 34, "\u03c6": 34, "dvae": 34, "token\ub97c": 34, "\ud835\udc5d": 34, "\ud835\udf03": 34, "token\uc5d0\uc11c": 34, "decoder\uc5d0\uc11c": 34, "\u03c8": 34, "purpl": 34, "text\uc640": [34, 40], "token\ub4e4\uc758": 34, "\ud835\udc5e_\u03c6": 34, "\ud835\udc5d_\ud835\udf03": 34, "\ud559\uc2b5\ud568": 34, "elb": 34, "bound\ub97c": 34, "192": [23, 34], "elb\ub97c": 34, "continuous\ub97c": 34, "\ubc14\uafd4\uc57c": 34, "\ud559\uc2b5\uc2dc\uc5d0\ub294": 34, "argmax\ub97c": 34, "\uc778\ub371\uc2a4\ub97c": 34, "\uc120\ud0dd\ud558\uc5ec": 34, "argmax": 34, "gumbel": 34, "\ud574\uacb0": 34, "underset": 34, "g_i": 34, "e_i": 34, "relaxation\ub97c": 34, "tau": [34, 42], "temperatur": 34, "relaxation\uc744": 34, "tight\ud558\uac8c": 34, "\uc7a1\uc544\uc90c": 34, "120\uc5b5\uac1c\uc758": 34, "token\uc740": 34, "logit\uc5d0\uc11c": 34, "\uc18c\ubb38\uc790\ud654": 34, "384": 34, "vocabulary\ub97c": 34, "\ud55c\ubc88\uc5d0": 34, "row": 34, "column": 34, "\ub300\ud558\uc5ec": 34, "n\uac1c\ub294": 34, "n\uac1c": 34, "\uace8\ub77c\uc11c": 34, "\uace0\ub974\uae30": 34, "\ubc88\uc9f8\ub85c": 34, "\uc120\ud0dd\ud568": 34, "best\ub97c": 34, "\uace0\ub97c\ub54c": 34, "prompt\ub791": 34, "\ub098\uc634": [34, 35], "score\uc774": 34, "\uc81c\uc77c": [34, 35, 37, 42], "\uc54c\ub9de\uc740": 34, "\uac1c\uc218\uc5d0": [34, 36], "df": 34, "five": 34, "vote": 34, "gan\ubcf4\ub2e4": [34, 35], "\ucc28\uc774\ub85c": 34, "\ud22c\ud45c": 34, "\ubc1b\uc558\uc74c": 34, "\ub0ae\uc744\uc218\ub85d": [34, 35], "\uc88b\uc73c\uba70": 34, "\ub192\uc744\uc218\ub85d": [34, 35], "\ub791": 34, "cub": 34, "coco\uc5d0\uc11c\ub294": 34, "\ubcf4\uc5ec\uc92c\uc74c": 34, "cub\uc5d0\uc11c\ub294": 34, "\ucc0d\uc9c0": 34, "\ubabb\ud558\uc600\uace0": 34, "score\uc5d0\uc11c\ub294": 34, "cub\uc5d0": 34, "\uacc4\uc120\uc744": 34, "\uc0dd\uac01\ud568": 34, "\uacb0\uacfc\uac12": 34, "parameter\uacfc": 34, "\ub6f0\uc5b4\ub098\uac8c": 34, "\ud574\uacb0\ud568": [23, 34], "\uc77c\ubc18\ud654": [14, 34], "\ud3c9\uac00\uc5d0\uc11c": 34, "\uc900\uc218\ud55c": 34, "\uc2f6\uc740": 34, "\uac1d\uccb4\uac00": 34, "\ud3ec\ud568\ub418\uba74": 34, "\uacaa\uc74c": 34, "\uace0\uc2b4\ub3c4\uce58\uac00": 34, "2\ub9c8\ub9ac\uac70\ub098": 34, "\uac15\uc544\uc9c0\uc640": 34, "\uace0\uc2b4\ub3c4\uce58": 34, "\ud06c\ub9ac\uc2a4\ub9c8\uc2a4": 34, "\uc2a4\uc6e8\ud130\ub97c": 34, "\uc785\uace0": 34, "\uc544\uc26c\uc6b4": 34, "\ub370\uc774\ud130\uc14b\uc774": [23, 34, 39], "tuning\uc73c\ub85c": 34, "limitation\uc744": 34, "2105": 35, "05233": 35, "\ubaa8\ub378\ub4e4\uc758": [14, 35], "\ub6f0\uc5b4\ub118\uc74c": 35, "\ubd80\ubd84\uc5d0\uc11c\ub3c4": 35, "\uc8fc\uc7a5\ud568": 35, "diversity\uc640": 35, "fidelity\uc758": 35, "off\uc5d0": 35, "model\ub4e4\uc774\uba70": 35, "\uc0dd\uc131\ud574\ub0b4\ub294\ub370\uc5d0": 35, "\uc131\uacf5": 35, "deep\uc5d0": 35, "\ub0ae\uc73c\uba70": 35, "\uac1c\uc120\uc0ac\ud56d\uc774": 35, "model\ub4e4\uc758": 35, "\ub04c\uc5b4\uc62c\ub9ac\uba70": 35, "\ub0ae\ucd94\uaca0\ub2e4\uace0": 35, "\uc124\uba85\ub418\uc788\uc73c\ubbc0\ub85c": 35, "\ub17c\ubb38\ub4e4\uc758": 35, "\uac00\uc815\ud558\uba70": 35, "\uacf5\ubd84\uc0b0": 35, "\ubd88\uac00\ub2a5\ud55c": 35, "\ub9e4\uac1c\ubcc0\uc218\ub85c": 35, "\uc124\uc815\ub418\uba70": 35, "ddpm\uc5d0\uc120": 35, "\uc9c0\ud45c\uac00": 35, "\ub0ae\uc558\ub2e4": 35, "scheduling\uc744": 35, "\uc0ac\uc6a9\ud588\uc9c0\ub9cc": 35, "\uc8fc\uc7a5\ud588\ub2e4": 35, "\ud559\uc2b5\uc5d0\ub3c4": 35, "\ub04a\uace0": 35, "\ubc14\uafc8": 35, "iteration\uc73c\ub85c": 35, "\ucc44\ud0dd\ud588\uc9c0\ub9cc": 35, "parameter\uc744": 35, "\ubcc0\uacbd\ud558\uc5ec": 35, "\uc77c\uc815\ud558\uac8c": 35, "\uac00\uc838\uac00\uba74\uc11c": 35, "\ubcf4\uae30": 35, "\uc2dc\ucf1c\ubcf4\uae30": 35, "head\uc5d0": 35, "8x8": 35, "\ud574\ubcf4\uae30": 35, "\uc77c\ubc18": 35, "block\uc774": 35, "biggan\uc758": 35, "connection\uc744": [23, 35], "32\uc77c\ub54c": 35, "\ub0ae\ub2e4": 35, "160": 35, "block\ub9c8\ub2e4": 35, "\ud29c\ub2dd\uc744": [14, 35], "adain\uc774\ub791": 35, "\uc5f0\uc0b0\ud558\ub294": [23, 35], "adagn": 35, "\uc18c\uac1c\ud588\ub2e4": 35, "\ubc29\ubc95\ub860\uc778\uc9c0\ub294": 35, "\ubaa8\ub974\uaca0\ub2e4": 35, "normalization\uc744": 35, "adpative\ud558\uac8c": 35, "embedding\uacfc": 35, "adain": 35, "\uacf1\ud558\uace0": 35, "\ub354\ud568": 35, "y_b": 35, "adagn\uc758": 35, "adagn\uacfc": 35, "additon": 35, "normalization\ubcf4\ub2e4": 35, "layer\uc744": 35, "\uc0ac\uc6a9\ud588\ub294\ub370": 35, "\uc8fc": 35, "de": 35, "\uc90c\uc73c\ub85c\uc368": 35, "zp_": 35, "normalizing\uc744": 35, "\uc0c1\uc218": 35, "log_": 35, "\uace1\ub960\uc774": 35, "\ubb34\ud55c\uc73c\ub85c": 35, "rightarrow0": 35, "\ud14c\uc77c\ub7ec": 35, "\uae09\uc218\ub97c": 35, "\uc7ac\uc804\uac1c": 35, "\uc720\ub3c4\ub294": 35, "\ubcf8\ubb38\uc758": 35, "\ubc88\uc2dd\uc774\ubbc0\ub85c": 35, "\ub611\uac19\uc774": 35, "sample\ud55c\ub2e4": 35, "gradient\uc758": 35, "\ube7c": 35, "score\uc744": 35, "scaling\uc758": 35, "classifier\uac00": 35, "scaling\uc774": 35, "\ub2e4\ub974\ub2e4": 35, "\uc8fc\uba74": 35, "\uc6f0\uc2dc\ucf54\uae30\ub77c\ub294": 35, "\uc6f0\uc2dc\ucf54\uae30\uc2a4\ub7ec\uc6b4": 35, "\uac15\uc544\uc9c0\uac00": 35, "\ub418\uc9c0\ub294": 35, "\uc6f0\uc2dc\ucf54\uae30": 35, "class\ub77c\ub294": 35, "\ubd84\uc704\uae30\uc758": 35, "\uac15\uc544\uc9c0\uc758": 35, "epsilon\uc774\ub77c\ub294": 35, "scale\uc5d0": 35, "\ubc1b\ub294\uc9c0": 35, "sampling\ud560": 35, "scale\uc774": 35, "recall\uc740": 35, "\ub0ae\uc9c0\ub9cc": 35, "precision\uc740": 35, "\ub192\ub2e4": 35, "\uc0dd\uae30\ub294\ub370": 35, "recall\uc774": 35, "diveristy\uac00": 35, "\ub0ae\ub2e4\ub294": [35, 43], "\uc758\ubbf8\uc774\uace0": 35, "precision\uc774": 35, "\ub192\ub2e4\ub294": 35, "\ub73b\uc774\ub2e4": 35, "\ub192\uc77c\uc218\ub85d": 35, "label\ucabd\uc73c\ub85c": 35, "guide\uac00": 35, "\uc0dd\uae30\ubbc0\ub85c": 35, "\uc77c\uc815\ud55c": 35, "sfid\ub294": 35, "off\ub85c": 35, "\ub3c4\ucd9c\ub418\ub294": 35, "\uac12\uc774\ubbc0\ub85c": 35, "\uc9c0\uc810\uc5d0\uc11c": 35, "\ub098\uc654\ub2e4": 35, "adm\uc740": 35, "\uc57d\uc790\uc774\uba70": 35, "g\ub294": 35, "guidance\uc758": 35, "\uc57d\uc790\uc774\ub2e4": 35, "\uc8fc\uc5c8\uc744": 35, "fid\uac12\uc774": [35, 38], "\ub098\uc654\uc73c\uba70": 35, "\ub450\ubc88\uca30": 35, "\ud50c\ub77c\ubc0d\uace0": 35, "\ubcfc\ub54c": 35, "biggan\uc740": 35, "\uc774\ubbf8\uc9c0\uac04\ub4e4\uc758": 35, "\ud50c\ub77c\ubc0d\uace0\uac00": 35, "\ub290\ub08c\uc758": 35, "\ubf51\uc544\ub0b8\ub2e4": 35, "\ub2e4\ucc44\ub85c\uc6b4": 35, "\ud55c\ub9c8\ub9ac\ub9cc": 35, "\uc0ac\uc9c4\ub3c4": 35, "\ub290\ub9ac\ub2e4": [14, 35], "\ubc95\uc744": 35, "function\uc758": [35, 40], "label\uc774": 35, "data\uc5d0\ub294": 35, "\ud655\uc7a5\uc774": 35, "\ubd88\uac00\ub2a5\ud558\ub2e4": [35, 40], "unlabel": 35, "cluster": 35, "\ubc29\ubc95\ub860\uc744": 35, "\ud558\ub824": 35, "12242": 36, "huggingfac": [36, 42], "\ucd5c\uadfc\uc5d0": [36, 37, 38], "\ub4f1\uc7a5\ud558\uc600\uc9c0\ub9cc": 36, "\ubd80\ubd84\uc5d0\uc11c": [36, 41], "\uba74\ub4e4\uc744": 36, "\uac1c\uc120\ud558\uae30": 36, "\uc18c\uac1c\ub418\uc5c8\uace0": 36, "5\uc7a5\uc758": 36, "\uc815\ub3c4\ubc16\uc5d0": 36, "\uc18c\uc694\ub418\uc9c0": 36, "\uc54a\ub294\ub2e4\uace0": 36, "\uc54c\uc544\ubcf4\uae30": 36, "\uc815\ub9ac\ub97c": 36, "gamma": [23, 36, 41], "\uc785\ub825\ubc1b\uc544\uc11c": 36, "\uc218\uc2dd\uc801\uc73c\ub85c": [36, 41, 43], "alpha_tx": 36, "\ud560\ub54c": 36, "\ub54c\ub85c\ub294": 36, "\uace0\uc815\uc2dc\ud0a8\ub2e4\uace0": 36, "\uc55e\uc368": [36, 39, 41, 42], "\uc124\uba85\ub4dc\ub838\ub358": 36, "\ub0b4\uc6a9\ub4e4\uc744": 36, "blob": 36, "text_encoder_cl": 36, "import_model_class_from_model_name_or_path": 36, "noise_schedul": 36, "ddpmschedul": 36, "from_pretrain": 36, "subfold": 36, "text_encod": 36, "autoencoderkl": 36, "unet2dconditionmodel": 36, "first_epoch": 36, "num_train_epoch": 36, "train_dataload": 36, "until": 36, "reach": 36, "resum": 36, "resume_from_checkpoint": 36, "resume_step": 36, "progress_bar": [36, 42], "accumul": [14, 36], "pixel_valu": 36, "weight_dtyp": 36, "latent_dist": 36, "config": 36, "scaling_factor": 36, "offset_nois": 36, "bsz": 36, "randint": 36, "num_train_timestep": 36, "accord": 36, "magnitud": 36, "noisy_lat": 36, "add_nois": 36, "get": 36, "input_id": 36, "model_pr": 36, "prediction_typ": 36, "v_predict": 36, "get_veloc": 36, "part": 36, "model_pred_prior": 36, "target_prior": 36, "float": 36, "prior_loss": 36, "sync_gradi": 36, "params_to_clip": 36, "itertool": 36, "clip_grad_norm_": 36, "max_grad_norm": 36, "zero_grad": [36, 37], "set_to_non": 36, "set_grads_to_non": 36, "\ub300\uc0c1\uc5d0": 36, "\ub2f4\ub294": 36, "rare": [36, 39], "3\uac1c": 36, "unicod": 36, "\uc0d8\ud50c\ub9c1\ud574\uc11c": 36, "\uc785\ub825\ud558\uc5ec": 36, "\ud559\uc2b5\ud558\uace0\uc790": 36, "\uc2dc\ud0a8": 36, "\ucd94\uac00\ud568\uc73c\ub85c\uc368": 36, "\uc720\uc9c0\ud558\uac8c": 36, "\uc774\ub85c\uc368": [36, 43], "encourag": 36, "\uac00\uc9c0\uc758": 36, "\uccab\ubc88\uc9f8\ub85c\ub294": [36, 41], "dino": 36, "\uc0dd\uc131\ub418\uae30": 36, "\uc120\ud638\ub41c\ub2e4\uace0": 36, "\uacc4\uc0b0\ub429\ub2c8\ub2e4": 36, "pairwis": 36, "\uacb0\uacfc\ub3c4": [36, 41, 42, 43], "\uc801\uc6a9\ub428\uc73c\ub85c\uc368": 36, "\uc18c\uac1c\ub4dc\ub838\ub358": 36, "div": 36, "\ud574\uacb0\ub418\ub294": 36, "\uc785\ub825\ud588\uc744\ub54c\uac00": 36, "\uc124\uba85\ud569\ub2c8\ub2e4": 36, "randomli": 36, "can": 36, "backpack": 36, "recontextu": 36, "articul": [14, 36], "art": [36, 41], "famou": 36, "painter": 36, "statu": 36, "sculptor": 36, "\ud615\ud0dc\ub3c4": 36, "novel": [23, 36], "\uac01\ub3c4\uc5d0\uc11c": [23, 36], "\ubcf4\ub294": 36, "\uc0dd\uc131\ub3c4": [36, 38], "modif": 36, "speci": 36, "\uace0\uc720": 36, "\ud55c\uacc4\uc810\ub3c4": 36, "\uc790\uc8fc": [36, 41], "\ub098\ud0c0\ub098\uc9c0": 36, "\ubcf8\ubb38\uc5d0": 36, "\uc18c\uac1c\ub418\uace0": 36, "\uc788\uc9c0\ub294": 36, "\uc54a\uc9c0\ub9cc": [36, 40], "\ubd80\ubb38\uc5d0\uc11c\ub3c4": 36, "\ud559\uc2b5\uacb0\uacfc\ub97c": 36, "\ubcf4\uc5ec\uc8fc\ub294\ub370": 36, "\uc7a5\ub9cc\uc73c\ub85c\ub3c4": 36, "\ub9cc\ud654": 36, "\uc0ac\ub840\ub4e4\uc744": 36, "nip": 37, "2014": [37, 43], "1406": 37, "2661": 37, "eriklindernoren": 37, "smart": [37, 43], "lab": [37, 42, 43], "kaist": [37, 43], "\ub525\ub7ec\ub2dd": [37, 43], "chp": 37, "editor": [37, 43], "changhwan": [33, 37, 43, 44], "densiti": [23, 37], "\ub098\ub269\ub2c8\ub2e4": 37, "\uacc4\uc0b0\ud55c\ub2e4\ub294": 37, "tractabl": 37, "\ucd94\uc815\ud558\ub294": 37, "\uadfc\uc0ac\ud654\uc2dc\ucf1c": 37, "\ubc29\uc2dd\uc774": [37, 40], "pixelcnn": 37, "pixelrnn": 37, "boltzmann": 37, "energi": 37, "\ud655\ub960\ubd84\ud3ec\ub97c": 37, "\uc815\uaddc\ud654\ud558\ub294": 37, "\uacc4\uc0b0\ud558\uc9c0": 37, "\uc644\uc804\uadf8\ub798\ud504": 37, "\uc5b4\ub824\uc6cc": 37, "\ub9ce\uc544\uc11c": 37, "\uc644\uc804\uadf8\ub798\ud504\uc774\uae30": 37, "\ub178\ub4dc\uac00": 37, "\ub298\uc5b4\ub0a0\uc218\ub85d": 37, "\uac04\uc120": 37, "\uae09\uc99d\ud558\ub294": 37, "restrict": 37, "rbm": 37, "\uc81c\uc548\ub418\uae30\ub3c4": 37, "\uc815\uc758\ud558\uc9c0": 37, "\ub300\ud45c\uc801\uc73c\ub85c\ub294": 37, "ian": 37, "goodfellow": 37, "2014\ub144\uc5d0": 37, "\ubc1c\ud45c\ud55c": 37, "\uc18c\uac1c\ub418\uae30": 37, "\uc804\uae4c\uc9c0": 37, "\ub144": 37, "\uc790\ub9ac\uc7a1\uc558\uc5c8\uc2b5\ub2c8\ub2e4": 37, "\uad6c\ud558\uac8c": 37, "taxonomi": 37, "\uc7a0\uc7ac\ubcc0\uc218": [37, 43], "\uadf8\ub85c\ubd80\ud130": 37, "\uad6c\ubd84\ud558\ub294": 37, "\uad6c\uc131\uc774": 37, "\ub9d0\ud574\uc11c": 37, "\ub4e4\uc5b4\uc624\uba74": 37, "\uac00\uc9dc\ub85c": 37, "binari": 37, "\uc9c4\ud589\ud569\ub2c8\ub2e4": [33, 37], "\ucf54\ub4dc\ub3c4": 37, "in_feat": 37, "out_feat": 37, "batchnorm1d": 37, "leakyrelu": 37, "inplac": 37, "opt": 37, "latent_dim": 37, "np": 37, "prod": 37, "img_shap": 37, "tanh": 37, "sigmoid": [37, 43], "img_flat": 37, "d\ub97c": 37, "g\ub97c": 37, "\uc190\uc2e4\ud568\uc218": [37, 43], "min_g": 37, "max_d": 37, "logd": 37, "p_z": 37, "\uc54c\uace0\ub9ac\uc998\uacfc": 37, "\ube44\uad50\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4": 37, "n_epoch": 37, "fill_": 37, "real_img": 37, "optimizer_g": 37, "gen_img": 37, "measur": 37, "fool": 37, "g_loss": 37, "adversarial_loss": 37, "optimizer_d": 37, "real_loss": 37, "fake_loss": 37, "d_loss": 37, "print": 37, "item": 37, "batches_don": 37, "sample_interv": 37, "save_imag": 37, "nrow": 37, "\ucd5c\ub300\ud654\ud558\uace0": 37, "\uc9c4\ud589\ud558\uac8c": 37, "\ud559\uc2b5\ud558\uc9c0": 37, "\uc0c1\ud669\uc774": 37, "\ubc1c\uc0dd\ud569\ub2c8\ub2e4": [33, 37, 39], "\ucd5c\uc18c\ud654\ud558\uc9c0": 37, "\ucd5c\ub300\ud654\ud558\ub294": 37, "\uae30\ubc95\ub3c4": 37, "\uc644\ubcbd\ud788": 37, "\ubcf5\uc6d0\ud558\uace0": 37, "\uc5b8\uc81c\ub098": 37, "\ub0b4\ubc49\uac8c": 37, "proposit": 37, "p_g": 37, "\uc99d\uba85\ud558\uc790\uba74": 37, "\uc190\uc2e4\ud568\uc218\ub97c": [37, 40, 42], "int_x": 37, "int_z": 37, "dz": [37, 43], "\uc77c\ub54c": 37, "\uc131\ub9bd\ud558\uace0": 37, "\uc190\uc2e4\ud568\uc218\ub294": [37, 42], "\uac19\uace0": 37, "ast": 37, "jsd": 37, "\ucd5c\uc19f\uac12\uc740": 37, "\uc131\ub9bd\ud569\ub2c8\ub2e4": 37, "mnist": [37, 43], "toronto": 37, "databas": [33, 37], "tfd": 37, "\ud3c9\uac00\uc2dc\uc5d0\ub294": 37, "parzen": 37, "estimation\uc744": 37, "\ud45c\ub97c": 37, "vae\ub294": 37, "\ud750\ub9bf\ud558\ub2e4\ub294": 37, "\ucc28\uc6d0\ucd95\uc18c\ub85c": 37, "\ud65c\uc6a9\ub418\uace0": 37, "\ud65c\uc6a9\ub418\uc5c8\ub2e4\uace0": 37, "11487": 38, "learning\uc774": 38, "\ub3c5\ucc3d\uc801\uc778": 38, "\ub9d0\ubb49\uce58": 38, "corpu": 38, "llm\ub4e4\uc758": 38, "embedding\ub4e4\uc740": 38, "\ud6a8\uacfc\uc801\uc774\ub77c\uace0": 38, "\ucda9\uc2e4\ub3c4": [14, 38], "\uc0ac\uc774\uc988\ub97c": 38, "\uc911\uc694\ud558\ub2e4\ub294": 38, "\uc81c\uc2dc\ud558\uc5ec": 38, "weight\uc744": 38, "\ub9cc\ub4e4\uc5b4": [14, 38], "\ud604\uc2e4\uc801\uc778": 38, "palett": [38, 39], "\uad6c\uc870\ubcf4\ub2e4": 38, "\uc81c\uc2dc\ud568": 38, "27": 38, "\ub2ec\uc131\ud568": 38, "evaluation\uc6a9": 38, "encoder\uc744": 38, "\ud574\ub193\uc74c": 38, "\uc774\ub780": 38, "generation\uc774": 38, "\uc77c\uc815\ud558\uc9c0": 38, "\ubabb\ubc1b\uc544\uc11c": 38, "class\ub098": 38, "object\uc774": 38, "\uc77c\uc815\ud558\uace0": 38, "\ubb34\uc5c7\uc744": 38, "\uc0dd\uc131\ud558\ub294\uac83\uc778\uc9c0": 38, "\uc790\uc138\ud558\uac8c": 38, "guide\uc758": 38, "\ub192\uc774\uba74": 38, "\ubd88\uc77c\uce58\uac00": [14, 38], "\uac00\uc911\uce58\uc758": 38, "\uc774\ub3d9\uc2dc\ucf1c": 38, "\ube57\ub098\uac00": 38, "\uc774\uc0c1\ud55c": 38, "satur": 38, "\ub35c\ud55c": 38, "\ub40c": 38, "\ud574\uacb0\ud558\uace0\uc790": 38, "\ubc31\ubd84\uc704\uc218": 38, "\uc808\ub300": 38, "\uc9c0\uc815\ud558\uace0": 38, "s\ub85c": 38, "\ub098\ub208\ub2e4": 38, "\uc9c0\uc810\uc758": 38, "among": 38, "net\uc774\ub77c\ub294": 38, "\uc5ec\ub7ec\uac00\uc9c0": 38, "modification\uc744": 38, "\ud558\uc600\ub2e4\uace0": 38, "effu": 38, "net\uc740": 38, "\uc758\ub8cc\ucabd\uc73c\ub85c": 38, "\uc788\ub294\uac78\ub85c": 38, "\uc544\ub294\ub370": 38, "remov": 38, "keep": 38, "block\uc5d0\uc11c": 38, "blocks\ub97c": 38, "\ucd94\uac00\ud568": 38, "\ubca4\uce58\ub9c8\ud06c": 38, "categori": 38, "\uc774\ub8e8\uc5b4\uc84c\ub2e4": 38, "\uae43\ud5c8\ube0c\uc5d0\uc11c": 38, "\ub2e4\uc6b4": 38, "\uac17\ub2e4": 38, "25\uba85\uc758": 38, "\ud3c9\uac00\uc790": 38, "a\uc5d0\uc11c": 38, "\ud3c9\uac00\uc790\ub294": 38, "\uc9c8\ubb38\uc744": 38, "\uae30\uc900\uc810\uc73c\ub85c": 38, "q1": 38, "q2": 38, "repres": 38, "\uae30\uc900\uc810": 38, "\ub2f5\ubcc0": 38, "\uc120\ud0dd\ud574\uc57c\ud568": 38, "am": 38, "indiffer": 38, "screenshot": 38, "drawbench\uc5d0\uc11c": 38, "\uccb4\ub9ac\ud53c\ud0b9": 38, "\uce74\ud14c\uace0\ub9ac\uc5d0\uc11c\ub3c4": 38, "\uc8fc\uc7a5\uc778": 38, "peopl": 38, "\uc62c\ub77c\uac10": 38, "people\uc744": 38, "\uc0dd\uc131\ud558\uae30\uc5d0": 38, "rater": 38, "xxl\ub85c": 38, "\uc120\ud638\ud568": 38, "evaul": 38, "\uc911\uc694\ud568": 38, "\ub07c\uce68": 38, "boost\uc5d0": 38, "thresholding\uc744": 38, "\ub04c\uc5b4": 38, "\uc62c\ub9b4": 38, "allow": [23, 38], "usag": 38, "much": 38, "editbench": 39, "06909": 39, "\uc2dc\uac04\uc5d0\ub294": [39, 42], "\uc18c\uac1c\ud558\ub294": [39, 41, 42], "\ud3c9\uac00\uae30\ubc95": 39, "\uc608\uc815\uc785\ub2c8\ub2e4": [39, 41, 42], "\uc601\uc5ed\uc744": 39, "\uc9c0\uc815\ud558\uc5ec": 39, "\ucc38\uc870\ud558\uc9c0": 39, "\uc624\ub85c\uc9c0": 39, "\uc720\ub3c4\ud558\ub294": 39, "ssd": 39, "mobilenet": 39, "detector": 39, "\ud2b9\uc9d5\uc740": 39, "\uc810\uc785\ub2c8\ub2e4": 39, "sr3": 39, "\ud558\uba74\uc11c": 39, "\uac00\uc9c4\ub2e4\uace0": 39, "\uc791\uc5c5": 39, "\uc785\ub825\ud569\ub2c8\ub2e4": [39, 42], "\ub0b4\uae30": [39, 40], "\ucd94\uac00\ub418\ub294": 39, "\ucd08\uae30\ud654\ud574\uc11c": 39, "\uc18c\uac1c\ub418\uc5c8\ub358": 39, "1\ubd80\ud130": 39, "\ubcc0\ud654\uc2dc\ud0a4\ub294": 39, "oscil": 39, "\uc801\uc6a9\ud568\uc73c\ub85c\uc368": 39, "\uc0c1\uc2b9\ub418\ub294": 39, "240\uac1c\uc758": 39, "\uad6c\ucd95\ub418\uc5b4\uc788\uace0": 39, "\uc30d\ub9c8\ub2e4": 39, "3\uac00\uc9c0\uc758": 39, "\uce21\uc815\ud558\uac8c": 39, "\uc73c\ub85c\ub294": [39, 42], "clipscor": 39, "prec": 39, "\uc808\ubc18\uc740": 39, "\ub370\uc774\ud130\uc14b\uc73c\ub85c\ubd80\ud130": 39, "\uc218\uc9d1\ub418\uc5c8\uace0": 39, "\uc0dd\uc131\ud574\uc11c": 39, "\uad6c\ucd95\ud588\uc2b5\ub2c8\ub2e4": 39, "\uc694\uc18c\ub4e4\uc744": 39, "\uac16\ucd94\ub3c4\ub85d": 39, "materi": 39, "common": 39, "render": 39, "indoor": 39, "outdoor": [39, 41], "metal": 39, "\ubb38\uad6c\ub97c": 39, "stand": 39, "farm": 39, "\ud574\ub2f9\uc0ac\uc9c4\ucc98\ub7fc": 39, "\uad6c\ucd95\uc2dc": 39, "\ud06c\uae30\ub3c4": 39, "\uce21\uc815\ud574\ubcf8": 39, "medium": 39, "\uc131\ub2a5\uc801\uc73c\ub85c": 39, "\uc800\ud558\ub418\ub294": [33, 39, 42], "\uc18d\uc131\ubcf4\ub2e4": 39, "\uc18d\uc131\uc5d0": 39, "\ucde8\uc57d\ud55c": 39, "\uc0ac\uc9c4\uc785\ub2c8\ub2e4": [39, 42], "maskrich": 39, "00512": 41, "\ubcf4\uc5ec\uc8fc\uba70": 41, "\uac01\uad11\uc744": 41, "\uc18c\uac1c\ud558\uac8c": 41, "\uc124\uba85\ud558\uc790\uba74": 41, "\ubc18\ubcf5\ud558\uc5ec": 41, "\uc218\ucc9c\ubc88\uc758": 41, "\uc774\ubbf8\uc9c0\ub4e4\uacfc": 41, "\uc694\uc18c\ub4e4\ub85c": [23, 41], "\ud568\uc218\ub4e4\uc740": 41, "lambda_t": 41, "monoton": 41, "decreas": 41, "\ud558\ub3c4\ub85d": 41, "\uc124\uc815\ub429\ub2c8\ub2e4": 41, "\uc774\ub4e4\uc744": 41, "\uc18c\uac1c\ud588\ub358": 41, "z_1": 41, "\ucd94\uac00\ud560\uc9c0": 41, "2021c": 41, "probabiil": 41, "\ud45c\ud604\ud574\uc11c": 41, "dt": [23, 40, 41], "d\u03c3_t": 41, "nabla_z": 41, "rung": 41, "kutta": 41, "integr": 41, "\uc801\uc6a9\ud588\uc744\ub54c": 41, "probabilt": 41, "\ucc38\uace0\ub85c": 41, "\ud574\uc11d\ud558\uba74": 41, "\uc55e\uc73c\ub85c": 41, "\ubcf4\uac8c": 41, "\uae30\ubc95\uc740": 41, "\uc808\ucc28\ub85c": 41, "teacher": [40, 41], "\ubcf5\uc0ac": 41, "\uacf5\uc2dd\uc740": 41, "\uc18c\uac1c\ub418\ub294\ub370": 41, "\uacf5\uc2dd\uc785\ub2c8\ub2e4": 41, "\ud575\uc2ec\uc785\ub2c8\ub2e4": 41, "\ub118\uc5b4\uac00\ub294": 41, "\uc9c4\ud589\ub418\ub294": 41, "\uac12\ub4e4\uc5d0": 41, "\ubaa8\ub378\uc774\ub77c\uace0": 41, "sharp": 41, "\uc904\uc5b4\ub4dc\ub294": 41, "\ud655\uc778\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4": [41, 43], "progresss": 41, "\uc124\uc815\uac12\uc5d0": 41, "\uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4": 41, "\uc77c\ubc18\uc131\uc744": 41, "\uc783\uc9c0": 41, "\ub300\ub2e4\uc218\uc758": 41, "\uc190\uc2e4\ud568\uc218\uc5d0": 41, "\ub300\uc785\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4": 41, "\ub3d9\uc77c\ud558\uba70": 41, "\uc815\uc758\ud560": 41, "\uc801\ud569\ud558\uc9c0": [40, 41], "\uc54a\ub2e4\uace0": 41, "\uae30\ubc95\uc5d0\uc11c\ub294": 41, "\ub0b4\uc5d0\uc11c\uc758": 41, "\ud559\uc2b5\ub418\uc9c0\ub9cc": 41, "\uc9c4\ud589\ub420\uc218\ub85d": 41, "\uac10\uc18c\ud55c\ub2e4\ub294": 41, "\ud655\uc778\ud558\uac8c": 41, "\uac00\uae4c\uc6cc\uc9c0\uac8c": 41, "\ucee4\uc9c0\uac8c": 41, "\uc5ec\ub7ec\ubc88\uc758": 41, "\uac70\uce60": 41, "\uc0c1\uad00\uc5c6\uc9c0\ub9cc": 41, "\uc904\uc5b4\ub4e4\uc218\ub85d": 41, "\uce58\uba85\uc801\uc774\uac8c": 41, "\uc785\ub825\uc73c\ub85c\ub294": 41, "\uc0ac\ub77c\uc9c0\uac8c": 41, "\uc138\uac00\uc9c0": 41, "\ubc29\uc548\uc73c\ub85c": 41, "\ubc29\uc9c0\ud558\ub3c4\ub85d": 41, "\uc124\uc815\ub418\uc5c8\ub2e4\uace0": 41, "\ud655\uc778\ud588\uc2b5\ub2c8\ub2e4": 41, "\ubd80\uac00\uc801\uc73c\ub85c": 41, "\uae30\ubc95\ub4e4\ub85c": 41, "\ube44\uad50\ud574\ubcf8": 41, "snr": 41, "\uc870\ud569\uc744": 41, "\ud604\uc0c1\ub3c4": 41, "\uc2e4\ud5d8\uacb0\uacfc\ub97c": 41, "\uc9c4\ud589\uc2dc": 41, "\ub370\uc774\ud130\uc14b\uc5d0\uc11c\ub294": 41, "\ucc38\uc870\ud558\uc2dc\uba74": 41, "8192": 41, "\uc2dc\uc791\ud558\uc600\uace0": 41, "anneal": 41, "\uc9c4\ud589\ud574\ub3c4": 41, "undistil": 41, "\uc900\ud558\ub294": 41, "\uc9c4\ud589\ud558\uba74\uc11c": 41, "\uc0dd\uac01\ud588\uc744\ub54c": 41, "\uc7a5\uc810\uc774\ub77c\uace0": 41, "\uc798\ub418\ub294": 41, "\ud69f\uc218\ub97c": 41, "\uc810\ucc28": 41, "\ube44\uad50\ud574\ubcf4\uace0": 41, "2\ubc30": 41, "4\ubc30\uc529": 41, "\uc904\uc5ec\uac00\uba74\uc11c": 41, "\uc904\uc784\uc5d0\ub3c4": 41, "\uc904\uc9c0": 41, "\ud559\uc2b5\ubc29\uc2dd\uc73c\ub85c\ub294": 41, "\ubabb\ud55c": 41, "dig": 42, "more": 42, "08453": 42, "tencent": 42, "arc": 42, "\ub09c\ud574\ud55c": 42, "car": 42, "fly": 42, "wing": 42, "iron": 42, "man": 42, "bunni": 42, "ear": 42, "\uc785\ub825\ubc1b\uc744": 42, "textur": [14, 42], "\ud45c\ud604\ud558\uae30": 42, "\ub9cc\uc73c\ub85c\ub294": 42, "\ud544\uc694\ud558\ub2e4\uace0": 42, "\uc11c\uc220\ud569\ub2c8\ub2e4": 42, "extern": 42, "\uc18c\uac1c\ud558\uace0": 42, "77m": 42, "300m": 42, "\uc5f0\uc0b0\uc791\uc5c5\uc774": 42, "\uc2e4\ud589\ub429\ub2c8\ub2e4": 42, "\uac00\uc838\uc624\uae30": 42, "\uc6a9\ub7c9\uc774": [23, 42], "\ud06c\uace0": [14, 42], "compos": 42, "generaliz": 42, "\uae30\ubc18\uc774": [14, 23, 42], "autoencod": [42, 43], "\ubc14\uafb8\uace0": 42, "\ubcf5\uc6d0\ud558\ub294": [14, 42], "_2": [23, 42], "bar": [40, 42], "z_0": [40, 42], "\uc785\ub825\ud568\uc73c\ub85c\uc368": 42, "matric": 42, "unshuffl": 42, "\ubcc0\ud658\uc774": 42, "1\uac1c\uc758": 42, "4\ubc88": 42, "\ud1b5\uacfc\ud558\uac8c": [23, 42], "\uac70\uce58\uace0": 42, "f_c": 42, "\uc0dd\uc131\ub418\uace0": 42, "enc": 42, "\ub354\ud574\uc9c0\uac8c": 42, "\ub3d9\uc77c\ud558\ub3c4\ub85d": 42, "\uc124\uc815\ud588\uae30": 42, "\ub367\uc148": 42, "\uc5f0\uc0b0\ud558\ub294\ub370": 42, "fulladapt": 42, "in_channel": 42, "640": 42, "num_res_block": 42, "downscale_factor": 42, "pixelunshuffl": 42, "conv_in": 42, "kernel_s": 42, "adapterblock": 42, "total_downscale_factor": 42, "out_channel": 42, "downsample2d": 42, "in_conv": 42, "adapterresnetblock": 42, "act": 42, "relu": [23, 42, 43], "adapter_st": 42, "adapter_input": 42, "adapter_conditioning_scal": 42, "num_images_per_prompt": 42, "repeat": 42, "do_classifier_free_guid": 42, "num_warmup_step": 42, "order": 42, "latent_model_input": 42, "scale_model_input": 42, "prompt_emb": 42, "cross_attention_kwarg": 42, "down_block_additional_residu": 42, "noise_pred_uncond": 42, "noise_pred_text": 42, "previou": 42, "extra_step_kwarg": 42, "prev_sampl": 42, "\uc885\ub958\ub85c\ub294": 42, "\ubd84\ub958\ud560": 42, "keypos": 42, "bicub": 42, "\uc81c\uc678\uc2dc\ud0a4\uace0": 42, "nearest": 42, "\ud06c\uae30\ub85c": 42, "\ubd80\ubd84\ucc98\ub7fc": 42, "\ud30c\ub77c\ubbf8\ud130\ub9cc": 42, "t2": 42, "\uc2dc\uc640": 42, "dure": [23, 42], "\ub123\uc73c\uba74\uc11c": 42, "expens": 42, "late": 42, "\uc2e4\ud5d8\ud574\ubcf8": 42, "\ud06c\ub2e4\uace0": 42, "\ud3ec\ud568\ub418\ub3c4\ub85d": 42, "\uc218\uc2dd\ucc98\ub7fc": 42, "uniformli": 42, "\uc9c4\ud589\ud588\uace0": 42, "cubic": 42, "\uc0c1\uc138\uc0ac\ud56d\uc740": 42, "4x": 42, "tesla": 42, "32g": 42, "\uc2e4\ud5d8\ubcc4": 42, "coco17": 42, "164k": 42, "pidinet": 42, "stuff": 42, "keypoint": 42, "\ub370\uc774\ud130\uc14b\ub85c\ubd80\ud130": 42, "600k": 42, "mm": 42, "mida": 42, "\ubaa8\ub378\ub4e4\uacfc": 42, "\uc815\ub7c9\uc801\uc778": 42, "\uc218\uce58\ub85c": 42, "\ube44\uad50\ud558\ub294\ub370": 42, "\uc88b\uc2b5\ub2c8\ub2e4": 42, "comparisoin": 42, "\uc608\uc2dc\ub4e4\uc740": 42, "\uc815\ud655\ud558\uc9c0": 42, "\uc9c0\uc5ed\uc744": 42, "\ubabb\ud558\ub2e4\uace0": 42, "\uac83\ub85c": 42, "\uc704\uc5d0\uc11c\ubd80\ud130": 42, "\uc7a5\uc810\ub4e4": 42, "\uba85\uc2dc\ub418\uc5c8\ub358": 42, "\uc0ac\ub840\uc785\ub2c8\ub2e4": 42, "\uc644\ub8cc\ud55c": 42, "\uc801\uc6a9\ud558\uba74\uc11c": 42, "4\ubcf4\ub2e4": 42, "\uacbd\ub7c9\ud654\ub41c": 42, "\uc608\uc2dc\ucc98\ub7fc": 42, "\uc22b\uc790\ub97c": 42, "\ubc14\uafd4\uac00\uba70": 42, "tini": 42, "x4": 42, "x8": 42, "compress": 42, "auto": 43, "1312": 43, "6114": 43, "gunhochoi": 43, "fastcampu": 43, "ch": 43, "\ubb38\uad6c\uac00": 43, "\uc801\ud600\uc788\ub294\ub370\uc694": 43, "bayesian": 43, "vb": 43, "involv": 43, "\uc81c\uc2dc\ud558\ub294": 43, "aevb": 43, "\ub274\ub7f4": 43, "\ub124\ud2b8\uc6cc\ud06c\ub85c": [14, 23, 43], "\uadfc\uc0ac\ud568\uc73c\ub85c\uc368": 43, "\uc774\uac00": 43, "\ubc14\uac00": 43, "\ub9cc\ub4e4\uc5b4\ub0b4\uace0": 43, "\ubcf5\uc6d0\ud558\uac8c": 43, "assumpt": 43, "\ub0b4\ub9bd\ub2c8\ub2e4": 43, "parametr": 43, "\ud558\ub2e4\ub294": 43, "\ub530\ub974\uace0": [23, 43], "\uc131\uc9c8\uc5d0": 43, "bernoulli": 43, "\ucd5c\ub300\ud654\uc2dc\ud0a4\ub294": 43, "\uacc4\uc0b0\ud558\uae30": 43, "\ub4f1\uc7a5\ud558\uac8c": 43, "\ub3c4\uc2dd\ud654\ud55c": 43, "\uc815\ub9ac\ud558\uc790\uba74": [40, 43], "\uacc4\uc0b0\ub41c": 43, "fc1_1": 43, "784": 43, "hidden_s": 43, "fc1_2": 43, "log_var": 43, "reparametr": 43, "std": 43, "mul": 43, "exp_": 43, "ep": 43, "floattensor": 43, "cuda": 43, "add_": 43, "reparam": 43, "fc1": 43, "\ucc3e\uc73c\uba74": 43, "\ubd84\ud560\ud560": 43, "\uc720\uc0ac\ud558\ub3c4\ub85d": 43, "\uc7a0\uc7ac\ubcc0\uc218\uc758": 43, "\uc800\ud76c\uac00": 43, "\ubd80\uc5ec\ud55c": 43, "\uac00\uae5d\ub3c4\ub85d": 43, "mont": 43, "carlo": 43, "\uadfc\uc0ac\uac12\uc744": 43, "\uc5f0\uc0b0\ub7c9\uc774": 43, "\ub9ce\uc73c\ubbc0\ub85c": 43, "\ubcc0\ud658\ud558\uc5ec": 43, "\ud3c9\uade0\uc801\uc73c\ub85c": 43, "\ub192\ub2e4\uace0": 43, "backpropag": 43, "\uc6d0\ud65c\ud788": 43, "\uc0d8\ud50c\ub9c1\ud558\uc9c0": 43, "\ub354\ud558\uace0": 43, "\uacf1\ud558\uac8c": 43, "\ub530\ub978\ub2e4\uace0": 43, "\uc124\uc815\ud588\uc744": 43, "\ub54c\uc774\uace0": 43, "\uac00\uc815\ud558\uc5ec": 43, "\uc2dc\ub3c4\ud560": 43, "\uba85\uc2dc\ub418\uc5b4": 43, "\ud558\ub2e8\uc5d0\ub294": 43, "\uc67c\ucabd\uc5d0\ub294": 43, "trick\uc774": 43, "\uacbd\uc6b0\ub85c": 43, "\uace0\uc815\ub418\uc5b4": 43, "\uc788\uc5b4\ub3c4": 43, "\uc0d8\ud50c\ub9c1\ud558\ubbc0\ub85c": 43, "\ubbf8\ubd84\ud560": 43, "\uc801\uc6a9\ud558\uae30\uac00": 43, "\uc624\ub978\ucabd\ucc98\ub7fc": 43, "\ubcc0\uc218\ub85c\ub3c4": 43, "\ubbf8\ubd84\uc774": 43, "\uac00\ub2a5\ud574\uc9c0\uae30": 43, "frei": 43, "wake": 43, "sleep": 43, "\uc54c\uace0\ub9ac\uc998\ub97c": 43, "\uc801\uc6a9\ud574\uc11c": 43, "\uc2e4\ud5d8\uacb0\uacfc\ub294": 43, "\ucd5c\uc801\ud654\ud558\ub294\ub370": 43, "\uc54c\uace0\ub9ac\uc998\uc774": 43, "\uc218\ub834\ud558\uba70": [40, 43], "\uc131\ub2a5\uc801\uc73c\ub85c\ub3c4": 43, "em": 43, "\ud560\uc6a9\ud558\uc5ec": 43, "\ub9ce\uc73c\uba74": 43, "\uc218\ub834\uc774": 43, "\uc9c0\uc815\ud574\uc92c\ub2e4\uba74": 43, "\ud30c\ub77c\ubbf8\ud130\ub4e4\uacfc": 43, "\uc7a0\uc7ac\ubcc0\uc218\ub97c": 43, "\uc0ac\uc6a9\ud574\ubcf4\uba74": 43, "repositori": 44, "pseudodiffus": [], "team": 44, "aim": 44, "them": 44, "theoret": 44, "conduct": 44, "pseudolab": 44, "\ub9e4\uc8fc": 44, "\uc218\uc694\uc77c": 44, "\uc624\ud6c4": 44, "9\uc2dc": 44, "\uac00\uc9dc\uc5f0\uad6c\uc18c": 44, "discord": 44, "room": 44, "dh": 44, "\uc785\uc7a5": 44, "preliminari": 44, "\uc870\uc0c1\uc6b0": 44, "linkedin": 44, "\ubb38\uad11\uc218": 44, "\uae40\uc9c0\uc218": 44, "\ubc15\ubc94\uc218": 44, "\uc9c0\uc2b9\ud658": 44, "\uace0\ub3d9\uadfc": 44, "\uc870\ub0a8\uacbd": 44, "\uae40\uc120\ud6c8": 44, "\uc774\uc900\ud615": 44, "junhyoung": 44, "\uc870\ud615\uc11c": 44, "\uc720\uc815\ud654": 44, "\ubc15\uc138\ud658": 44, "\uc1a1\uac74\ud559": 44, "gigagan": 15, "synthes": [23, 40], "2310": 40, "04378": 40, "luosiallen": 40, "donghyun": [40, 44], "han": [40, 44], "\uc131\uacfc\ub97c": 40, "\uac70\ub450\uc5c8\uc9c0\ub9cc": 40, "\uac00\uc9c0\uae30": 40, "\uc2e4\uc2dc\uac04": 40, "\uc0ac\uc6a9\uc774": 40, "\uadf9\ubcf5\ud558\uae30": 40, "\ud5a5\uc0c1\uc2dc\ud0a4\ub294": 40, "\uc81c\uc548\ub418\uc5c8\ub2e4": 40, "solver\uc758": 40, "\uc131\ub2a5\uac1c\uc120\uc744": 40, "step\ub9cc\uc73c\ub85c\ub3c4": 40, "dpm": 40, "\ucd94\ub860\ud560\uc218": 40, "On": [23, 40], "\uc774\uc911": [14, 40], "models\uc740": 40, "trajectory\uc5d0": 40, "\uac16\ub3c4\ub85d": 40, "\ubaa8\ub378\ub85c\uc11c": 40, "2\uac00\uc9c0\uc758": 40, "model\uc774\uae30": 40, "\uace0\ub824\ud558\uc9c0": [23, 40], "\uc54a\uc544": 40, "text2img": 40, "\uc81c\uc548\uc810\uc740": 40, "3\uac00\uc9c0\ub2e4": 40, "lcm": 40, "lcms\uc740": 40, "\uace0\ud488\uc9c8\uc758": 40, "distillation\uc744": 40, "step\uc774\ub77c\ub294": [], "32\uc2dc\uac04": 40, "\ubc16\uc5d0": 40, "\uac78\ub9ac\uc9c0": 40, "lcms\uc5d0": 40, "\ubc29\uc2dd\uc778": [14, 40], "\uc720\uc9c0\ud558\uba74\uc11c\ub3c4": 40, "models\ub294": 40, "\uc8fc\uc785\ud558\uace0": 40, "sampling\ud558\ub294": 40, "\uae30\ubc95\uc774\ub2e4": 40, "forwad": 40, "\ud655\ub960\ubd84\ud3ec\uc778": 40, "0t": 40, "scheduler\ub97c": 40, "timestep\uc758": 40, "\ud655\ub960\ubbf8\ubd84\ubc29\uc815\uc2dd": 40, "tag": 40, "q_t": 40, "ptobabl": 40, "\uc0c1\ubbf8\ubd84\ubc29\uc815\uc2dd": 40, "\ub9cc\uc871\ud558\ub294\ub370": 40, "dx_t": 40, "nabla_x": 40, "\ud559\uc2b5\uc2dc\ud0a8\ub2e4": 40, "\uadfc\uc0ac\uce58\ub97c": 40, "\uc608\uce21\ud558\uace0": 40, "sampling\ud558\ub294\ub370": 40, "ode\ub77c": 40, "\uacbd\ud5d8\uc801": 40, "sampling\uc758": 40, "\uc0ac\uc6a9\ub418\uc5c8\ub2e4": [14, 40], "cfg\uc758": 40, "prediction\uc740": 40, "prediction\uc744": 40, "\ub300\uccb4\ub41c\ub2e4": 40, "emptyset": [14, 40], "consistenct": 40, "cm": 40, "cm\uc758": 40, "\ud575\uc2ec\uc740": 40, "ode\uc758": 40, "\uada4\uc801\uc5d0": 40, "point\uc640": 40, "solution\uc5d0": 40, "mapping\ub418\ub294": 40, "\uc591\uc218\uac12\uc744": 40, "function\uc740": 40, "\uc790\uae30": 40, "\uc790\uc2e0\uc5d0": 40, "\ub9cc\uc871\ud574\uc57c\ud55c\ub2e4": 40, "foral": 40, "\ud568\uc218\uc774\uba70": 40, "\uc774\uae30": 40, "\ub9cc\uc871\ud55c\ub2e4": 40, "\uc2ec\uce35": 40, "\uc2e0\uacbd\ub9dd\uc744": [23, 40], "cm\uc740": 40, "\ud559\uc2b5\ud558\uba70": 40, "\uad6c\uc131\ud55c\ub2e4": 40, "\uc9c0\uc218\ud3c9\uade0\uc774\ub3d9": 40, "leftarrow": 40, "\uc9c0\ud45c\uc774\ub2e4": 40, "\ucd94\uc815\ud55c": 40, "ode\uc5d0": 40, "solver\ub85c": 40, "euler\ub098": [], "solver\ub4f1\uc758": [], "\uc218\uce58\uc801\uc778": 40, "solver\ub97c": 40, "distillation\uc740": 40, "\uc601\uc0c1\uc5d0": 40, "generation\ub9cc": 40, "\uc7a0\uc7ac\uc131\uc774": 40, "\ud0d0\uad6c\ub418\uc9c0": 40, "\uc54a\uc558\uc74c": [23, 40], "\ubc1c\ud718\ud558\uc5ec": 40, "\ub3c4\uc804\uc801\uc778": 40, "lcd": 40, "lcms\ub294": 40, "\uc124\uacc4\ub418\uc5c8\uae30": 40, "varepsilon": 40, "vector\ub85c": 40, "\uc784\ubca0\ub529\ud558\uace0": 40, "\ubcf5\uc6d0\ud55c\ub2e4": 40, "\uc0c1\uc5d0\uc11c": 40, "\uc774\ub904\uc9c0\uae30": 40, "laptop": 40, "gpu\uc5d0\uc11c": 40, "\ucd94\uac00\ud55c": 40, "\uc815\uc758\ub41c\ub2e4": 40, "dz_t": 40, "c\ub294": 40, "ode\uc0c1\uc5d0\uc11c": 40, "trick\uc778": 40, "\ubcc0\ud615\ud558\uc5ec": 40, "\ub300\uc785\ud55c": 40, "\uce58\ud658": 40, "cm\uacfc": 40, "pd\uc5d0\uc11c": 40, "psi_": 40, "solver\uc774\uba70": 40, "8\uc758": 40, "\uc6b0\ud56d\uc744": 40, "\uadfc\uc0ac\ud55c": 40, "\uac12\uc774\ub2e4": 40, "solver\uc774\uae30": 40, "distillation\uc2dc\uc5d0\ub9cc": 40, "edm\uc744": 40, "\ud1a0\ub300\ub85c": 40, "cm\uc5d0\uc11c": 40, "\uac04\uaca9\uc73c\ub85c": 40, "\uc5b4\ub5a0\ud55c\uac04\uaca9\uc744": 40, "8\uc744": 40, "\uc801\ubd84": 40, "clasifi": 40, "\ud6c8\ub828\ud574\uc57c\ud558\uae30": 40, "\ud6a8\uc728\uc801\uc774\uc9c0": 40, "\ubabb\ud558\uba70": 40, "lcms\uc640": 40, "method\uc5d0": 40, "cfg\ub97c": 40, "\ud1b5\ud569\ud558\uc600\ub2e4": 40, "distill\uc758": 40, "sampling\uc5d0": 40, "\ud1b5\ud569\ud558\uc600\uc73c\ub098": 40, "\ud559\uc2b5\uc2dc\uac04\uc774": 40, "\uae38\uace0": 40, "2\ub2e8\uacc4\ub97c": 40, "\ub204\uc801\ub418\uae30": 40, "t\uc774\uc5d0": 40, "ode\ub97c": 40, "stage\uc758": 40, "cfg\uc5d0": 40, "varnoth": 40, "\uc608\uce21\uac12\uacfc": [14, 40], "\ubcc0\ud615\ub418\ubbc0\ub85c": 40, "ode\ub77c\uace0": [], "ode\ub294": 40, "function\ub3c4": 40, "\ubcc0\uc218\ub85c": 40, "\ubc1b\uc544\uc624\uae30": 40, "omega_": 40, "sampling\ub41c\ub2e4": 40, "\uc774\uc804\uacfc": 40, "cfg\uac00": 40, "\uc608\uce21\ubaa8\ub378": 40, "11\ucc98\ub7fc": 40, "\ubcf4\ud1b5\uc758": 40, "\uc7a1\uace0": 40, "\uc774\uac19\uc774": 40, "\ucd18\ucd18\ud55c": 40, "\uac10\uc18c\uc2dc\ud0a4\uae30": 40, "loss\ub3c4": 40, "\uc791\uc544\uc9c0\uac8c": 40, "loss\uac00": 40, "\uc791\uc544\uc9c0\uba74": 40, "\uc218\ub834\uc18d\ub3c4\ub3c4": 40, "\ub290\ub824\uc9c0\uac8c": 40, "\uc218\ub834\uc758": 40, "\uc218\ucc9c\uc5d0\uc11c": 40, "\uc218\uc2ed\uc73c\ub85c": 40, "\ub2e8\ucd95\uc2dc\ud0a4\ub294": 40, "scheduler\ub85c": 40, "\ubc29\ubc95\uc774\ub098": 40, "solver\ub3c4": 40, "\uc99d\uba85\ud588\ub2e4": 40, "\ube44\uad50\ud558\ub294\uac83\uc774": 40, "step\ub9cc\ud07c": 40, "\ub108\ubb34\uc791\uc73c\uba74": 40, "\uc218\ub834\uc18d\ub3c4\ub97c": 40, "\uac16\uac8c\ub418\uba70": 40, "\uac12\uc77c": 40, "\uc624\ucc28\uac00": 40, "\ucee4\uc9c8\uc218": 40, "14\uc5d0": 40, "k\uac12\uc744": 40, "\uc218\uc2dd\ub3c4": 40, "foundat": 40, "cunstom": 40, "\ub54c\uac00": 40, "lcf": 40, "dataset\ub3c4": 40, "\uc885\uc18d\uc5c6\uc774": 40, "inference\ub97c": 40, "\ud560\uc218": 40, "lcm\uc740": 40, "\ubc14\ub85c\ubc14\ub85c": 40, "\uc0ac\uc6a9\ud560\uc218": [], "\uc788\ub294\uac83\uc740": 40, "\uc544\ub2c8\uace0": 40, "consisteni": 40, "ema\ub97c": 40, "dataset\uc73c\ub85c": 40, "\uc0ac\uc6a9\ud558\uae30\ub9cc\ud558\uba74": 40, "diffuson": 40, "\ubc14\ub85c\ud559\uc2b5\uc774": 40, "\uc758\ubbf8\uc774\ub2e4": 40, "650k": 40, "\uc55e\uc11c\ub9d0\ud55c\uac83\ucc98\ub7fc": 40, "768x768\uc758": 40, "solver\ub85c\ub294": 40, "20\uc758": 40, "lcm\uacfc": 40, "\uc131\ub2a5\ube44\uad50\ub97c": 40, "\ud588\ub294\ub370": 40, "distill\uc740": 40, "\uc624\ud508\uc18c\uc2a4": 40, "\ucf54\ub4dc\uac00": 40, "\uc218\ub834\ud558\uace0": 40, "\uc0dd\uc131\ud558\uc600\ub2e4": 40, "distillation\uc774\uc9c0\ub9cc": 40, "stage\ub9cc": [], "\uc774\uac19\uc740": 40, "\ubcf4\uc5ec\uc92c\ub2e4": 40, "\ud478\ub294": 40, "solver\ub4e4": 40, "lcm\uc5d0": 40, "\ube44\uad50\uc640": 40, "schedule\uc758": 40, "iteration\uc5d0\uc11c\uc758": 40, "\uace0\uc815\ud574\uc11c": 40, "\ube44\uad50\ud588\ub2e4": 40, "\uc62c\ub838\uc744": 40, "\ud6e8\uc52c\ub354": 40, "dpm\uacfc": 40, "50\uc77c": 40, "ddim\ubcf4\ub2e4": 40, "error\ub97c": 40, "ddim\uc5d0": 40, "\uc801\uae30": 40, "\uc88b\uc544\uc9c0\uc9c0\ub9cc": 40, "\ub5a8\uc5b4\uc838": [14, 40], "quality\uc640": 40, "diversity\uc5d0": 40, "off\uac00": 40, "inference\ub294": 40, "\uac00\uc9c0\uc9c0\ub294": 40, "\uc54a\ub294\uac83\uc73c\ub85c": 40, "\ud655\uc778\ub41c\ub2e4": 40, "\uac1c\uc120\uc758": 40, "\uc788\ub294\uac83\uc744": [], "\ube44\uad50\ud574": 40, "\ubd24\uc744": 40, "\ud655\uc5f0\ud558\uac8c": 40, "\ub4e4\uc5b4\ub09c\ub2e4": 40, "\uc2dc\uc5d0\ub3c4": 40, "\uc99d\uba85\ud55c\ub2e4": 40, "\ud3ec\ucf13\ubaac": 40, "\ub370\uc774\ud130\uc14b\uacfc": 40, "\uc2ec\uc2a8": 40, "lcf\ub97c": 40, "\ub54c\ub97c": 40, "\uc644\ubcbd\ud558\uc9c4": 40, "catch\ud55c": 40, "\uc0c1\uc5d0": 40, "\uace0\ud654\uc9c8\uc758": 40, "\ub9cc\ub4e4\uc5c8\ub2e4": 40, "dataset\uc5d0\ub3c4": 40, "step\uc73c\ub85c\ub3c4": 40, "lu": 40, "method\ub4f1\uc758": 40, "\uc788\ub294\uac83": 40, "\ud55c\ub3d9\ud604": 44, "06025": 14, "grail": 14, "cs": 14, "washington": 14, "edu": 14, "\uc785\ucd9c\ub825": 14, "\uc2dc\ud000\uc2a4\uc5d0": 14, "\ub4ef\ud55c": 14, "\uc2dc\ud000\uc2a4\uac00": 14, "\uc0ac\ub78c\uacfc": 14, "\uc637\uac10\uc758": 14, "\ud569\uc131\ud558\ub294": [14, 33], "dreampose\ub97c": 14, "\uc2a4\ud14c\uc774\ube14": 14, "\ub514\ud4e8\uc804\uc744": 14, "\ud0dc\uc2a4\ud06c\ub97c": 14, "\ud3ec\ucc29\ud558\uae30": 14, "\uc778\ucf54\ub354\uc640": 14, "\ub3c4\uc785\ud558\uc600\uace0": 14, "adapter\ub97c": 14, "\ub514\ud4e8\uc804\uc758": 14, "\ub123\uc5b4\uc92c\ub2e4": 14, "\uc2dc\ud000\uc2a4\ub97c": 14, "\ubc18\uc601\ud558\uae30": 14, "concat\ud558\uc5ec": 14, "\ub514\ub178\uc774\uc9d5": 14, "unet\uc5d0": 14, "\ud53c\uc0ac\uccb4\uc5d0": 14, "\ub4c0\uc5bc": 14, "\ucda9\uc2e4\ub3c4\uc758": 14, "\uac15\ub3c4\ub97c": 14, "\uc870\uc815\ud55c\ub2e4": 14, "\ud328\uc158": 14, "\ud0dc\uc2a4\ud06c\uc5d0": 14, "dreampose\uac00": 14, "\uc628\ub77c\uc778\uc5d0": 14, "\ud37c\uc838": 14, "\uc804\ub2ec\ud560": 14, "\uc81c\ud55c\uc801\uc774\uba70": 14, "\uc785\uc5c8\uc744": 14, "\ub298\uc5b4\uc9c4": 14, "\ubaa8\uc591\uc774\ub098": 14, "\ud750\ub984": 14, "\ub258\uc559\uc2a4\ub97c": 14, "\ubcf4\uc5ec\uc8fc\uae30\uc5d0": 14, "\uc18c\ube44\uc790\uc758": 14, "\uacb0\uc815\uc5d0": 14, "\ub3d9\uc601\uc0c1\uc774": 14, "\uc0c1\ud488\uc740": 14, "\ub4dc\ubb3c\ub2e4": 14, "\uc560\ub2c8\uba54\uc774\uc158": 14, "\ube44\ub514\uc624\ub85c": 14, "\ubcf4\uc5ec\uc8fc\uc5c8\uc9c0\ub9cc": 14, "\uc5bb\uc9c0": 14, "\ubabb\ud588\uc73c\uba70": 14, "\ud14d\uc2a4\ucc98": 14, "\uc6c0\uc9c1\uc784\uc774\ub098": 14, "\uce74\ud230\uacfc": 14, "\ubaa8\uc591\uc73c\ub85c": 14, "\uc77c\uad00\uc131\uc774": 14, "jitter\uac00": 14, "\uc0ac\uc2e4\uc131": 14, "\ubb3c\uccb4": [14, 23], "dreampose\uc758": 14, "\uc811\uadfc\ubc95": 14, "\ubaa8\ub378\ub9c1\ud558\ub294": [14, 23], "\ud29c\ub2dd\ud558\uc600\ub2e4": 14, "\uc2e0\ud638\uc640": 14, "\ub2e8\uc21c\ud654": 14, "\uba54\ucee4\ub2c8\uc998\uc744": 14, "\uc7ac\uc124\uacc4\ud558\uc600\ub2e4": 14, "\uc2a4\ud14c\uc774\uc9c0": 14, "\uc560\ub2c8\uba54\uc774\uc158\uc744": 14, "\ud3ec\uc988\ub97c": 14, "\uac04\ub2e8\ud558\uc9c0\ub9cc": 14, "\ub192\uc5ec\uc8fc\ub294": 14, "\ud3ec\uc988\uc5d0": 14, "\ub9de\ucd94\ub294": 14, "\uc804\ub7b5": 14, "\ub514\ud4e8\uc804\uacfc": 14, "\uc0ac\ud56d\uacfc": 14, "\uccb4\ud06c\ud3ec\uc778\ud2b8\ub294": 14, "\ucd9c\uc2dc": 14, "\ub17c\ubb38\uc5d0\uc11c\ub3c4": 14, "subject\uc5d0": 14, "\ud0dc\uc2a4\ud06c": 14, "\ubc29\uc2dd\ub4e4\uc740": 14, "\uad6c\uc131\ub418\ub294": 14, "\ub2e8\uacc4\ub9c8\ub2e4": 14, "\ubaa8\uc158\uc774\ub098": 14, "depth\ub4f1\uc758": 14, "\ubd88\uc644\uc804\ud560": 14, "\ubcf5\uc7a1\ud560": 14, "groud": 14, "truth\uc5d0": 14, "\ub3c4\ucd9c\ud558\uae30": 14, "\ubc1c\uc0dd\ud558\uae30": 14, "\uc27d\ub2e4": 14, "\ubc29\ubc95\ub4e4\uc740": 14, "\uc5d4\ub4dc": 14, "\ud22c": 14, "\uc2f1\uae00": 14, "\ud0d0\uad6c\ud558\uace0": 14, "optic": 14, "warp": 14, "nerf": 14, "\uc560\ub2c8\uba54\uc774\uc158\uc774": 14, "\ud734\uba3c": 14, "flow\uc5d0": 14, "\uc758\uc874\ud574": 14, "\ubcc0\ud654": [14, 23], "\uac00\ub824\uc9c4": [14, 23], "\uc758\uc0c1": 14, "\ucd5c\uadfc\uc5d4": 14, "\uc5b4\ud150\uc158": 14, "\uc140\ud504": 14, "\ud06c\ub85c\uc2a4": 14, "\uc5b4\ud150\uc158\uc744": 14, "\ub9de\ucd94\ub824\uace0": 14, "difffashion": 14, "\ub808\ud37c\ub7f0\uc2a4": 14, "\ud2b8\ub79c\uc2a4\ud37c\ud558\uc5ec": 14, "\uc758\ub958": 14, "\uc544\uc774\ud15c\uc744": 14, "\ud3b8\uc9d1\ud558\ub294": 14, "\ub123\uc5b4": [14, 23], "\ucd5c\uc801\ud654\ub294": 14, "\uae30\ub300\ud560\ub9cc": 14, "\ub098\uc624\uc9c0": 14, "\ubaa8\uc158\uc744": 14, "\uc2a4\ud06c\ub798\uce58\ubd80\ud130": 14, "\uac12\ube44\uc2fc": 14, "\ub9ac\uc18c\uc2a4": 14, "\ubc29\ub300\ud559": 14, "\uc624\ub79c": [14, 23], "video\ub294": 14, "\ud30c\uc778\ud29c\ub2dd\ud55c\ub2e4": 14, "\ubc29\ubc95\ub4e4\uacfc": 14, "\uae5c\ube61\uac70\ub9bc": 14, "flicker": 14, "\uad6c\uc870\uc801\uc778": 14, "\ud574\uacb0\ud558\uc5ec": 14, "\uc12c\uc720\uc758": 14, "\uc6c0\uc9c1\uc784\uc758": 14, "\uc2f1\ud06c\ub97c": 14, "\uc0ac\uc6a9\ub418\uc5b4": 14, "\ucee8\ub514\uc154\ub2dd\uc740": 14, "\uc218\uc900\uc758": 14, "\ub370\ub294": 14, "\ud6a8\uacfc\uc801\uc774\uc9c0\ub9cc": 14, "\uc758\uc0c1\uc758": 14, "identity\ub098": 14, "\ud48d\ubd80\ud558\uace0": 14, "\uc0c1\uc138\ud55c": [14, 33], "\ub2e4\ub8e8\uace0": 14, "\ubaa8\ub378\uc5d0\ub294": 14, "\uc784\ubca0\ub529\uc774": 14, "\ud53c\uc0ac\uccb4\ubcc4": 14, "\ub3d9\uc601\uc0c1\uc758": 14, "\ud1b5\ud569\ud558\uae30\ub3c4": 14, "pidm\uc740": 14, "\ud14d\uc2a4\ucc98\ub97c": 14, "\uc5f0\uacb0\ud55c\ub2e4": 14, "dreampose\ub294": 14, "\ud53c\uc0ac\uccb4\uc758": 14, "\uc678\ud615\ubfd0\ub9cc": 14, "\uad6c\uc870\uc640": 14, "\uc6c0\uc9c1\uc784\uae4c\uc9c0": 14, "pidm\uacfc": 14, "\ud1b5\ud569\ud558\uc9c0\ub9cc": 14, "\ub178\uc774\uc988\uc5d0": 14, "\uc5f0\uacb0\ub41c": 14, "\ubd80\ub4dc\ub7fd\uace0": 14, "\uad6c\ud604\ud560": 14, "\uc548\uc815\uc131": 14, "\ub2a5\uac00\ud558\ub294": [14, 23], "\uc815\uaddc": 14, "\ubd84\ud3ec\ub41c": 14, "\ub178\uc774\uc988\uc5d0\uc11c": 14, "\uc791\ub3d9\ud558\ubbc0\ub85c": 14, "\ud76c\uc0dd\ud558\uba74\uc11c": 14, "\uc808\uc57d\ud55c\ub2e4": 14, "vae\uc640": 14, "\uc624\ud1a0\uc778\ucf54\ub354": 14, "\ucef4\ud329\ud2b8\ud55c": 14, "\ud45c\ud604\uc5d0\uc11c": 14, "\uacb0\uc815\ub860\uc801": [14, 23], "\ud504\ub85c\uc138\uc2a4\uc5d0": 14, "\ud0c0\uc784": 14, "\uc2a4\ud0ec\ud504": 14, "\ub514\ud4e8\uc988\ub418\uc5b4": 14, "\ub178\uc774\uc9c0": 14, "\ub9cc\ub4e6": 14, "\ubcf5\uad6c\ud558\uae30": 14, "\ud0c0\uc784\uc2a4\ud0ec\ud504\uc5d0": 14, "\uc2dc\uac04\uc73c\ub85c": 14, "\ucee8\ub514\uc154\ub2dd\ub41c": 14, "unet\uc774": 14, "cal": 14, "\uc138\uadf8\uba58\ud14c\uc774\uc158": 14, "\ub9c8\uc2a4\ud06c\ub4f1": 14, "\ub514\ud4e8\uc804\uc5d0\uc11c\ub294": 14, "\uc778\ucf54\ub354\ub85c\ubd80\ud130": 14, "\uc5bb\uc5b4\uc9d0": 14, "\ubcf5\uad6c\ud558\ub3c4\ub85d": 14, "\ubd84\ud3ec\ub85c": 14, "\ubc00\uc5b4\ubd99\uc774\ub294": 14, "\uba54\ucee4\ub2c8\uc998\uc774\ub2e4": 14, "\ub110": 14, "\ub4dc\ub86d\uc544\uc6c3\uc744": 14, "\ub2ec\uc131\ub41c\ub2e4": 14, "\uc778\ud37c\ub7f0\uc2a4\ud558\ub294": 14, "\uc2a4\uce7c\ub77c": 14, "s\ub97c": 14, "\uc870\uac74\ubd80\ub85c": 14, "\uac00\uc774\ub4dc\ud558\ub294": 14, "null\ub85c": 14, "\uc92c\uc744": 14, "\ubcf4\uac04\ud55c\ub2e4": 14, "\uc2dc\ud000\uc2a4\ub85c\ubd80\ud130": 14, "\ub3d9\uc601\uc0c1": 14, "\uceec\ub809\uc158\uc5d0\uc11c": 14, "\uceec\ub809\uc158\uc5d0": 14, "\uc2e0\ud638": 14, "\ucd9c\ub825\ud558\uae30": 14, "\uc870\uc815\ud558\ub294": 14, "p_1": 14, "p_n": 14, "_n": 14, "p_i": 14, "\ub178\uc774\uc988\ub85c": 14, "\uc2dc\uc791\ud558\uc5ec": 14, "\uc2e0\ud638\ub85c": 14, "\ucffc\ub9ac\ud558\uc5ec": 14, "latent\uc758": 14, "\uc81c\uac70\ud55c\ub2e4": 14, "\ub514\ub178\uc774\uc988\ub41c": 14, "\ub514\ucf54\ub529\ud558\uc5ec": 14, "\uc560\ub2c8\uba54\uc774\uc158\uc758": 14, "\uc81c\uacf5\ub41c": 14, "\ub2ec\uc131\ud558\uae30": 14, "\uad6c\uc131\ud558\uc600\ub2e4": 14, "\uc5b4\ub311\ud130": 14, "\ud544\uc694\uc131": 14, "\ub123\uae30": 14, "\ub4e4\uc5b4\uc624\ub294": 14, "\uc2e0\ud638\ub97c": 14, "net\uc5d0": 14, "concat\ud55c\ub2e4": 14, "\uc2e0\ud638\uc5d0": 14, "\uc870\uac74\ud654\uc5d0": 14, "\uc815\ub82c\ub418\uc9c0": 14, "\ud0dc\uc2a4\ud06c\uc5d0\ub294": 14, "\ub9de\ucda4\ud615": 14, "\uad6c\ud604\ud558\uc600\ub2e4": 14, "\uc5b4\ub311\ud130\ub294": 14, "\uc870\uac74\ud654\ub97c": 14, "\uacb0\ud569\ud55c\ub2e4": 14, "\uae30\uc6b8\uae30\ub97c": 14, "\uc774\uc720\ub85c": 14, "\uccb4\uacc4\ub294": 14, "\uc791\uc6a9\ud558\ub294": 14, "\ub514\ud4e8\uc804\uc774": 14, "clip\uc774": 14, "\uc2a4\ud398\uc774\uc2a4": 14, "share": [14, 23], "\uc778\ucf54\ub529\ud55c\ub2e4\ub294": 14, "\uac10\uc548\ud560": 14, "\ucee8\ub514\uc154\ub2dd\uc744": 14, "\uac04\ub2e8\ud788": 14, "\uc790\uc5f0\uc2a4\ub7ec\uc6cc": 14, "\uc784\ubca0\ub529\ub9cc\uc73c\ub85c\ub294": 14, "\ucea1\ucc98\ud558\uae30\uc5d0": 14, "\ucda9\ubd84\ud558\uc9c0": 14, "vae\uc5d0\uc11c": 14, "\ub3c4\uba54\uc778\uacfc": 14, "\uc7a5\uc810\uc744": 14, "\uc544\ud0a4\ud14d\ucc98\ub294": 14, "\uc9c0\uc6d0\ud558\uc9c0": 14, "\ub124\ud2b8\uc6cc\ud06c\uc758": [14, 23], "\uc5f0\uc0b0\uc5d0": 14, "\ud63c\ud569\ud558\uace0": 14, "\ubaa8\ub4c8\uc5d0\uc11c": 14, "\uc608\uc0c1\ud558\ub294": 14, "\ud30c\uc778\ud29c\ub2dd\uc5d0\uc11c": 14, "\uc5b8\uae09\ud588": 14, "\ub4ef\uc774": 14, "\ucda9\uaca9\uc744": 14, "\uc124\uc815\ub418\uc5b4": 14, "\uc784\ubca0\ub529\uc73c\ub85c\ub9cc": 14, "\uc2dc\uc791\ud55c\ub2e4": 14, "c_i": [14, 23], "\ucee8\ub514\uc154\ub2dd\uacfc": 14, "\uc815\ub82c": 14, "c_p": 14, "\ucd94\uc815\ub41c": 14, "\ud3ec\uc988\uc758": 14, "\ud504\ub808\uc784\uc5d0\uc11c\uc758": 14, "\uadf9\ub300\ud654\ud558\uae30": 14, "\ub2e4\uc12f": 14, "\uc5f0\uc18d\ub41c": 14, "\ud3ec\uc988\ub85c": 14, "\ubd80\ub4dc\ub7ec\uc6c0\uacfc": 14, "\uc99d\uac00\ud55c\ub2e4": 14, "\uad6c\uc870\uc801\uc73c\ub85c": 14, "10\uac1c\uc758": 14, "\ubc1b\uc544\ub4e4\uc774\ub3c4\ub85d": 14, "\ucc44\ub110\uc740": 14, "\uac00\uc911\uce58\uc5d0\uc11c": 14, "\uc218\uc815\ub418\uc9c0": 14, "\uccb4\ud06c\ud3ec\uc778\ud2b8\ub85c": 14, "\ucd08\uae30\ud654\ub41c\ub2e4": 14, "\uccb4\ud06c\ud3ec\uc778\ud2b8\uc5d0\uc11c": 14, "\ub85c\ub4dc\ub41c\ub2e4": 14, "\uc2e0\ud638\uac00": 14, "\uae30\uc5ec\ud558\uc9c0": [14, 23], "\ud30c\uc778\ud29c\ub2dd\ub41c\ub2e4": 14, "phase": 14, "\ubaa8\ub4c8\uc744": 14, "\ud29c\ub2dd\ud558\uc5ec": 14, "\ud569\uc131\ud55c\ub2e4": 14, "\ud30c\uc778\ud29c\ub2dd\ud55c": 14, "\uac1c\uc120\ud558\uc5ec": 14, "\ucd94\ub860\uc5d0": 14, "\uc720\uc9c0\ud558\ub824\uba74": 14, "\uc0d8\ud50c\ubcc4": 14, "\ud544\uc218\uc801\uc774\uc5c8\ub2e4": 14, "\ud6c8\ub828\ud558\uba74": 14, "\uace0\ucc29": 14, "stick": 14, "\ud06c\ub86d\uc744": 14, "\ud3ec\uc988\uc30d\uc744": 14, "\uc99d\uac15\ud55c\ub2e4": 14, "\ud30c\uc778\ud29c\ub2dd\ud558\ub294": 14, "\uc120\uba85\ud558\uace0": 14, "\ubcf5\uad6c\ud558\ub294": 14, "\ud30c\uc778\ud29c\ub2dd\uc758": 14, "\uc911\uc694\uc131": 14, "\ud3ec\uc988\uc5d0\uc11c": 14, "\ud504\ub808\uc784\ubcc4\ub85c": 14, "dual": 14, "\uc870\uc808\ud55c\ub2e4": 14, "\uc218\uc815\ub41c\ub2e4": 14, "_p": 14, "s_i": 14, "s_p": 14, "\uac00\uc774\ub358\uc2a4": 14, "\uc6e8\uc774\ud2b8": 14, "\ucee8\ub514\uc154\ub2dd\uc774": 14, "\uacbd\uc6b0\uc640": 14, "\uacc4\uc0b0\ud558\uace0": 14, "\uacc4\uc0b0\ud574\uc11c": 14, "\uc6e8\uc774\ud2b8\ub97c": 14, "\uc870\uc815\ud574\uc11c": 14, "\ubcf4\uc7a5\ud558\uace0": 14, "\uc815\ub82c\uc744": 14, "\ubcf4\uc7a5\ud55c\ub2e4": 14, "\uac00\uc774\ub4dc\ub97c": 14, "\uac15\ud654\ud558\ub294": 14, "\uc5d0\uc678\ub3c4": 14, "\ubc29\uc9c0\ud55c\ub2e4": 14, "1500": 14, "pndm": 14, "\uc0d8\ud50c\ub7ec": 14, "100step": 14, "339\uac1c\uc758": 14, "30\ud504\ub808\uc784\uc774\uba70": 14, "\uae38\uc774\ub294": 14, "12\ucd08": 14, "\ube44\ub514\uc624\ub85c\ubd80\ud130": 14, "densepose\ub97c": 14, "\uacc4\uc0b0\ud558\uc600\ub2e4": 14, "mraa": 14, "thin": 14, "plate": 14, "spline": 14, "mothion": 14, "tpsmm": 14, "\uc218\uce58\uc801": 14, "\uc815\uc131\uc801\uc778": 14, "\uc2a4\ud06c\ub9bd\ud2b8\uc640": 14, "\uad8c\uc7a5": [14, 23], "\uc5d0\ud3ed": 14, "\ud559\uc2b5\ud558\uc600\ub2e4": 14, "avd": 14, "\ubaa8\ub4dc\uc5d0\uc11c": 14, "\uc2a4\ud06c\ub9bd\ud2b8\ub97c": 14, "pidm\uacfc\ub3c4": 14, "pidm\uc758": 14, "deepfashion": 14, "\uccb4\ud06c\ud3ec\uc778\ud2b8\ub97c": 14, "\uc2a4\ud15d\uc744": 14, "\uc2e4\ud589\ud558\uc600\ub2e4": 14, "50\ud504\ub808\uc784": 14, "\uc774\uc0c1": 14, "50\uac1c\uc758": 14, "\ud14c\uc2a4\ud2b8\ud558\uc600\ub2e4": 14, "mraa\uc640": 14, "tpsmm\uc740": 14, "drive": 14, "video\uc5d0\uc11c": 14, "feautre\uc5d0": 14, "\uc758\uc874\ud558\ub294": 14, "uv": 14, "\uc2dc\ud000\uc2a4\uc5d0\ub9cc": 14, "\uc758\uc874\ud55c\ub2e4\ub294": 14, "\uc720\uc758\ud558\ub77c": 14, "\ub124": 14, "\ucde8\ud560": 14, "\uc637\uac10": 14, "\uc8fc\ub984": 14, "\ud328\ud134\uc774": 14, "\ubcc0\uacbd\ud558\ub294": 14, "mraa\ub294": 14, "\ud314": 14, "\ub2e4\ub9ac\uac00": 14, "pidm\uacfc\uc758": 14, "\uc5bc\uad74\uc758": 14, "\ud328\ud134": 14, "\uc5bc\uad74\uc744": 14, "\ud569\uc131\ud558\uc9c0\ub9cc": 14, "\uc77c\uce58\ud558\uc9c0": 14, "\uc637\ucc28\ub9bc\uc774": 14, "\ud504\ub808\uc784\ub9c8\ub2e4": 14, "\ub2ec\ub790\ub2e4": 14, "pidm\uc774": 14, "\ud569\uc131\uc5d0\uc11c\ub294": 14, "NO": 14, "\ud30c\uc778\ud29c\ub2dd\ud558\uc9c0": 14, "\ubc84\uc804": 14, "\ud3ec\uc988\ub9cc": 14, "\uc5f0\uacb0\ud55c": 14, "identity\uc5d0": 14, "\uc778\ucf54\ub354\ub85c": 14, "\uad50\uccb4\ud55c": 14, "\ub514\ud14c\uc77c\uc740": 14, "\ucea1\ucc98\ud560": 14, "\uc678\ud615\uc5d0": 14, "\ud30c\uc778\ud29c\ub2dd\ud558\uba74": 14, "\ub514\ud14c\uc77c\uc758": 14, "\uc120\uba85\ub3c4\uac00": 14, "\ud5a5\uc0c1\ub418\uace0": 14, "\uc624\ubc84\ud53c\ud305\uc774": 14, "\ubc1c\uc0dd\ud558\uc9c0": 14, "\uc785\ub825\ud558\uba74": 14, "\ud314\uacfc": 14, "\uba38\ub9ac\uce74\ub77d": 14, "\uc8fc\ubcc0\uc5d0\uc11c\uc758": 14, "\ud615\ud0dc\uac00": 14, "\ub098\ud0c0\ub0ac\ub2e4": 14, "\ub123\uc5b4\uc11c": 14, "\ud30c\uc778\ud29c\ub2dd\ud560": 14, "\ud5a5\uc0c1\ub41c\ub2e4": 14, "\uc2e4\ud328": [14, 23], "\uc0ac\ub840": 14, "\ub4dc\ubb38": 14, "\uacbd\uc6b0\uc9c0\ub9cc": 14, "\ud314\ub2e4\ub9ac\uac00": 14, "\uc637": 14, "\uc18d\uc73c\ub85c": 14, "\uc0ac\ub77c\uc9c0\uace0": 14, "feature\uac00": 14, "\ud3ec\uc988\uac00": 14, "\ub4a4\ub97c": 14, "\ud5a5\ud560": 14, "\ubc29\ud5a5\uc774": 14, "\uc798\ubabb": 14, "\uad00\ucc30\ub41c\ub2e4": 14, "\ud328\ud134\uc758": 14, "\uc637\uc5d0\uc11c": 14, "\ud328\ud134\uc5d0\uc11c": 14, "\uae5c\ubc15\uc784": 14, "\ub3d9\uc791\uc744": 14, "vae\uc5d0": 14, "\ud30c\uc778\ud29c\ub2dd\uc740": 14, "18\ucd08\uc758": 14, "\ub80c\ub354\ub9c1": [14, 23], "\uc678\uc758": 14, "10\ubd84": 14, "\ub514\ucf54\ub354\uc758": 14, "20\ubd84\uc774": 14, "\uc18c\uc694\ub41c\ub2e4": 14, "\uc2a4\ud2f8": 14, "\uc12c\uc720": 14, "\ud559\uc2b5\ud558\uc9c0\ub9cc": 33, "\ub85c\uc758": 33, "collect": 33, "transfigur": 33, "season": 33, "enhanc": 33, "\ub123\uc73c\uba74": 33, "section": 33, "\ucc38\uc870\ud558\uba74": 33, "\ud559\uc2b5\ud574\uc11c": 33, "\ub098\uc624\ub3c4\ub85d": 33, "\ubcc0\ud658\ud558\uace0": 33, "\ucc98\uc74c\uc758": 33, "\uc6d0\ubcf8\uc73c\ub85c": 33, "\uc77c\uc885\uc758": 33, "\uc21c\ud658": 33, "\ud504\ub85c\uc138\uc2a4\uac00": 33, "\uc548\uc815\uc801\uc774\uac8c": 33, "gram": 33, "\uc77c\uce58\ub97c": 33, "\ub4e0": 33, "\ud604\uc0c1\uc785\ub2c8\ub2e4": 33, "\ud544\uc694\ud574\uc84c\uc2b5\ub2c8\ub2e4": 33, "\ud45c\uae30": 33, "d_x": 33, "d_y": 33, "\uad6c\ubd84\ud558\uace0": 33, "\ubaa9\uc801\uc2dd\uc73c\ub85c": 33, "\ub098\uc635\ub2c8\ub2e4": 33, "norm": 33, "\uc5c6\uc5c8\ub2e4\uace0": 33, "\uc640\uc758": 33, "\uacb0\uc815\ub429\ub2c8\ub2e4": 33, "\ub85c\uc11c": 33, "1603": 33, "08155": 33, "\ucc44\ud0dd\ud569\ub2c8\ub2e4": 33, "\ucc38\uace0\ud588\uc73c\uba70": 33, "\uc5c5\ub370\uc774\ud2b8\uc2dc": 33, "\uc2e4\ud5d8\uc5d0": 33, "0002": 33, "\uc124\uc815\ud588\uace0": 33, "\ud558\uc600\uc2b5\ub2c8\ub2e4": 33, "fcn": 33, "\uc88b\uc744": 33, "\uacb0\uacfc\uc5d0\uc11c": 33, "\uc5c6\uc5c8\uc2b5\ub2c8\ub2e4": 33, "\ub2a5\uac00\ud569\ub2c8\ub2e4": 33, "\uc81c\uac70\ud558\uba74": 33, "\ud55c\ucabd": 33, "reconctruct": 33, "\uc608\uc2dc\ub4e4\uc785\ub2c8\ub2e4": 33, "\ub9ce\uc558\uc2b5\ub2c8\ub2e4": 33, "facad": 33, "\uc2e0\ubc1c": 33, "\ube44\ub86f\ud558\uc5ec": 33, "\uc785": 33, "\uad6c\uc870\uc5d0": 33, "diffinject": 44, "revisit": 44, "debia": 44, "dongjun": 44, "namjun": 44, "jaekwang": 44, "workshop": 44, "\uc774\ucc3d\ud658": 44, "2003": 23, "08934": 23, "bmild": 23, "jeongin": 23, "youtu": 23, "juh79e8rdkc": 23, "\uad6c\uc131\ud558\uc5ec": 23, "\ub80c\ub354\ub9c1\ud558\ub294": 23, "\uc800\uc7a5": 23, "\uc18c\uc694": 23, "\uad6c\uc131\ud558\uc9c0": 23, "\uc88c\ud45c\ub97c": 23, "mlp\uc5d0": 23, "\uc7a5\uba74": 23, "\uac01\ub3c4\ub85c": 23, "\uc77c\ubd80\uc758": 23, "\uac01\ub3c4\uc758": 23, "\uc720\ucd94\ud558\ub294": 23, "\ud55c\uc815\ub41c": 23, "\ubdf0": 23, "contin": 23, "volumetr": 23, "\ucd5c\uc801\ud654\ub97c": 23, "\ucc28\uc6d0": 23, "\ubc14\ub77c\ubcf4\ub294": 23, "\ubc29\ud5a5": 23, "density\uc640": 23, "\uce74\uba54\ub77c": 23, "\uad11\uc120\uc744": 23, "\uace0\uc804\uc801": 23, "\uc678\ud615\uc744": 23, "\uc785\uc99d": 23, "keyword": 23, "08934v2": 23, "\ucea1\ucc98\ub41c": 23, "\uc774\ubbf8\uc9c0\ub4e4\uc758": 23, "\ucd5c\uc801\ud654\ud558\uc5ec": 23, "\ubd84\uc57c\uc758": 23, "\uc815\uc801": 23, "regress": 23, "coord": 23, "\ubc29\ucd9c\ub41c": 23, "\ubc00\ub3c4\uc758": 23, "\ub204\uc801\uac12\uc744": 23, "\ube5b\uc774": 23, "\ud835\udc65": 23, "\ud835\udc66": 23, "\ud835\udc67": 23, "\ud1b5\uacfc\ud558\ub294": 23, "\uad11\uc120\uc5d0": 23, "\ub204\uc801\ub418\ub294\uc9c0\ub97c": 23, "\uc2dc\uc810\uc73c\ub85c\ubd80\ud130\uc758": 23, "\uc774\ub3d9\ud558\uc5ec": 23, "\ud3ec\uc778\ud2b8": 23, "\ud3ec\uc778\ud2b8\ub4e4\uacfc": 23, "\uc2e0\uacbd\ub9dd\uc5d0": 23, "\uc0c9\uc0c1\uacfc": 23, "\ub80c\ub354\ub9c1\ub41c": 23, "\uc624\ucc28": 23, "\ucd5c\uc18c\ud654\ub97c": 23, "\uc7a5\uba74\uc758": 23, "cotent": 23, "\ud560\ub2f9\ud558\uc5ec": 23, "\ucd5c\uc801\ud654\uc758": 23, "basic": 23, "implementation\uc758": 23, "\ub300\uc548": 23, "\ud45c\ud604\uc73c\ub85c": 23, "\uc218\ub834\ub418\uc9c0": 23, "5d": 23, "mlp\uac00": 23, "\uc8fc\ud30c\uc218\uc758": 23, "\uad11\uc120\ub2f9": 23, "\uc694\uad6c\ub418\ub294": 23, "\uacc4\uce35\uc801": 23, "\uace0\uc8fc\ud30c\uc218\uc758": 23, "\uc801\uc808\ud558\uac8c": 23, "\uc0d8\ud50c\ub9c1\ud558\uae30": 23, "\uac10\uc18c\uc2dc\ud0b4": 23, "\uc0c1\uc18d": 23, "\uc2e4\uc138\uacc4\uc758": 23, "\uae30\ud558\ud559\uc801": 23, "\ud615\ud0dc\uc640": 23, "\ud22c\uc601\ub41c": 23, "\uc801\ud569": 23, "\uace0\ud574\uc0c1\ub3c4\uc5d0\uc11c": 23, "\ubaa8\ub378\ub9c1\ud560": 23, "\uc774\uc0b0\ud654\ub41c": 23, "\ubcf5\uc140": 23, "\uadf8\ub9ac\ub4dc\uc758": 23, "\ube44\uc6a9\uc744": 23, "voxel": 23, "3\ucc28\uc6d0": 23, "\uccb4\uc801\uc758": 23, "\ub2e8\uc704": 23, "2\ucc28\uc6d0\uc758": 23, "\uacbd\uc6b0\uc5d0\uc120": 23, "pix": 23, "\ud22c\uacfc\uc131": 23, "volumn": 23, "\uccb4\uc801": 23, "mri": 23, "technic": 23, "\uae30\ud558\ud559\uacfc": 23, "\uc18c\uc7ac\ub97c": 23, "5\ucc28\uc6d0": 23, "\ub9e4\uac1c\ubcc0\uc218\ud654": 23, "\uace0\uc804\uc801\uc778": 23, "\ubcfc\ub968": 23, "strategi": 23, "capac": 23, "\ub0b4\uc6a9\uc774": 23, "\uacf5\uac04\uc73c\ub85c": 23, "\ud560\ub2f9": 23, "\uc9d1\uc911\uc801\uc73c\ub85c": 23, "\uace0\ucc28\uc6d0": 23, "\ub9e4\ud551\ud558\uae30": 23, "nerf\ub97c": 23, "\uace0\uc8fc\ud30c\uc758": 23, "\ud45c\ud604\uac00\ub2a5": 23, "locat": 23, "practic": 23, "cartesian": 23, "\ud835\udc51_\ud835\udc65": 23, "\ud835\udc51_\ud835\udc66": 23, "\ud835\udc51_\ud835\udc67": 23, "\uae38\uc774\uac00": 23, "\uc815\uaddc\ud654": 23, "emit": 23, "\uc0c9\uc0c1\uc740": 23, "256\uac1c": 23, "256\ucc28\uc6d0": 23, "\uad11\uc120\uc758": 23, "\ubc29\ud5a5\uacfc": 23, "\ubdf0\uc5d0": 23, "\uc0c9\uc0c1\uc744": 23, "128\uac1c": 23, "\uc804\ub2ec\ub428": 23, "\uc608\uce21\ud574\uc57c": 23, "lambertian": 23, "\ubb3c\uccb4\uc758": 23, "\ud45c\uba74\uc5d0\uc11c": 23, "\uad11\uc120\uc774": 23, "\ubc18\uc0ac\ub418\ub294": 23, "\ud45c\uba74\uc758": 23, "\uac01\ub3c4\uc5d0": 23, "\uad11\ub7c9\uc774": 23, "\uc77c\uc815\ud558\ub2e4\ub294": 23, "\uc6d0\ub9ac\ub97c": 23, "\uc2dc\uc120": 23, "\ubc18\uc0ac\uc131": 23, "specular": 23, "\ud45c\ud604\ud558\ub294\ub370": 23, "\ud3ec\uc778\ud2b8\uc5d0\uc11c": 23, "\ub80c\ub354\ub9c1\ud558\ub824\uba74": 23, "\uac00\uc0c1": 23, "\uce74\uba54\ub77c\uc758": 23, "\ud53d\uc140\uc744": 23, "\ucd94\uc801\ub41c": 23, "\uc801\ubd84\uac12": 23, "\ucd94\uc815\uc744": 23, "\uad11\uc120": 23, "t_f": 23, "rai": 23, "\ub204\uc801\ub41c": 23, "\ud22c\uacfc\uc728": 23, "transmitt": 23, "quadratur": 23, "\uad6c\uc801\ubc95": 23, "\uc801\ubd84\uac12\uc744": 23, "\uc218\uce58\uc801\uc73c\ub85c": 23, "grid": 23, "\ub80c\ub354\ub9c1\uc5d0": 23, "\uadf8\ub9ac\ub4dc\ub97c": 23, "\uad6c\uc801\ubc95\uc740": 23, "\uc774\uc0b0": 23, "\ucffc\ub9ac\ub418\uae30": 23, "\uc81c\ud55c": 23, "stratifi": 23, "\ud45c\uc9d1": 23, "\uc811\uadfc\ubc95\uc744": 23, "bin\uc73c\ub85c": 23, "\ubd84\ud560\ud55c": 23, "partit": 23, "bin": 23, "\ud45c\ubcf8\ub4e4\uc744": 23, "\uc0ac\uc6a9\ud558\ub354\ub77c\ub3c4": 23, "\ud45c\ud604\uc774": 23, "\uac00\ub2a5\ud558\ubbc0\ub85c": 23, "\uc704\uce58\ub4e4\uc5d0\uc11c": 23, "\ud3c9\uac00\ub418\ub3c4\ub85d": 23, "\uc0d8\ud50c\ub4e4\ub85c": 23, "\ub80c\ub354\ub9c1\uc5d0\uc11c": 23, "\ub17c\uc758\ub41c": 23, "\uad6c\uc801\ubc95\uc73c\ub85c": 23, "\uc801\ubd84\uc744": 23, "sigma_i": 23, "delta_i": 23, "sigma_j": 23, "delta_j": 23, "adjac": 23, "\uc9d1\ud569\uc73c\ub85c\ubd80\ud130": 23, "\uac00\ub2a5\ud558\uba70": 23, "alpha_i": 23, "\uc54c\ud30c": 23, "\ud22c\uba85\ud55c": 23, "\uc720\ub9ac": 23, "\uadf8\ub9bc\uc790": 23, "\uacb9\uce60": 23, "\ucef4\ud3ec\uc9c0\ud305\uc744": 23, "remind": 23, "\ub2ec\uc131\ud558\uae30\uc5d0\ub294": 23, "assist": 23, "\ud615\ud0dc\uc5d0\uc11c": 23, "\uace0\uc8fc\ud30c": 23, "\ubcc0\ub3d9\uc744": 23, "35": 23, "spectral": 23, "\uc2e0\uacbd\ub9dd\uc774": 23, "\uc800\uc8fc\ud30c": 23, "\ucabd\uc73c\ub85c": 23, "\ud3b8\ud5a5\ub418\uc5c8\uc74c\uc744": 23, "\ud1b5\uacfc\ud558\uae30": 23, "\ub9f5\ud551": 23, "\ubcc0\ub3d9\uc774": 23, "circ": 23, "\uc138\uac1c\uc758": 23, "\uc88c\ud45c\uac12\uacfc": 23, "\uc131\ubd84\uc5d0": 23, "\uac1c\ubcc4\uc801\uc73c\ub85c": 23, "\uc801\uc6a9\uc5d0": 23, "\ubd84\ub9ac\ub418\uc5b4": 23, "\uc801\uc6a9\ub428": 23, "\uc5ec\uc720": 23, "\ube44\uc5b4\uc788\ub294": 23, "\ub9c9\ud600\uc788\ub294": 23, "\uc601\uc5ed\uc774": 23, "\uc0d8\ud50c\ub9c1\ub428": 23, "\ud6a8\uacfc\uc5d0": 23, "\ube44\ub840\ud558\uc5ec": 23, "\uc99d\uac00\uc2dc\ud0b4": 23, "\uacf3\uc744": 23, "\ubf51\uc790": 23, "n_c": 23, "\uc704\uce58\uc5d0\uc11c": 23, "\uc608\uce21\ud558\uc5ec": 23, "\ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c\uc758": 23, "_c": 23, "\uceec\ub7ec": 23, "\uac00\uc911\ud569": 23, "\uc500": 23, "w_i": 23, "piecewis": 23, "dfrac": 23, "w_j": 23, "\uc5ed\ubcc0\ud658": 23, "\ubc00\ub3c4\ud568\uc218": 23, "2\ubc88\uc9f8": 23, "\uc0d8\ud50c\uc9d1\ud569\uc758": 23, "n_f": 23, "\ubc88\uc9f8\uc640": 23, "\uc9d1\ud569\uc758": 23, "\ud569\uc9d1\ud569\uc5d0\uc11c": 23, "_f": 23, "\uc808\ucc28\uc5d0\uc11c\ub294": 23, "\uad00\uce21": 23, "\ud3ec\ud568\ub420": 23, "\uc608\uc0c1\ub418\ub294": 23, "scene\uc774": 23, "extrins": 23, "\uacbd\uacc4\ub85c": 23, "\uce74\uba54\ub77c\uac00": 23, "\uc5b4\ub514\uc5d0": 23, "\uc5b4\ub514\ub97c": 23, "\ubc14\ub77c\ubcf4\uace0": 23, "rotat": 23, "\ub80c\uc988\uc640": 23, "\uc13c\uc11c": 23, "\uacb0\uc815\ub418\uc5b4\uc9c0\ub294": 23, "\ud56d\ubaa9\uc73c\ub85c": 23, "\ud328\ub110\uc774": 23, "\uc774\ub3d9": 23, "\ud655\ub300\ud558\uace0": 23, "\uae30\uc6b8\uc5b4\uc84c\ub294\uc9c0": 23, "shear": 23, "\uacf5\uac04\uc0c1\uc758": 23, "\uc810\ub4e4\uc744": 23, "\ud3c9\uba74\uc5d0": 23, "\ud22c\uc0ac": 23, "perspect": 23, "iteration\uc5d0\uc11c": 23, "\uc9d1\ud569\uc5d0\uc11c": 23, "batch\ub97c": 23, "\ub450\uc0d8\ud50c": 23, "\ub80c\ub354\ub9c1\uacfc": 23, "\ub80c\ub354\ub9c1\uc758": 23, "\uc81c\uacf1": 23, "\ub80c\ub354\ub9c1\uc740": 23, "lr": 23, "beta_2": 23, "999": 23, "30\ub9cc": 23, "1\uac1c\ub85c": 23, "2\uc77c": 23, "degre": 23, "geometry\ub85c": 23, "\uc0c1\ubc18\uad6c\uc5d0": 23, "viewpoint": 23, "479": 23, "8\uac1c": 23, "pathtrac": 23, "\uad6c": 23, "scene\uc744": 23, "\uc55e\ucabd\uc5d0\uc11c": 23, "llff": 23, "\ucea1\ucc98": 23, "1008": 23, "756": 23, "nv": 23, "srn": 23, "fusion": 23, "\ubbf8\uc138": 23, "\ub514\ud14c\uc77c": 23, "\uc678\uc591": 23, "nonlambertian": 23, "\ubc18\uc0ac": 23, "ghost": 23, "artifact": 23, "ship": 23, "lego": 23, "blurri": 23, "\uae30\ud558\uc801": 23, "\ub80c\ub354\ub9c1\uc5d0\uc11c\uc758": 23, "\uacb9\uce68": 23, "\ubc88\uc9d0": 23, "\ubc1d\uae30": 23, "\ubc1d\uae30\uc640": 23, "\uad11\ud0dd": 23, "\ud22c\uba85\ub3c4": 23, "\uac00\uc9d0": 23, "occlud": 23, "region": 23, "360\ub3c4": 23, "pe": 23, "\uc758\uc874\uc131": 23, "vd": 23, "\uc8fc\ud30c\uc218": 23, "\ucd08\uacfc\ud560": 23, "\ud5a5\uc0c1\uc5d0": 23, "so": 23, "li": 23, "within": 23, "side": 23, "length": 23, "\ub354\ud574\uc9c4": 23, "\ud22c\uc785": 23, "relu\ub85c": 23, "\uc5ee\uc778": 23, "deepsdf": 23, "5\ubc88\uc9f8": 23, "activation\uc5d0": 23, "\uc0b0\ucd9c": 23}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"inform": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "synthet": [0, 2, 28], "data": [0, 5, 11, 13, 28], "stabl": [0, 3, 14, 30, 42], "diffus": [0, 3, 8, 11, 12, 14, 16, 18, 19, 24, 26, 28, 29, 30, 31, 32, 35, 36, 38, 40, 41, 42], "foliar": 0, "diseas": 0, "classif": [0, 28], "1": [0, 2, 3, 5, 8, 10, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 24, 26, 28, 30, 32, 34, 35, 40, 41, 42], "\uac1c\uc694": 0, "2": [0, 2, 3, 5, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 28, 30, 32, 34, 35, 40, 41, 42], "baselin": [0, 33], "\uad6c\ucd95": 0, "3": [0, 2, 3, 5, 8, 10, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 28, 30, 32, 34, 35, 40, 41, 42], "fine": [0, 5, 8, 16, 28, 30, 36, 40], "tune": [0, 5, 8, 16, 28, 30, 36, 40], "4": [0, 2, 3, 5, 8, 10, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 28, 30, 32, 35, 40, 41, 42], "\uc131\ub2a5": 0, "\ube44\uad50": [0, 29], "5": [0, 2, 3, 8, 10, 12, 13, 14, 18, 20, 21, 22, 23, 25, 26, 28, 32, 35, 41], "discuss": [0, 8, 23], "6": [0, 10, 12, 14, 18, 23, 28, 32, 35], "appendix": [0, 1, 23, 36], "train": [1, 3, 5, 7, 8, 11, 13, 16, 21, 22, 25, 28, 32, 33, 34, 37, 41, 43], "dreambooth": [1, 17, 30, 36], "naver": 1, "webtoon": 1, "face": [1, 26], "dataset": [1, 2, 14, 21, 23, 33, 40], "introduct": [1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 23, 24, 25, 26, 28, 29, 32, 34, 35, 36, 37, 38, 40, 41, 42, 43], "ablat": [1, 3, 14, 23, 33, 36, 38, 42], "studi": [1, 2, 3, 14, 23, 33, 36, 38, 40, 42], "prior": [1, 34], "preserv": 1, "loss": [1, 11, 33, 41], "neg": [1, 6], "prompt": 1, "instanc": 1, "guidanc": [1, 5, 14, 16, 22, 35, 38, 40], "scale": [1, 11, 15, 18, 28, 40], "A": [2, 21, 22, 23], "evalu": [2, 5, 6, 21, 33, 38], "gener": [2, 3, 5, 6, 8, 10, 12, 24, 28, 30, 32, 40], "model": [2, 3, 5, 8, 11, 12, 13, 14, 16, 18, 19, 21, 22, 24, 25, 26, 28, 29, 30, 31, 32, 35, 36, 38, 40, 41, 42], "\ud559\uc2b5": 2, "\uc790\ub8cc": 2, "0": [2, 20, 23], "abstract": [2, 3, 5, 8, 10, 12, 13, 15, 16, 18, 20, 23, 24, 25, 26, 29, 30, 33, 35], "background": [2, 10, 11, 12, 14, 16, 28, 33, 34, 35, 41], "kl": 2, "diverg": 2, "kullback": 2, "leibler": 2, "incept": 2, "score": [2, 24, 28], "IS": [2, 28], "fid": [2, 28], "fr\u00e9chet": 2, "distanc": 2, "kernel": 2, "clean": 2, "benchmark": 2, "comparison": [2, 3, 6, 12, 14, 17, 18, 23, 33, 42], "between": 2, "metric": [2, 21], "Is": 2, "all": 2, "we": 2, "need": 2, "anim": [3, 14], "anyon": 3, "relat": [3, 6, 8, 14, 17, 23, 24, 26, 28, 29, 33], "work": [3, 6, 8, 14, 17, 21, 23, 24, 26, 28, 29, 33, 34, 35], "imag": [3, 5, 7, 8, 12, 14, 15, 16, 21, 30, 32, 33, 35, 36, 40], "video": [3, 14, 21, 30], "human": [3, 21, 38], "method": [3, 6, 8, 14, 15, 17, 20, 21, 24, 26, 29, 33, 42], "preliminari": [3, 40, 42], "network": [3, 21, 27, 33], "architectur": [3, 13, 14, 22, 33, 35], "strategi": [3, 5], "experi": [3, 6, 8, 10, 11, 12, 14, 15, 17, 19, 20, 21, 23, 24, 26, 30, 32, 36, 37, 40, 41, 42, 43], "implement": [3, 7, 14, 23, 33, 42], "qualit": [3, 6, 14, 21, 38], "result": [3, 5, 6, 7, 14, 16, 21, 22, 23, 28, 33, 34, 35, 37, 38, 40], "limit": [3, 6, 8, 14, 29, 33, 34, 35, 36], "bbdm": 4, "cm3leon": 5, "pretrain": [5, 38], "token": [5, 22], "retriev": 5, "augment": [5, 40], "object": [5, 6, 11, 33, 41], "function": [5, 11, 33], "text": [5, 8, 15, 16, 21, 22, 29, 30, 36, 40], "To": [5, 21, 40], "import": 5, "decod": [5, 11, 22], "temperatur": 5, "sampl": [5, 10, 11, 18, 23, 28, 41], "topp": 5, "classifi": [5, 14, 16, 22, 31, 35, 38], "free": [5, 14, 16, 22, 38], "cfg": 5, "contrast": 5, "topk": 5, "cd": 5, "k": 5, "quantit": [5, 6, 12, 14, 21], "supervis": 5, "instruct": 5, "guid": [5, 16, 29, 40], "edit": [5, 8, 12, 32], "ground": 5, "spatial": 5, "caption": 5, "visual": [5, 34], "question": 5, "answer": 5, "task": 5, "conceptlab": 6, "prelimiari": [6, 17], "The": [6, 40], "constraint": 6, "regular": [6, 27], "adapt": [6, 8, 35, 42], "evolutionari": 6, "creativ": 6, "concept": [6, 8], "mix": [6, 27], "setup": [6, 29], "conclus": [6, 12, 14, 17, 26, 28, 34, 38, 40], "controlnet": 7, "addit": [7, 20, 23, 33], "control": 7, "base": [7, 22, 24], "condit": [7, 14, 16, 25], "block": [7, 13], "zero": [7, 31, 32], "convolut": [7, 21], "custom": [8, 40], "deep": 8, "transfer": 8, "learn": [8, 34], "singl": 8, "multipl": [8, 14], "composit": 8, "detail": [8, 14, 23, 33, 34, 42], "dall": [9, 29, 34], "e": [9, 29, 34], "ddim": [10, 12, 35], "ddpm": [10, 11, 12, 18, 35, 41], "variat": [10, 27, 43], "infer": [10, 13, 20, 22], "For": 10, "non": 10, "markovian": 10, "forward": [10, 11], "process": [10, 11, 12], "from": [10, 28, 38], "code": 10, "q": [11, 22], "mathbf": 11, "x": 11, "_t": 11, "_": 11, "t": [11, 20], "revers": [11, 12], "p": 11, "l": 11, "denois": [11, 12, 18], "encod": [11, 14, 22, 23], "l_t": 11, "l_": 11, "l_0": 11, "simplifi": 11, "qualiti": [11, 12, 28, 33], "alreadi": 12, "have": 12, "semant": [12, 22], "latent": [12, 19, 29, 30, 40], "space": [12, 40], "probabl": [12, 41], "implicit": 12, "manipul": 12, "clip": [12, 14, 16], "discov": 12, "In": 12, "problem": [12, 20], "asymmetr": 12, "asyrp": 12, "h": 12, "neural": [12, 23], "direct": 12, "design": [12, 42], "With": 12, "boost": 12, "stochast": [12, 27, 43], "nois": [12, 16], "inject": 12, "overal": 12, "versatil": 12, "analysi": [12, 14, 33], "dreamov": 13, "collect": 13, "preprocess": 13, "motion": 13, "content": [13, 44], "guider": 13, "gigagan": [], "\uc8fc\uc694": 15, "\uc9c8\uc758\uc751\ub2f5": 15, "glide": 16, "inpaint": 16, "hyperdreambooth": 17, "contribut": [17, 21, 22, 38], "lightweight": 17, "lidb": 17, "hypernetwork": 17, "rank": [17, 20], "relax": 17, "fast": [17, 41], "finetun": [14, 17, 22, 30], "follow": 17, "up": [15, 17], "i": 18, "probabilist": 18, "improv": [18, 25, 28, 35], "log": 18, "likelihood": 18, "improc": 18, "speed": 18, "gan": [15, 18, 29, 35, 37], "size": 18, "lora": 20, "terminolog": 20, "convent": 20, "statement": 20, "aren": 20, "exist": 20, "solut": 20, "good": 20, "enough": 20, "our": 20, "low": 20, "parameter": [20, 41], "updat": 20, "matric": 20, "No": 20, "latenc": 20, "appli": 20, "transform": [20, 34], "empir": 20, "ia3": 20, "aa": 20, "\uc0ac\uc6a9\ubc95": 20, "refer": 20, "make": 21, "\uc81c\uc548": 21, "\ubc30\uacbd": 21, "\ud2b9\uc131": 21, "previou": [21, 34], "spatiotempor": 21, "layer": 21, "pseudo": [21, 29], "3d": 21, "psuedo": 21, "attent": 21, "frame": [21, 30], "interpol": [21, 30], "set": 21, "automat": 21, "evaluaton": 21, "msr": 21, "vtt": 21, "evluat": 21, "ucf": 21, "101": 21, "\uacb0\ub860": 21, "muse": 22, "mask": 22, "pre": 22, "us": [22, 44], "vqgan": 22, "super": [22, 38], "resolut": [22, 30, 38], "7": [14, 22, 35], "8": [14, 22, 35], "iter": 22, "parallel": 22, "sdedit": 24, "sde": 24, "smld": 24, "sdxl": 25, "micro": 25, "crop": 25, "paramet": [25, 28, 35], "multi": 25, "aspect": 25, "autoencod": [25, 30], "put": 25, "everyth": 25, "togeth": 25, "refin": 25, "stage": [25, 34, 40], "styo": 26, "styliz": 26, "framework": 26, "stylegan": 27, "map": 27, "style": 27, "adain": 27, "\uc2e4\ud5d8": 27, "\uacb0\uacfc": [27, 29], "imagenet": 28, "imagen": [28, 38, 39], "protocol": 28, "accuraci": 28, "differ": 28, "merg": 28, "real": 28, "textual": 29, "invers": 29, "cf": 29, "\uc774\ud574": 29, "\ubabb\ud568": 29, "ldm": 29, "embed": 29, "\uc131\ub2a5\ud3c9\uac00": 29, "2\uc640": 29, "synthesi": [14, 15, 23, 29, 30, 35], "word": 29, "\ub450": 29, "\uac1c": 29, "\uc0ac\uc6a9": 29, "bia": 29, "reduct": 29, "\uc815\ub7c9\ud3c9\uac00": 29, "\ud3c9\uac00": 29, "\uc8fc\ubaa9\ud560": 29, "\uc810": 29, "\uc0ac\uc6a9\uc790\ud3c9\uac00": 29, "\ub9c8\ubb34\ub9ac": 29, "videoldm": 30, "turn": 30, "tempor": 30, "predict": 30, "long": 30, "term": 30, "high": 30, "rate": 30, "sr": 30, "drive": 30, "person": 30, "your": 31, "secretli": 31, "shot": [31, 32], "consist": [32, 33, 40], "via": [14, 32], "distil": [32, 40, 41], "isol": 32, "few": 32, "step": [32, 40], "cyclegan": 33, "\ucc38\uace0": 33, "translation\uc774\ub780": [], "mode": 33, "collapse\ub780": [], "\uad00\ub828": [], "\uc5f0\uad6c": [], "formul": [], "adversari": 33, "cycl": 33, "full": 33, "\uc804\uccb4": [], "\ubaa9\uc801\uc2dd": [], "least": 33, "squar": 33, "\ucd94\uac00": 33, "\uc124\uba85": 33, "\uae30\ud0c0": [], "against": 33, "fcn": [], "\ub4f1": [], "reconstruct": 33, "pair": 33, "dataset\uc5d0": [], "\ub300\ud55c": [], "applic": [36, 42], "transfigur": [], "season": [], "photo": [], "paint": [], "enhanc": [], "gati": [], "discusss": 33, "gpt": 34, "vq": 34, "vae": [14, 34, 43], "methodolog": [34, 38], "overview": [14, 33, 34, 42], "an": 34, "autoregress": 34, "pipelin": 34, "\uc608\uc2dc": 34, "equat": 34, "\ud559\uc2b5\uacfc\uc815": 34, "codebook": 34, "beat": 35, "group": 35, "normal": 35, "algorithm": [35, 43], "impact": 35, "s": 35, "9": 35, "futur": [14, 35], "procedur": 37, "theoret": 37, "summari": [37, 43], "t5": 38, "xxl": 38, "cascad": 38, "larg": 38, "weight": 38, "sampler": 38, "static": 38, "threshold": 38, "dynam": 38, "drawbench": 38, "tabl": 38, "editor": 39, "progress": 41, "continu": 41, "time": [40, 41], "definit": 41, "ancestr": 41, "flow": 41, "od": [40, 41], "parametr": 41, "t2i": 42, "optim": [23, 42], "intract": 43, "sgvb": 43, "gradient": 43, "bay": 43, "reparameter": 43, "trick": 43, "feat": [], "contributor": 44, "about": 44, "One": 40, "solv": 40, "pf": 40, "acceler": 40, "skip": 40, "abul": 40, "solver": 40, "schedul": 40, "effect": 40, "omega": 40, "downstream": 40, "dreampos": 14, "fashion": 14, "still": 14, "mechan": 14, "split": 14, "modifi": 14, "unet": 14, "pose": 14, "input": 14, "translat": 33, "collaps": 33, "welcom": 44, "pseudodiffus": 44, "public": 44, "tech": 44, "blog": 44, "nerf": 23, "repres": 23, "scene": 23, "radianc": 23, "field": 23, "view": 23, "represent": 23, "volum": 23, "render": 23, "posit": 23, "hierarch": 23}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 56}}) \ No newline at end of file