728x90
반응형
영상 및 이미지 기초
이미지와 영상의 기본 개념
- 이미지 : 픽셀로 이루어진 2차원 배열
- RGB 이미지의 경우, 세 개의 채널(R, G, B)을 가짐
- 영상 : 시간에 따라 변화하는 이미지의 연속
- 프레임 단위로 처리
데이터 전처리
- Normalization(정규화) : 픽셀 값을 0-1 범위로 조정
- Augmentation(증강) : 데이터를 다양하게 변형하여 학습 데이터를 늘림
- 회전, 자르기, 색상변화 등
컨볼루션 층
- 필터(Filter)와 커널(Kernel)
- 필터(또는 커널) : 작은 크기의 행렬로, 일반적으로 3 x 3, 5 x 5, 7 x 7 크기를 가짐
- 필터는 이미지의 일부 영역을 스캔하면서 점곱 연산을 수행하여 결과를 생성
- 스트라이드
- 필터가 이미지 위를 이동하는 단계의 크기
- 스트라이드가 1이면 필터가 한 칸씩 이동, 스트라이드가 2이면 두 칸씩 이동
- 스트라이드가 클수록 출력 크기는 줄어듬
- 패딩
- 입력 이미지의 경계 부분을 처리하기 위해 여백을 추가하는 방법
- 패딩 유형
- Valid Padding : 패딩을 추가하지 않음, 출력 크기가 줄어듬
- Same Padding : 출력 크기가 입력 크기와 동일하게 유지되도록 패딩을 추가
- 출력 크기 계산
- 컨볼루션 층의 출력 크기는 아래 공식을 사용하여 계산
- 출력크기=(입력크기−필터크기+2)∗패딩스트라이드+1출력크기 = \frac{(입력크기-필터크기+2)*패딩}{스트라이드}+1
- 컨볼루션 층의 출력 크기는 아래 공식을 사용하여 계산
- 컨볼루션 연산
- 입력 이미지에 필터를 적용하여 특성 맵(feature map)을 생성
- 각 특성 맵은 필터가 이미지에서 감지한 특정 패턴을 나타냄
- 활성화 함수
- 컨볼루션 연산 후, 비선형을 추가하기 위해 ReLU와 같은 활성화 함수를 적용
- 모델이 복잡한 패턴을 학습할 수 있게 도와줌
- 컨볼루션 연산 후, 비선형을 추가하기 위해 ReLU와 같은 활성화 함수를 적용
컨볼루션 예시코드
import torch
import torch.nn as nn
# 입력 이미지 생성 (배치 크기 1, 채널 1개, 높이 32, 너비 32)
input_image = torch.randn(1, 1, 32, 32)
# 컨볼루션 레이어 정의 (입력 채널 1, 출력 채널 16, 필터 크기 3x3, 스트라이드 1, 패딩 same)
conv_layer = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, stride=1, padding=1)
conv_output = conv_layer(input_image)
print("Conv Layer Output Shape:", conv_output.shape)
풀링
- 컨볼루션 신경망에서 중요한 역할을 하는 연산 중 하나
- 이미지의 공간적인 크기를 줄이고, 계산 비용을 줄이며, 특정 특징을 강화하기 위해 사용
- 풀링은 필터를 사용하여 이미지의 특정 영역에서 추출하는 방식으로 작동
- 풀링의 종류
- Max Pooling(최대 풀링)
- Max Pooling은 필터가 커버하는 영역 내에서 가장 큰 값을 선택 → 주요 특징을 강조하고 노이즈를 줄이는데 도움
- Average Pooling(평균 풀링)
- Average Pooling은 필터가 커버하는 영역 내의 값들의 평균을 계산 → 이미지의 축소된 버전에서 평균적인 특성을 유지
- Max Pooling(최대 풀링)
- 풀링의 효과
- 차원 축소 : 풀링은 이미지의 공간적 크기를 줄여 계산량을 감소시키고, 메모리 사용량을 줄임→ 모델을 더 효율적으로 학습시키고,과적합(overfitting)을 방지하는데 도움이 됨
- 불변성 제공 : 풀링은 입력 이미지의 작은 변화(예: 이동, 회전 등)에 대해 모델이 더 안정적이고 불변한 특성을 가지도록 함
- 주요특징 : Max Pooling의 경우, 중요한 특징을 강조하여 모델이 더 중요한 정보를 학습할 수 있게 도움
- 풀링의 출력 크기 계산
- 출릭 크기 공식(풀링)
- 출력크기=입력크기−필터크기스트라이드+1출력크기= \frac{입력크기-필터크기}{스트라이드}+1
- 출릭 크기 공식(풀링)
풀링 예시코드
# Max Pooling 레이어 정의 (필터 크기 2x2, 스트라이드 2)
max_pool_layer = nn.MaxPool2d(kernel_size=2, stride=2)
max_pooled_output = max_pool_layer(conv_output)
print("Max Pool Layer Output Shape:", max_pooled_output.shape)
# Average Pooling 레이어 정의 (필터 크기 2x2, 스트라이드 2)
avg_pool_layer = nn.AvgPool2d(kernel_size=2, stride=2)
avg_pooled_output = avg_pool_layer(conv_output)
print("Average Pool Layer Output Shape:", avg_pooled_output.shape)
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
return x
# 모델 인스턴스 생성
model = SimpleCNN()
# 임의의 입력 이미지 생성 (배치 크기 1, 채널 1개, 높이 32, 너비 32)
input_image = torch.randn(1, 1, 32, 32)
# 모델을 통해 예측 수행
output = model(input_image)
print("Model Output Shape:", output.shape)
반응형
728x90
반응형
'컴퓨터비전 기초논문' 카테고리의 다른 글
Classification - GoogLeNet(2014) (0) | 2024.08.22 |
---|---|
Classification - AlexNet(2012) (0) | 2024.08.12 |