Etc/Deep Learning

6장 합성곱 신경망Ⅱ(5) - 이미지 분할을 위한 신경망(U-Net부터 내용추가하기)

z.zzz 2021. 8. 17. 15:03

6.3 이미지 분할을 위한 신경망

이미지 분할이란?

신경망을 훈련시켜 이미지를 픽셀 단위로 분할하는 것(이후 이미지에 포함된 객체를 추출)

이미지 분할의 대표적 네트워크

완전 합성곱 네트워크, 합성곱 & 역합성곱 네트워크, U-Net, PSPNet, DeepLabv3/DeepLabv3+

 


6.3.1 완전 합성곱 네트워크

완전연결층의 한계

  • 고정된 크기의 입력만 받아들임
  • 완전연결층을 거친 후에는 위치 정보가 사라짐

⇒ 해결 : 완전연결층을 1×1 합성곱으로 대체함 = 완전 합성곱 네트워크

 

완전 합성곱 네트워크란?

CNN 기반 모델(이미지 분류에서 우수한 성능, AlexNet, VGG16, GoogLeNet)을 변형

→ 이미지 분할에 적합하도록 만든 네트워크

 

예) AlexNet의 하단에서 사용되었던 완전연결층 3개를 1×1 합성곱으로 변환

→ 위치 정보가 남아 있음

→ 히트 맵 그림과 같이 고양이 위치 확인 가능

    + 입력 이미지에 대한 크기 제약이 사라짐(합성곱층으로 사용되기 때문)

// 히트맵 : 색상으로 표현할 수 있는 다양한 정보를 이미지 위에 열(heat) 분포 형태의 그래픽으로 출력하는 것

 


6.3.2 합성곱 & 역합성곱 네트워크

완전 합성곱 네트워크의 장점 : 위치 정보가 보존됨

완전 합성곱 네트워크의 단점 

 • 여러 단계의 합성곱층과 풀링층을 거치면서 해상도가 낮아짐

 • 낮아진 해상도를 복원하기 위해 업 샘플링 방식을 사용 → 이미지의 세부 정보들을 잃어버림

    //업 샘플링 : 최종 이미지의 크기가 입력 이미지의 크기와 같도록 하는 것

⇒ 해결 : 역합성곱 네트워크를 도입 = '합성곱 & 역합성곱 네트워크'

 

역합성곱이란?

 • CNN의 최종 결과를 원래 입력 이미지와 같은 크기로 만들고 싶을 때 사용

 • 시멘틱 분할 등에 활용    //이미지 내에 있는 물체들을 의미 있는 단위로 분할하는 것

 • (=업 샘플링)

합성곱 & 역합성곱 네트워크

 

CNN에서 합성곱층 : 합성곱을 사용하여 특성맵 크기를 줄임

역합성곱 : 특성맵 크기를 증가시키는 방식으로 동작

 

역합성곱 동작 방식

 ① 각각의 픽셀 주위에 제로 패딩을 추가

 ② 이렇게 패딩된 것에 합성곱 연산을 수행함

 

입력 : 아래쪽 파란색 픽셀

출력 : 초록색 픽셀

 - 파란색 픽셀 주위로 흰색 제로 패딩을 수행

 - 회색 필터로 합성곱 연산 수행 → 초록색이 출력됨

 

 


6.3.3 U-Net

U-Net이란?

바이오 메디컬 이미지 분할을 위한 합성곱 신경망

 

U-Net 특징

 • 속도가 빠름

   : 이미 검증이 끝난 패치는 건너뛰기 때문에 속도가 빠름(기존 슬라이딩 윈도우 방식 : 이전 패치(이미지 인식 단위)에서 검증이 끝난 부분을 다음 패치에서 또 검증함 - 속도 느림)

 • 트레이드오프(trade-off)에 빠지지 않음

   : 일반적으로 패치 크기↑ ⇒ 넓은 범위의 이미지 인식이 뛰어남 ⇒ 컨텍스트 인식에 탁월

     BUT 지역화에 한계 - 너무 넓은 범위를 한 번에 인식하면 지역화가 약해짐

     U-Net - 컨텍스트 인식 & 지역화 트레이드오프 문제를 개선

 

📝Note. 지역화
지역화란?
 • 이미지 안에 객체(고양이) 위치 정보를 출력하는 것
 • 바운딩 박스를 많이 사용함 - 바운딩 박스의 왼쪽 위, 오른쪽 아래 좌표를 출력(네 꼭지점 픽셀 좌표 출력X)

 

U-Net 구조

 • FCN 기반으로 구축

 • 수축 경로 + 확장 경로

    //수축 경로 : 컨텍스트를 포착

    //확장 경로 : 특성맵을 업 샘플링 & 수축 경로에서 포착한 특성맵의 컨텍스트와 결합하여 정확한 지역화를 수행함

 • 3×3 합성곱이 주를 이룸 

   - 각 합성곱 블록은 3×3 합성곱 두개 + 그 사이의 드롭아웃

U-Net

수축 경로 확장 경로
블록 : 3×3 합성곱 두 개로 구성된 것이 네 개가 있는 형태
각 블록은 최대 풀링을 이용하여 크기를 줄이면서 다음 블록으로 넘어감
합성곱 블록에 up-conv를 앞에 붙임
수축 과정에서 줄어든 크기를 다시 키워 가면서 합성곱 블록을 이용하는 형태

즉, 크기가 다양한 이미지의 객체를 분할하기 위해 크기가 다양한 특성 맵을 병합할 수 있도록

다운 샘플링과 업 샘플링을 순서대로 반복하는 구조

 

U-Net의 네트워크(신경망) 구축 부분 코드

inputs = layers.Input(shape=(572,572,1)) ------ 입력 이미지는 그레이스케일로 구성

c0 = layers.Conv2D(64, activation='relu', kernel_size=3)(inputs)
c1 = layers.Conv2D(64, activation='relu', kernel_size=3)(c0) ------ 확장 경로와 연결하기 위한 계층
c2 = layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid')(c1) ------ 합성곱 두 개와 하나의 최대 풀링으로 구성

c3 = layers.Conv2D(128, activation='relu', kernel_size=3)(c2)
c4 = layers.Conv2D(128, activation='relu', kernel_size=3)(c3) ------ 확장 경로와 연결하기 위한 계층
c5 = layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid')(c4) ------ 합성곱 두 개와 하나의 최대 풀링으로 구성

c6 = layers.Conv2D(256, activation='relu', kernel_size=3)(c5)
c7 = layers.Conv2D(256, activation='relu', kernel_size=3)(c6)
c8 = layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid')(c7)

c9 = layers.Conv2D(512, activation='relu', kernel_size=3)(c8)
c10 = layers.Conv2D(512, activation='relu', kernel_size=3)(c9) ------ 확장 경로와 연결하기 위한 계층
c11 = layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid')(c10)

c12 = layers.Conv2D(1024, activation='relu', kernel_size=3)(c11)
c13 = layers.Conv2D(1024, activation='relu', kernel_size=3, padding='valid')(c12)