Semantic Segmentation 8

8. 시맨틱 분할 추론

추론 파일 경로 리스트를 만든다. VOC 데이터셋 화상이 아니라 승마 화상에 대해 추론하며 어노테이션 화상을 한 장 사용한다. 어노테이션 화상을 사용하는 두 가지 이유가 있다. 첫째, 어노테이션 화상이 없으면 전처리 클래스의 함수가 제대로 작동하지 않게 된다. 실제로는 추론에 사용하지 않지만 더미 데이터로서 함수에 전달한다. 둘째, 어노테이션 화상에서 색상 팔레트 정보를 추출하지 않으면 물체 라벨에 해당하는 색상 정보가 존재하지 않게 된다. from utils.dataloader import make_datapath_list, DataTransform # 파일 경로 리스트 작성 rootpath = "./data/VOCdevkit/VOC2012/" train_img_list, train_anno_list,..

7. 파인튜닝을 활용한 학습 및 검증 실시

PSPNet의 학습 및 검증을 구현하고 실행해보자. 처음부터 PSPNet을 학습시키지 않고 학습된 모델을 사용하여 파인튜닝한다. 데이터 준비 학습된 모델로 파인튜닝을 실행한다. pspnet50_ADE20K.pth를 다운로드한다. 학습한 PSPNet의 결합 파라미터를 초깃값으로 하여 VOC2012 데이터셋을 파인튜닝한다. 학습 및 검증 구현 # 패키지 import import random import math import time import pandas as pd import numpy as np import torch import torch.utils.data as data import torch.nn as nn import torch.nn.init as init import torch.nn.funct..

6. Decoder, AuxLoss 모듈

Decoder 및 AuxLoss 모듈 구조 이 두 모듈은 Pyramid Pooling 또는 Feature 모듈에서 출력된 텐서 정보를 Decode(읽기) 한다. 텐서 정보를 읽은 후 픽셀별로 물체 라벨을 클래스 분류로 추정하고 마지막으로 화상 크기를 원래의 475x475로 업샘플링 한다. Decoder 및 AuxLoss 모듈에서 최종 출력되는 텐서는 21x475x475(클래스 수 x 높이 x 폭)이다. 출력 텐서는 화상의 각 픽셀에 21종류 클래스의 확률이 대응하는 값(신뢰도)이다. 해당 값이 가장 큰 클래스가 그 픽셀이 속하는 것으로 예측된 물체 라벨이다. Decoder 및 AuxLoss 모듈 구현 class DecodePSPFeature(nn.Module): def __init__(self, heig..

5. Pyramid Pooling 모듈

Pyramid Pooling 모듈의 서브 네트워크 구조 Pyramid Pooling 모듈은 PyramidPooling 클래스로 이루어진 하나의 서브 네트워크로 구성되었다. 다음 그림은 PyramidPooling 클래스의 구조이다. Pyramid Pooling 모듈의 입력은 Feature 모듈에서 출력된 크기 2048x60x60의 텐서이다. 이 입력이 다섯 개로 분기된다. 가장 위의 분기는 Adaptive Average Pooling(출력=6)으로 보내진다. Adaptive Average Pooling층은 출력을 통해 화상(높이 x 폭)을 지정된 크기로 변환되도록 Average Pooling을 한다. 즉 60x60 해상도였던 입력이 특징량 스케일을 6x6 해상도로 변환할 수 있다. Adaptive Aver..

4. Feature 모듈 설명 및 구현(ResNet)

Featuer 모듈의 서브 네트워크 구성 다음 그림은 Feature 모듈의 서브 네트워크 구성을 보여준다. Feature 모듈은 다섯 개의 서브 네트워크인 FeatureMap_convolution, 두 개의 ResidualBlockPSP, 두 개의 dilated(확장))판 ResidualBlockPSP로 구성된다. 서브 네트워크 FeatuerMap_convolution 다음 그림은 FeatureMap_convolutoin 유닛(층)을 나타낸다. 이 층은 단순히 합성곱, 배치 정규화, 최대 풀링으로 화상의 특징량을 추출하는 역할을 한다. 먼저 구현하기 위해 conv2dBatchNormRelu 클래스를 만든다. ReLU 구현 부분에서 nn.ReLU(inplace=True)의 inplace는 메모리 입출력을 ..

3. PSPNet 네트워크 구성 및 구현

PSPNet 구성 모듈 다음 그림은 PSPNet 모듈 구성을 보여준다. PSPNet은 네 개의 모듈인 Feature,Pyramid Pooling, Decoder, AuxLoss로 구성되어 있다. PSPNet의 첫 번째 모듈은 Feature 모듈이며 Encoder 모듈로도 불린다. 입력 화상의 특징을 파악하는 것이 Feature 모듈의 목적이다. 두 번째 모듈은 Pyramid Pooling 모듈이다. PSPNet의 독창성을 보여주는 모듈이다. Pyramid Pooling 모듈로 해결하려는 문제는 '어떠한 픽셀의 물체 라벨을 구하려면 다양한 크기로 해당 픽셀 주변 정보가 필요'하다. 예를 들어 하나의 픽셀만 보면 소의 등인지 말의 등인지 알 수 없지만 해당 픽셀 주위를 점진적으로 확대한 특징량을 확인하면 소..

2. 데이터셋과 데이터 로더 구현

화상 데이터 및 어노테이션 데이터 파일의 경로 리스트 작성 # 패키지 import import os.path as osp from PIL import Image import torch.utils.data as data import matplotlib.pyplot as plt def make_datapath_list(rootpath): """ 학습, 검증용 화상 데이터와 어노테이션 데이터의 파일 경로 리스트를 작성한다. Parameters ---------- rootpath : str 데이터 폴더의 경로 Returns ------- ret : train_img_list, train_anno_list, val_img_list, val_anno_list 데이터의 경로를 저장한 리스트 """ # 화상 파일과 어..

1. 시맨틱 분할이란

이번 포스팅에서는 화상 처리 중 하나인 시맨틱 분할(semantic segmentation)을 학습하면서 딥러닝 모델인 PSPNet(Pytamid Scene Parsing Network)를 설명한다. 먼저 시맨틱 분할의 개요와 VOC 데이터셋, PSPNet을 활용한 시맨틱 분할의 입출력에 대해 알아보겠다. 개요 한 장의 화상에 포함된 여러 물체의 영역과 이름을 픽셀 수준에서 지정하는 작업을 시맨틱 분할이라고 한다. 다음 그림은 학습시킨 모델로 분할한 결과이다. 시맨틱 분할에서는 픽셀 수준으로 '어디에서 어디까지 어떠한 클래스 물체인지' 라벨을 붙인다. 제조업의 흠집 탐지, 의료 영상 진단의 병변 감지, 자율 운전의 주변 환경 파악 등에서 시맨틱 분할 기술을 사용한다. 시맨틱 분할의 입출력 시맨틱 분할의 ..