본문 바로가기
AI Naver boost camp/[Week 04] CV 1

ZFNet 딥러닝 모델 시각화와 데이터 증강(Augumentation) 이해

by AI-BT 2024. 8. 29.
728x90
반응형

ZFNet 

1. ZFNet 이란?

딥러닝이 놀라운 성능을 보여주지만,

많은 사람들에게 딥러닝 모델, 특히 CNN(Convolutional Neural Networks) 모델의 내부는

여전히 "블랙박스"처럼 느껴집니다.

 

왜냐하면, 우리가 이미지를 입력하면 모델은 수많은 계산을 거쳐 결과를 출력하지만,

그 과정이 눈에 보이지 않기 때문이죠.

 

하지만, 우리는 ZFNet(Zeiler and Fergus Network)을 통해 이 블랙박스의 내부를 들여다볼 수 있습니다.

ZFNet은 AlexNet을 기반으로 발전된 CNN 모델로, 특히 CNN의 내부 작동 방식을 시각화하여 우리가 CNN이 이미지를 어떻게 처리하는지 더 잘 이해할 수 있게 도와줍니다.


 

2. ZFNet 적용 코드

 

import os
import torch
import torch.nn as nn
from torchvision import models, transforms
from torch.utils.data import DataLoader
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

# Pre-trained VGG16 모델 로드
model = models.vgg16(pretrained=True).features
model.eval()

# 이미지를 모델에 넣기 위해 전처리하는 함수
preprocess = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 이미지를 불러와서 전처리
img = Image.open('./hangang.jpg')
input_tensor = preprocess(img)
input_batch = input_tensor.unsqueeze(0)

# 이미지를 CNN에 통과시키고 중간 레이어의 출력을 저장
activations = []


# 이미지가 네트워크를 통과할 때 각 레이어의 출력을 저장
def hook_fn(module, input, output):
    activations.append(output)


# 각 레이어에 hook을 걸어줌
for layer in model:
    layer.register_forward_hook(hook_fn)

# 이미지가 모델을 통과
output = model(input_batch)

# 시각화할 레이어 선택 (여기서는 첫 번째 컨볼루션 레이어)
activation = activations[0].squeeze().detach().numpy()

# 시각화
fig, axes = plt.subplots(4, 4, figsize=(10, 10))
for i, ax in enumerate(axes.flat):
    if i < activation.shape[0]:
        ax.imshow(activation[i], cmap='viridis')
    ax.axis('off')

plt.show()

 


 

3. 이미지 출력 결과

 

 

특정 특징 강조
각 서브 이미지를 보면, 어떤 필터는 건물의 윤곽을 강조하고,
어떤 필터는 하늘의 대비를 강조하는 등 서로 다른 부분에 주목하는 것을 볼 수 있습니다.

이는 CNN이 이미지의 여러 특징들을 단계적으로 추출하고 있음을 시사합니다.
초기 레이어는 주로 단순한 가장자리나 텍스처 같은 저수준 특징에 반응하는 반면,
후속 레이어는 점점 더 복잡한 패턴이나 모양에 반응할 수 있습니다.

 

 

활성화 강도
이미지의 밝기나 색상 강도는 해당 필터가 얼마나 강하게 반응하는지를 나타냅니다.
더 밝은 부분은 필터가 해당 부분에 더 강하게 반응하고 있음을 의미합니다.

예를 들어, 특정 필터가 특정 부분에서 매우 밝게 나타난다면,
해당 필터가 그 부분에 있는 특정 패턴이나 형상을 강하게 인식하고 있다는 뜻입니다.


4. Low, Middle, High Feature

 

- Low Level Feature (저수준 특징)

Low Level Feature는 CNN의 초기 레이어에서 추출된 특징들을 의미합니다.
이 레이어는 이미지의 기본적인 정보를 분석하는 단계로,
주로 가장자리(edge), 선(line), 텍스처(texture) 같은 단순하고 원초적인 패턴들을 인식합니다.

이를 이해하기 쉽게 비유하자면,
Low Level Feature는 마치 퍼즐을 풀기 위해 각 조각의 가장자리와 모서리를 먼저 찾아내는 과정과 같습니다.

 

이러한 Low Level Feature들은 이미지의 기본적인 구조를 이해하는 데 중요한 역할을 합니다.
예를 들어, 얼굴을 인식할 때, 눈, 코, 입의 가장자리와 같은 기본적인 특징이 가장 먼저 인식되는 것처럼 이해하면 됩니다.

 

- Middle Level Feature (중간 수준 특징)

Middle Level Feature는 CNN의 중간 레이어에서 추출된 특징들로,
여러 저수준 특징들이 결합되어 더 복잡한 패턴이나 **형태(형상)**를 인식하는 단계입니다.
이 레이어에서는 곡선이나 특정 모양이 포함된 부분을 인식하며,
여러 Low Level Feature들을 조합하여 사물의 일부분이나 윤곽을 추출합니다.

 

중간 수준 특징들은 이미지 내에서 더 구체적인 부분을 인식하고, 이러한 부분들을 연결하여 사물의 일부분을 파악합니다. 예를 들어, 중간 레이어는 얼굴의 윤곽이나 특정 패턴을 인식할 수 있습니다.

 

- High Level Feature (고수준 특징)

High Level Feature는 CNN의 깊은 레이어에서 추출된 특징들로, 구체적인 객체나 사물의 전체적인 형태를 인식합니다.

이 단계에서는 앞서 추출된 모든 특징들이 결합되어, CNN이 입력 이미지에서 전체적인 의미를 이해하고,
최종적으로 예측을 수행할 수 있도록 합니다.

 

이 단계에서 CNN은 단순히 이미지의 특정 부분을 인식하는 것이 아니라,
객체나 사물의 전체적인 구조와 의미를 이해하게 됩니다.
이로 인해 모델은 이미지를 보고 무엇이 포함되어 있는지를 정확히 예측할 수 있게 됩니다.

 

import torch
import torch.nn as nn
from torchvision import models, transforms
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

# VGG16 모델을 로드하고, 중간 레이어를 추출하기 위한 기능 설정
model = models.vgg16(pretrained=True).features
model.eval()

# 이미지를 전처리하는 함수
preprocess = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 이미지를 불러와서 전처리
img = Image.open('./hangang.jpg')
input_tensor = preprocess(img)
input_batch = input_tensor.unsqueeze(0)

# 모델의 특정 레이어를 선택하여 활성화 맵을 추출하는 함수


def get_activation(layer, x):
    activations = []

    def hook_fn(module, input, output):
        activations.append(output)
    hook = layer.register_forward_hook(hook_fn)
    model(x)
    hook.remove()
    return activations[0]


# Low, Middle, High 레벨 특징을 추출할 레이어 지정
low_level_layer = model[0]  # 첫 번째 Conv 레이어
middle_level_layer = model[5]  # 중간 Conv 레이어 (예: ReLU 이후)
high_level_layer = model[10]  # 깊은 Conv 레이어 (예: ReLU 이후)

# 각 레벨에서의 활성화 맵을 추출
low_level_activation = get_activation(low_level_layer, input_batch)
middle_level_activation = get_activation(middle_level_layer, input_batch)
high_level_activation = get_activation(high_level_layer, input_batch)

# 활성화 맵 시각화 함수


def plot_activation(activation, title):
    fig, axes = plt.subplots(4, 4, figsize=(12, 12))
    fig.suptitle(title, fontsize=16)
    for i, ax in enumerate(axes.flat):
        if i < activation.size(1):
            ax.imshow(activation[0, i].detach().numpy(), cmap='viridis')
        ax.axis('off')
    plt.show()


# Low, Middle, High Level Features 시각화
plot_activation(low_level_activation, 'Low Level Features')
plot_activation(middle_level_activation, 'Middle Level Features')
plot_activation(high_level_activation, 'High Level Features')

 

 

 

728x90
반응형

'AI Naver boost camp > [Week 04] CV 1' 카테고리의 다른 글

딥러닝 Motion Magnification  (6) 2024.08.29
Class Activation Mapping (CAM)과 Grad-CAM  (0) 2024.08.29

댓글