2024. 5. 25. 02:08ㆍDevelopers 공간 [SOTA]
- Paper : https://arxiv.org/pdf/2402.03290
- Authors
- Meta + UC Berkeley Univ, CVPR’24
- Main Idea
- pretrained T2I모델을 control하기 위한 방법으로, 개별적인 instance들에게 각각 control을 제공하기 위한 모델
** GLIGEN의 open-set grounded T2I문제와 비슷한 문제를 해결합니다. - instance별로 각각 free-form language condition을 제공할 수 있으며, 아래와 같은 location에 대한 유연한 control을 제공할 수 있습니다.
- Single point
- Scribble
- Bounding box
- Instance segmentation mask
- Tasks : Text2Image + Control
- Results : COCO-val, LVIS
- pretrained T2I모델을 control하기 위한 방법으로, 개별적인 instance들에게 각각 control을 제공하기 위한 모델
<구성>
1. Problem
a. Gligen
2. Approach
a. UniFusion Block
b. ScaleU Block
c. Sampling & Data
3. Results
a. Setting
b. Results : Comparison with prior work
c. Results : Ablation Study
글효과 분류1 : 논문 내 참조 및 인용
글효과 분류2 : 폴더/파일
글효과 분류3 : 용어설명
글효과 분류4 : 글 내 참조
글효과 분류5 : 글 내 참조2
글효과 분류6 : 글 내 참조3
1. Problem
이 모델은 GLIGEN의 open-set grounded T2I문제와 비슷한 문제를 해결합니다. 즉, GLIGEN은 어떠한 location 등의 grounding 정보를 활용해 생성할 수 있는 방법을 제안했는데, 여기서는 instance 별로 location정보를 줄 수 있다는 것이 다릅니다.
따라서 관련된 논문인 GLIGEN을 먼저 살펴보고자 합니다.
GLIGEN은 이미 diffusers에 반영되어있을 만큼, 알아두면 좋을 것 같습니다.
a. Gligen
** GLIGEN: Open-Set Grounded Text-to-Image Generation (CVPR'23)
존재하는 T2I모델을 활용해 grounding input을 가능하게하기 위해 모든 weight를 freeze하고 gated 메커니즘을 활용해 새로운 trainable layer를 추가하는 GLIGEN(Grounded-Language-to-Image Generation) 모델을 제안합니다.
기존에 T2I모델에서는 "다른 modality"에 대해 condition을 주기 어렵거나 정확한 정보를 제공하기 어려웠다고 합니다.
따라서 기존의 pretrained모델의 성능을 해치지 않으면서 새로운 modality의 Input을 제공할 수 있는 모델이 필요해 GLIGEN을 제안했습니다.
이 Grounded model의 global text condition인 caption c와, instruction인 e가 아래와 같이 구성되어있다고 하겠습니다.
$$\begin{matrix}
\ \ \ \ Caption&:&c&=&[c_1,...,c_L]\\
Grounding&:&\mathbf{e}&=&[(e_1,l_1),...,(e_N,l_N)]
\end{matrix}$$
L은 caption의 길이이며, N은 ground coundition로 들어갈 (grounding entity, grounding spatial configuration) 쌍의 개수입니다.
** grounding entity $e_i$의 예 : 텍스트, 예시 이미지
** grounding spatial configuration $l_i$의 예 : bounding box, keypoints, edge map
위에서 caption c는 LDM과 동일하게 BERT-like Text Encoder $f_{text}()$를 활용해 feature를 얻어낼 수 있습니다.
$$h^c=[h^c_1,...,h^c_L]=f_{text}(c)$$
다음으로 grounding token은 Bounding Box을 예로 설명하겠습니다.
location의 top-left와 bottom-right정보를 $l=[\alpha _{min},\beta _{min},\alpha _{max},\beta _{max}]$ 형태로 아래와 같이 처리하고, text entity를 위에서 사용한 $f_{text}()$를 활용해 처리해 아래와 같이 feature를 만들어낼 수 있습니다.
** 이 때 Fourier Embedding을 만드는 Fourirer()의 경우는 NeRF를 참조했다고 합니다.
$$h^e=[h^e_1,...,h^e_N]=MLP(f_{text}(e),Fourier(l))$$
** bounding box가 아닌 다른 grounding coniditon들을 처리하는 방법이나 NeRF에 대해 궁금하신 분들은 아래 더보기를 참조하세요.
---------------------------------------------------------
<다른 grounding condition>
위에서는 bounding box를 예로, coordinates 상의 포인트로 만들어 처리했습니다.
다른 grounding condition인 경우는 아래와 같이 처리한다고 합니다.
- image prompt : $f_{text}$ 대신 $f_{image}$를 활용해 image에 대한 concept을 제공합니다.
- keypoints : 똑같이 Fourier embedding을 keypoint location에 대해 진행합니다.
- spatially-aligned conditions(edge map, depth map, normal map, semantic map)
- conv layer를 활용해 l을 hxw의 grounding token으로 만들어 준뒤 사용합니다.
- 이 때 추가로, l을 UNet을 추가로 통과시키는 것이 더 성능이 좋다고 합니다.
즉, downsampling network $f_l(l)$이 있을 때, $Concat(f_l(l),z_t)$을 UNet의 input으로 넣어주면 좋다고합니다.
** 이 때, UNet의 첫번째 conv는 차원이 바뀌므로 학습 가능해야합니다.
---------------------------------------------------------
---------------------------------------------------------
<NeRF>
** Nerf: Representing scenes as neural radiance fields for view synthesis (ECCV’20)
GLIGEN에서는 embdding을 만들 때 NeRF논문을 인용했지만, instanceDiffusion에서는 아래와 같은 논문을 인용했습니다.
** Fourier features let networks learn high frequency functions in low dimensional domains (NIPS'20)
NeRF는 복잡한 scene을 합성하기 위해 SOTA결과를 보인 논문입니다.
먼저 용어에 관해 설명하겠습니다.
- (Concept) 기본 용어
- Camera Ray $r(t)=o+td$ : o를 중심으로 d direction으로 t만큼의 배율로 움직이는 camera의 ray
- $t_n$ : 가장 가까운 bound의 위치를 나타내기 위한 값
- $t_f$ : 가장 먼 bound의 위치를 나타내기 위한 값
- Camera Ray $r(t)=o+td$ : o를 중심으로 d direction으로 t만큼의 배율로 움직이는 camera의 ray
- (Preprocessing) 전처리
- $\lambda$() : positional encoding 함수입니다.
- (Input) 5D vector
- 3D spatial location
- $\mathbf{x}=(x,y,z)$ : 3D location으로 3D Cartesian 좌표계에서 정의 됩니다.
- 2D radiance direction (viewing direction)
- $unit\ vector\ \mathbf{d} =(\theta, \phi)$ : 2D direction으로, 나중에 3D Cartesian 좌표계로 표현됩니다.
- 3D spatial location
- (Network) output을 얻기 위한 네트워크
- $F_\Theta :(x,d)\rightarrow (c,\sigma)$ :
- $F_{\Theta 1}$ : 8개의 FC layer(layer마다 256채널을 가지며 ReLU activation)
- $F_{\Theta 2}$ : 1개 FC layer(128채널을 가지며 ReLU activation)으로, conv layer없이 구현됩니다.
- $F_\Theta :(x,d)\rightarrow (c,\sigma)$ :
- (Output) x를 input으로 얻은 결과
- $\sigma$ : 해당 위치에 추정되는 volume density, 즉 장애물의 밀집도 입니다.
- $c=(r,g,b)$ : 해당 위치에 추정되는 emitted(view-dependent) color입니다.
그럼 먼저 위 Preprocessing에 대해 설명하겠습니다. 5D space상에서 5개의 값을 그대로 사용한다면 geometry나 color 값에 대해 high frequency인 곳들은 성능이 안좋은 것을 볼 수 있습니다.
이에 대한 원인은 하기 타 논문에서 보였는데, deep network들은 low frequency함수로 bias되는 경향이 있으며, input을 high-frequency function을 활용해 high dimensional space로 mapping해 바꿔주면 데이터를 조금더 잘 fitting해 high-frequency variation을 포함시킬 수 있다고 합니다.
** On the spectral bias of neural networks (ICML'18)
따라서 3D cartesian 좌표계상의 5D vector인 $\mathbf{x}$와 $\mathbf{d}$를 아래와 같은 positional encoding을 통해 표현해 준 뒤 네트워크에 사용하고, 이를 포함한 네트워크는 $F_\Theta=F'_\Theta\circ \gamma$로 표현할 수 있습니다.
$$\gamma(p)=(sin(2^0\pi p),cos(2^0\pi p), ...,sin(2^{L-1}\pi p),cos(2^{L-1}\pi p))$$
기존에 positional encoding 컨셉을 활용한 다른 논문에서는 input token의 discrete한 위치를 표현하기 위해 사용되었으나, 본 논문에서는 다른 방법으로 활용되었다고 볼 수 있습니다.
** Attention is all you need (NIPS’17)
다음으로 $\sigma$와 c를 얻어내기 위한 Network $F_\Theta$에 대해 설명하겠습니다.
먼저 location $\mathbf{x}$만을 활용해 $F_{\Theta 1}$을 통해 volume density $\sigma$와 256차원의 feature vector를 얻습니다.
그 다음 위에서 얻은 feature vector와 direction $\mathbf{d}$를 concat해 $F_{\Theta 2}$를 통과해 view-depdent RGB color를 얻습니다.
이런 방식으로 volume density가 location에만 의존하도록 할 수 있습니다.
그럼 이제 scene을 표현하기 위한 5D neural radiance field를 구성하는 방식을 보이겠습니다.
input 5D vector와 추정될 volume density/emitted color로 구성된 space를 NeRF(Neural Radiance Field)라고 했는데, 이 field를 구성하기 위해서는 기존 논문에서의 Volume Rendering이라는 방법을 활용합니다.
** Ray tracing volume densities. Computer Graphics (SIGGRAPH’84)
기존 논문에서는 어떤 camera ray $r$ 에서 예상되는 color인 $C(r)$를 나타내기 위해 $\sigma$와 c를 활용해 아래와 같은 식으로 나타냅니다.
** T(t)는 ray에 따라서 축적된 transmittance(투과율), 즉 ray가 아무것도 막지 않을 확률을 의미합니다.
$$\begin{matrix}
C(r)&=&\int^{t_f}_{t_n}T(t)\sigma(r(t))c(r(t),d)dt\\
&&where\ T(t)=exp(-\int^t_{t_n}\sigma(r(s))ds
\end{matrix}$$
하지만 본 논문에서는 타 논문에서의 아래와 같은 식을 통해, 예상되는 $\hat{C}(r)$를 구해냅니다.
** $\delta_i$는 아래서 설명할 sample간의 거리를 의미합니다.
** Optical models for direct volume rendering(TVCG’95)
$$\begin{matrix}
\hat{C}(r)&=&\sum^{N}_{i=1}T_i\alpha _ic_i\\
&&where\ T_i=exp(-\sum^{i-1}_{j=1}\sigma_j\delta_j)\\
&&where\ \alpha _i=1-exp(-\sigma _i\delta_i)\\
&&where\ \delta_i=t_{i+1}-t_i
\end{matrix}$$
즉, 위에서 제안한 연속적인 적분을 quadrature(구분구적법)으로 변환해 계산합니다.
하지만 Deterministic한 구분구적법을 사용하면 뒤의 MLP에서 정해진 discrete의 location만 반영해 표현력을 제한할 수 있어, stratified sampling 방법을 활용합니다.
즉, N개의 evenly-spaced bins로 $[t_n,t_f]$를 구분한 뒤, 아래와 같은 식을 통해 각각의 bin에서 uniform random sampling을 통해 sample을 뽑는 것입니다.
$$t_i\sim \upsilon\begin{bmatrix}
t_n+\frac{i-1}{N}(t_f-t_n),t_n+\frac{i}{N}(t_f-t_n)
\end{bmatrix}$$
이렇게 구해진 $\hat{C}(r)$는 미분가능하며 위 식에서 $\alpha_i$ 값에 대한 기존의 alpha compositing 문제로 귀결될 수 있다고 합니다.
** alpha compositing : 컴퓨터 그래픽스에서 불투명한 객체를 합성할 때, alpha값을 고려해 색상을 결정하는 방법
사실 위 방법은 조금 더 복잡한 방법으로 진행됩니다.
위 $\hat{C}(r)$을 구하는 과정에서 sampling을 진행할 때, 조금 더 마지막 rendering에 영향력이 있는 것에 조금 더 비율을 높여 sampling하는 “Hierarchical Volume Sampling”을 진행합니다.
** Efficient ray tracing of volume data (ToG’90)
즉, 위 네트워크를 구성할 때 하나의 네트워크가 아닌 coarse network $\hat{C}_c(r)$와 fine network $\hat{C}_f(r)$ 두 네트워크를 학습합니다.
먼저 coarse network를 통해, 결과를 낼 input을 만들어 내기 위해 $N_c$개를 위에서 언급한 것과 같이 stratified sampling을 통해 골라냅니다.
그럼 이제 coarse network를 통해, 각각의 ray에서 volume에 조금더 관계가 높은 점들을 sampling해 낼 수 있으며, 아래와 같이 다시 표현해보겠습니다.
$$\begin{matrix}
\hat{C}_c(r)&=&\sum^{N_c}_{i=1}w_ic_i & where\ w_i=T_i(1-exp(-\sigma_i\delta_i))\\
\hat{w}_i&=&\frac{w_i}{\sum^{N_c}_{j=1}w_j}&
\end{matrix}$$
이 때, $w_i$들을 normalize하면 해당 ray에 대해서 piecewise-constant PDF형태로 나타낼 수 있습니다.
그 다음 해당 PDF distribution에서 $N_f$를 inverse transform sampling을 통해 뽑아내고 fine network $\hat{C}_f(r)$를 통해 color를 찾아내면 visible한 content에 대해 더 sampling을 많이 할 수 있게 됩니다.
** 이 때 fine network의 sample로는 $N_c$와 $N_f$ 모두 활용합니다.
이는 기존의 importance sampling과 비슷한 방법입니다.
---------------------------------------------------------
위 과정을 그림으로 나타내면 아래와 같습니다. 아래 그림 중 위 pipeline은 text encoder의 결과와 location embdding의 결과를 합쳐 grounding tokens을 만들어내는 과정입니다.
이제, visual feature token인 $v=[v_1,…,v_M]$이 있을 때, 이를 처리했던 기존의 Transformer block은 아래 식과 같았습니다.
$$\begin{array}{ll}
v=&v+SelfAttn(v)\\
v=&v+CrossAttn(v,h^c)
\end{array}$$
** Diffusion 모델에서 활용하는 UNet의 구조에 대해 궁금하신 분들은 아래 더보기를 참조하세요
-----------------------------------------------------------------------
<DDPM의 UNet>
diffusers 패키지의 SD(diffusers.StableDiffusionPipeline)과 SD-XL(diffusers.StableDiffusionXLPipeline) 모두 UNet2DConditionalModel을 활용합니다.
** https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/unets/unet_2d_condition.py
같은 UNet2DConditionModel을 활용하지만 아래와 같이 config에 따라 다르게 구성됩니다.
- SD : https://huggingface.co/runwayml/stable-diffusion-v1-5/blob/main/unet/config.json
- SD-XL : https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/blob/main/unet/config.json
아래는 SD와 SD-XL의 UNet 전체 구조를 보입니다.
위에는 보이는 것과 같이 4가지 하위 Block들이 존재합니다.
- DownBlock2D : 위는 (2xResnetBlock2D+Downsample2D)로 구성됩니다.
- https://github.com/huggingface/diffusers/blob/4d40c9140c28bd99deb2c2052f03a56c65655d94/src/diffusers/models/unets/unet_2d_blocks.py#L1312
- Downsample2D : stride 2, 3x3의 nn.Conv2d를 default로 사용합니다.
- CrossAttnDownBlock2D : 위는 (2x(ResnetBlock2D+Transformer2DModel)+Downsample2D)로 구성됩니다.
- CrossAttnUpBlock2D : 위는 (3x(ResnetBlock2D+Transformer2DModel)+Upsample2D)
- https://github.com/huggingface/diffusers/blob/4d40c9140c28bd99deb2c2052f03a56c65655d94/src/diffusers/models/unets/unet_2d_blocks.py#L2391
- Upsample2D : stride 1, 3x3의 nn.Conv2d를 default로 사용합니다. 하지만 forward()에서 torch.nn.functional.interpolate()를 활용해 upsampling합니다.
- UpBlock2D : 위는 (3xResnetBlock2D+Upsample2D)로 구성됩니다.
위와 같은 layer들은 공통적으로 마지막 layer인 경우(is_final_block), Downsample2D나, Upsample2D는 사용하지 않습니다.
추가적으로 Group Normalization layer의 경우, 채널을 그룹의 개수로 나눠서 그룹마다 평균과 표준편차를 구해 normalization하는 방법입니다. 이 때 채널 개수는 변하지 않습니다.
더 하위의 Block을 살펴보겠습니다. 먼저, Transformer2DModel의 구조는 아래와 같이 self-attention과 cross-attention으로 구성된 BasicTransformerBlock으로 단위 구성되어 있습니다.
이 때, SD-XL의 경우 여러개의 Transformer Block을 활용합니다.
중요한 점은, BasicTransformerBlock의 cross attention은 위 그림과 같이 condition을 반영하기 위해 활용됩니다.
다음으로 ResnetBlock2D를 살펴보겠습니다. diffusers에 구현된 Resnet block은 아래와 같이 되어있습니다.
처음에 구현되었던 Phil Wang의 diffusion 모델의 resnet block은 다른 형태로 구현되어있었지만, 공통적인 것은 group normalization이 잘 동작하기 위해 노력했다는 것입니다.
**https://github.com/lucidrains/denoising-diffusion-pytorch
중요한 점은, ResnetBlock2D은 위 그림과 같이 timestep을 반영하기 위해 활용됩니다.
특히 SD-XL의 경우, 위 그림과 같이 condition을 timestep에 추가로 반영해주기도 합니다.
-----------------------------------------------------------------------
하지만 이 두 layer를 freeze한 뒤, 새로운 Gated Self-Attention을 아래 그림과 같이 추가해 spatial grounding 기능을 추가하기 위한 학습을 진행합니다.
Gated Self-attention은 아래 수식과 같이 동작합니다.
** TS(Token Selection) : visual token만을 골라내는 과정
** $\gamma$ : 학습 가능한 파라미터
$$v=v+\beta\cdot tanh(\gamma)\cdot TS(SelfAttn([v,h^e]))$$
학습은 기존 LDM의 objective와 동일하게 사용해 학습하는데, 학습 과정에서는 위 $\beta$를 1로 두고 학습합니다.
하지만, inference에서는 기존의 모델의 성능을 해치지 않기 위해 $\beta$를 아래 식과 같이 scheduled sampling을 통해 설정합니다.
$$\beta=\left\{\begin{matrix}
1, &t\leq \tau*T&Grounded\ inference \\
0, &t> \tau*T &Standard\ inference
\end{matrix}\right.$$
이 때, $\tau\in[0,1]$는 0.2로 설정했으며, 이는 앞선 20%의 step에서는 학습된 gated self-attention을 사용하지만, 뒤에서는 사용하지 않았다는 뜻입니다.
2. Approach
이제 본격적으로 instanceDiffusion에 대해 설명하겠습니다.
먼저 input은 아래와 같습니다. 이때 l은 i번째 instance의 location 정보를 의미합니다.
$$\begin{array}{rl}
global\ text\ caption\ :&c_g\\
per\ instance\ conditions\ :&\begin{Bmatrix}
(c_1,l_1),...,(c_n,l_n),
\end{Bmatrix}
\end{array}$$
각 instance의 location정보는 아래 설명할 바와 같이 다양한 input이 가능하며, i번째 instance에 대해 $p_i=\begin{Bmatrix}
(x_k,y_k)
\end{Bmatrix}^n_{k=1}$와 같이 point의 집합으로 표현할 수 있습니다.
각각의 location 정보마다 다른 점은 아래와 같습니다.
- single point : 점 하나로 표현 가능합니다.
- scribble : curve를 표현하기 위해 uniform하게 sample된 point의 집합으로 표현됩니다.
- bbox : top-left와 bottom-right 두개의 점으로 표현 가능합니다.
- instance mask : boundary의 polygon과 mask 내부에서 sample된 point의 집합으로 표현됩니다.
전체 구조는 아래와 같습니다. 기존 T2I모델은 freeze한 뒤, 학습이 가능한 UniFusion block과 ScaleU block을 추가해 학습합니다.
그럼 UniFusion block과 ScaleU block 그리고 기타 설명할 것들에 대해 설명보겠습니다.
a. UniFusion Block
UniFusion Block은 instance-level의 condition을 T2I모델에 제공하기 위한 block입니다.
GLIGEN과 비슷하게 self-attention과 cross-attention layer 사이에 들어갑니다.
이 때 input을 처리하는 과정은 먼저, 아래 그림과 같이 각각의 instance에 대해 각각의 tokenizer를 활용해 embedding을 만들어주어야 합니다.
위에서 설명한 point의 집합은 Fourier mapping $\gamma ()$을 통해 location embdding이 됩니다.
** Fourier features let networks learn high frequency functions in low dimensional domains (NIPS’20)
다음으로 각 instance의 text정보는 CLIP text encoder $\tau_\theta()$를 통해 encode되어 text embdding이 됩니다.
위 두 정보는 아래와 같은 식을 통해 token embedding $g_i$가 됩니다.
$$g_i=MLP([\tau_\theta(c_i),\gamma(p_i)])$$
당연히 MLP는 location format마다 다르며, 각 instance의 token embedding $g_i$는 mask, scribble, bbox, point 등 여러가지 포맷으로 표현될 수 있습니다.
하지만, location embdding이 하나의 포맷으로 표현되는 경우 아래와 같이 null token $e_i$와 binary값 s를 추가해 해당 embedding format이 존재하는지에 대한 정보를 제공할 수 있습니다.
$$g_i=MLP([\tau_\theta(c_i),\ s\cdot \gamma(p_i)+(1-s)\cdot e_i])$$
------------------------------------------------------------------------------------------------
<instance mask condition에는 binary instance mask 추가>
기존에 ControlNet이나 Gligen에서는 semantic segmentation mask를 64x64로 resize해 추가적인 input latent 채널에 concat해주는 방법을 활용했습니다.
하지만 이 같은 방법을 본논문에서 instance mask condition의 align을 잘 맞춰주기 위해 활용했을 때는 아래와 같은 단점이 있었다고 합니다.
- occlusion ratio가 높을 때, occlusion 대상이 같은 semantic 정보를 가지는 경우는 모델의 성능이 compromised(굽혀지는)되는 경향이 있습니다.
- 작은 object에 대해 high-quality성능을 내는 것이 어렵습니다.
따라서 본 논문의 instance mask condition의 align을 잘 맞춰주기 위해, binary instance mask를 각각의 mask instance embedding에 concat해 주었습니다.
즉, binary instance mask(NxHW)를 512x512로 resize한 후, ConvNext를 활용해 16x16으로 만들어준 뒤 flatten해 $g^{mask}_i$ 뒤에 concat해주었습니다.
이 기법은 선택적으로 진행되었다고 합니다.
------------------------------------------------------------------------------------------------
이제 만들어진 다양한 포맷의 token embdding은 self-attention의 input인 visual token V와 함께 $[V,G^{mask}, G^{scribble}, G^{box}, G^{point}]$와 같이 instance condition token으로 표현됩니다.
다음으로, 위 instance condition token은 Instance-Masked Attention을 통해 처리됩니다.
위 Attention은 아래와 같은 두가지 구조가 고려됩니다.
- Format-aware (Default) : 각각의 location에 대한 정보가 concat된 뒤, masked self-attention에 독립적인 방식으로 활용됩니다.
- Joint format : 각각의 location에 대한 정보가 concat된 뒤, MLP를 통한 하나의 single embedding으로 masked self-attention에 활용합니다.
위에서 Joint format fusion이 optimal하지 않은 이유는 layout condition마다 다른 접근이 필요해서라고 합니다.
- point, scribble : Grounding 정보를 인접한 visual token에 퍼트릴 필요가 있습니다.
- bbox, mask : Grounding 정보를 퍼트리는 것이 아닌, 해당 mask내부로 제한해 넣어주어야 합니다.
또한 Attention에 masking을 활용하는 이유는, instance 간의 정보가 leakage하는 것을 방지 하기 위함이며, 아래 식과 같이 진행됩니다.
$$\tilde{V}=SA_{mask}([V,G^{mask}, G^{scribble}, G^{box}, G^{point}])$$
Masking은 아래 두가지 경우에 대해 -inf를 줍니다.
- visual token 간 diagonal이 아닌 경우 (본인 자신이 아닌 경우) : "본인에 대해서만 정보를 반영하겠다!"
- visual token이 해당 instance의 영역에 포함되지 않는 경우 : "각각의 instance에 해당하는 정보만 반영하겠다!"
이제 아래 식&그림과 같이 Gated-Addition을 통해 합쳐집니다.
** $\omega$ : 학습가능한 파라미터
** $SA_{mask}(\tilde{V}[:m])$ : masking이 되지 않은 영역을 처리하는 것을 의미
$$V=V+tanh(\omega)SA_{mask}(\tilde{V}[:m])$$
b. ScaleU Block
ScaleU Block은 이미지의 fidelity를 올리기 위한 block으로, FreeU라는 논문에서 활용한 방법을 응용하기 위한 방법입니다.
기존에 FreeU에서는 main feature map인 $F_b$가 denoising에 ciritical한 반면, skip-connection의 feature $F_s$는 high-frequency 정보를 주로 다룬다는 것을 확인했습니다.
하지만 이런 차이가 있는 정보를 단순히 concat한다면, main feature의 무시할 수 없는 semantic content를 해칠 수 있어 channel-independent하며, emprically-tuned된 파라미터를 활용합니다.
이를 통해 main feature를 증진시키면서도 skip-feature의 low-frequency요소를 감소시키는 방법으로 FreeU를 제안했습니다.
** FreeU에 대해 궁금하신 분들은 아래 더보기를 참조하세요
-----------------------------------------------------------------------
<FreeU>
** FreeU: Free Lunch in Diffusion U-Net (CVPR'24)
아래 그림과 같이, 기존의 Stable Diffusion의 이상한 이미지 디테일을 생성하는 것에 대한 것을 보완하기 위해 생성의 Quality를 올려주는 UNet을 추가적인 fine-tuning 등의 학습 없이 가능하도록 제안한 논문입니다.
** 이미 diffusers(https://huggingface.co/docs/diffusers/using-diffusers/freeu)에 반영되어 있습니다.
먼저 이미지 생성을 하는 UNet을 학습할 때 High-frequency와 Low-frequency의 iteration에 따른 변화 특징은 아래와 같습니다.
- Low-frequency
- 아래 그림과 같이 학습에 따라 부드러운 변화가 있습니다.
- layout 등 global structure와 이미지의 색감 같은 중요한 특징을 가지고 있습니다.
- 빠른 변화는 이미지의 기본적인 본질을 깨트릴 수 있습니다.
- High-frequency
- 학습에 따라 확연한 변화가 있는 것을 볼 수 있습니다.
- High-frequency는 edge와 texture등 finer한 detail을 담당하고 있습니다.
- 학습에 따라 빠르게 변화하는 특징을 가지고 있어 noise에 굉장히 민감합니다.
따라서 없어서는 안될 복잡한 detail을 유지하면서도, noise를 없애는 것을 잘 해내야 합니다.
아시다시피 diffusion에 활용되는 UNet은 encoder와 decoder로 구성된 Backbone Network와 encoder와 decoder사이의 정보를 연결해주는 Skip Connections로 구성됩니다.
두 구조에 위와 같이 단순히 scaling factor b와 s를 위 그림과 같이 추가해서 실험해봤을 때의 결과를 아래 그림에서 확인할 수 있습니다.
즉, b가 클수록 quality를 증가시키며, s의 modulation에 따라 생성된 이미지의 quality에 영향을 끼치는 것을 볼 수 있습니다.
따라서, backbone과 skip connection간의 counterbalance가 중요할 것같습니다.
위 결과를 포함해 두 네트워크 사이의 특징을 정리하면 아래와 같습니다.
- Main Backbone Network feature $x_l$ (scaling factor $b_l$)
- 역할 : denoising 역량을 담당하며, 중요한 정보를 위주로 다룹니다.
- b가 클수록...
- 생성된 이미지의 fidelity나 detail 묘사 quality가 올라간다.
- high-frequency요소가 억제된다.
- constant scalar factor $b_l$을 어떻게 적용할까?
- (layer별로) 아래와 같은 식을 통해 layer별 feature map을 기반으로 값을 결정합니다.
** $\bar{x}_l$ : l번째 layer에 대해 모든 채널의 평균 backbone feature map을 의미
$\alpha_l=(b_l-1)\cdot\frac{\bar{x}_l-Min(\bar{x}_l)}{Max(\bar{x}_l)-Min(\bar{x}_l)}+1$ - (layer내 채널별로) 모든 채널에 동일한 값이 적용되는 것이 아닌, 아래 식과 같이 채널(i)의 절반에만 scaling을 적용합니다.
** 모든 채널에 동일한 값을 적용하는 경우, texture가 over-smoothing되는 현상이 일어나는데, 이는 b가 커졌을 때 high frequency 정보를 과하게 억제하기 때문이라고 합니다.
$x_{l,i}'=\left\{\begin{matrix}
x_{l,i}\odot \alpha _l&if\ i<C/2\\
x_{l,i}&otherwise
\end{matrix}\right.$
- (layer별로) 아래와 같은 식을 통해 layer별 feature map을 기반으로 값을 결정합니다.
- Skip Connections feature $h_l$ (scaling factor $s_l$)
- 역할 : high-frequency 정보를 위주로 담당하며, decoder의 정보에 영향을 많이 줍니다.
- s가 클수록...
- high-frequency 정보로 인해 decoder의 convergence를 무모하게 빠르게 진행할 수도 있습니다.
- high-frequency 정보가 skip-connection에서 영향이 많아, backbone의 역량을 attenuation(희석)할 위험이 있습니다.
- constant scaling factor $s_l$를 어떻게 적용할까?
- 전체 : Fourier domain(주파수 영역)에서 spectral한 modulation을 통해 적용합니다. 즉, skip connection의 low-frequency 정보를 선택적으로 줄여줌으로써 위에서 발생한 over-smoothing효과를 보완할 수 있다고 합니다.
- 아래와 같은 식을 통해 먼저 fourier mask $\beta _{l,i}$를 구해냅니다.
** 이때, $r_{thresh}$는 주파수 radius의 threshold입니다.
$\beta_{l,i}(r)=\left\{\begin{matrix}
s_l&if\ r<r_{thresh}\\
1&otherwise
\end{matrix}\right.$ - 그 다음 아래 식을 통해 mask를 적용해 skip feature map $h'_{l,i}$을 구합니다.
** 이때, FFT(Fast Fourier Transform), IFFT(Inverse FFT)를 활용하며, $\odot$은 element-wise multiplication을 의미합니다.
$\begin{matrix}
\mathcal{F}(h_{l,i})&=&FFT(h_{l,i})\\
\mathcal{F}'(h_{l,i})&=&\mathcal{F}(h_{l,i})\odot\beta_{l,i}\\
h'_{l,i}&=&IFFT(\mathcal{F}'(h_{l,i}))
\end{matrix}$
그럼 실제로 FreeU에서 constant scalar factor인 b와 s를 어떻게 주었을까요?
먼저 두 값의 범위는 아래와 같습니다.
$$\begin{matrix}
b1&:& 1\leq &b1\leq 1.2 \\
b2&:& 1.2 \leq &b2 \leq 1.6 \\
s1&:& &s1 \leq 1 \\
s2&:& &s2 \leq 1
\end{matrix}$$
실행할 때 default값을 보면 SDXL을 예로, 아래와 같은 값을 주었습니다.
** https://github.com/ChenyangSi/FreeU#range-for-more-parameters
- b1: 1.3
- b2: 1.4
- s1: 0.9
- s2: 0.2
이 때, s1,b1은 1280x1280에서 동작하며, ,b2,s2는 640x640에서 동작합니다.
-----------------------------------------------------------------------
본 논문에서는 FreeU를 응용해 channel-wise하며, 학습 가능한 scaling vector를 활용하는 ScaleU를 소개합니다.
이 때, main feature map인 $F_b$를 위한 vector는 $s_b$이며, skip-connection의 feature $F_s$에 대한 vector는 $s_s$입니다.
** 모두 zero-vector로 초기화됩니다.
먼저 main feature map $F_b$는 scale vector $s_b$와 channel-wise multiplication을 통해 아래와 같이 곱해집니다.
$$F'_b=F_b\otimes (tanh(s_b)+1)$$
다음으로 skip-connection feature는 먼저 아래와 같이 frequency mask $\alpha$를 만들어냅니다.
** $\odot$는 element-wise multiplication입니다.
$$\alpha(r)=\left\{\begin{matrix}
tanh(s_s)+1&if\ r<r_{thresh}\\
1&otherwise
\end{matrix}\right.$$
다음으로 mask를 활용해 FreeU와 같이 feature map을 처리합니다.
$$F'_s=IFFT(FFT(F_s)\odot\alpha)$$
결과적으로 굉장히 적은(<0.01%) 파라미터를 활용해 큰 gain을 얻을 수 있었다고 합니다.
** 위 그림의 SE-ScaleU에 대한 설명은 아래 더보기를 참조하세요.
--------------------------------------------------------------------
<ScaleU의 다른 구조>
위 그림에 나와 있듯이 SE-ScaleU의 구조를 보면 Squeeze-and-Excitation과 비슷한 방법을 활용해 MLP를 활용했습니다.
** Squeeze-and-excitation networks (CVPR’18)
즉, scaling vector가 feature의 sample에 따라 dynamic하게 생성되도록 만들어주었습니다.
하지만 ScaleU와 성능이 비슷한데 비해 추가적인 파라미터를 쓰기 때문에 ScaleU를 그냥 default로 사용한다고 합니다.
--------------------------------------------------------------------
c. Sampling & Data
다음으로 위에서 설명하지 못한 Sampling기법과 Dataset을 준비하는 과정에 대해 설명해보겠습니다.
<Multi-instance Sampler(MIS)>
앞서서 instance 간의 정보가 leakage하는 경우 것을 방지 하기 위해 attention에 masking을 활용했었다는 것을 기억하실 겁니다.
이에 추가적으로 같은 목적을 위해 Multi-instance Sampling기법을 제안합니다. 이를 활용하면 생성된 이미지의 fidelity나 quality를 또한 향상할 수 있다고 합니다.
즉, 아래 그림과 같이 여러개의 instance에 대해 한번에 denoising process를 진행하는 것이 아니라, M step(<10%)에 대해서는 n개의 instance latent $L_I$에 대해서 각각 denoising을 진행합니다.
** 이 때 각각의 instance object들은 location token과 함께 학습되므로 따로 모델을 학습해 latent정보를 만들도록 하지 않아도 됩니다..
이후에 얻어진 latent $\begin{Bmatrix}{L^1_I,...,L^n_I}\end{Bmatrix}$는 $L_G$와 함께, 합쳐져(integrate) denoised 됩니다.
** $L_G$ : 정상적으로 모든 instance와 text prompt와 함께 denoised된 latent
위에서 "integrate"를 진행할 때 아래와 같은 두가지 전략을 활용합니다.
- crop-and-paste : M step에 n개의 instance가 있을 때, 각각의 instance $L^i_I$에 instance의 location condition에 따라 crop한 뒤, 이 crop 된 것을 global denoised lantents인 $L_G$에 붙여넣어 주었습니다.
- latents averaging (Default) : M step에 n개의 instance가 있을 때, n개 instance에 대해 denoised 된 latent들을 global denoised lantents인 $L_G$와 함께 평균내주었습니다.
위에서 Latents averaing를 default로 사용했는데, 그 이유는 아래 두가지와 같습니다.
- crop-and-paste의 경우 crop하기 위해 instance latents에 해당하는 bbox나 mask를 넘겨주어야 하는데, 이는 {bbox, mask}가 아닌 {point, scribble}에 대해서는 size와 shape를 직접 넣어주어야합니다.
- 또한 overlapped instance에 대해서는, 겹치는 instance중 하나의 instance만 살린다면 overlap부분에서 blurred되거나 quality가 떨어진다고 합니다.
이제 이후부터는 $L_G$와 같이 모든 instanced token과 text prompt를 활용해 denoised 됩니다.
얼마나 적용할지에 대한 이 MIS percentage는 코드 상에서 0.36이 default로 사용되며, 실제로 0.36이하일 때 성능이 좋았다고 합니다.
** https://github.com/frank-xwang/InstanceDiffusion/blob/main/inference.py
아래 그림은 UniFusion의 효과만을 확인하기 위해 timestep의 몇 %만(10%~75%) 적용해 instance에 대해 얼마나 잘 생성하는지를 확인한 결과입니다. 실제로 더 많이 적용할수록 condition에 더욱 dependent하게 생성되는 것을 확인할 수 있습니다.
<Dataset Preparation>
이런 instance별로 condition을 주기 위해서는 많은 (instance,image) pair의 데이터셋을 얻는것이 어려우므로, 자동으로 instance-level location과 caption을 얻기 위해 아래와 같이 진행합니다.
- 강력한 open-vacabulary image tagging 모델인 RAM을 활용해 image-level로 tagging을 진행합니다.
** Recognize anything: A strong image tagging model (arxiv’23) - Grounded-SAM을 활용해 앞서 얻은 tag에 맞는 bbox와 mask를 instance-level로 얻어냅니다.
** Segment anything (arxiv’23)
** Grounding dino: Marrying dino with grounded pre-training for open-set object detection (arxiv’23) - 위에서 얻은 instance들을 crop한 뒤, BLIP-v2를 활용해 해당 instance에 대해 다시 caption을 진행합니다.
** BLIP-2: bootstrapping language-image pre-training with frozen image encoders and large language models (ICML’23)
위의 과정을 통해 instance-level의 bbox, mask, caption을 얻어냈는데, 추가적으로 다른 condition에 대해서는 아래와 같이 진행합니다.
- scribble : mask내에서 랜덤하게 sampling을 통해 point를 뽑아냅니다.
- single-point : 아래 그림과 같이 bbox의 center를 원의 중심으로 중심으로부터 $0.1\cdot r$거리 내에서 point를 랜덤하게 sampling합니다.
이 때 GLIGEN과 성능을 비교하기 위해, GLIGEN과 비슷한 수의 이미지(5M)를 licensed dataset으로부터 만들었다고 합니다.
마지막으로, benchmark를 위한 Test-set은 아래와 같으며, train dataset을 하나도 사용하지 않음으로써 zero-shot 평가가 가능하도록 했다고 합니다.
- COCO-val : 80classes, bbox, instance masks
- LVIS(Large Vocabulary Instance Segmentation) : 1200↑ classes, instance masks
- COCO-val : 한 이미지당 ~2개의 object를 선택해 250개의 샘플을 만들어냈습니다, bbox
3. Results
이제 실험결과에 대해 살펴보겠습니다.
a. Setting
결과를 설명하기에 앞서, 디테일한 실험 셋팅에 대해 간단히 보입니다.
<Training>
hyper-parameter는 아래와 같이 GLIGEN과 비슷하게 셋팅했다고 합니다.
- batch size : 512
- iterations : 100K
- Optimizer : Adam
- Learning Rate
- ~5000 steps : 0.0001 (Warm up)
- 5000~ steps : 0.0001
- decay factor 0.99의 EMA를 활용해 모델 파라미터를 업데이트했으며, inference때는 역시 EMA모델을 활용합니다.
- 학습시에 10%에 대해서는, 모든 condition을 null token으로 넣어 CFG를 가능하도록 했습니다.
- 학습시 64개의 A100 GPU를 사용했습니다.
** EMA에 대해 궁금하신 분들은 아래 더보기를 참조하세요.
---------------------------------------------------------------
<EMA(Exponential Moving Average)>
EMA는 기존 모델 weight의 moving average을 유지하는 weight 및 방법으로, Stable Diffusion 2에서 사용되었습니다.
각각의 time step에서 EMA 모델을 업데이트하는 경우를 예로 들면, decay factor(smoothing) 0.99인 경우, (0.99의 current EMA 모델 + 0.01의 새로운 weight)로 EMA모델을 업데이트 해 줍니다.
$$W^{t+1}_{ema\ model}=smoothing\cdot w^t_{ema\ model}+(1-smoothing)\cdot w^t_{model}$$
하지만 위와 같이 모든 weight를 Read/Write해야하므로 많은 메모리 operation 때문에 느려질 위험이 있습니다.
하지만 이런 EMA모델을 활용하는 방법에서 최종 결과에 영향을 미치는건 최종 몇 step뿐이므로, 학습이 끝나기 전 몇 %만(~3.5%~) EMA를 적용하기도 합니다.
EMA모델은 아래와 같은 두가지 장점을 가집니다.
- (학습시) 모델의 Generalization을 향상시키며, 학습이 안정화됩니다.
- (생성시) 역시나 Generalization이 더 잘되어있고 안정적이며, 일반적인 파라미터보다 성능이 조금 더 좋은 것으로 알려져있습니다.
이때 저장된 결과 weight를 EMA weight라고 부르며 아래와 같이 일반적인 weight와 다릅니다.
- sd-v1-4.ckpt : 파라미터가 저장되어있으며, fine-tuning 등 학습시에 필요합니다.
- sd-v1-4-full-ema.ckpt : 파라미터의 running average가 저장되어있으며, inference시에 안정적인 결과를 냅니다.
---------------------------------------------------------------
<Evaluation>
다양한 condition에 대해 평가를 위한 방법도 중요할 것입니다. 각각의 condition에 대해 측정하는 방법은 아래와 같습니다.
- object의 location alignment를 측정
- Bbox : YOLO score를 활용합니다. 즉, pretrained YOLOv8m-Det을 활용해 생성된 이미지에서 detection한 뒤, input bbox를 활용해 AP&AR을 측정합니다.
- Instance mask : YOLOv8m-Seg를 활용해 생성된 이미지를 segment한 뒤, input mask와의 IoU&AP&AR을 측정합니다.
- Scribble: 새로운 evaluation metric으로 PiM(Points in Mask)를 제안합니다. 즉, YOLOv8m-Seg를 활용해 mask를 얻은 뒤, mask 내에 input scribble이 얼마나 포함되는지를 측정합니다.
- Single-point : scribble과 비슷하게 측정하며 0또는 1이 나옵니다. 이후에 PiM score를 평균내 측정합니다.
- object의 prompt alignment를 측정
- 복합적인 Attribute : instance의 color&texture의 정보가 instance prompt와 얼마나 일치하는지를 측정합니다. 즉,
먼저 YOLOv8-Det을 활용해 bbox를 얻어낸 뒤, 해당 bbox를 CLIP에 넣어 attribute를 얻어내고 instance의 prompt와 비교합니다.
** color : 8가지 색 사용 (black, white,red,green, yellow, blue, pink, purple)
** texture : 8가지 재질 사용 (rubber, fluffy, metallic, wooden, plastic, fabric, leather, glass - instance 이미지와 instance prompt의 alignment : crop된 instance 이미지와 instance text간의 거리를 CLIP-score를 통해 측정합니다
- 전체 이미지와 전체 prompt의 alignment : 전체 이미지와 prompt간의 거리를 CLIP-score를 통해 측정합니다.
- 복합적인 Attribute : instance의 color&texture의 정보가 instance prompt와 얼마나 일치하는지를 측정합니다. 즉,
- Human Evaluation
- instance-level에서의 fidelity : 선택된 250개의 sample 중, 제공된 caption 및 layout과 가장 비슷한 것을 고르라고 요청해 측정합니다.
- 전체 이미지에서의 fidelity : 위와 같습니다.
b. Results : Comparison with prior work
기존의 prior work와 비교한 결과를 순서대로 설명합니다.
1. Single location format
아래 표에는, 다양한 location format에 대해 생성된 이미지의 성능을 COCO-val데이터셋으로 다른 논문과 비교해 나타냈습니다.
** upper bound를 나타내기 위해, 위에서 보인 다양한 evaluation metric을 실제 이미지에 적용해 표시했습니다.
각각의 성능에 대한 결과는 아래와 같습니다.
- Box input : 이전 SOTA인 GLIGEN보다 성능이 좋다고 합니다.
** " * " 문자는 GLIGEN에서 YOLO-v4를 활용한 것과 다르게 YOLOv8을 활용해 측정한 것입니다.
** Hybrid는 instance mask를 추가 condition으로 선택적으로 줬을 때의 결과입니다. - Instance mask input : SOTA인 DenseDiffusion보다 성능이 좋다고 합니다.
** $\ddagger $ 문자가 붙은 ControlNet과 SpaText는 instance가 구분되지 않은 Semantic segmentation만을 input으로 받으므로, image2image generation pipeline을 통해 나온 mask로 측정했습니다. - Points and Scribble : prior study가 없지만 새로운 metric을 통해 평가할 수 있었다고 합니다.
** $\dagger $ 문자의 경우, GLIGEN을 scribble-based에 활용한 것으로 top-right와 bottom-left 코너를 활용한 bbox에 포함되는 scribble을 측정해 결과를 냈습니다.
2. Attribute binding
color & texture를 평가한 결과 GLIGEN에서는 굉장히 challenging했지만 instanceDiffusion에서는 아래 표와 같이 성능이 좋았다고 합니다.
또한 Human Evaluation으로도 quality나 controlability가 더 좋았다고 합니다.
3. Challenging box inputs
아래 표와 같이 class나 object가 많은 LVIS 데이터셋을 활용해 측정한 결과도 아래와 같이 GLIGEN보다 좋았는데, 특히 object 사이즈가 큰 곳에서 더 좋은 결과를 냈다고 합니다.
4. Multiple location formats
여러개의 location을 condition으로 줬을 때의 결과는 아래 표와 같습니다. 결과적으로는 모든 포맷을 다 주어졌을 때 가장 정확한 control이 가능해 성능이 좋았다고 합니다.
여러개 location format을 활용했을 때의 경우, 더 많은 condition일 수록 좋은 결과가 나오기는 하지만 instance mask나 scribble을 활용할 때 더욱 성능이 좋아졌다고 합니다.
즉, 이는 아래와 같이 기존의 format을 활용해 다른 format을 유추가능하기 때문입니다.
- box → central point
- mask → box ,central point
예를 들어 mask로부터 box와 central point를 추출가능하기 때문에, 따로 추가적인 input condition을 굳이 필요하지 않습니다.
5. Qualitative results
정성적인 결과는 아래와 같습니다.
instanceDiffusion과 GLIGEN을 비교하면, GLIGEN은 가끔 잘못된 color 등 잘못 instance를 생성하는 경향이 있었습니다.
또한 두개의 새가 생성되는 등, 본 논문에서 우려했던 instance간 ‘information leakage” 문제가 드러나는 것을 볼 수 있습니다.
c. Results : Ablation Study
다양한 Ablation Study를 보입니다.
먼저, 아래 표와 같이 COCO-val 데이터셋을 활용해 mask, box, point의 정보를 사용해 평가할 때, 전체적으로 ablation study를 진행했습니다.
- ScaleU : (a)에서 localization AP가 향상되는 것을 보아, ScaleU가 학습 가능한 파라미터를 사용함으로써 성능이 향상되는 것을 볼 수 있습니다.
- binary instance mask : (b)를 보아 사용했을 때 성능이 좋습니다.
- masked-conditioned input : instance mask condition에 대한 다양한 실험을 진행합니다.
- (c)를 보아 polgygon형태의 boundary와 내부 모두 활용할 때 성능이 좋았습니다.
- (d)를 보아 mask의 input point를 sampling할 때 128개를 사용할 때가 가장 성능이 좋았습니다.
각각 component를 사용하는 것에 대해 ablation 결과는 아래와 같습니다.
** FA Fusion : 체크된 경우 Format Aware 구조를 선택하며, 체크되지 않은 경우 Joint format fusion구조를 활용합니다.
다음 표는 Multi-instance Sampler에서 전체 denoising step에서 몇 %가 적용되었을 때 성능이 가장 좋아하는지를 나타낸 표입니다.
위에서 언급한 바와 같이 36%이하일 때 가장 성능이 좋았다고 합니다.
다음으로, MIS를 GLIGEN에 적용했을 때의 결과를 나타냅니다.
실제로 GLIGEN에 적용하니, Attribute Binding효과가 좋아지는 것을 볼 수 있습니다. 즉, 위에서 언급한 information leakage효과를 줄일 수 있는 것을 확인할 수 있습니다.
다음으로 아래와 같이 UniFusion의 hyper-parameter관련한 실험 결과입니다.
UniFusion block에서는 2D point 정보에 대해 Fourier mapping을 진행하는데, 이때 frequency bandwidth가 클수록 성능이 향상하는 경향이 있었지만 결국 plateau(평지)에 도달한다고 합니다.
** 앞서 설명한 바와 같이 Fourier transform을 하는 이유는 high frequency function을 통해 MLP의 성능을 올리기 위함입니다.
또한 Unifusion block의 MLP layer의 dimension(N)의 효율성과 사이즈 사이에서 optimal한 밸런스는 3072라고 합니다.
마지막으로 아래 그림과 같이 instanceDiffusion은 user가 선택적으로 object의 정확한 위치를 제공하는 반면, 생성된 object의 결합도 자연스럽도록 생성할 수 있는 application을 구축할 수 있게 되었습니다.