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 합성곱 두개 + 그 사이의 드롭아웃
수축 경로 | 확장 경로 |
블록 : 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)
'Etc > Deep Learning' 카테고리의 다른 글
7장 시계열 분석(2) - RNN 구조(계층, 셀) + RNN 셀 구현 (0) | 2021.08.21 |
---|---|
7장 시계열 분석(1) - 시계열 데이터 분류, 시계열 분석 모델, 순환 신경망(RNN), RNN계층과 셀 (0) | 2021.08.21 |
6장 합성곱 신경망(4) - 객체 인식을 위한 신경망(R-CNN, 공간 피라미드 풀링, Fast R-CNN, Faster R-CNN) (0) | 2021.08.12 |
6장 합성곱 신경망Ⅱ(3) - 이미지 분류를 위한 신경망(VGGNet, GoogLeNet, ResNet) (0) | 2021.08.11 |
6장 합성곱 신경망Ⅱ(2) - 이미지 분류를 위한 신경망(AlexNet) (0) | 2021.08.10 |