Adetailer, DDetailer에서 dilation 값이 미치는 영향을 확인해봤습니다.
세팅에서 inpaint 중간 생성이미지 저장하기
DDetailer, ADetailer는 얼굴 바운딩박스를 찾아서 마스크를 만들어 얼굴 이미지만 추출해 캔버스에 맞게 확대하여 다시 얼굴을 그린 후에 다시 resize 해서 새로 보정된 얼굴을 가져다 붙여주는 확장/스크립트 입니다.
그 과정에 inpaint process를 거치게 되는데 이 중간 생성 이미지를 저장하는 옵션이 있습니다. 이걸 활성화시키면 어떤 과정인지 확인이 가능합니다.
- Settings에서, 맨 상단의 Saving images/grids 선택하여
- [체크] For inpainting, save a copy of the greyscale mask
- [체크] For inpainting, save a masked composite Quality for saved jpeg images
- [체크] Save init images when using img2img Directory for temporary images; leave empty for default (명칭은 이러하지만, 디테일러 사용시 img2img 방식을 내부적으로 쓰기때문에 체크해줘서, 중간에 생성되는 마스크를 저장합니다.
그 결과입니다. (ADetailer를 사용하면 파라메터가 중간단계 이미지에도 저장되기때문에 ADetailer를 주로 사용하였습니다. 아래 스샷은 ADetailer / DDetailer 결과물이 혼재되었을 수 있습니다)
※ ADetailer 사용하시는 분이라면, 여기서 ADetailer 최신판을 사용해야 dilation이 적용됩니다.
생성 이미지 원본: (디테일러보정받기 전 이미지 즉, init_image 저장 설정 옵션이 활성화 되어있을 경우 저장됨)
마스크: dilation 값이 큰 경우 (80 가까운 값으로 줌. 바운딩 박스가 큽니다.) 마스크 및 composite 이미지는 이미지 저장위치에 저장됩니다.
마스크: dilation 값이 0인경우.
(dilation 값이 4정도 줬어도 그에 의해 초기화되는 커널 크기가 4x4 매트릭스에 의해 생성되는 마스크가 조금 더 큽니다.)
이에 대한 원본 이미지에 마스크된 각각의 composite 이미지,
dilation 값이 큰 경우. 얼굴 범위가 넓고, 눈동자가 초롱초롱
dilation 값이 0인 경우. 얼굴 범위가 좁고, 눈동자가 약간 흐리멍텅
여기서 결과물은 ADetailer이나, DDetailer에서 dilation이 0이면, 여전히 눈동자가 초롱초롱. dilation값이 30 이상이면 과도하게 처리된 이미지가 생성됩니다. dilation값에 의한 커널 생성 방식에 차이가 있음을 확인하였습니다. (잘못된 내용으로 삭선 처리)
위의 내용중 부정확하거나 잘못된 부분은 삭선처리했습니다.
- dilation 값은 바운딩박스의 크기를 키우기 위해 사용합니다. (dilation = 4인경우 python에서 kernel = np.ones((4,4), np.uint8) 커널을 만들어 cv2.dilate(원본이미지, kernel, iterations=1))
다음은, ADetailer의 얼굴 바운딩박스 찾기 - mask만들기 등의 과정을 gif이미지로 간단히 만들어본 것입니다.
(GIF이미지로 만들면서 해상도 및 색감은 떨어지지만 그 과정을 쉽게 알 수 있을 것입니다)
APNG 이미지입니다. 다운로드해서 꿀뷰 등으로 보시거나 이미지 원본보기를 통해서 보시면 단계별 과정을 보실 수 있습니다.
DDetailer에서 delation=4를 주었을 때의 보정 과정 (APNG. 원본보기를 통해 과정을 보실 수 있습니다)
inpaint at full resolution padding값의 역할은?
Inpaint at full resolution padding, pixels: 패딩값이 DDetailer에서 32인데, 이 값을 0 ~ 100 사이 조절해봤는데 큰 차이점이 보이지 않습니다. 이 값이 어떤 영향을 주는지는에 대해서는 다음 기회에... (관심 있으신 분은 직접 살펴보시기 바랍니다)
위의 확인되지 않은 제 짐작을 직접 확인해봤습니다. modules/processor.py를 살짝 고쳐, 중간 생성 이미지를 저장하여 확인한 것입니다. (아래 이미지 예시 포함)
- inpaint padding (at full resolution)값은 inpaint에서 쓰이는 값으로, 보정 결과에 영향을 주는 것으로 확인하였습니다. 그 이유는 다음과 같습니다.
- 생성된 마스크에 적당한 패딩을 주게 되는데, 이 때 쓰이는 값이 inpaint padding값입니다.
- 이 패딩을 먹인 마스크를 캔버스 크기로 확대합니다. 이렇게 확대된 캔버스에 다시 그린 후에 resize 후에 보정된 얼굴을 이어붙이게 됩니다. 이때, 패딩을 많이 먹이면 마스크 사이즈가 작게 되며, 패딩을 0을 준다면 마스크 사이즈가 커지게 됩니다. 적당한 패딩을 주어야 자연스럽게 보정된 이미지를 이어붙이는데, 예를 들어, 패딩이 너무 적으면 약간 갸우뚱한 얼굴이 제자리로 돌아가기도 하는 것은 너무 적은 패딩때문입니다.
- 다만 패딩이 너무 크게되면, 확대시킬 얼굴 크기가 작아지게 되어 디테일이 너무 떨어질 수도 있는 것입니다.
다음은 패딩을 먹이고 확대된 마스크의 예
padding = 32인 경우
padding = 0인 경우
다음은 중간 생성물이 축소되기 전과 축소 후 이미지 (padding=32의 경우)
padding 32의 경우에 대한 마스크와 겹치게 해서 수작업으로 편집해본 스샷
변경사항:
- 5/14 - APNG, Animation GIF로 올림.
- 5/15 - inpaint padding 설명 추가.