Post

무엇이 재구성 품질을 결정하는가 — 잡음, 수용 영역, 그리고 해상도

무엇이 재구성 품질을 결정하는가 — 잡음, 수용 영역, 그리고 해상도

앞선 글에서 SITL 재구성 네트워크로 포스터 수치를 재현했습니다. 이번 글은 그 다음 질문들에 답한 기록입니다.

  • 무엇이 성능을 결정하는가 — 잡음? 모델 크기? 데이터?
  • Post-ConvL은 정말 de-blurring과 de-noising을 둘 다 하는가?
  • 해상도를 올리면 어떻게 되는가?

측정 결과를 그림 위주로 정리했습니다.

1. 잡음이 압도적입니다

같은 구조, 같은 데이터에서 입력 사이노그램의 잡음만 바꿔봤습니다.

잡음의 영향 잡음만 바꿨을 때의 RMSE(왼쪽)와 SSIM(오른쪽). 점선은 포스터 목표치

잡음RMSESSIM
21.7%9.61%0.705
10.0%6.44%0.834
0%1.62%0.987

6배가 갈립니다. 참고로 모델 파라미터를 42% 늘려 얻은 개선은 1.5%였습니다. 차원이 다릅니다.

잡음 수준이 제멋대로였던 이유는 전처리 기본값 때문이었습니다. 사이노그램 값을 그대로 계수로 쓰면 해상도에 따라 잡음이 달라집니다 — 광선이 지나는 픽셀 수가 해상도에 비례하니까요.

해상도bin당 계수상대잡음
64×6421.321.7%
512×512183.07.4%

같은 코드인데 64는 잡음이 과했습니다. 지금은 --counts-per-bin 으로 해상도와 무관하게 직접 지정합니다.

2. 성능은 파라미터가 아니라 수용 영역을 따릅니다

Post-ConvL의 층 수, 커널 크기, dilation을 바꿔가며 측정했습니다.

수용 영역과 성능 왼쪽: 수용 영역 대비 성능. 오른쪽: 같은 데이터를 파라미터 축으로 본 것

구성수용 영역파라미터val NRMSE
C4 5×519px349,7317.52%
C5 5×523px452,1957.14%
C4 7×725px570,9156.98%
C5 7×731px771,6836.82%
C5 7×7 dilation 455px771,6837.29%
C6 7×7 dilation 479px972,4517.31%

C5 5×5(452K, 23px)보다 C4 7×7(571K, 25px)이 낫습니다. 층을 하나 줄이고 커널을 키운 쪽인데, 수용 영역 순서와 성능 순서가 정확히 일치합니다.

SITL이 만드는 아티팩트가 영상을 가로지르는 긴 줄무늬라, 넓게 봐야 지울 수 있습니다. 다만 영상 크기의 절반(31px / 64px)을 넘으면 포화했습니다. dilation으로 55px, 79px까지 넓혀도 더 좋아지지 않았고, 오히려 dilation 자체가 격자를 만드는 듯했습니다.

3. Post-ConvL은 정말 둘 다 합니다

포스터는 Post-ConvL이 “de-blurring과 de-noising을 동시에 수행”한다고 적고 있습니다. 같은 모델 안에서 SITL 직후와 최종 출력을 비교해 확인했습니다.

디블러링 (무노이즈 입력)

디블러링 단계 왼쪽부터 정답, SITL 직후(역투영 수준), Post-ConvL 통과 후

단계RMSESSIMPSNR
SITL 직후4.590%0.94427.62 dB
Post-ConvL 후1.625%0.98736.85 dB

SITL은 본질적으로 역투영이라 결과가 흐립니다. 가운데 영상의 뿌연 느낌이 오른쪽에서 걷히는 게 보입니다. 오차 기준 2.8배, PSNR +9.23 dB 입니다.

디노이징 (잡음 10% 입력)

잡음 조건 비교 왼쪽부터 정답, FBP, MLEM 10회, SITL 직후, 최종 출력

방법RMSESSIMPSNR
FBP13.589%0.60018.27 dB
MLEM (10 iter)9.552%0.69921.35 dB
SITL 직후8.449%0.75622.26 dB
최종 출력6.258%0.84425.01 dB

FBP는 잡음이 그대로 드러나고, MLEM은 깨끗하지만 뭉갭니다. 네트워크는 둘 다를 앞섭니다. 이전 재현 시도에서 MLEM에게 졌던 것과 대조적인데, 그때는 잡음 설정이 잘못돼 있었습니다.

Post-ConvL 기여도 왼쪽: 해상도별 수렴 곡선. 가운데: Post-ConvL이 걷어내는 양. 오른쪽: 잡음 조건에서 고전 알고리즘 대비

4. 해상도를 올리면

같은 구조로 256×256까지 올려봤습니다.

256 재구성 결과 256×256 / 336 view 재구성. 왼쪽부터 정답, 예측, 오차×4

해상도데이터RMSESSIMPSNR
64×64 / 128 view157,875장1.618%0.98737.04 dB
256×256 / 336 view49,699장3.971%0.93828.40 dB

얼룩말 줄무늬, 곰인형 털까지 복원됩니다. 다만 64×64 대비 오차가 2.5배입니다.

두 가지가 겹쳐 있습니다.

  • 데이터가 3분의 1 — 256 crop이 가능한 COCO 영상이 49,699장뿐입니다 (64는 crop 256 후 축소라 157,875장)
  • 학습을 13 에포크에서 중단 — 25 에포크 계획이었으나 도중에 멈췄습니다. 64는 80 에포크 중 62에서 최저값이 나왔으니, 256도 더 돌리면 내려갈 여지가 있습니다

512×512는 더 어렵습니다. COCO 158,957장 중 512 center crop이 가능한 게 6.9%인 11,137장뿐입니다. 짧은 변 중앙값이 427px이라 그렇습니다. 해상도를 올릴수록 데이터가 줄어드는 구조적 제약이 있습니다.

5. 재현 결과 다시 보기

64x64 재구성 결과 64×64 최종 결과. 오차 영상이 거의 검습니다

 RMSESSIMPSNR
재현1.618%0.98737.04 dB
포스터1.556%0.98336.60 dB

SSIM과 PSNR은 넘었고 RMSE만 4% 차이입니다. 테스트셋 15,787장 기준입니다.

정리

세 축을 따로 재보고 나서야 순서가 보였습니다.

  1. 잡음 — 6배. 압도적입니다
  2. 데이터 — 275장에서 126,301장으로 늘리자 5 에포크 만에 이전 400 에포크 결과를 넘었습니다
  3. 구조 — 수용 영역을 따르되 영상 절반에서 포화합니다. 파라미터 수는 지표가 아닙니다

모델을 건드리기 전에 입력 데이터가 의도한 대로 만들어졌는지 확인하는 게 훨씬 빨랐을 것입니다. 원본 코드에 남아 있던 total_cnt_range = (2e5, 8e6) 한 줄이 답이었는데, 한참을 돌아왔습니다.

코드는 GitHub에 있습니다.

This post is licensed under CC BY 4.0 by the author.