블롭 포트레이트: 사진을 위한 그래디언트 디센트
2D 가우시안 블롭으로 사진을 그립니다. 1,500개의 무작위 블롭에서 시작하여, 각 단계에서 블롭을 렌더링하고 사진과의 오차(L1 + SSIM)를 측정한 뒤, 각 블롭을 조금씩 이동시켜 오차를 줄입니다(Adam). 오차가 가장 큰 영역에는 새로운 작은 블롭이 생성됩니다. 이미지 생성기는 사용되지 않습니다: 사진은 학습됩니다.
단계
-
사진을 준비합니다. 첨부된 파일을 사용합니다. 피사체의 위치를 확인하여
--focus를 설정할 수 있도록 합니다(가장 집중적으로 학습할 영역, 일반적으로 얼굴). -
설치합니다. Python 3.10+.
pip install -r requirements.txt # torch, numpy, pillowPyTorch 인덱스가 차단된 경우, PyPI에서
pip install torch로 간단히 설치할 수 있습니다. -
사용 가능한 하드웨어와 시간에 맞춰 프리셋을 선택합니다.
프리셋 단계 최대 블롭 2코어 CPU GPU quick300 15,000 ~8분 ~1분 default1,600 45,000 ~35분 ~5분 full6,000 100,000 수시간 ~20-40분 CPU에서 실행할 경우,
default프리셋을 백그라운드에서 실행하고 로그를 확인하며, 실행을 막지 않도록 합니다. -
실행합니다.
python scripts/blobfit.py photo.jpg --out result/ --preset default \ --aspect 4:5 --focus 0.5,0.4,0.45,0.5--aspect는 중심 기준으로 w:h 비율로 자릅니다(none은 원본 비율 유지).--focus cx,cy,w,h는 자른 이미지의 0-1 범위 좌표입니다. 중앙 셀카의 경우0.5,0.4,0.45,0.5가 얼굴을 덮습니다.--steps/--blobs로 프리셋을 재정의할 수 있습니다.- 장치는 자동 선택됩니다: CUDA, Apple MPS, CPU 순서로 시도합니다.
-
결과를 전달하기 전에 확인합니다.
compare.jpg와zoom.jpg를 열어 확인합니다.stats.json에 PSNR이 기록됩니다: 약 28-30 dB는 부드러운 유사도(quick 프리셋), 38 dB 이상은 일반 크기에서 구별하기 어려운 수준입니다. 얼굴이 흐릿하면 더 많은 단계로 다시 실행하거나--focus를 얼굴에 맞게 조정합니다. -
전달합니다.
compare.jpg,render.png,training.gif를 보냅니다. 블롭 수, 단계 수, PSNR, 그리고 생성된 것이 아니라 학습된 것임을 설명합니다.
출력물
| 파일 | 설명 |
|---|---|
render.png | 전체 크기로 맞춰진 블롭 그림 |
compare.jpg | 실제 사진과 코드 버전 나란히 비교 |
zoom.jpg | 눈 주변 클로즈업 증명 |
training.gif | 노이즈에서 그림으로 변하는 과정, 중요 단계마다 프레임 |
blobs.npz | 모든 블롭 정보: 위치, 크기, 각도, 색상, 강도 (재렌더링 또는 애니메이션용) |
stats.json | 단계 수, 블롭 수, PSNR, 소요 시간, 사용 장치 |
정직한 한계점
- 하나의 사진을 복사합니다. 새로운 시각이나 얼굴을 창조할 수 없습니다.
- 품질은 단계 수에 의존합니다: 짧은 CPU 실행은 부드럽게 나오고, 미세한 피부 질감은
full프리셋이 필요합니다. - 배경색은 사진 가장자리에서 추출되므로, 블롭은 배경색과 다른 부분만 칠하면 됩니다.