DDetailer와 ADetailer의 결과물이 약간씩 상이해서 번갈아 사용하고 있는 1인입니다.
대부분 DDetailer를 켜고 사용하지만, 가끔씩 결과가 이상하거나 마음에 안들 때 ADetailer가 나은 경우도 있더군요.
미세한 결과물의 차이지만 표정이 상당히 바뀌어 버리는 경우가 생기기때문에 DDetailer 사용을 고수하시는 분이 많으신 것 같습니다.
궁금해서 DDetailer와 ADetailer 소스코드를 살펴보았습니다.
대략 다음과 같은 순서를 밟는데,
1) 얼굴에 대한 바운딩박스를 찾는다. adetailer는 ultralytics 사용, ddetailer는 mmdet 라이브러리 사용 - 바운딩 박스는 근소한 차이만 있을 뿐 같다고 봐도 무방. (근소한 차이지만, 너비, 높이가 각각 차이가 있음)
2) 얼굴 바운딩박스에 대한 마스크를 만들어 inpainting 시도한다. (내장된 process_image() 사용)
- DDetailer: https://github.com/dustysys/ddetailer/blob/master/scripts/ddetailer.py#L316
- ADetailer: https://github.com/Bing-su/adetailer/blob/main/scripts/!adetailer.py#L638
※ 참고: 제가 이해한 것이 맞다면, DDetailer는 스크립트로서 프로세싱 전 과정이 스크립트를 통해 이루어지고, ADetailer는 프로세싱 과정중 이미지 후처리기 postprocess() 호출 과정에서 처리하는 방식으로 작동합니다.
따라서, 바운딩박스를 찾는 알고리즘만 다를 뿐 SD webui 내장함수 process_image()를 사용하기때문에, 결과도 거의 같을 것이라고 예상할 수 있을텐데.. 왜 아주 미세한 차이가 있을까요?
이것은 같은 내장 함수를 호출한다 할지라도, 초기값 바운딩박스가 미세하게 다른 차이가 결과물의 차이를 만들고 있기 때문입니다.
실제로 DDetailer의 옵션에는 X축, Y축으로 오프셋을 줄 수 있는데, 바운딩박스의 오프셋 약간 조정해주면 결과가 달라집니다...
또한, ADetailer와 DDetailer의 기본 옵션에도 차이가 있습니다.
ADetailer의 inpaint 패딩 값 기본이 0인 반면, DDetailer의 inpaint 패딩값 기본은 32입니다. 이 값을 변경해주면 결과가 달라집니다.
(덧: 제 의견은, ADetailer의 inpaint 패딩값을 기본 0에서 32로 올려주시면 좋을 것 같습니다. 패딩을 0으로 주면 얼굴이 살짝 돌아감..)
요약: ADetailer와 DDetailer의 결과물이 다른 이유는
1) 얼굴 바운딩박스 인식 결과의 차이
2) inpaint 패딩값의 차이 / delation 기본값의 차이
이 두가지의 차이로 결과물에 영향을 미치게 됩니다
테스트로 사용한 샘플 이미지 올려봅니다. (다운로드 받아서 비교하셔야 차이를 알수 있습니다)
ADetailer - inpaint 패딩 0 (기본값)
ADetailer - inpaint 패딩 32
DDetailer - inpaint 패딩 32 (기본값)
DDetailer - inpaint 패딩 0
inpaint 패딩 32에서 각각의 얼굴 바운딩 박스
DDetailer (기본 anime-face-yolov3 선택)
ADetailer의 바운딩박스 (yolov8n 선택시. yolov8s도 거의 같음)
자세히 보시면 DDetailer의 바운딩박스는 이마가 거의 제외되어 있어 범위가 좁은 편이고,
ADetailer의 바운딩박스는 이마를 거의 포함시켜 범위가 좀 더 넓으며 또한 턱에 바짝 붙어있습니다.
※추가: 더 넓은 범위를 다시 그리는 것이 ADetailer가 더 나쁜 결과를 낳게하는 원인이 아닐까 싶습니다.
그래서 ADetailer의 다른 바운딩박스 방식을 확인해보니, DDetailer에서 판독하는 크기와 가장 유사한 크기를 가지는 방식이 다음과 같이 있음을 알 수 있습니다.
ADetailer : mediapipe_face_short 선택시
mediapipe_face_short 선택시 얼굴 범위가 좁으며, DDetailer와 크기가 유사합니다.
또한, 이 경우에 ADetailer에 의해 보정된 이미지는 다음과 같습니다.
※ 수정사항:
- 5/13 12:12 - 세팅 옵션을 켜면 저장되는 바운딩박스를 첨부함.
- 5/13 dilation 기본값도 차이가 있음. adetailer에서 dilation 설정값을 사용하지 않고 있었음. (5/13 3시 현재 수정됨. 최신 adetailer로 업데이트하세요)
mmdet 종속성을 벗어난 모델을 직접 만드셨다고 하던데 그 차이도 있지 않았을까 싶었습니다.
잦은 업데이트가 있어서 매일 확인하는편인데 모델들도 추가되고 업데이트 되더군요
샘플링스텝, cfg분리하고 콘트롤넷 인페인트모델까지 불러서 돌리면 더 정밀하게 되는 느낌입니다.
전 반대로 ddtailer를 지웠어요
제 컴퓨터에선 D디테일러, DD디테일러, DDSD모두 작동을 안해서 그냥 A디테일러 쓰는데..
얼굴 도자기처럼 밀어버리는게 D디테일러에 비해 좀 더 심한것 같다는 느낌은 있습니다.