본문 바로가기
AI/딥러닝

[AI 부트캠프] DAY 88 - 트랙학습 CV 2

by HOHHOH 2023. 11. 24.

[오늘의 일지]

트랙학습 녹화 강의 - 의료 데이터를 활용한 CV

[상세 내용]

의료 데이터를 활용한 CV

의료데이터 파악하기

- 원래 의료데이터는 개인정보와 연관이 많이 되어있다 보니 공개된 자료를 찾기가 굉장히 힘들고 폐쇄성이 높다고 알려져 있습니다. 그래서 해당 강의에서는 캐글의 대회에서 공개한 의료 데이터를 이용해서 실습을 진행하고 있었습니다.

 

코로나에 걸린 폐 이미지

- CNN의 실습을 위한 데이터는 코로나 당시의 데이터로서 코로나의 걸린 폐와 일반 폐 그리고 폐렴에 걸린 폐를 비교하는 데이터였습니다. CNN을 이용해서 코로나에 걸린 폐를 학습시킨 후에 예측을 하는 실습이었습니다. 

예시 이미지

이미지 불러오기

def list_image_files(data_dir, sub_dir):
    image_format = ["jpeg", "jpg", "png"]
    
    image_files = []
    images_dir = os.path.join(data_dir, sub_dir)
    for file_path in os.listdir(images_dir):
        if file_path.split(".")[-1] in image_format:
            image_files.append(os.path.join(sub_dir, file_path))
    return image_files
    
data_dir = "../DATASET/Classification/train/"

normals_list = list_image_files(data_dir, "Normal")
covids_list = list_image_files(data_dir, "Covid")
pneumonias_list = list_image_files(data_dir, "Viral Pneumonia")

 

3차원 배열로 불러오기

import cv2

def get_RGB_image(data_dir, file_name):
    image_file = os.path.join(data_dir, file_name)
    image = cv2.imread(image_file)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    return image

 

연산 가능한 텐서로 변경

transformer = transforms.Compose([
    transforms.ToTensor(),
    transforms.Resize((224, 224)),
    transforms.Normalize(mean=[0.5, 0.5, 0.5],
                         std=[0.5, 0.5, 0.5])
])

train_dset = Chest_dataset(train_data_dir, transformer)

 

학습 및 평가

- 이 부분은 어제 학습했던 부분과 비슷해서 생략하겠습니다. 평가는 accuracy와 crossentropy 로스함수를 이용했다는 점도 비슷했습니다.

 

Semantic segmentation를 이용한 CT 복원 영상의 폐, 기도, 심장 가이드 영상 만들기

- 이 수업은 생각보다 더 어려워서 나중에 다시 반복해서 들으면서 추후에 다시 리뷰하면 좋을 거 같다고 생각했습니다. 우선 간략하게 정리해 보겠습니다.

 

Semantic segmentation
- 컴퓨터 비전 분야에서 이미지를 픽셀 수준에서 분류하는 작업을 말합니다. 각 픽셀은 해당하는 객체 또는 클래스에 할당되며, 이미지 내의 모든 픽셀에 대한 세분화된 정보를 제공합니다. Semantic segmentation의 목표는 이미지에서 다양한 객체 또는 영역을 식별하고, 각 픽셀을 해당하는 객체 또는 클래스에 할당하는 것입니다. 이를 통해 시각적으로 구별 가능한 세부 사항을 추출하여 더 높은 수준의 이해와 해석을 가능하게 합니다.

 

U-net

- 이번 수업에서는 Semantic segmentation 중에서 U-net을 이용해서 학습을 진행했습니다. U-net은 입력 이미지를 인코딩과 디코딩을 아래와 같이 거쳐서 학습을 시키는 모델입니다. 설정하는 코드는 생각보다 복잡해서 복습을 많이 해봐야 될 거 같습니다.

출처:https://towardsdatascience.com/unet-line-by-line-explanation-9b191c76baf5

 

- 인코더

class Encoder(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv_block1 = ConvLayer(in_channels=3, out_channels=64)
        self.conv_block2 = ConvLayer(in_channels=64, out_channels=128)
        self.conv_block3 = ConvLayer(in_channels=128, out_channels=256)
        self.conv_block4 = ConvLayer(in_channels=256, out_channels=512)
        self.conv_block5 = ConvLayer(in_channels=512, out_channels=1024)
        self.pool = nn.MaxPool2d(kernel_size=2)

    def forward(self, x):
        encode_features = []
        out = self.conv_block1(x)
        encode_features.append(out)
        out = self.pool(out)

        out = self.conv_block2(out)
        encode_features.append(out)
        out = self.pool(out)

        out = self.conv_block3(out)
        encode_features.append(out)
        out = self.pool(out)

        out = self.conv_block4(out)
        encode_features.append(out)
        out = self.pool(out)

        out = self.conv_block5(out)
        return out, encode_features

 

 

- 디코더 

class Decoder(nn.Module):
    def __init__(self):
        super().__init__()
        self.upconv_layer1 = UpConvLayer(in_channels=1024, out_channels=512)
        self.conv_block1 = ConvLayer(in_channels=512+512, out_channels=512)

        self.upconv_layer2 = UpConvLayer(in_channels=512, out_channels=256)
        self.conv_block2 = ConvLayer(in_channels=256+256, out_channels=256)

        self.upconv_layer3 = UpConvLayer(in_channels=256, out_channels=128)
        self.conv_block3 = ConvLayer(in_channels=128+128, out_channels=128)

        self.upconv_layer4 = UpConvLayer(in_channels=128, out_channels=64)
        self.conv_block4 = ConvLayer(in_channels=64+64, out_channels=64)

    def forward(self, x, encoder_features):
        out = self.upconv_layer1(x)
        croped_enc_feature = self._center_crop(encoder_features[-1], out.shape[2:])
        out = torch.cat([out, croped_enc_feature], dim=1)
        out = self.conv_block1(out)

        out = self.upconv_layer2(out)
        croped_enc_feature = self._center_crop(encoder_features[-2], out.shape[2:])
        out = torch.cat([out, croped_enc_feature], dim=1)
        out = self.conv_block2(out)

        out = self.upconv_layer3(out)
        croped_enc_feature = self._center_crop(encoder_features[-3], out.shape[2:])
        out = torch.cat([out, croped_enc_feature], dim=1)
        out = self.conv_block3(out)

        out = self.upconv_layer4(out)
        croped_enc_feature = self._center_crop(encoder_features[-4], out.shape[2:])
        out = torch.cat([out, croped_enc_feature], dim=1)
        out = self.conv_block4(out)
        return out

    def _center_crop(self, encoder_feature, decoder_feature_size):
        croped_features = transforms.CenterCrop(size=decoder_feature_size)(encoder_feature)
        return croped_features

 

[마무리]

 오늘은 일정이 갑작스럽게 바뀌면서 실시간 강의가 예정되어 있었지만 급하게 녹화 강의를 듣게 되었습니다. 난이도가 생각보다 많이 높아져서 이해하는 것만으로도 힘들었던 거 같습니다. 강의 내용도 실습 위주로 하는 바람에 따라가기도 굉장히 힘들었습니다. 그래서 전부 이해하는 것을 포기하고 한번 훑어보는 것으로 마무리했습니다. 그래도 다행인 점은 앞으로 트랙학습만 수업이 남아있기 때문에 남은 3개월을 CV를 위해서 최대한 공부해 보면 좋을 거 같다고 생각했습니다.

반응형

댓글