
강의 영상 보기 (새 탭에서 재생)YouTube
📓Google Colab에서 실습하기
이 레슨은 PyTorch/GPU가 필요합니다. 노트북을 다운로드 후 Google Colab에서 열어주세요.
학습 내용
컴퓨터 비전 소개
학습 목표
이 레슨을 완료하면:
- •컴퓨터가 이미지를 어떻게 인식하는지 이해합니다
- •픽셀과 채널의 개념을 배웁니다
- •이미지 데이터의 구조를 파악합니다
- •컴퓨터 비전의 주요 응용 분야를 알게 됩니다
핵심 메시지
"컴퓨터에게 이미지는 숫자들의 배열일 뿐입니다." 우리가 보는 고양이 사진은 컴퓨터에게는 수십만 개의 숫자 행렬입니다. 이 숫자들에서 패턴을 찾아내는 것이 컴퓨터 비전의 핵심입니다.
1. 컴퓨터 비전이란?
비유: 시각장애인이 점자를 통해 글을 읽듯이, 컴퓨터는 숫자를 통해 이미지를 "읽습니다". 우리가 눈으로 보는 것을 컴퓨터가 숫자로 이해하도록 번역하는 것이 컴퓨터 비전입니다.
주요 응용 분야
| 분야 | 예시 | 설명 |
|---|---|---|
| 이미지 분류 | 고양이 vs 개 구분 | 이미지가 어떤 카테고리인지 판별 |
| 객체 탐지 | 자율주행 차량 인식 | 이미지 내 물체의 위치와 종류 파악 |
| 얼굴 인식 | 스마트폰 Face ID | 얼굴의 특징점을 추출하여 신원 확인 |
| 의료 영상 | X-ray, CT 분석 | 질병의 징후를 자동으로 탐지 |
| OCR | 문서 텍스트 추출 | 이미지에서 문자를 인식 |
| 자세 추정 | 운동 자세 분석 | 사람의 관절 위치를 추적 |
2. 이미지의 디지털 표현
픽셀(Pixel)이란?
픽셀(Pixel) = Picture + Element (그림 요소)
이미지의 가장 작은 단위입니다. 디지털 이미지는 수많은 픽셀들이 격자 형태로 배열된 것입니다.
| 이미지 종류 | 크기 | 총 픽셀 수 |
|---|---|---|
| HD | 1920 × 1080 | 약 200만 |
| 4K | 3840 × 2160 | 약 800만 |
| MNIST | 28 × 28 | 784 |
| CIFAR-10 | 32 × 32 | 1,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 |
🔬 실습: 이미지 정규화
pythonimport 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 등을 실행할 수 있습니다.