Semantic Segmentation
semantic segmentation은 위와 같이 이미지를 픽셀 단위로 분류하는 것을 말한다. 흔히 아는 자율 주행에도 이 기술이 들어갑니다.
한 장의 화상에 포함된 여러 물체의 영역과 이름을 픽셀 수준에서 지정하는 작업을 시맨틱 분할(semantic segmentation)이라고 합니다.
obejcet detection이 물체를 커다란 직사각형의 BBox로 묶었지만 시맨틱 분할에서는 픽셀 수준으로 어디에서 어디까지 어떠한 클래스 물체인지 라벨을 붙입니다.
제조업의 흠집 탐지, 의료 영상 진단의 병변 감지, 자율 운전의 주변 환경 파악 등에서 시맨틱 분할 기술을 사용합니다.
이를 구현 하기 위해 Fully Convolutional Network(FCN)을 도입하게 된다.
Fully Convolutional Network(FCN)
- Modern CNN 구조는 맨 뒤에서 affine layer가 들어가게 되면서 후반부에는 outpu이 flatten 되어 각 output의 위치정보가 소실되는 단점이 있었다.
- FCN에서는 affine layer 대신 1 x 1 kernel을 가진 convolutional layer를 넣어줌으로써 결과적으로 output의 위치정보를 유지할 수 있다.
- 그리고 위치정보를 남길뿐만아니라, input의 size도 자유로워졌다. 본래 affine layer는 input 크기가 딱딱 맞춰 들어와야 했는데, convolution 연산에서는 거듭 말하지만 커널의 사이즈가 input size와 독립적이기 때문에 어느 입력이든 받아들일 수 있다. 물론 input이 커지면 output도 커지고, input이 작아지면 output도 작아진다.
- 다만 convolution을 거치면 보통 output의 spatial dimension은 줄어들게 된다. 따라서 원본 이미지와 크기가 같도록 늘려줄 필요성이 있다.
- 이를 위해 upsampling(확장), deconvolution(역합성곱)을 해주게 되는데, 사실 엄밀히 말하면 convolution의 역연산은 존재할 수 없지만, 맥락이 통하므로 이러한 용어를 사용한다.
- 위와 같이 최종 output에 패딩을 많이 주어서 그것으로 원본 이미지 크기를 만들 수 있는 convolution 연산을 돌리게 되면 이미지를 복원할 수 있다.
PSPNet을 활용한 물체 감지 흐름
- 입력 : 이미지
- 출력 : 각 픽셀이 속한 클래스의 라벨 정보
- semantic segmentation 순서
- 이미지 전처리(리사이즈, 정규화)
- 이미지를 pspnet에입력
- pspnet 출력이 최댓값인 클래스 추출
- (클래스수 x 475 x 475)의 배열 -> (475 x 475)의 배열
- 3단계의 출력(475 x 475) 배열을 원본 이미지 크기로 복원
PSPNet 구성
PSPNet은 4개의 모듈인 Feature, Pyramid Pooling, Decoder, AuxLoss
로 구성되어 있다.
- Feature 모듈 (Encoder 모듈)
- 입력 이미지의 특징을 파악
- 출력 : 2048 x 60 x 60 (채널 x 높이 x 폭)
- 이미지의 특징을 파악한 2048ch과 이미지 크기가 60x60으로 변환됨.
- Pyramid Pooling 모듈
- 어떠한 픽셀의 물체 라벨을 구하려면 다양한 크기로 해당 픽셀 주변 정보가 필요
- Pyramid Pooling 모듈에서는 네 가지 크기의 특징량 맵을 준비
이미지 전체 크기
,이미지 절반 크기
,이미지 1/3 크기
,이미지 1/6 크기
- 출력 : 4096 x 60 x 60
- Decoder 모듈(업샘플링 모듈)
- Pyramid Pooling 모듈의 출력을 21 x 60 x 60(클래스 수 x 높이 x 폭) 텐서로 변환
- 21 x 60 x 60 (클래스 수 x 높이 x 폭)으로 변환된 텐서를 원 이미지 크기에 맞도록 변환(21 x 475 x 475)
- 출력 : 21 x 475 x 475
- 추론 시 Decoder 모듈의 출력으로 출력에 대한 최대 확률의 물체 클래스를 찾아 각 픽셀의 라벨을 결정.
- AuxLoss (보조 loss)
- 손실 함수 게산을 보조
- Feature 모듈로 중간 정보를 빼내 입력 데이터로 사용
- Decoder 모듈처럼 각 픽셀에 대응하는 물체 라벨 추정 클래스 분류 실행
- 입력 : 1024 x 60 x 60, 출력 : 21 x 475 x 475
- AuxLoss 모듈은 Feature 층의 중간까지 결과로 시맨틱 분할을 실시하여 분류 정확도는 떨어진다. 하지만 오차 역전파법 수행 시 Feature 층 중간까지의 네트워크 파라미터 학습을 보조하는 역할을 한다.
- 학습 시에는 AuxLoss 모듈을 사용하지만 추론 시에는 AuxLoss 모듈의 출력은 사용하지 않고 Decoder 모듈의 출력만으로 semantic segmantation을 실행한다.
reference
'딥러닝 > Vision' 카테고리의 다른 글
stable diffusion (0) | 2023.07.04 |
---|---|
diffusion (0) | 2023.07.04 |
Mask R-CNN (0) | 2022.03.30 |
Object Detection (0) | 2022.03.30 |
CNN with pytorch (0) | 2022.02.12 |