의미적 분할(FCN, U-NET): Semantic segmentation

FCN

  • 완전 합성곱 신경망: Fully Convolutional Network

  • 각 픽셀에 의미론적 레이블을 할당하는 '시맨틱 분할'에 사용되는 심층 학습 모델

  • 과정
    • Convolution
    • Deconvolution(Upsampling)
      • 분류를 위해 flatten(1차원)하는 대신, Convolution으로 줄어든 사이즈를 다시 키움
    • Skip architecture

  • 해결해야 할 문제
    • coarse(컨벌루션으로 추상화된)한 feature-map해결하기 위해, 원본 이미지 픽셀에 가까운 dense-map으로 변환

FCN의 구조

  • VGG16모델의 Backbone 사용

  • 업 샘플링
    • 7x7 > 2배 > 14x14 > 2배 >28x28 > 8배 >224x224

  • Skip-connection 사용 (다음 단계를 생략하고 바로 완전연결층으로 보내는 필터)

  • 완전연결계층은 없음

코드

U-Net

  • 대칭을 나타내기 위해 구조를 U자형으로 그림.
  • 생체의학 영상 분할 분야에 응용
  • 구성: 축소 경로, 병목 경로, 확장 경로
  • 정확히 4번 일어난다.
  • 인코더
    • 구성: 합성곱(3x3)+풀링(2x2)

  • 디코더
    • 구성: 업샘플링+합성곱(3x3)

  • 스킵 연결
    • 구성: 인코더와 디코더를 병합
    • 사이즈가 맞지 않음에도 concat을 하는데, 큰 이미지를 crop해서 concat한다.

왜 줄였다가 늘릴까?

  • 피처맵 초기
    • 위치정보
    • 리세트필드가 작다.(지역정보를 따로따로 보유)
    • Fine (그대로)
    • 명시적
    • decoded

  • 피처맵 추상화
    • 의미정보
    • 리세트필트가 크다.(글로벌피처, 하나의 지역이 갖고 있는 정보가 크다)
    • Coarse (세밀하지않은)
    • 추상적
    • encoded

  • 축소: 연산 효율성을 높여, 의미를 찾는다.

  • 확장: 위치정보를 명확히 한다.

  • 연결(concat(축소,확장))

왜 시작 사이즈가 572인가?
  • 10번의 컨볼루션(패딩없는)과 4번의 풀링 동안, 단 한번도 홀수가 나오지 않았다.
  • 572x572 > 28x28
  • 처음부터 28x28까지 줄어들 것을 고려하여 전체 레이어에 대한 세부 설계(conv 개수, padding유무)에 부합하는 이미지 크기를 의도적으로 결정.
  • 2의 n제곱 수가 아닌 572를 사용한 것은 padding을 주지 않았기 때문
왜 padding을 주지 않았을까?
  • Padding을 주지 않았기 때문에 인코딩 쪽 피처맵과 디코딩 쪽 피처맵 크기가 서로 맞지 않음(디코딩쪽이 더 작음)
  • 추론하고자 하는 이미지보다 입력이미지가 더 큼.
  • UNET설계자는 의도적으로 입력이미지를 실제 추론하고자 하는 이미지보다 크게 설정.
왜 입력이미지 크기와 출력이미지 크기가 다를까?
  • 생체의학 분야에서 개발된 모델, 생체의학 분야에서 다루는 데이터셋은 보통 초고해상도 이미지다. 즉, 크기가 매우 큰 이미지.
  • 매우 큰 이미지를 한번에 모델에 입력으로 넣어줄 수 없기 때문에, 이미지를 잘라서 따로 따로 학습시킨다. (이를 '타일링'이라 한다.)
  • 도메인 특성상 세포의 분포를 확인하는 것이기 때문에 데이터를 쪼개서 세그멘테이션 한다고 해도, 의미적 훼손이 크지 않기 때문에 사용 가능한 기법이다.
  • 단, 타일링의 경계에서 잘리게 되는 객체들이 존재할 수 있으며, 이 경우는 의미의 훼손이 발생할 수 있다. 이 문제를 해결하기 위해서 Unet 설계자는 'Overlapping 타일링'을 사용했다.
  • 572 x 572 로 자를뿐 실제로 확인하는 영역은 더 작다. 그리고 영역을 겹쳐서(Overlap), 사용한다. 원본은 사방으로 마진을 두고 자른다. 업스케일링은 마진만큼 원본이미지를 패딩한다. 합친다.
정리
  • 이미지가 너무 크다. -> 타일링하자.
  • 타일링하면 경계에서 이미지 훼손이 생긴다. -> Overlapping 타일링 하자
  • Overlapping을 하면, 입력 이미지지의 크기와 실제 추론하고자 하는 타겟 이미지의 크기가 서로다르다. -> 모델의 입력 크기와 출력 크기를 다르게 설정하자.
  • 모델의 입력 크기와 출력 크기가 다르려면 -> conv 층에 패딩을 두지 말자. -> 정확한 사이즈는 계산해서 설계한다.

Segmentation 후처리

  • 침식: 주변의 어두운 색으로 자신을 바꿈

  • 팽창: 주변의 밝은 색으로 자신을 바꿈

  • Opening (침식>팽창)
    • 흰색 노이즈 점을 없애줌

  • Closing (팽창>침식)
    • 작은 경계가 메워짐

Deeplab v3 (또는 v3+)

최근까지 발전해 온 Segmentation 모델



댓글 쓰기

다음 이전