Level 5: CNN & 이미지 처리
🖼️

Level 5

컴퓨터 비전 소개

이미지 표현, 픽셀, 채널 이해

30분
컴퓨터 비전 소개 강의 영상
강의 영상 보기 (새 탭에서 재생)YouTube

📓Google Colab에서 실습하기

이 레슨은 PyTorch/GPU가 필요합니다. 노트북을 다운로드 후 Google Colab에서 열어주세요.

학습 내용

컴퓨터 비전 소개

학습 목표

이 레슨을 완료하면:

  • 컴퓨터가 이미지를 어떻게 인식하는지 이해합니다
  • 픽셀과 채널의 개념을 배웁니다
  • 이미지 데이터의 구조를 파악합니다
  • 컴퓨터 비전의 주요 응용 분야를 알게 됩니다

핵심 메시지

"컴퓨터에게 이미지는 숫자들의 배열일 뿐입니다." 우리가 보는 고양이 사진은 컴퓨터에게는 수십만 개의 숫자 행렬입니다. 이 숫자들에서 패턴을 찾아내는 것이 컴퓨터 비전의 핵심입니다.


1. 컴퓨터 비전이란?

비유: 시각장애인이 점자를 통해 글을 읽듯이, 컴퓨터는 숫자를 통해 이미지를 "읽습니다". 우리가 눈으로 보는 것을 컴퓨터가 숫자로 이해하도록 번역하는 것이 컴퓨터 비전입니다.

주요 응용 분야

분야예시설명
이미지 분류고양이 vs 개 구분이미지가 어떤 카테고리인지 판별
객체 탐지자율주행 차량 인식이미지 내 물체의 위치와 종류 파악
얼굴 인식스마트폰 Face ID얼굴의 특징점을 추출하여 신원 확인
의료 영상X-ray, CT 분석질병의 징후를 자동으로 탐지
OCR문서 텍스트 추출이미지에서 문자를 인식
자세 추정운동 자세 분석사람의 관절 위치를 추적

2. 이미지의 디지털 표현

픽셀(Pixel)이란?

픽셀(Pixel) = Picture + Element (그림 요소)

이미지의 가장 작은 단위입니다. 디지털 이미지는 수많은 픽셀들이 격자 형태로 배열된 것입니다.

이미지 종류크기총 픽셀 수
HD1920 × 1080약 200만
4K3840 × 2160약 800만
MNIST28 × 28784
CIFAR-1032 × 321,024

3. 채널(Channel)의 이해

흑백 이미지 (1채널 = Grayscale)

각 픽셀은 0~255 사이의 밝기 값 하나만 가집니다.

  • 0: 완전한 검정
  • 255: 완전한 흰색

텐서 Shape: (H, W) 또는 (H, W, 1)

예: MNIST 이미지는 (28, 28, 1)

컬러 이미지 (3채널 = RGB)

각 픽셀은 R, G, B 세 가지 값의 조합입니다.

채널범위설명
Red (R)0~255빨간색 강도
Green (G)0~255초록색 강도
Blue (B)0~255파란색 강도

텐서 Shape: (H, W, 3) 또는 (C, H, W)

RGB 색상 조합 예시

색상(R, G, B)
빨강(255, 0, 0)
초록(0, 255, 0)
파랑(0, 0, 255)
노랑(255, 255, 0)
흰색(255, 255, 255)
검정(0, 0, 0)

4. 텐서로 표현하기

이미지 텐서 Shape

딥러닝에서 이미지는 텐서(다차원 배열)로 표현됩니다.

단일 이미지:

  • 흑백: (H, W) 또는 (1, H, W)
  • 컬러: (C, H, W) - PyTorch 방식
  • 컬러: (H, W, C) - TensorFlow/NumPy 방식

배치 이미지 (PyTorch):

  • Shape: (N, C, H, W)
  • N = 배치 크기, C = 채널 수, H = 높이, W = 너비
  • 예: (64, 3, 224, 224) = 64개의 224×224 컬러 이미지

🔬 실습: 이미지 텐서 다루기

python
⚠️ 로컬 실행 필요
import torch import numpy as np import matplotlib.pyplot as plt # ═══════════════════════════════════════════════════════════════ # 📊 이미지 텐서의 구조 이해하기 # ═══════════════════════════════════════════════════════════════ # 랜덤 컬러 이미지 생성 (H, W, C) - NumPy 방식 np.random.seed(42) image_numpy = np.random.randint(0, 256, size=(32, 32, 3), dtype=np.uint8) print("=" * 50) print("📊 이미지 텐서 구조") print("=" * 50) print(f"NumPy 이미지 shape: {image_numpy.shape}") print(f" → (Height, Width, Channels) = (32, 32, 3)") # PyTorch 텐서로 변환 (C, H, W) - PyTorch 방식 image_torch = torch.from_numpy(image_numpy).permute(2, 0, 1).float() / 255.0 print(f"\nPyTorch 텐서 shape: {image_torch.shape}") print(f" → (Channels, Height, Width) = (3, 32, 32)") # 배치 차원 추가 batch = image_torch.unsqueeze(0) # (1, 3, 32, 32) print(f"\n배치 텐서 shape: {batch.shape}") print(f" → (Batch, Channels, Height, Width) = (1, 3, 32, 32)") # 시각화 fig, axes = plt.subplots(1, 3, figsize=(12, 4)) # RGB 각 채널 시각화 channels = ['Red', 'Green', 'Blue'] for i, (ax, name) in enumerate(zip(axes, channels)): ax.imshow(image_numpy[:, :, i], cmap='gray') ax.set_title(f'{name} Channel') ax.axis('off') plt.suptitle('RGB Channel Separation of Color Image', fontsize=14, fontweight='bold') plt.tight_layout() plt.show() print("\n💡 핵심: PyTorch는 (N, C, H, W), NumPy는 (H, W, C) 순서를 사용합니다!")

5. 정규화의 중요성

왜 정규화가 필요한가?

원본 픽셀값 범위: 0 ~ 255

문제점설명
값이 너무 큼기울기 폭발 위험
학습 불안정수렴이 어려움
수렴 속도 느림학습에 오래 걸림

정규화 방법

방법공식결과 범위
0~1 범위pixel / 255.0[0, 1]
-1~1 범위(pixel - 127.5) / 127.5[-1, 1]
표준화(pixel - mean) / std평균 0, 표준편차 1

🔬 실습: 이미지 정규화

python
import numpy as np import matplotlib.pyplot as plt # ═══════════════════════════════════════════════════════════════ # 📊 이미지 정규화 비교 # ═══════════════════════════════════════════════════════════════ np.random.seed(42) # 원본 이미지 (0-255 범위) original = np.random.randint(0, 256, size=(8, 8), dtype=np.uint8).astype(float) # 방법 1: [0, 1] 범위로 정규화 norm_01 = original / 255.0 # 방법 2: [-1, 1] 범위로 정규화 norm_11 = (original - 127.5) / 127.5 # 방법 3: 표준화 (평균 0, 표준편차 1) mean, std = original.mean(), original.std() standardized = (original - mean) / std print("=" * 55) print("📊 정규화 방법 비교") print("=" * 55) print(f"원본: min={original.min():>6.1f}, max={original.max():>6.1f}") print(f"[0,1]: min={norm_01.min():>6.3f}, max={norm_01.max():>6.3f}") print(f"[-1,1]: min={norm_11.min():>6.3f}, max={norm_11.max():>6.3f}") print(f"표준화: min={standardized.min():>6.3f}, max={standardized.max():>6.3f}") print(f" mean={standardized.mean():>6.3f}, std={standardized.std():>6.3f}") # 시각화 fig, axes = plt.subplots(1, 4, figsize=(14, 3)) titles = ['Original (0-255)', '[0, 1] Norm', '[-1, 1] Norm', 'Standardized'] images = [original, norm_01, norm_11, standardized] for ax, img, title in zip(axes, images, titles): im = ax.imshow(img, cmap='viridis') ax.set_title(title, fontsize=11) ax.axis('off') plt.colorbar(im, ax=ax, fraction=0.046) plt.suptitle('Image Normalization Methods Comparison', fontsize=14, fontweight='bold') plt.tight_layout() plt.show() print("\n💡 정규화는 학습 안정성과 수렴 속도를 크게 향상시킵니다!")

핵심 요약

개념핵심 내용기억할 포인트
픽셀이미지의 최소 단위0~255 밝기 값
채널색상 정보흑백=1채널, 컬러=3채널(RGB)
텐서 Shape이미지의 차원PyTorch: (N, C, H, W)
정규화값 범위 조정학습 안정성 향상

학습 체크리스트

  • 픽셀과 이미지의 관계를 설명할 수 있다
  • RGB 채널의 의미를 이해한다
  • 텐서 Shape (N, C, H, W)를 해석할 수 있다
  • 정규화의 필요성을 설명할 수 있다

다음 강의 예고

"합성곱 연산" - CNN의 핵심인 합성곱이 어떻게 이미지의 특징을 추출하는지 배웁니다!

레슨 정보

레벨
Level 5: CNN & 이미지 처리
예상 소요 시간
30분
참고 영상
YouTube 링크

💡실습 환경 안내

이 레벨은 PyTorch/GPU가 필요하여 Google Colab 사용을 권장합니다.

Colab은 무료 GPU를 제공하여 PyTorch, CNN, Transformer 등을 실행할 수 있습니다.