길가다 그냥 문뜩 이런 생각이 들었습니다.
'현실에서 AI 캐릭터를 만나면 어떤 느낌일까?'
그래서 합성을 해 보았습니다.
적당한 실사 배경을 준비합니다.
오래된 디즈니 영화 "Who Framed Roger Rabbit"과 같이 실사 캐릭터와 투샷을 찍을 수 있다는 두근거림에 이끌려 저는 실제 사진으로 갔습니다. "이 장소가 아니면 안돼"라는 강한 취향이 없다면, 체크포인트로 생성한 배경으로 해도 상관 없을 것 같습니다.
들어갈 2D 캐릭터를 준비합니다.
1girl, standing, flat_background
"flat_background"를 넣어주면 그나마 배경을 지우기 편한 그림으로 그려주는 것 같습니다.
Rembg를 사용해 배경을 지운 결과입니다.
이 툴 역시 완벽하지 않습니다. 특히 옷이나 머리카락이 반투명으로 배경에 섞여버린 경우는 잘 안지워집니다. 몇가지 알고리즘을 시험해보고 그중에 제일 나은걸로 골라봅니다.
외부 이미지 편집 툴로 두 그림을 합쳐줍니다. 저는 GIMP를 사용해서 적당히 배치해보았습니다.
여러가지 실험해 본 결과, 이렇게 외부 이미지 편집 툴을 사용하는게 가장 만족스러운 결과를 얻을 수 있었습니다.
아래부터 삽질기입니다. 좀 더 간편하게 SD만을 사용해서 합성하는 방법은 없을까 실험해보았습니다.
Inpaint를 잘 사용하면 왠지 배경과 캐릭터를 합칠 수 있을 것 같다는 느낌이 들었습니다.
Rembg에서 "Return mask"를 체크하면 마스크를 따로 저장할 수 있습니다.
Inpaint upload를 사용해 배경을 넣고 Rembg에서 따온 마스크를 사용해 캐릭터만 다시 그려주도록(Inpaint masked) 합니다.
Mask blur를 사용하면 캐릭터와 배경 사이의 경계를 좀 뭉게줍니다. 다만, 2D와 실사의 벽을 넘을 정도의 수준은 안됩니다.
Seed는 원래 그림의 seed를 재사용하면 비슷한 색깔로 나오긴 합니다만 완벽하게 동일하지는 않습니다.
2D캐릭터 이미지는 아래처럼 ControlNet의 canny를 통해서 넘겨줍니다.
원본 그림과 동일한 seed를 사용한 결과
랜덤한 seed를 사용한 결과
Ultimate SD upscale의 inpaint 효과로 경계를 합쳐보는 방법도 시도해봤습니다만, 배경 이미지가 2D쪽 페인팅에 끌려가 실사의 질감과 디테일이 뭉게지는 단점이 있어 역시 만족스럽지 않았습니다.
물론 이와같은 경계면 문제는 img2img에서 마스크를 사용하지 않으면 해결이 됩니다. 다만 그렇게 되면, 실사와의 합성이 아닌 아래와 같은 어중간한 결과물이 나오게 됩니다.
Denoising strength 0.5를 경계로, 이보다 작아지면 캐릭터가, 강해지면 배경이 사라져버립니다.
다른 extension을 사용하면 좀 더 나은 결과를 얻을 수 있을지 모르겠습니다만, 아직까지는 GIMP나 포토샵과 같은 외부 이미지 편집 툴로 합성하는 방법이 가장 좋아보입니다.