🏗️ CNN 架構演進(LeNet → AlexNet → VGG → ResNet)
從5層到152層:深度學習如何征服影像辨識
卷積神經網路(CNN)的核心優勢:透過卷積核(Filter)自動提取局部特徵(邊緣→紋理→物件),並藉由參數共享大幅減少參數量。ImageNet 大賽(ILSVRC)推動了四代里程碑架構。
卷積運算(Convolution)
卷積核(Filter)在輸入影像上滑動,計算點積,提取局部特徵。一個 3×3 卷積核只有9個參數,但可以掃描整張影像,實現參數共享。池化層(Max Pooling)降低維度、增加平移不變性。
▶ 考點:卷積核 / 參數共享 / 平移不變性
AlexNet 的突破
2012年 ImageNet 競賽,AlexNet 以 15.3% 錯誤率大幅領先亞軍(26%),開啟深度學習時代。關鍵創新:GPU 平行訓練、ReLU 激活函數(取代 sigmoid)、Dropout 防過擬合、資料增強。
▶ 考點:ReLU 取代 Sigmoid / GPU 加速
ResNet 殘差連結(核心考點)
深層網路訓練時梯度逐層衰減(梯度消失)。ResNet 引入跳躍連結(Skip Connection):F(x) + x,讓梯度可以直接回傳,解決了訓練100層以上網路的難題。
▶ 考點:ResNet 解決梯度消失 / F(x)+x
📌 iPAS 考試高頻:ResNet 的殘差連結(Skip Connection)解決梯度消失問題,公式為 H(x) = F(x) + x。VGG 全用 3×3 卷積核,AlexNet 首次使用 GPU 訓練。
🎬 卷積運算互動展示
3×3 卷積核滑動計算過程(點擊「下一步」逐步觀看)
📷 輸入矩陣(6×6,模擬灰階影像像素值)和 3×3 卷積核(邊緣偵測 filter)準備就緒。點擊「下一步」開始卷積運算。
🎯 YOLO 物件偵測
一次前向傳播同時偵測多個物件(You Only Look Once)
傳統兩階段偵測(R-CNN系列):先生成候選區域再分類(慢)。YOLO 將偵測視為單一迴歸問題:將影像分割成 S×S 格子,每格預測 B 個邊框(Bounding Box)和類別概率,一次性輸出所有結果。
// YOLO 輸出格式(每個格子預測)
Grid Cell → [x, y, w, h, confidence] × B + class_probabilities
// confidence = P(物件存在) × IoU(預測框, 真實框)
IoU = 交集面積 / 聯集面積 // Intersection over Union
// 非極大值抑制(NMS):過濾重複框
NMS: 保留 confidence 最高的框,抑制 IoU > 閾值的其他框
YOLO vs R-CNN 比較
YOLO:單階段偵測,一次前向傳播完成,速度達 45fps(實時)。
R-CNN:兩階段,先提取候選區(Region Proposal)再分類,精度高但慢(~47秒/張)。
Faster R-CNN:引入 RPN 加速候選區提取。
▶ 考點:YOLO一次前向傳播 / 實時偵測
IoU(交並比)
衡量預測邊界框與真實框的重疊程度。IoU = 交集面積 / 聯集面積。
IoU = 1:完美重疊;IoU = 0:無重疊。
通常 IoU > 0.5 視為正確偵測(True Positive)。
▶ 考點:IoU = 交集/聯集 / 評估偵測準確度
NMS(非極大值抑制)
YOLO 對同一物件可能生成多個重疊框。NMS 解決方法:選最高信心分數的框 → 計算其與其他框的 IoU → 抑制 IoU 超過閾值的重複框 → 重複直到無重疊框。
▶ 考點:NMS 消除重複偵測框
🖼️ 影像分割:語義分割 vs 實例分割
從分類到像素級理解的三個層次
| 任務類型 | 輸出粒度 | 能區分個體? | 代表模型 | 應用場景 |
| 影像分類 | 全圖標籤 | ❌ | ResNet、VGG | 貓/狗分類 |
| 物件偵測 | 邊界框(BBox) | ✅ | YOLO、Faster R-CNN | 行人偵測、車牌識別 |
| 語義分割 | 像素級類別標籤 | ❌(同類視為一體) | FCN、U-Net、DeepLab | 醫療影像邊界、自駕道路分割 |
| 實例分割 | 像素級 + 個體區分 | ✅(每個個體分開) | Mask R-CNN | 工廠計件、細胞計數 |
🏥 iPAS 情境題:「醫療影像需要精確標示腫瘤邊界」→ 語義分割(像素級分類)。「工廠流水線需統計每個瑕疵零件的數量」→ 實例分割(區分個體)。
🔮 3D 卷積層特徵圖視覺化
CNN 前向傳播:輸入→卷積層→池化層→特徵圖堆疊(可拖曳旋轉)
🔮 CNN 特徵圖 3D 視覺化 · 拖曳旋轉
🤖 Vision Transformer(ViT)
將圖片切成 Patch,用 Transformer 處理影像任務
ViT(2020)突破性地將 NLP 的 Transformer 架構直接應用於影像:將影像切割成固定大小的 Patch(如 16×16),展平後加上位置編碼(Position Embedding),送入 Transformer Encoder。
// ViT 處理流程
Image (224×224×3)
→ Patch Split: 196 個 16×16 patches
→ Linear Projection: 每個 patch → 768 維向量
→ + Position Embedding: 加入位置資訊
→ Transformer Encoder: Multi-Head Self-Attention
→ [CLS] Token → 分類輸出
// 注意:ViT 需要大量資料預訓練(如 JFT-300M)
// 資料量不足時,CNN 仍優於 ViT
ViT vs CNN 核心差異
CNN:局部感受野,透過層疊卷積逐漸擴大感知範圍,具備平移不變性,小資料效果好。
ViT:全局 Self-Attention,第一層就能感知全圖關係,需要大量資料。
▶ 考點:ViT 用 Patch+Position Embedding
Patch + Position Embedding
224×224 影像以 16×16 patch 切割 → 196 個 patch。每個 patch 展平後線性投影為向量。由於 Transformer 無位置感知,必須額外加入 Position Embedding(可學習或固定)表示 patch 在圖中的位置。
▶ 考點:196 patches / Position Embedding
遷移學習(Transfer Learning)
在大型資料集(ImageNet)預訓練的模型已學到通用視覺特徵(邊緣、紋理、形狀)。針對特定任務(如醫療X光)只需微調(Fine-tuning)最後幾層,用少量資料即可達到高效果。
▶ 考點:遷移學習節省訓練成本 / Fine-tuning
🎲 資料增強(Data Augmentation)
透過人工變換擴充訓練資料,提升模型泛化能力
| 增強技術 | 操作方式 | 防止過擬合原因 | 適用場景 |
| 水平翻轉 | 左右鏡像 | 讓模型對左右朝向不敏感 | 通用影像分類 |
| 隨機裁剪 | 隨機選取部分區域 | 模型學習不同尺度局部特徵 | 物件偵測 |
| 顏色抖動 | 調整亮度/對比度/飽和度 | 對光照條件不敏感 | 戶外場景辨識 |
| 旋轉/仿射 | 隨機旋轉角度 | 對方向不敏感(但某些任務不適用) | 醫療影像、衛星圖 |
| Mixup | 兩張圖線性插值混合 | 增加決策邊界平滑度 | 分類精度提升 |
| CutOut/CutMix | 遮蓋或置換部分區域 | 迫使模型學習全局特徵 | 增強魯棒性 |
⚠️ 注意:資料增強要符合任務語意。如醫療X光「不可水平翻轉」(左右肺有別義);文字辨識「不可旋轉180度」(上下顛倒影響語意)。
💻 程式碼考點(PyTorch · torchvision · OpenCV)
📦 torchvision — CNN 模型載入與遷移學習
# 載入預訓練 ResNet50(遷移學習)
import torchvision.models as models
import torch.nn as nn
# 載入 ImageNet 預訓練權重
model = models.resnet50(pretrained=True)
# 凍結所有層(只訓練最後分類頭)
for param in model.parameters():
param.requires_grad = False
# 替換最後全連接層(適應新任務類別數)
num_classes = 10
model.fc = nn.Linear(model.fc.in_features, num_classes)
# 只有 fc 層的參數會被訓練
optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-3)
pretrained=True
載入在 ImageNet(1.2M 張、1000類)預訓練的權重。模型已學到通用視覺特徵,可直接用於遷移學習。
▶ 考點:預訓練模型節省訓練成本
requires_grad = False
凍結特徵提取層的梯度更新,只允許最後分類頭學習。適用於目標資料集與預訓練資料集相似的情況。
▶ 考點:凍結層 / 只訓練分類頭
in_features 替換
ResNet50 的 fc 層原為 2048→1000(ImageNet 1000類)。替換為 2048→N 以適應新任務類別數。輸入特徵維度 in_features 保持不變。
▶ 考點:替換分類頭不改特徵提取
🔧 torchvision.transforms — 資料增強管道
from torchvision import transforms
# 訓練集增強(強)
train_transform = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(), # 50% 機率翻轉
transforms.ColorJitter(brightness=0.2, contrast=0.2),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]) # ImageNet 均值/標準差
])
# 驗證集(不增強,只標準化)
val_transform = transforms.Compose([
transforms.Resize(256), transforms.CenterCrop(224),
transforms.ToTensor(), transforms.Normalize(...)
])
Compose 管道
將多個轉換操作串聯,按順序依次執行。訓練集用隨機增強提升泛化;驗證集只做確定性預處理(不可隨機,否則評估不穩定)。
▶ 考點:訓練增強/驗證不增強
Normalize 標準化
ToTensor() 後像素值為 [0,1]。Normalize 用 ImageNet 的均值(0.485,0.456,0.406)和標準差(0.229,0.224,0.225) 標準化,使輸入分佈穩定,加速收斂。
▶ 考點:ImageNet 均值標準化
RandomHorizontalFlip
以 50% 機率水平翻轉圖片。是最常用且安全的增強方式(對多數任務語意不變)。注意:醫療影像或文字圖片需謹慎使用。
▶ 考點:增強需符合任務語意
🔍 評估指標:mAP(Mean Average Precision)物件偵測
from torchmetrics.detection import MeanAveragePrecision
metric = MeanAveragePrecision(iou_thresholds=[0.5]) # mAP@0.5
# 更新預測結果
metric.update(preds=[{
'boxes': predicted_boxes, # [N, 4] 邊界框
'scores': confidence_scores, # [N] 信心分數
'labels': predicted_labels # [N] 類別標籤
}], target=[{
'boxes': ground_truth_boxes,
'labels': true_labels
}])
# mAP 計算:所有類別的 AP 平均值
result = metric.compute() # {'map': tensor(0.85), 'map_50': ...}
AP(Average Precision)
對不同信心閾值下的 Precision-Recall 曲線積分。AP = AUC(PR曲線)。mAP 是所有類別 AP 的平均。物件偵測的主要評估指標。
▶ 考點:mAP = 多類別 AP 平均
IoU 閾值
mAP@0.5:預測框與真實框 IoU ≥ 0.5 才算 True Positive(PASCAL VOC 標準)。mAP@0.5:0.95:COCO 標準,更嚴格。
▶ 考點:IoU閾值判斷TP/FP
Precision vs Recall 取捨
降低信心閾值 → Recall ↑(偵測更多物件)但 Precision ↓(誤報增加)。安防場景需高 Recall(不漏偵);醫療篩檢需高 Precision(減少誤診)。
▶ 考點:任務決定 Precision/Recall 優先
🧪 歷屆考題程式題型
以下為常見的 iPAS 程式概念考題:
Q1. 以下 PyTorch 程式碼中,param.requires_grad = False 的目的是?
A. 增加模型參數數量
B. 凍結該層參數,使其在訓練時不更新(遷移學習中保留預訓練知識)✓
C. 將參數轉換為 float32
D. 啟用 GPU 加速計算
Q2. 使用 transforms.Normalize(mean, std) 的主要目的是?
A. 將影像轉換為黑白
B. 隨機翻轉影像以增強資料
C. 使輸入像素值分佈穩定(均值≈0、標準差≈1),加速模型收斂 ✓
D. 調整影像解析度至統一大小
🎯 仿真考題(8 題)