스테이블 디퓨전으로 인물 이미지를 주로 생성하시는 분들께는 종종 등장하는 기괴한 손이 항상 골치덩어리입니다. 때문에 전세계 여러 유저들이 다양한 방법으로 손 보정 기술을 개선해 최근에 이르러서는 꽤 그럴듯한 보정이 가능해졌습니다. 본문에서는 컨트롤넷을 활용한 대표적인 손 보정 기술 중 하나로 Inpaint-Depth를 기반으로 한 HandRefiner에 대해 살펴보도록 하겠습니다.
Mesh Graphormer 손 보정(Hand Refiner) 방법
인물 사진의 손 부분을 자동으로 감지하고, 손가락 개수가 부족하거나 이상할 때, 이를 5개 정상적인 손가락을 가진 손 모양의 뎁스맵을 적용해, 해당 부위만 인페인트를 진행할 수 있도록 해주는 기술입니다.
모델 다운로드
먼저 해당 기술을 사용해 손 보정을 하려면 아래의 HandRefiner 컨트롤넷 모델을 다운로드 받아야 합니다.
추가적으로 ComfyUI에서 전처리를 진행하기 위해, 아래의 ComfyUI’s ControlNet Auxillary Preprocessors 커스텀 노드도 설치해주셔야 합니다.
ComfyUI 커스텀 노드 설치에 대해 익숙하지 않은 분들은 아래 글을 참고해 ComfyUI Manager 및 커스텀 노드 설치를 진행해주시기 바랍니다.
워크플로우 구성 및 손 보정 결과
Hand refiner를 활용해 손 보정을 하기 위한 워크플로우 구성은 생각보다 매우 간단합니다. 여느 컨트롤넷 워크플로우를 구성하는 것과 동일하기 때문에 어려울 것이 없습니다. 단, 인페인트를 진행해야 하므로, 컨트롤넷을 인페인트 워크플로우 중간에 끼워넣는 다는 개념으로 이해할 수 있습니다. 아래는 Hand refiner 기능을 구현한 예시 워크플로우입니다.
우선, 위 예시 워크플로우에서 노드 구성을 간단히 살펴보면, 컨트롤넷을 직접적으로 구동하는 노드는 12, 13, 15번 노드로, 각각 다음과 같습니다.
- 12번 Apply ControlNet : 컨트롤넷 적용 노드
- 13번 MechGraphormer Hand Refiner : 원본이미지에서 인물의 손을 감지하고, 이를 기준으로 뎁스 및 마스크 정보를 생성
- 15번 Load ControlNet Model : 컨트롤넷 손 보정 모델 로드
그 외 14번 및 22번 노드는 각각 감지된 손을 수정한 뎁스맵과 손의 영역을 마스킹한 마스크 이미지를 보여주고 있습니다. 20번 노드는 원본 이미지의 손 부분만 인페인트를 진행하여 실질적인 손 보정을 하기 위해 사용하는 인페인트용 VAE 인코더입니다. MeshGraphormer Hand Refiner 노드에서 생성된 인물의 손위치 마스크를 해당 노드에 함께 전달해줘야 합니다.
예시 이미지에서도 로딩한 이미지와 결과 이미지에서 이미 확인되지만, 다시한 번 이미지만 놓고 비교해보자면, 위 워크플로우를 구동해 얻은 손 보정 결과는 다음과 같습니다.
원본 이미지는 SD1.5 모델로 512×768 해상도에서 생성한 일반적인 인물 이미지입니다. 손의 형상을 제대로 드러내 테스트를 하기 위해 프롬프트에는 일부러 waving hand를 작성했으며, 이 때문에 한 손을 펼쳐 보이고 있는 모습입니다. 다만, 손가락이 총 4개로 약지 하나가 비는 모습인데요, 위에서 구성한 워크플로우를 따라 컨트롤넷이 알아서 손의 위치와, 손가락의 개수를 파악하고, 모자란 약지를 채워넣은 새로운 손 모양의 뎁스맵을 생성해준 것을 볼 수 있습니다.
장점 및 한계
사용자가 따로 정상적인 손의 뎁스 맵을 준비한 뒤, 원본 사진의 손 전체를 마스킹하고, 인페인트를 적용하는 과정을 거치면 유사한 결과 이미지를 얻을 수 있는데요, 이를 하나하나 직접 하는 수고를 하지 않아도, 알아서 컨트롤넷이 모든 것을 케어해주기때문에 굉장히 편리합니다.
실제로 이 기술이 발표되기 전까지는 많은 분들이 인물 이미지의 손이 정상적으로 생성되지 않는 문제를 해결하기 위해, 다양한 각도, 다양한 포즈의 손 예시 이미지를 구해 일일이 직접 인페인트를 진행하는 등의 노력을 해왔기 때문에, Hand Refiner는 더더욱 그 사용 가치가 있습니다.
하지만, hand refiner만으로는 극복이 되지 않는 경우도 자주 발생하는데요, 위 예시와 같이 이미지 중 인물의 손이 차지하는 비율이 꽤 될때는 꽤 그럴듯하게 동작하지만, 손이 크게 보이지 않거나, 정면을 향하지 않고 각도가 틀어진 경우 등에는 손 보정 자체가 동작을 하지 않거나, 보정을 하더라도 이상한 이미지가 생성되기도 합니다.
위 예시 이미지는 똑같은 워크플로우를 적용해 인물의 손 보정 작업을 진행한 결과를 보여주고 있습니다. 그런데 원본 이미지의 손이 오히려 보정된 이미지보다 더 자연스러워 보입니다. 물론 원본 이미지 자체가 이미 손가락이 정상적으로 5개 그려진 이미지이긴 하지만, 자세히 보면 손가락의 비율이나, 왼손의 엄지와 검지 사이 어설프게 손가락이 하나 더 생길것만 같은 처리 등으로 부자연스러움이 보입니다.
이를 보정하기 위해 Hand Refiner를 적용해 그럴듯한 손 모양의 댑스맵이 적용되었지만, 보정 결과손의 형상은 색감과 형태 등 오히려 원본보다 더 이상합니다. 이처럼 Hand Refiner자체가 완성형 기술은 아니기 때문에, 필요한 경우 선택적으로 적용해보고, 그 결과를 적용 전후로 비교해보는 것이 좋습니다.
본문의 첫 예시처럼 아예 손가락의 개수가 4개라든지, 완전 기형으로 생성된 손이라면, 먼저 Hand Refiner를 통해 손 보정을 진행하여 손가락 개수를 5개로 만들고, 필요하다면 추가로 다시 손 보정을 진행하거나 수작업으로 이미지 편집 프로그램 등에서 리터칭하여 완성도를 끌어올리는 것이 좋겠습니다.