Search
Duplicate

시각적 이해를 위한 머신러닝/ Generative Models III (GAN, NeRF)

Image Translation은 style이 다른 이미지를 생성해 내는 것.
StyleGAN은 여러 style 변환을 만들려면 그 변환 마다 학습을 따로 해줘야 하는 문제가 있음. 그걸 하나로 합친게 StarGAN
하나의 모델에 Style을 다 학습 시켜 놓고, 그걸로 다양한 Style 변환이 가능하도록 함.
Adversarial Loss와 Reconstruction Loss는 CycleGAN과 유사한데, 진짜 이미지가 들어왔을때 domain도 분류해주는 loss가 추가됨
Adversarial Loss, Reconstruction Loss는 CycleGAN과 같음.
추가로 진짜 이미지일 때는 domain class를 맞추는 loss가 추가되고, 가짜 이미지일 때는 가짜 이미지라는 것을 맞춰야 함.
이미지가 제대로 나왔는지만 보는 것에 class까지 맞추도록 함.
Dataset에 따라 설정하는 속성이 다름. 다만 다른 데이터셋이라도 속성의 길이는 동일하게 맞춤.
Mask vector에서 어떤 데이터셋을 사용하는지를 지정해 줌.
그 외는 CycleGAN과 비슷하게 동작함. Generator가 style 변환 했다가 원복. 그리고 Discriminator가 가짜인지 진짜인지 맞추게 함.
사례
GAN은 해석 가능성이 없음. black box
GAN의 결과에 대해 control 가능하게 하는게 목표
포즈를 지정한다거나, 헤어 스타일을 지정한다거나 등
Discriminator는 그대로 쓰고 Generator만 바꿈.
generator는 대체로 위와 같이 생김.
z 값에 대해 normalize 한 후에 fully-connected, conv를 거쳐서 upsample해서 사이즈를 키워나감.
z 값을 처음 설정한 이후에는 control이 안되기 때문에 중간에 어떤 설정을 할 수 있게 하는게 아이디어.
style을 주입하기 위해 각 단계 사이에 AdlN이라는 것을 넣어 줌.
AdalN은 입력에 대해 normalize(평균을 빼고 분산을 나눔) 한 후에 원하는 scale과 bias을 추가해 줌.
y를 학습 가능하게 하기 위해 affine transformation을 사용 함.
y가 학습 가능하지 않으면 그냥 하이퍼 파라미터가 됨. 사람이 그걸 정해줄 수는 없으니 데이터로부터 배울 수 있게 해줘야 함.
2개의 벡터가 있다고 할 때
Linear Combination은 그냥 선형 결합 → 공간 상의 모든 점을 표현할 수 있음
Affine Combination은 결합 할 때 weight의 합이 1이어야 한다는 조건 → 두 벡터를 지나는 직선 위에 존재하게 됨.
Convex Combination은 Affine Combination에 대해 weight가 모두 0이상 이어야 한다는 조건 → 두 벡터 사이에 존재하게 됨
Adalh에 넣는 style y에 z를 Affine Transformation한 값을 사용 함.
최종적으로 style y를 z가 통제하도록 함.
z는 결국 데이터로부터 배우는 값인데, 데이터로부터 특성을 분리하는게 쉽지 않음.
예컨대 데이터에 머리가 긴 남자가 많지 않기 때문에, 마치 머리 길이가 성별을 결정하는 요인으로 학습해 버릴 수 있음.
disentangle을 위해 z를 그대로 사용하지 않고, fully-connected를 통과 시켜서 —8개 사용함— w를 만들고 그 w로 style을 통제하게 함.
그렇게 함으로써 z가 이미지를 만들지 않고, 초기에 상수를 줘서 만들고, w로 스타일을 제어하게 함.
마지막으로 noise를 중간에 추가해서 매번 같은 이미지가 나오지 않게 함.
현실에서 수집한 데이터 (a) 자체가 불균일하기 때문에 그걸 그냥 학습 하면 (b) 실제 데이터를 제대로 반영하지 못함.
그래서 fully-connected를 쭉 쌓아서, w를 만들어내면 (c) 처럼 데이터를 제대로 반영할 수 있게 됨.
사례. 어느 단계에서 style을 적용하느냐에 따라 style이 바뀌는 정도가 달라짐.
앞단에서 바꾸면 전체적으로 style이 달라지는 반면, 뒷단에서 바꾸면 조금만 바뀜.
NeRF는 3D를 만드는 모델
같은 씬은 여러 곳에서 본 이미지가 들어오는데, 그걸 이용해서 3D를 만들어 냄.
시간 정보와 공간 정보를 분리 시켜서 같은 시간에 여러 방향에서 본 이미지를 만들어 줌.
3D를 voxel로 표현할 수 있음. (x, y, z)에 color가 추가 됨.
이러면 데이터가 너무 많음.
MRI 같은 것에서는 사용 함.
컴퓨터 animation에서는 빠른 처리가 중요해서 모든 점을 표현하지 않고 triangle로 표현 함.
또는 level set으로 등고선 형태로 표현할 수도 있음.
NeRF는 voxel 값을 예측하는 모델.
3차원 공간에서 여러 방향에서 이미지를 찍고, 그걸 모아서 MLP 돌려 주는게 NeRF
이미지와 어느 방향에서 찍은 것인지도 같이 input으로 넣어 줌.
NeRF는 x, d를 input으로 받음
x는 (x,y,z)(x, y, z)
d는 (θ,ϕ)(\theta, \phi)
그렇게 받아서 output은 color cc와 volume density σ\sigma 값을 출력 함
σ\sigma는 물체가 있는지 빈공간인지를 나타 냄.
여러 장의 이미지로부터 3d를 reconstruct 함.
각 카메라에서 ray를 쏘고, 그 방향으로 적분하는데, 순서대로 적분하고, 불투명한 것이 나오면 그 색을 사용 함.
카메라 좌표 oo에서 dd방향으로 ray를 쏨. tt는 벡터를 만들기 위한 상수
tnt_n부터 trt_r 까지 모든 tt에 대해 물체가 존재하는 영역에 대해 위 수식대로 적분함.
카메라 앞에 있는 것을 써야하기 때문에 앞에 있는 점에 대해 더 가중을 두는 방식으로 함. 그걸 위해 weight 2를 사용.
그렇게 최종적으로 구해진 값을 실제 값과 비교해서 loss를 줌.
사례. 실제 잘 되더라
3D인데다 연산도 비싸기 때문에 너무 느림. 그걸 개선한 모델이 mip-NeRF
NeRF와 달리 3D Cone을 쏴서 학습 함
제대로 된 3D를 구성하려면 이미지가 많이 필요함. 사진이 적으면 가려지는 부분이 많음.
3장 가지고 돌렸더니 다 깨지더라.
이미지가 몇 장 없을 때도 쓸 수 있게 한게 RegNeRF
color와 geometry가 인접한 것들은 같은 물체라는 가정으로 함.
이미지가 몇 장 없을 때 geometry를 regularization 하자는 아이디어
표면이 flat 하다는 가정으로 patch 기준으로 잘라서 regularization을 수행함.
color도 비슷하다는 가정으로 loss 줌.
기존의 Reconstruction loss에 Geometry와 color loss를 추가함.
NeRF에서 빈 공간에 대해 적분하면 학습이 잘 안되서 문제가 됨.
사람들이 사진 찍을 때는 보통 물체를 중심에 두고 찍는다는 가정으로 중심을 주로 sampling 함.
사례
이미지가 적더라도 기존 것들보다 잘 된다.
기존 모델들보다 정량적인 성능도 좋았다.
표면이 flat 하지 않은 것들은 한계가 있음.