U Net 설명 | [Paper Review] U-Net: Convolutional Networks For Biomedical Image Segmentation 343 개의 새로운 답변이 업데이트되었습니다.

당신은 주제를 찾고 있습니까 “u net 설명 – [Paper Review] U-Net: Convolutional Networks for Biomedical Image Segmentation“? 다음 카테고리의 웹사이트 th.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: th.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 고려대학교 산업경영공학부 DSBA 연구실 이(가) 작성한 기사에는 조회수 4,168회 및 좋아요 102개 개의 좋아요가 있습니다.

u net 설명 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [Paper Review] U-Net: Convolutional Networks for Biomedical Image Segmentation – u net 설명 주제에 대한 세부정보를 참조하세요

[1] 발표자 : DSBA 연구실 석사과정 정의석
[2] 발표 논문 : https://arxiv.org/abs/1505.04597

u net 설명 주제에 대한 자세한 내용은 여기를 참조하세요.

U-Net 정리

U-Net의 장점 · 적은 양의 학습 데이터로도 Data Augmentation을 활용해 여러 Biomedical Image Segmentation 문제에서 우수한 성능을 보임 · 컨텍스트 정보 …

+ 자세한 내용은 여기를 클릭하십시오

Source: velog.io

Date Published: 7/30/2021

View: 270

[U-Net] U-Net 구조 – Deep Campus

U-Net 은 인코더 또는 축소경로(contracting path)와 디코더 또는 확장경로(expending path)로 구성되며 두 구조는 서로 대칭적이다. 인코더와 디코더를 …

+ 여기에 보기

Source: pasus.tistory.com

Date Published: 6/5/2021

View: 7757

U-Net 논문 리뷰 — U-Net: Convolutional Networks … – Medium

U-Net은 Biomedical 분야에서 이미지 분할(Image Segmentation)을 목적으로 제안된 End-to-End 방식의 Fully-Convolutional Network 기반 모델이다.

+ 자세한 내용은 여기를 클릭하십시오

Source: medium.com

Date Published: 5/6/2021

View: 1209

[Semantic Segmentation] U-Net 원리 :: KUKLIFE

Semantic Segmentation 알고리즘 – U-Net U-Net은 2015년 5월 경에 게제되.. … N을 계산하는데에 있어 추가적인 설명을 붙였는데 만약 이전 layer …

+ 자세한 내용은 여기를 클릭하십시오

Source: kuklife.tistory.com

Date Published: 6/4/2022

View: 182

[머신러닝 공부] 딥러닝/U-Net – 코딩뚠뚠 – Tistory

U-Net은 이미지 분할을 목적으로 제안된 End to End 방식의 Fully Convolutional Network 기반 모델이다. 네트워크 구성의 형태가 U 모양이여서 U-Net …

+ 여기에 표시

Source: dbstndi6316.tistory.com

Date Published: 11/21/2022

View: 9895

[논문리뷰]U-Net – 새내기 코드 여행

[논문리뷰]U-Net. Convolutional Networks for Biomedical Image Segmentation. Posted by Code Journey on September 28, 2020 …

+ 여기를 클릭

Source: joungheekim.github.io

Date Published: 5/6/2022

View: 4644

[DNN] U-net 구조와 code 구현 (MICCAI2015) – 아무블로그

u-net 은 그림과 같이 u자형 형태로 되어 있으며, convolution 과 pooling 을 통해서 feature map 이 줄어드는 부분과 다시 upsampling 을 한 부분을 …

+ 여기를 클릭

Source: csm-kr.tistory.com

Date Published: 10/29/2021

View: 2294

[딥러닝] FCN 논문 부터 U-net 논문까지 (2/2) – U-net 리뷰편

U-Net은 Biomedical 분야에서 이미지 분할(Image Segmentation)을 목적으로 제안된 End-to-End 방식의 Fully-Convolutional Network 기반 모델이다.

+ 더 읽기

Source: koreapy.tistory.com

Date Published: 3/26/2021

View: 5380

비공개 게시물입니다. – 네이버 블로그

비공개 게시물입니다. 이전 화면으로.

+ 여기에 더 보기

Source: m.blog.naver.com

Date Published: 7/9/2022

View: 8323

주제와 관련된 이미지 u net 설명

주제와 관련된 더 많은 사진을 참조하십시오 [Paper Review] U-Net: Convolutional Networks for Biomedical Image Segmentation. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[Paper Review] U-Net: Convolutional Networks for Biomedical Image Segmentation
[Paper Review] U-Net: Convolutional Networks for Biomedical Image Segmentation

주제에 대한 기사 평가 u net 설명

  • Author: 고려대학교 산업경영공학부 DSBA 연구실
  • Views: 조회수 4,168회
  • Likes: 좋아요 102개
  • Date Published: 2020. 10. 31.
  • Video Url link: https://www.youtube.com/watch?v=O_7mR4H9WLk

[U-Net] U-Net 구조

이미지 세그멘테이션(image segmentation)은 이미지의 모든 픽셀이 어떤 카테고리(예를 들면 자동차, 사람, 도로 등)에 속하는지 분류하는 것을 말한다.

이미지 전체에 대해 단일 카테고리를 예측하는 이미지 분류(image classification)와는 달리, 이미지 세그멘테이션은 픽셀 단위의 분류를 수행하므로 일반적으로 더 어려운 문제로 인식되고 있다.

위 그림에서 semantic segmentation은 이미지 내에 있는 객체들을 의미 있는 단위로 분할해내는 것이고, instance segmentation 은 같은 카테고리에 속하는 서로 다른 객체까지 더 분할하여 semantic segmentation 범위를 확장한 것이다.

이미지 세그멘테이션은 의료 이미지 분석(종양 경계 추출 등), 자율주행 차량(도로면, 보행자 감지 등) 및 증강현실과 같은 광범위한 분야에서 사용되고 있다.

딥러닝을 이용한 이미지 세그멘테이션은 수백개의 알고리즘이 제안되어 있다고 하는데, 그 중 U-Net 모델을 Tensorflow 2로 구현해보고자 한다.

U-Net은 ‘U-Net: Convolutional Networks for Biomedical Image Segmentation’ 이라는 논문에서 제안한 구조로서 매우 적은 수의 학습 데이터로도 정확한 이미지 세그멘테이션 성능을 보여주었으며 ISBI 세포 추적 챌린지 2015에서 큰 점수 차이로 우승했다고 한다.

U-Net은 오토인코더(autoencoder)와 같은 인코더-디코더(encoder-decoder) 기반 모델에 속한다. 보통 인코딩 단계에서는 입력 이미지의 특징을 포착할 수 있도록 채널의 수를 늘리면서 차원을 축소해 나가며, 디코딩 단계에서는 저차원으로 인코딩된 정보만 이용하여 채널의 수를 줄이고 차원을 늘려서 고차원의 이미지를 복원한다. 하지만 인코딩 단계에서 차원 축소를 거치면서 이미지 객체에 대한 자세한 위치 정보를 잃게 되고, 디코딩 단계에서도 저차원의 정보만을 이용하기 때문에 위치 정보 손실을 회복하지 못하게 된다.

U-Net의 기본 아이디어는 저차원 뿐만 아니라 고차원 정보도 이용하여 이미지의 특징을 추출함과 동시에 정확한 위치 파악도 가능하게 하자는 것이다. 이를 위해서 인코딩 단계의 각 레이어에서 얻은 특징을 디코딩 단계의 각 레이어에 합치는(concatenation) 방법을 사용한다. 인코더 레이어와 디코더 레이어의 직접 연결을 스킵 연결(skip connection)이라고 한다.

원래 논문에서는 신경망 구조를 스킵 연결을 평행하게 두고 가운데를 기준으로 좌우가 대칭이 되도록 레이어를 배치하여, 이름 그대로 U자 형으로 만들었다.

U-Net 은 인코더 또는 축소경로(contracting path)와 디코더 또는 확장경로(expending path)로 구성되며 두 구조는 서로 대칭적이다. 인코더와 디코더를 연결하는 부분을 브릿지(bridge)라고 한다. 인코더와 디코더에서는 모두 3×3 컨볼루션을 사용한다. 인코더의 자세한 구조는 다음 그림과 같다. 맨 아래의 블록은 브릿지이다.

그림에서 세로 방향 숫자는 맵(map)의 차원을 표시하고 가로 방향 숫자는 채널 수를 표시한다. 예를 들면 세로 방향 숫자 256×256 과 가로 방향 숫자 128 은 해당 레이어의 이미지가 256x256x128 임을 의미한다. 입력 이미지는 512x512x3 이므로 RGB 3개 채널을 갖고 크기가 512×512 인 이미지를 나타낸다.

그림에서 파란색 박스가 인코더의 각 단계마다 계속 반복하여 나타나는 것을 볼 수 있는데, 이 박스는 3×3 컨볼루션, Batch Normalization, ReLU 활성화 함수가 차례로 배치된 것을 나타낸다. 이 박스 두 개를 한데 묶어서 한 개의 레이어 블록으로 구현하여 사용하면 편리하다. 이 블록 이름을 ConvBlock이라고 하자.

다음 코드는 ConvBlock을 구현한 것이다.

“”” Conv Block “”” class ConvBlock(tf.keras.layers.Layer): def __init__(self, n_filters): super(ConvBlock, self).__init__() self.conv1 = Conv2D(n_filters, 3, padding=’same’) self.conv2 = Conv2D(n_filters, 3, padding=’same’) self.bn1 = BatchNormalization() self.bn2 = BatchNormalization() self.activation = Activation(‘relu’) def call(self, inputs): x = self.conv1(inputs) x = self.bn1(x) x = self.activation(x) x = self.conv2(x) x = self.bn2(x) x = self.activation(x) return x

인코더 그림을 보면 보라색 박스안에 한 개의 ConvBlock이 있고 이 박스가 인코더의 각 단계마다 나타나는 것을 볼 수 있다. 이 박스에서 나오는 출력이 2개인데, 한 개의 출력은 U-Net의 디코더로 복사하기 위한 연결선이며, 또 한 개의 출력은 2×2 max pooling 으로 다운 샘플링(down sampling)하여 인코더의 다음 단계로 내보내는 빨간색 화살선이다. 이 박스도 한 개의 레이어 블록으로 구현하여 사용하면 편리하다. 이 블록 이름을 EncoderBlock이라고 하자.

다음 코드는 EncoderBlock을 구현한 것이다.

“”” Encoder Block “”” class EncoderBlock(tf.keras.layers.Layer): def __init__(self, n_filters): super(EncoderBlock, self).__init__() self.conv_blk = ConvBlock(n_filters) self.pool = MaxPooling2D((2,2)) def call(self, inputs): x = self.conv_blk(inputs) p = self.pool(x) return x, p

브릿지는 두개의 파란색 박스로만 구성되어 있으므로 1개의 ConvBlock 레이어로 표현할 수 있다.

디코더의 자세한 구조는 다음 그림과 같다.

그림에서 파란색 박스 2개는 인코더에 있는 ConvBlock와 동일하다. 녹색 박스는 스킵 연결을 통해서 인코더에 있는 맵을 복사한 것이다. 노란색 박스는 디코더의 하위 단계에서 전치 컨볼루션(transposed convolution)을 통해서 맵의 차원을 두배로 늘리면서 채널 수를 반으로 줄인 것이다. 두 개의 맵을 서로 합쳐서(concatenation) 저차원 이미지 정보뿐만 아니라 고차원 정보도 이용할 수 있는 것이다.

디코더의 그림에서도 회색 박스가 반복적으로 나타나므로 한 개의 레이어 블록으로 구현하여 사용하면 편리하다. 이 블록 이름을 DecoderBlock 이라고 하자.

다음 코드는 DecoderBlock을 구현한 것이다.

“”” Decoder Block “”” class DecoderBlock(tf.keras.layers.Layer): def __init__(self, n_filters): super(DecoderBlock, self).__init__() self.up = Conv2DTranspose(n_filters, (2,2), strides=2, padding=’same’) self.conv_blk = ConvBlock(n_filters) def call(self, inputs, skip): x = self.up(inputs) x = Concatenate()([x, skip]) x = self.conv_blk(x) return x

디코더 그림의 맨 상단의 오른쪽 부분은 U-Net의 출력으로서 1×1 컨볼루션으로 특징 맵을 처리하여 입력 이미지의 각 픽셀을 분류하는 세그멘테이션 맵을 생성하는 부분이다. 컨볼루션 필터의 개수는 분류할 카테고리 개수이며 활성 함수로는 카테고리 수가 1개라면 sigmoid 함수를, 여러 개라면 softmax 함수를 사용한다.

EncoderBlock과 DecoderBlock 을 사용하면 U-Net을 다음과 같이 간단히 코드로 구현할 수 있다.

“”” U-Net Model “”” class UNET(tf.keras.Model): def __init__(self, n_classes): super(UNET, self).__init__() # Encoder self.e1 = EncoderBlock(64) self.e2 = EncoderBlock(128) self.e3 = EncoderBlock(256) self.e4 = EncoderBlock(512) # Bridge self.b = ConvBlock(1024) # Decoder self.d1 = DecoderBlock(512) self.d2 = DecoderBlock(256) self.d3 = DecoderBlock(128) self.d4 = DecoderBlock(64) # Outputs if n_classes == 1: activation = ‘sigmoid’ else: activation = ‘softmax’ self.outputs = Conv2D(n_classes, 1, padding=’same’, activation=activation) def call(self, inputs): s1, p1 = self.e1(inputs) s2, p2 = self.e2(p1) s3, p3 = self.e3(p2) s4, p4 = self.e4(p3) b = self.b(p4) d1 = self.d1(b, s4) d2 = self.d2(d1, s3) d3 = self.d3(d2, s2) d4 = self.d4(d3, s1) outputs = self.outputs(d4) return outputs

U-Net 모델의 전체 코드는 다음과 같다.

unet_model.py

# U-Net model # coded by st.watermelon import tensorflow as tf from tensorflow.keras.layers import Conv2D, MaxPooling2D, Conv2DTranspose from tensorflow.keras.layers import Activation, BatchNormalization, Concatenate “”” Conv Block “”” class ConvBlock(tf.keras.layers.Layer): def __init__(self, n_filters): super(ConvBlock, self).__init__() self.conv1 = Conv2D(n_filters, 3, padding=’same’) self.conv2 = Conv2D(n_filters, 3, padding=’same’) self.bn1 = BatchNormalization() self.bn2 = BatchNormalization() self.activation = Activation(‘relu’) def call(self, inputs): x = self.conv1(inputs) x = self.bn1(x) x = self.activation(x) x = self.conv2(x) x = self.bn2(x) x = self.activation(x) return x “”” Encoder Block “”” class EncoderBlock(tf.keras.layers.Layer): def __init__(self, n_filters): super(EncoderBlock, self).__init__() self.conv_blk = ConvBlock(n_filters) self.pool = MaxPooling2D((2,2)) def call(self, inputs): x = self.conv_blk(inputs) p = self.pool(x) return x, p “”” Decoder Block “”” class DecoderBlock(tf.keras.layers.Layer): def __init__(self, n_filters): super(DecoderBlock, self).__init__() self.up = Conv2DTranspose(n_filters, (2,2), strides=2, padding=’same’) self.conv_blk = ConvBlock(n_filters) def call(self, inputs, skip): x = self.up(inputs) x = Concatenate()([x, skip]) x = self.conv_blk(x) return x “”” U-Net Model “”” class UNET(tf.keras.Model): def __init__(self, n_classes): super(UNET, self).__init__() # Encoder self.e1 = EncoderBlock(64) self.e2 = EncoderBlock(128) self.e3 = EncoderBlock(256) self.e4 = EncoderBlock(512) # Bridge self.b = ConvBlock(1024) # Decoder self.d1 = DecoderBlock(512) self.d2 = DecoderBlock(256) self.d3 = DecoderBlock(128) self.d4 = DecoderBlock(64) # Outputs if n_classes == 1: activation = ‘sigmoid’ else: activation = ‘softmax’ self.outputs = Conv2D(n_classes, 1, padding=’same’, activation=activation) def call(self, inputs): s1, p1 = self.e1(inputs) s2, p2 = self.e2(p1) s3, p3 = self.e3(p2) s4, p4 = self.e4(p3) b = self.b(p4) d1 = self.d1(b, s4) d2 = self.d2(d1, s3) d3 = self.d3(d2, s2) d4 = self.d4(d3, s1) outputs = self.outputs(d4) return outputs

[Semantic Segmentation] U-Net 원리

1. Semantic Segmentation의 목적 : https://kuklife.tistory.com/118?category=872136

2. Semantic Segmentation 알고리즘 – U-Net

U-Net은 2015년 5월 경에 게제되었으며, 독일의 프라이부르크 대학에서 Olaf Ronneberger, PhilippFischer, Thomas Brox에 의해 작성되었다.

논문의 핵심 내용은 주제에서 비춰지듯 Biomedical Image segmentation을 위한 convolutional network에 대한 내용으로써, End-to-End 로 Segmentation하는 심플하고 효과적인 방법이다.

U-Net은 Fully Convolution Network(FCN)를 기반으로 하여 구축하였으며, 적은 데이터를 가지고도 더욱 정확한 Segmentaion을 내기 위해 FCN 구조를 수정하였다.

※ FCN 원리 : https://kuklife.tistory.com/117?category=872135

(1) Introduction

논문에서 위의 Architecture를 network의 중심을 기준으로 왼쪽은 Contracting Path(Encoding으로 생각하면 됨), 오른쪽은 Expansive Path(Decoding으로 생각하면 됨)로 정의하였다.

이제 그럼 그림을 보면서 architecture의 내부 특징과 그 과정에서 사용된 Overlap-tile기법에 대해 살펴보겠다.

U-Net의 main idea는 다음과 같다.

1) Contracting Path : 이미지의 context 포착

2) Expansive Path : feature map을 upsampling 하고 1)에서 포착한 feature map의 context와 결합 → 이는 더욱 정확한 localization을 하는 역할을 한다.

기존의 FCN과 다른 중요한 점 2가지가 있다.

1) upsampling 과정에서 feature chennel 수가 많다. 이는 context를 resolution succesive layer에게 전파할 수 있음을 의미한다.

2) 각 Convolution의 valid part만 사용한다.(valid part란, full context가 들어있는 segmentation map을 의미) 이는 Overlap-tile 기법을 사용하여 원활한 segmentation이 가능하도록 한다.

그림에서 보이듯이 Blue tile과 Yellow tile이 서로 Overlap되어 있음을 확인할 수 있으며, Blue area에 기반하여 Yellow area의 Segmentation을 prediction 했음을 확인 할 수 있다. 그 이후, missing data는 mirroring을 통하여 extrapolation한다.

여기서, extrapolation은 한국어로 “외삽한다” 라고 표현하는데 외삽한다 라는 의미는 다른 변수와의 관계에 기초하여 변수 값을 추정한다는 것이다.

Pooling을 할 때, 0으로 이루어진 값으로 인해 값이 사라지게 되는데 이 사라진 값을 추정하겠다는 의미이다.

이러한 Overlap-tile을 적용함으로써 얻을 수 있는 혜택은 image resolution이 GPU memory에 대해 자유로워진다 라는 것이다.

또한, U-Net은 적은 데이터로 충분한 학습을 하기 위해 Data Augmentation을 사용한다. Data Augmentation이란 원래의 데이터를 부풀려서 더 좋은 성능을 만든다는 뜻으로써, 대표적인 케이스가 VGG Model에서 많이 사용하고 벤치마킹하였다.

Data Augmentation이 중요한 이유는

1) Preprocessing & augmentation을 하면 대부분 성능이 좋아진다.

2) 원본에 추가되는 개념이니 성능이 떨어지지 않는다.

3) 쉽고 패턴이 정해져 있다.

기본적인 예로는 아래와 같은 방법들이 있다.

1) 좌우반전을 해준다.

왼쪽만 바라보는 고양이를 70개 넣어준다고 가정하면, CNN Model을 적용하였을 때 오른쪽을 보는 고양이는 못맞추게 된다. 왼쪽을 보는 고양이 70개 + 오른쪽을 보는 고양이 70개 = 140개를 넣어주면 어느 쪽을 보더라도 맞추게 되는 것이다.

2) 이미지를 잘라준다.

확률적으로 꼬리를 보고 고양이를 판단할 확률 50%, 귀를 보고 판단할 확률 30%로 판단한다고 할 때, 딥러닝은 꼬리 뿐만 아니라 상자도 인식하느라 고양이의 특징을 제대로 파악하지 못하게 된다.

그렇기에 사람을 인식하는 방법을 모방하기 위해 사물 + 꼬리가 있는 사진을 넣어주기 보단 꼬리만 잘라서 넣어준다면 성능이 더 좋아질 것이다. 즉, 각 부분만 보고도 고양이로 판단할 수 있도록 해준다.

3) 밝기 조절

딥러닝 모델로 App을 만들게 된다면, 사진을 찍는 핸드폰마다 빛의 양이 다를 것이다. 그렇기에 모두 인식될 수 있도록 밝기를 조절해서 넣어준다.

다시 U-Net으로 돌아와 Data Augmentation에서 중요하게 사용된 것은 크게 2가지로 파악된다.

1) Elastic Deformation

적은 수의 이미지를 가지고 효과적으로 학습하기 위해 이 방식을 사용했다고 한다.(티슈 조직 등의 실질적인 변형과 유사하다고 함)

2) Weighted Cross Entropy + Data Augmentation

많은 cell을 Segmentation 해야하는 문제에서의 도전 과제는 같은 클래스가 서로 인접해 있는 케이스이다.

위 그림의 a처럼 cell이 인접해있으면 각 cell과 배경을 구분하는 것은 쉽지만, cell 각각을 서로 구분하는 것(논문에서는 instance segmentation이라 표현함)은 어렵다. 그래서 이 논문에서는 각 instance의 테두리와 테두리 사이가 반드시 배경이 되도록 처리한다.

즉, 2개의 셀이 붙어있는 경우라고 하더라도 그 둘 사이에는 반드시 배경으로 인식되어야 할 틈을 만들겠다 라는 의미이다.

(2) Architecture

이제, U-Net의 구조를 자세하게 살펴보자. 빠른 이해를 위해 위의 그림을 다시 가지고 오면 다음과 같으며, Contracting Path와 Expansive Path 두 가지로 나누어보겠다.

1) Contracting Path

Contracting Path는 일반적인 CNN을 따르며, Downsampling을 위한 Stride2, 2×2 max pooling 연산과 ReLU를 포함한 두 번의 반복된 3×3 unpadded convolutions 연산을 거친다.

즉, 3x3conv → ReLU → 2×2 max pooling → 3x3conv → ReLU → 2×2 max pooling 이다.

그리고 downsampling 과정에서 feature map channel의 수는 2배로 증가시킨다.

2) Expansive Path

Expansive Path는 2×2 convolutions를 통해 upsampled된 feature map과 1)의 cropped feature map과의 concatenation 후에 ReLU 연산을 포함한 두 번의 3×3 convolutions 연산을 거친다.

이 때, 1)의 Crop된 featrue map을 보내는 이유는 Convolution을 하면서 border pixel에 대한 정보가 날아가는 것에 대한 양쪽의 보정을 위함이다.

마지막 layer는 1×1 convolution 연산을 하는데 이는 64개의 component feature vector를 desired number of classes에 mapping 하기 위함이다.

(3) Training

input image와 상응하는 segmentation map은 SGD와 함께 network를 학습하기 위해 사용된다. convolution 연산이 padding을 거치지 않기 때문에 input image보다 output image의 크기가 더 작아진다.

Overhead와 GPU memory의 사용을 극대화하기 위하여 큰 batch size보다는 큰 input tiles를 선호된다. 따라서 저자는 높은 momentum(0.99)를 사용해서 과거에 진행했던 training sample이 현재의 update에 더욱 관여하도록 하였다.

Energy function은 최종적인 feature map과 corss entropy loss function, pixel wise soft-max를 결합하여 계산된다.

또한, 논문의 저자는 각각의 Ground truth segmentation의 weight map을 서로 다른 frequency를 대처하고 network에게 작은 separation borders를 학습시키기위해 사전에 weight map을 계산한다. separation border는 morphological operation을 통해 계산되어지며, weight map이 계산되어지는 식은 다음과 같다.

자신들의 실험에서 w0를 10으로 표준편차(σ)를 약 5pixel로 설정했다고 한다. 또한, deep network에서 초기 weight에 대한 good initialization의 중요성에 대해 언급하며, 이상적으로는 초기 weights들은 각각의 feature map이 대략적인 unit variance를 가지도록 설정되어야 한다고 한다.

U-Net은 표준편차를 가지는 가우시안 분포로부터 초기 weights를 도출해낼 수 있다고 한다.

N을 계산하는데에 있어 추가적인 설명을 붙였는데 만약 이전 layer에서 3×3 convolution 연산과 feature channel의 개수가 64개라면 N은 3x3x64 = 576으로 계산될 수 있다고 한다.

실험 결과는 생략하겠다.

[머신러닝 공부] 딥러닝/U-Net

반응형

이전 포스팅에서는 2021년 인턴에서 사용한 GNN에 대해 포스팅했다.

이번엔 2019년 인턴에서 U-Net을 사용한 것에 대해 다시 알아보는 포스팅을 할 것이다.

U-Net

U-Net은 이미지 분할을 목적으로 제안된 End to End 방식의 Fully Convolutional Network 기반 모델이다.

네트워크 구성의 형태가 U 모양이여서 U-Net 이라는이름이 붙여졌다.

레이어를 나열해보면 다음과 같은 형태를 보인다.

U-Net은

1) 이미지의 context 정보를 얻기위한 네트워크와

2) Localization 을 위한 네트워크가

대칭형태로 구성되어 있다.

1) 이미지의 context 정보를 얻기위한 네트워크

즉 encoding 과정을 Contracting Path 라고 부른다.

Fully Convolutional Networks 처럼 VGG 베이스의 아키텍쳐를 지닌다.

2) Localization 을 위한 네트워크

즉 decoding 과정을 Expanding Path 라고 부른다.

높은 차원의 채널을 갖는 Up-sampling으로 얕은 레이어의 특징맵을 결합한다.

Coarse Map에서 Dense Map을 얻기 위한 과정

또한 FCN을 토대로 확장한 것이여서 CoarseMap to DenseMap 뿐 아닌 Skip Architecture 개념도 활용했다.

이를 활용해 얕은 층의 Feature Map을 깊은 층의 Feature Map과 결합하는 방식을 제안하였다.

이러한 CNN 계층과의 결합을 통해 Segmentation이 내제하는 [Localization과 Context] 사이의 trade-off를 해결.

U-Net 네트워크 구성

1) Contracting Path

2) Expanding Path

+ skip Architecture

= 각 expanding step 마다 up-convolution 된 feature map은 contracting path의 cropped 된 특징맵과 concatenation한다.

concatenation : 텐서를 이어붙인다 lsjsj92.tistory.com/456

최종 출력인 Segmentation map의 크기는 Input Image의 크기보다 작다.

(Convolution 연산에서 패딩을 사용하지 않았기 때문이다)

Training

출력값은 픽셀 단위의 Softmax로 예측된다.

즉 최종적인 Feature Map에 대한 픽셀 X의 예측값은 아래와 같다.

(채널:k=클래스의 수, a(x):x의 activation)

Loss Function은 Cross-Entropy 함수가 사용된다.

정리 및 추가사항

U-Net은 Fully Convolutional Networks 보다 확장된 개념의 Up-sampling과 Skip Architecture 를 적용한 모델이다.

FCN-8

FCN 그리고 FCN을 기반으로 한 모델들()은 Semantic Segmentation에서 뛰어난 성능을 보였다. (2015년 발표)

Sementic Segmentation은 픽셀단위로 물체를 구별해내는 기술이다. (개와 고양이가 있다면 그들을 따로 분류하는것. 개와 고양이로 예측이 아니고 그들이 있는 범위를)

Sementic Segmentation은 Bounding box를 구별하는 기초적인 Detection 에서부터 시작한다.

Detection을 하는 모델은 R-CNN, SPPNet, Fast R-CNN , Faster R-CNN 등이 있다.

Detection : 대상의 여부 + 위치 정보를 박스로 나타냄

Sementic Segmentation : 대상의 여부 + 위치정보를 픽셀로 나타냄

순서가 바뀌었지만 다음 포스팅에선 FCN에 대한 정리를 해보고자 한다.

반응형

[DNN] U-net 구조와 code 구현 (MICCAI2015)

반응형

안녕하세요 pulluper 입니다. 🙂

오늘은 u-net 구조와 unet 을 활용한 colorization 에 대하여 알아보겠습니다.

U-net

U-net 이 처음에 제안된 논문은 medical 분야인 MICCAI 2015 학회에서 발표 되었으며

“U-Net: Convolutional Networks for Biomedical Image Segmentation”

arxiv.org/abs/1505.04597

위와 같은 논문입니다. 이 네트워크의 구조는 image segmentation 을 위한 것이며, 이를 더 잘 하기 위해서 만든 구조입니다. 특징으로는 upsampling 구조에 더 많은 channel 이 있어 네트워크가 resolution 을 키울 때 도움을 준다는 점 입니다.

구조

u-net structure

u-net 은 그림과 같이 u자형 형태로 되어 있으며, convolution 과 pooling 을 통해서 feature map 이 줄어드는 부분과 다시 upsampling 을 한 부분을 concatenation 을 하여 그 다음의 feature 로 넘겨주는 구조를 하고 있습니다.

Code

각 층의 convolution 은 2개의 convolution 으로 되어있습니다. 이 2개의 conv 를 사용하는 모듈을 만들면 다음과 같습니다.

class DoubleConv(nn.Module): def __init__(self, nin, nout): super().__init__() self.double_conv = nn.Sequential(nn.Conv2d(nin, nout, 3, padding=1, stride=1), nn.BatchNorm2d(nout), nn.ReLU(inplace=True), nn.Conv2d(nout, nout, 3, padding=1, stride=1), nn.BatchNorm2d(nout), nn.ReLU(inplace=True) ) def forward(self, x): return self.double_conv(x)

그리고 feature map 을 줄이는 down 부분에서는 다음과 같은 모듈을 사용 할 수 있습니다.

class Down(nn.Module): def __init__(self, nin, nout): super().__init__() self.down_conv = nn.Sequential(nn.MaxPool2d(2), DoubleConv(nin, nout)) def forward(self, x): return self.down_conv(x)

그리고 feature map 을 늘리고 concat 을 하는 up 부분에서는 다음과 같은 모듈을 사용 할 수 있습니다.

class Up(nn.Module): def __init__(self, nin, nout): super().__init__() self.up = nn.Upsample(scale_factor=2, mode=’bilinear’, align_corners=True) self.double_conv = DoubleConv(nin, nout) def forward(self, x1, x2): x1 = self.up(x1) # padding diffY = x2.size()[2] – x1.size()[2] diffX = x2.size()[3] – x1.size()[3] x1 = F.pad(x1, (diffX // 2, diffX – diffX // 2, diffY // 2, diffY – diffY // 2)) x = torch.cat([x2, x1], dim=1) x = self.double_conv(x) return x

그리고 마지막 output conv 에서는 다음과 같은 모듈을 사용합니다.

class OutConv(nn.Module): def __init__(self, nin, nout): super(OutConv, self).__init__() self.conv = nn.Conv2d(nin, nout, kernel_size=1) def forward(self, x): return self.conv(x)

u-net model의 총 코드입니다.

import torch import torch.nn as nn import torch.nn.functional as F class DoubleConv(nn.Module): def __init__(self, nin, nout): super().__init__() self.double_conv = nn.Sequential(nn.Conv2d(nin, nout, 3, padding=1, stride=1), nn.BatchNorm2d(nout), nn.ReLU(inplace=True), nn.Conv2d(nout, nout, 3, padding=1, stride=1), nn.BatchNorm2d(nout), nn.ReLU(inplace=True) ) def forward(self, x): return self.double_conv(x) class Down(nn.Module): def __init__(self, nin, nout): super().__init__() self.down_conv = nn.Sequential(nn.MaxPool2d(2), DoubleConv(nin, nout)) def forward(self, x): return self.down_conv(x) class Up(nn.Module): def __init__(self, nin, nout): super().__init__() self.up = nn.Upsample(scale_factor=2, mode=’bilinear’, align_corners=True) self.double_conv = DoubleConv(nin, nout) def forward(self, x1, x2): x1 = self.up(x1) # padding diffY = x2.size()[2] – x1.size()[2] diffX = x2.size()[3] – x1.size()[3] x1 = F.pad(x1, (diffX // 2, diffX – diffX // 2, diffY // 2, diffY – diffY // 2)) x = torch.cat([x2, x1], dim=1) x = self.double_conv(x) return x class OutConv(nn.Module): def __init__(self, nin, nout): super(OutConv, self).__init__() self.conv = nn.Conv2d(nin, nout, kernel_size=1) def forward(self, x): return self.conv(x) class UNet(nn.Module): def __init__(self, nin, nout): super().__init__() self.in_conv = DoubleConv(nin, 64) self.down1 = Down(64, 128) self.down2 = Down(128, 256) self.down3 = Down(256, 512) self.down4 = Down(512, 1024 // 2) self.up1 = Up(1024, 512 // 2) self.up2 = Up(512, 256 // 2) self.up3 = Up(256, 128 // 2) self.up4 = Up(128, 64) self.out_conv = OutConv(64, nout) def forward(self, x): x1 = self.in_conv(x) x2 = self.down1(x1) x3 = self.down2(x2) x4 = self.down3(x3) x5 = self.down4(x4) x = self.up1(x5, x4) x = self.up2(x, x3) x = self.up3(x, x2) x = self.up4(x, x1) x = self.out_conv(x) return x if __name__ == “__main__”: img = torch.rand([10, 1, 256, 256]).cuda() model = UNet(nin=1, nout=2).cuda() print(model.forward(img).size())

네 이렇게 u-net 을 사용하면, input 과 output 의 resolution 이 같은 feature 를 사용할 수 있습니다.

코드는 다음에서 확인 할 수 있습니다.

github.com/csm-kr/dog_cat_colorization

반응형

[딥러닝] FCN 논문 부터 U-net 논문까지 (2/2)

https://github.com/milesial/Pytorch-UNet

Summary

U-Net == Biomedical 분야에서 이미지 분할(Image Segmentation)을 목적으로 제안된 End-to-End 방식의 Fully-Convolutional Network 기반 모델

1) 전반적인 컨텍스트 정보를 얻기 위한 네트워크와 2) 정확한 지역화(Localization)를 위한 네트워크가 대칭 형태로 구성

1) Contracting Path

: 입력 이미지의 문맥 포착(해상도는 안좋은 Coarse Map 생성됨, 그러나 Context 및 개체 정보 잘 포착해서 Sematic에 해당하는 부분)

2) Expanding Path

:Contracting Path의 최종 특징 맵으로부터 보다 높은 해상도의 Segmentation 결과를 얻기 위해 몇 차례의 Up-sampling을 진행한다. Coarse Map에서 Dense Prediction을 얻기 위한 구조 (Sementation을 위한 정교한 아웃라인 그리기)

최종 출력인 Segmentation map의 크기는 Input Image 크기보다 작다는 것이다.

Convolution 연산에서 패딩을 사용하지 않았기 때문이다.

3) overlap-tite 전략 사용

Fully Convolutional Network 구조의 특성상 입력 이미지의 크기에 제약이 없다.

>> 따라서 U-Net 연구팀은 크기가 큰 이미지의 경우 이미지 전체를 사용하는 대신 overlap-tite 전략을 사용

아래 그림처럼 파란색 박스가 인풋이면, 노란색 박스의 Segmentation 결과가 나오고 이렇게 중복되게

노랑 초록 영역의 Segmentation을 완성해감.

그럼 당연히 인풋은 파랑박스, 빨강박스처럼 조금씩은 겹쳐야지 출력 레이어의 부분이 안떨어지고, 그림이 딱 떨어짐!!

>>>> 그래서 Overlap-Tite 전략을 씀

4) 그 외 부분 보간법

그럼 그 외 Padding 부분은 어떻게 보간하냐????

그냥 Extrapolation 기법으로 그냥 채움.

5) Touching cells separation

U-net은 결국에는 생물학적(병리학 세포, 혹은 뇌 MRI, 장기 MRI등에서의 분리)와 같은 것을 목표로 함으로 사전 훈련된 가중치 맵을 사용해서 이러한 닿아있는 부분을 분리함….

6) 학습

Loss Function은 Cross-Entropy 함수가 사용되지만, 위와 같은 Touching Cells 분리를 고려하기 위해 Weight map Loss가 포함된다.

요약 끝.

본문

[1] U-Net Ofiicial Git

U-Net: Semantic segmentation with PyTorch

Customized implementation of the U-Net in PyTorch for Kaggle’s Carvana Image Masking Challenge from high definition images.

[2] U-Net 논문 정리된 리뷰 미디엄

출처 |

U-Net 논문 리뷰 — U-Net: Convolutional Networks for Biomedical Image Segmentation

U-Net은 Biomedical 분야에서 이미지 분할(Image Segmentation)을 목적으로 제안된 End-to-End 방식의 Fully-Convolutional Network 기반 모델이다. 네트워크 구성의 형태(‘U’)로 인해 U-Net이라는 이름이 붙여졌다. 1 U-Net Architecture U-Net은 이미지의 1) 전반적인 컨텍스트 정보를 얻기 위한 네트워크와 2) 정확한 지역화(Localization)를 위한 네트워크가 대칭 형태로 구성되어 있다. 1.1 Contracting Path — 수축 단계 1.2 Expanding Path — 팽창 단계

Expanding Path — 팽창 단계 Expanding Path의 경우 Contracting Path의 최종 특징 맵으로부터 보다 높은 해상도의 Segmentation 결과를 얻기 위해 몇 차례의 Up-sampling을 진행한다. 다시 말해, Coarse Map에서 Dense Prediction을 얻기 위한 구조이다. U-Net은 FCN(Fully convolutional network)을 토대로 확장한 개념이기 때문에 명확한 이해를 돕기 위해 우선적으로 FCN을 이해하는 것이 바람직하다. FCN 논문 리뷰 — Fully Convolutional Networks for Semantic Segmentation 딥러닝 기반 OCR 스터디 — FCN 논문 리뷰 medium.com Coarse Map to Dense Map 개념 뿐만 아니라 U-Net은 FCN의 Skip Architecture 개념도 활용하여 얕은 층의 특징맵을 깊은 층의 특징맵과 결합하는 방식을 제안하였다. 얕은 층의 fine location 정보와 깊은 층의 global semantic 정보를 결합하는 skip architecture 이러한 CNN 네트워크의 Feature hierarchy의 결합을 통해 Segmentation이 내제하는 Localization과 Context(Semantic Information) 사이의 트레이드 오프를 해결할 수 있다. 2. Architecture Detail 대칭 구조의 네트워크 구성을 더 자세하게 들여다 보자. 2.1 The Contracting Path 3×3 convolutions을 두 차례씩 반복 (패딩 없음)

활성화 함수는 ReLU

2×2 max-pooling (stride: 2)

Down-sampling 마다 채널의 수를 2배로 늘림 Expanding Path는 Contracting Path와 반대의 연산으로 특징맵을 확장한다. 2.2 The Expanding Path 2×2 conv olution (“up-convolution”)

3×3 conv olutions을 두 차례씩 반복 (패딩 없음)

Up-Conv를 통한 Up-sampling 마다 채널의 수를 반으로 줄임

활성화 함수는 ReLU

Up-Conv 된 특징맵은 Contracting path의 테두리가 Cropped된 특징맵과 concatenation 함

마지막 레이어에 1×1 convolution 연산 위와 같은 구성으로 총 23-Layers Fully Convolutional Networks 구조이다. 주목해야 하는 점은 최종 출력인 Segmentation map의 크기는 Input Image 크기보다 작다는 것이다. Convolution 연산에서 패딩을 사용하지 않았기 때문이다. 3. Overlap-Tite Input Fully Convolutional Network 구조의 특성상 입력 이미지의 크기에 제약이 없다. 따라서 U-Net 연구팀은 크기가 큰 이미지의 경우 이미지 전체를 사용하는 대신 overlap-tite 전략을 사용하였다. 위와 같이 이미지를 타일(Tile; Patch)로 나눠서 입력으로 사용한다. 파란 영역의 이미지를 입력하면 노란 영역의 Segmentation 결과를 얻는다. 다음 tile에 대한 Segmentation을 얻기 위해서는 이전 입력의 일부분이 포함되어야 한다. 이러한 이유로 Overlap-Tite 전략이라 칭한다. 이미지의 경계 부분 픽셀에 대한 세그멘테이션을 위해 0이나 임의의 패딩값을 사용하는 대신 이미지 경계 부분의 미러링을 이용한 Extrapolation 기법(보간)을 사용하였다. 원본 이미지의 경계부분이 거울에 반사된 것 처럼 확장되어 있다. 4. Touching cells separation 세포 분할(Segmentation) 작업에서 주요한 과제 중 하나는 동일한 클래스의 접촉 개체를 분리하는 것이다. 닿아 있는 세포 사이의 경계부분을 분리하기 위해 사전에 학습된 가중치 맵을 사용 한다. 이미지 c, d와 같이 각 세포 사이의 경계를 포착할 수 있어야 한다. 이를 위해 학습 데이터에서 각 픽셀마다 클래스 분포가 다른 점을 고려하여 사전에 Ground-Truth에 대한 Weight map을 구해 학습에 반영하였다. Weight map to balance the class frequencies The distance to the border of the nearest cell The distance to the border of the second nearest cell 5. 모델 학습 Training 네트워크의 출력 값은 픽셀 단위의 Softmax로 예측된다. 즉, 최종 특징 맵(채널 k)에 대한 픽셀 x의 예측 값은 다음과 같이 계산된다. a(x)는 픽셀 x의 activation, K는 클래스의 수 따라서, Loss Function은 Cross-Entropy 함수가 사용된다. 다만 Touching Cells 분리를 고려하기 위해 Weight map Loss가 포함된다. Momentum : 0.99

Gaussian distribution 학습 파라미터 초기화 정리 U-Net은 FCNs보다 확장된 개념의 Up-sampling과 Skip Architecture를 적용한 모델을 제안하였다. 결과적으로 U-Net의 구조는 아주 적은 양의 학습 데이터만으로 Data Augmentation을 활용하여 여러 Biomedical Image Segmentation 문제에서 우수한 성능을 보여주었다.

[3] 파이토치릍 통한 U-net Architecture 실습

“”” Full assembly of the parts to form the complete network “”” import torch.nn.functional as F from .unet_parts import * class UNet(nn.Module): def __init__(self, n_channels, n_classes, bilinear=True): super(UNet, self).__init__() self.n_channels = n_channels self.n_classes = n_classes self.bilinear = bilinear self.inc = DoubleConv(n_channels, 64) self.down1 = Down(64, 128) self.down2 = Down(128, 256) self.down3 = Down(256, 512) factor = 2 if bilinear else 1 self.down4 = Down(512, 1024 // factor) self.up1 = Up(1024, 512 // factor, bilinear) self.up2 = Up(512, 256 // factor, bilinear) self.up3 = Up(256, 128 // factor, bilinear) self.up4 = Up(128, 64, bilinear) self.outc = OutConv(64, n_classes) def forward(self, x): x1 = self.inc(x) x2 = self.down1(x1) x3 = self.down2(x2) x4 = self.down3(x3) x5 = self.down4(x4) x = self.up1(x5, x4) x = self.up2(x, x3) x = self.up3(x, x2) x = self.up4(x, x1) logits = self.outc(x) return logits

https://github.com/milesial/Pytorch-UNet/blob/67bf11b4db4c5f2891bd7e8e7f58bcde8ee2d2db/unet/unet_model.py#L8

키워드에 대한 정보 u net 설명

다음은 Bing에서 u net 설명 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

See also  이벤트 복 포토 리뷰 | 이벤트 코스프레 고퀄/저렴/스타킹 사이트 추천해줄게요! ♥ 1784 투표 이 답변
See also  장학 재단 생활비 대출 | 한국장학재단 생활비대출 + 꼰대 리얼후기 상위 8개 베스트 답변

See also  Como Hacer Bancos De Palets Para Exterior | Banco De Palets 상위 8개 베스트 답변

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [Paper Review] U-Net: Convolutional Networks for Biomedical Image Segmentation

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기
[Paper #Review] #U-Net: #Convolutional #Networks #for #Biomedical #Image #Segmentation


YouTube에서 u net 설명 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [Paper Review] U-Net: Convolutional Networks for Biomedical Image Segmentation | u net 설명, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment