CV Day 45 系列總結與延伸路線
執行需求:CPU 可跑。今天是「PyTorch 電腦視覺進階」系列的第四十五篇,也是專案五篇的最後一篇。我們花一天回顧這 45 天的學習路徑:從 Day 1 的五個任務地圖開始、走到分類(Day 3–9)、偵測(Day 10–17)、分割(Day 18–25)、姿態(Day 26–32)、生成(Day 33–40)、最後匯聚到這週的「工業瑕疵檢測」專案(Day 41–44)。本篇不寫新技術,只整理學過的工具、指標、模型,給出延伸到 2024 年底後可走的學習方向。我們會把七個階段的學習重點串成一張圖,並列出五個常見的職涯方向,最後給一份延伸閱讀清單(不引用 2025 年後的工具或版本)。
引言
回頭看 45 天前,Day 1 我們說「這系列要把讀者從『會訓練模型』帶到『能獨立完成 CV 專案』」。今天我們可以驗收這個承諾:Day 1 的導論建立了任務地圖,Day 2 把工具鏈備齊(Colab、torchvision、timm、Ultralytics),接著五個任務每個用 5–8 天展開(分類 9 天、偵測 8 天、分割 8 天、姿態 7 天、生成 8 天),最後 5 天把所有工具合成一個可以 demo 的瑕疵檢測服務。四十四篇技術文之後的這篇,是把所有工具、指標、概念在腦中重新組合成一張可以帶走的「地圖」。
本篇的內容分四段:第一段回顧七個階段的學習路徑與代表工具;第二段整理常見的職涯方向(CV 工程師、ML 工程師、Computer Vision Researcher、MLOps、Domain Expert);第三段列出 2024 年底後仍可走的延伸學習方向,包含 anomaly detection 與少樣本學習等主題;第四段是 45 天學習的「自我評估清單」,讀者可以對照檢查自己學到了什麼、還缺什麼。這篇沒有新的程式碼,但有大量引用 Day 1–44 的連結,方便你回頭補課。
貫穿專案的共用設定(與 Day 41–44 完全一致):MVTec AD bottle 類別、EfficientNet-B0(timm 1.0.x)、DeepLabV3Plus + ResNet34(smp 0.3.x)、ONNX opset 17、threshold 0.30。技術版本基準仍是 2024 年底(PyTorch 2.5、torchvision 0.20、timm 1.0.x、Ultralytics 8.3.x 等),不引用 2025 年的新工具或新功能。
七個階段的學習路徑
在把這張地圖列出來之前,我們先用一段小程式把「45 天中每天的主題」做一個快速掃描,幫自己複習這整套內容的章節分布:
# 1. 掃描 posts-cv 目錄,看看每篇的章節 ID 與任務分類
import re
from pathlib import Path
manifest = Path("manifest-cv.json")
posts_dir = Path("posts-cv")
slots = []
for fp in sorted(posts_dir.glob("*-cv-day-*.html")):
m = re.match(r"(\d+)-cv-day-(\d+)", fp.stem)
if not m:
continue
slots.append((int(m[1]), fp.name, fp.stat().st_size // 1024))
# 統計各任務的篇章數
from collections import Counter
counter = Counter()
for slot, name, _ in slots:
if slot <= 2: counter["導論"] += 1
elif slot <= 9: counter["分類"] += 1
elif slot <= 17: counter["偵測"] += 1
elif slot <= 25: counter["分割"] += 1
elif slot <= 32: counter["姿態"] += 1
elif slot <= 40: counter["生成"] += 1
else: counter["專案"] += 1
print("七個階段篇章分布:")
for stage, n in counter.items():
print(f" {stage:6s} {n} 篇")
# 輸出:
# 七個階段篇章分布:
# 導論 2 篇
# 分類 7 篇
# 偵測 8 篇
# 分割 8 篇
# 姿態 7 篇
# 生成 8 篇
# 專案 5 篇
把 45 天切成七個階段,每個階段都有「理論 → 程式 → 實戰」的節奏。我們用一張地圖把每一階段的代表工具、指標、實戰資料集整理起來,方便你回頭查閱。
| 階段 | 天數 | 代表工具 | 代表指標 | 實戰資料集 |
|---|---|---|---|---|
| 導論 | Day 1–2 | Colab、torchvision、timm、Ultralytics | — | — |
| 分類 | Day 3–9 | ResNet、EfficientNet、ConvNeXt、ViT、timm | accuracy、top-k、F1、AUROC、混淆矩陣 | Oxford Flower-102 |
| 偵測 | Day 10–17 | Ultralytics YOLO11、torchvision Faster R-CNN、DETR | IoU、mAP、NMS、confidence | PASCAL VOC(person/car 子集) |
| 分割 | Day 18–25 | U-Net、DeepLabV3+、Mask R-CNN、SAM | pixel accuracy、mIoU、Dice、Boundary F1 | MVTec AD bottle、bottle/grid/hazelnut |
| 姿態 | Day 26–32 | MediaPipe、YOLO-Pose、ST-GCN | OKS、PCK、mAP | COCO keypoints、健身動作 |
| 生成 | Day 33–40 | DCGAN、Stable Diffusion、ControlNet、LoRA | FID、CLIP score、IS、人工評估 | MNIST / Fashion-MNIST、Stable Diffusion v1.5 |
| 專案 | Day 41–44 | EfficientNet-B0、DeepLabV3+、ONNX、FastAPI、Streamlit | AUROC、mIoU、Dice、F1 | MVTec AD bottle |
這張表是我們完成 45 天的「全景」。每一格都能在對應的篇章找到詳細實作:分類的遷移學習(Day 6 與 Day 9)、偵測的兩條路線對比(Day 13 對比 Day 15)、分割的 U-Net 與 smp(Day 19 對比 Day 20)、姿態的 MediaPipe 零樣本(Day 29)與 YOLO-Pose 多樣本(Day 28)、生成的 Diffusion 原理(Day 35)與 Stable Diffusion 推論(Day 36)、最後在 Day 41–44 全部組合成可部署服務。
四個貫穿主題
在展開這四個主題之前,我們先用一段小程式把 Day 41–44 的最終指標整合起來,這也是整個專案五篇的「實戰成果」:
# 2. 把 Day 42 的 experiments_log.json 與 Day 43 的 eval_report 整合成一個摘要
import json
from pathlib import Path
# 兩個關鍵數字檔:experiments_log.json(Day 42 寫出)、errors_log.json(Day 43 寫出)
exp = json.loads(Path("experiments_log.json").read_text(encoding="utf-8"))
errors = json.loads(Path("errors_log.json").read_text(encoding="utf-8"))
cls_best = next(r for r in exp if r["run"] == "cls_A2_B2")
seg_best = next(r for r in exp if r["run"] == "seg_D2")
print("=== Day 41–44 專案五篇最終指標 ===")
print(f"資料集:MVTec AD bottle({Path('manifest_bottle_seed42.csv').stat().st_size} bytes CSV)")
print(f"分類(EfficientNet-B0):val_acc={cls_best['val_acc']:.4f}, AUROC={cls_best['val_auroc']:.4f}")
print(f"分割(DeepLabV3+ ResNet34):val_mIoU={seg_best['val_miou']:.4f}, Dice={seg_best['val_dice']:.4f}")
print(f"test(Day 43 評估):AUROC=0.9892, mIoU=0.6838, 錯誤案例 {len(errors)} 個")
print(f"部署(Day 44):ONNX={Path('cls_efficientnet_b0.onnx').stat().st_size // 1024} KB + "
f"{Path('seg_deeplabv3plus.onnx').stat().st_size // 1024} KB,threshold=0.30,FastAPI:8000 + Streamlit:8501")
# 輸出(固定條件下每次都一致):
# === Day 41–44 專案五篇最終指標 ===
# 資料集:MVTec AD bottle(27400 bytes CSV)
# 分類(EfficientNet-B0):val_acc=0.9667, AUROC=0.9874
# 分割(DeepLabV3+ ResNet34):val_mIoU=0.7135, Dice=0.8329
# test(Day 43 評估):AUROC=0.9892, mIoU=0.6838, 錯誤案例 4 個
# 部署(Day 44):ONNX=8320 KB + 24780 KB,threshold=0.30,FastAPI:8000 + Streamlit:8501
回顧這 45 天的內容,有四個「貫穿主題」反覆出現,每一個都值得單獨再深入:
主題一:資料永遠比模型重要。從 Day 4(資料增強)到 Day 23(分割增強)到 Day 41(資料整備)到 Day 43(錯誤分析),資料相關的天數佔了近三分之一。我們學過的關鍵工具包括:Albumentations 1.4.x、imgaug、torchvision.transforms.v2、Day 39 的生成式合成。資料品質的提升往往比模型替換更划算——一個好的資料擴增可以讓 5 M 參數的小模型逼近 100 M 的大模型。
主題二:指標必須對應業務問題。Day 8 與 Day 17 的評估章節、Day 24 的分割指標、Day 43 的信心門檻掃描,都在告訴我們「單一指標容易誤導」。工業界常見的 best practice:先用 AUROC 看整體,再用 precision/recall 看部署 trade-off,最後用 per-class 指標找瓶頸。這套方法在 Day 43 的瑕疵檢測專案上完整示範了一遍。
主題三:訓練 vs 推論的權衡。從 Day 6 的 timm 預訓練到 Day 14 的 ONNX 匯出、Day 16 的 DETR 訓練、Day 44 的部署,這個主題貫穿整個系列。學完之後你應該了解:訓練追求「最高指標」會大量用 GPU + 大模型;推論追求「最低延遲」會大量用 ONNX + 量化 + 邊緣裝置。連接兩者的橋樑是「模型轉換 + benchmark + 上線觀察」。
主題四:錯誤分析驅動迭代。Day 17(偵測錯誤分類)、Day 24(分割評估)、Day 43(瑕疵錯誤分析)三個篇章都強調「不要只盯著 mAP / mIoU 把數字調高,要把錯誤拆給工程師看」。這個方法論在工業界比「重新 train 一個新模型」更常見:先看錯誤分布,再決定要不要換模型、換資料、還是換 loss。
常見職涯方向
在介紹五條職涯路線之前,我們用一張簡單的「技能 vs 路線」表格幫你判斷自己目前的位置:
# 3. 五條職涯路線的技能對照(純資料,方便決策)
career_paths = {
"CV 工程師": {
"核心技能": ["PyTorch", "ONNX", "TensorRT", "Linux", "Docker"],
"延伸技能": ["Kubernetes", "AWS/GCP", "CI/CD"],
"入門年資": "1-3 年",
"適合特質": "喜歡把模型做出來跑起來",
"Day 對應": "Day 6, 14, 41-44",
},
"ML 工程師": {
"核心技能": ["PyTorch", "Spark", "Airflow", "MLflow"],
"延伸技能": ["Feast", "Kafka", "Dashboard"],
"入門年資": "2-4 年",
"適合特質": "喜歡處理資料管線與自動化",
"Day 對應": "Day 8, 17, 23, 24, 41-44",
},
"CV Researcher": {
"核心技能": ["論文閱讀", "PyTorch 自刻模型", "arXiv"],
"延伸技能": ["數學推導", "benchmark 設計", "論文撰寫"],
"入門年資": "需要碩博士學位",
"適合特質": "對前沿技術有強烈好奇心",
"Day 對應": "Day 16, 22, 34-39",
},
"MLOps / Production": {
"核心技能": ["Docker", "Kubernetes", "Prometheus", "Terraform"],
"延伸技能": ["Grafana", "Kafka", "CI/CD"],
"入門年資": "2-4 年",
"適合特質": "在乎穩定性與監控",
"Day 對應": "Day 14, 44",
},
"Domain Expert": {
"核心技能": ["產業知識", "CV 工具", "domain 資料"],
"延伸技能": ["法規(醫療/食品/車規)", "domain 演算法"],
"入門年資": "3-5 年",
"適合特質": "喜歡跨領域合作",
"Day 對應": "Day 25, 32, 39, 41-44",
},
}
for name, attrs in career_paths.items():
print(f"== {name} ==")
for k, v in attrs.items():
print(f" {k}: {v}")
print()
這張對照表展示了「學完 45 天後,你可以走哪幾條路」。每條路都有 Day 對應欄位,告訴你這個系列中哪幾篇對這條職涯最有幫助。例如想做 Domain Expert,主要看 Day 25(MVTec AD)、Day 32(健身動作)、Day 39(生成式合成)、Day 41–44(瑕疵檢測專案)。想做 Researcher,主要看 Day 16(DETR)、Day 22(SAM)、Day 34–39(GAN 與 Diffusion)的原理章節。Career recommendation 的關鍵在於你的「興趣特質」與「現有技能」的交叉點,不要只看哪條路薪水高。
學完這 45 天的內容後,你有幾個常見的下一站可以選擇。我把幾條常見的職涯方向整理出來,附上對應的延伸技能、薪資區間、適合的人格特質。
- CV 工程師(Computer Vision Engineer):把模型訓練 + 部署整套做完。這條路以 PyTorch、ONNX、TensorRT、Linux、Docker、Kubernetes 為核心技能。專案篇 Day 41–44 就是這個角色的最佳預習。薪資區間在台灣大約年薪 100–180 萬新台幣(依年資與公司規模而定)。
- ML 工程師(Machine Learning Engineer):覆蓋 CV + NLP + 推薦系統,但通常以其中一條為主。CV 工程師與 ML 工程師的差異在「後者會處理更多資料管線、MLOps、特徵工程」。延伸技能:Airflow、Spark、MLflow、Feast。薪資與 CV 工程師相近。
- Computer Vision Researcher:投入新模型研發、論文發表。這條路偏學術,工業界職缺主要在大公司的 Research Lab(Google、Meta、Microsoft)或新創 CV 公司。延伸技能:大量論文閱讀、PyTorch 自刻模型、arXiv 追蹤。薪資區間較高(年薪 150–300 萬新台幣),但競爭也激烈。
- MLOps / Production Engineer:把模型從 notebook 推到 production。這條路專注於 deployment、monitoring、A/B testing、retraining。延伸技能:Kubernetes、Prometheus、Grafana、Kafka、Terraform。薪資區間與 ML 工程師相近。
- Domain Expert(領域專家):在特定產業(醫療、農業、製造、零售)把 CV 技術落地。這條路除了 ML 之外,還要懂產業知識(醫療影像需要懂 DICOM 與放射學、農業需要懂植物病理學)。薪資依產業而異,工廠自動化領域在台灣大約年薪 90–150 萬新台幣,醫療 AI 領域略高。
這五條路並不互斥,許多 ML/CV 工程師在工作 5–10 年後會跨界到 MLE 或 Researcher。建議你在工作 3 年內把第一條(CV 工程師)的核心技能練熟,再依專案需要延伸到其他方向。
延伸學習方向
在給延伸資源清單之前,我們用一段小程式把 6 個延伸學習方向做成結構化索引,方便日後查詢:
# 4. 延伸學習的「主題 → 關鍵論文與教材」對照表
extensions = {
"Anomaly Detection": [
"Bergmann 2019, MVTec AD (CVPR)",
"Bergmann 2021, MVTec AD Survey",
"PatchCore (CVPR 2022)",
"PaDiM (ICPR 2021)",
],
"Vision Transformer 與多模態": [
"Dosovitskiy 2020, ViT (ICLR 2021)",
"Radford 2021, CLIP (ICML)",
"Li 2022, BLIP (arXiv)",
"Liu 2023, LLaVA (NeurIPS)",
],
"3D 視覺": [
"Qi 2017, PointNet++ (NeurIPS)",
"Facebook 2020, PyTorch3D",
"Wang 2023, Point Transformer V3 (CVPR)",
],
"量化與邊緣部署": [
"Jacob 2018, Quantization + Training (CVPR)",
"TensorRT 8.6 (NVIDIA, 2023)",
"TFLite 2.15 (Google, 2024)",
"OpenVINO 2024.4 (Intel)",
],
"自監督學習": [
"Caron 2021, DINO (ICCV)",
"He 2022, MAE (CVPR)",
"Chen 2021, MoCo v3 (ICCV)",
],
"醫療影像": [
"Antonelli 2020, Medical Decathlon",
"Isensee 2021, nnU-Net (Nat Methods)",
"Cardoso 2022, MONAI (Medical Image Anal)",
],
}
for theme, papers in extensions.items():
print(f"== {theme} ==")
for p in papers:
print(f" - {p}")
print()
這六個主題在 2024 年底都已有穩固的論文與工具基礎,且都有良好的 Python 套件支援。讀完這系列後,你可以依興趣選一條深入。每個主題的入門成本大約 1–3 個月(每天 2–3 小時)。
45 天內容其實只是「可工作的 CV 工程師」最低門檻。接下來還有非常多值得深入的方向,這裡列出 6 個在 2024 年底仍持續發展、且有良好社群基礎的主題(不引用 2025 年的新模型或新工具)。
1. Anomaly Detection 與少樣本學習。MVTec AD 的官方 baseline 是 PatchCore 與 PaDiM,兩者都基於「特徵距離」的少樣本方法。Day 41 提到的「訓練資料只有 good」就是 anomaly detection 的典型情境。建議閱讀:The MVTec Anomaly Detection Dataset: A Survey(2021)、Real-Time Anomaly Detection — A Survey(2022)。
2. Vision Transformer 與多模態模型。Day 5 與 Day 16 已經介紹過 ViT 與 DETR(Transformer 架構)。多模態領域的下一站是 CLIP、BLIP、LLaVA 等把視覺與語言對齊的模型,這些在 2024 年底都仍在快速演進。建議閱讀:Learning Transferable Visual Models From Natural Language Supervision(CLIP,2021)。
3. 3D 視覺與 Point Cloud。Day 26–32 的姿態估計處理的是 2D 影像,但工業瑕疵中很多場景是「3D 物件掃描」而不是 2D 影像。PyTorch3D、PointNet++ 仍是 2024 年的標準工具。建議閱讀:PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space(2017)。
4. 模型量化與邊緣部署。Day 44 的部署只示範 ONNX,尚未觸及 INT8 量化、TFLite、TensorRT、Qualcomm SNPE 等。量化能把模型從 8 MB 壓到 2 MB、推論加速 2–3 倍,是邊緣裝置部署的必備技能。建議閱讀:Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference(2019)。
5. 自監督學習與資料效率。MVTec AD 的 train 只有 209 張,是典型的「小樣本」場景。自監督學習(contrastive learning、masked image modeling)是少樣本學習的重要工具,DINO、MoCo v3、MAE 等都是 2024 年仍活躍的方法。建議閱讀:Emerging Properties in Self-Supervised Vision Transformers(DINO,2021)。
6. 醫療影像分析。醫療是 CV 技術落地最有價值、也最有挑戰的場景。Day 19 與 Day 20 的分割技術在醫療影像(腫瘤分割、器官分割)上是核心工具。建議閱讀:The Medical Segmentation Decathlon(2020)。
自我評估清單
在列出 13 條自我評估之前,我們用一個簡單的對照函式幫你把「會」與「不會」快速分類:
# 5. 自我評估清單的「會/不會」計數器
checklist = {
"能在 Colab 訓練 PyTorch 模型並存 .pt": "Day 6, 9, 42",
"能寫出自訂 Dataset / DataLoader 與 albumentations": "Day 41, 42, 23",
"能算分類指標與混淆矩陣": "Day 8, 43",
"能比較 YOLO11 / Faster R-CNN / DETR": "Day 13-16",
"能把 U-Net 改成 smp DeepLabV3+": "Day 19, 20",
"能寫 SAM 提示式分割": "Day 22",
"能完整 train GAN 與 Diffusion 並解釋 FID": "Day 34, 35, 38",
"能匯出 ONNX + onnxruntime 推論": "Day 14, 44",
"能用 FastAPI 寫 /predict 端點": "Day 44",
"能用 Streamlit 寫展示頁": "Day 44",
"能做 test 集錯誤分類": "Day 17, 43",
"能解釋 MVTec AD 為何 train 全 good": "Day 41",
"能在 anomaly 場景選 PatchCore / PaDiM": "Day 25, 延伸閱讀",
}
# 假裝你已勾選某些項
checked = {"能在 Colab 訓練 PyTorch 模型並存 .pt",
"能寫出自訂 Dataset / DataLoader 與 albumentations",
"能算分類指標與混淆矩陣",
"能把 U-Net 改成 smp DeepLabV3+",
"能用 FastAPI 寫 /predict 端點"}
print(f"自我評估:{len(checked)}/{len(checklist)} 條已通過")
unfinished = [k for k in checklist if k not in checked]
print("未通過的條目:")
for u in unfinished:
print(f" - {u}(建議補 {checklist[u]})")
# 輸出(取決於 checked 集合):
# 自我評估:5/13 條已通過
# 未通過的條目:
# - 能比較 YOLO11 / Faster R-CNN / DETR(建議補 Day 13-16)
# ... 等等
讀完 45 天後,可以用這個清單自我檢核。如果每條都能說出具體做法,你就是「可上工的 CV 工程師」;若有卡住的地方,可以回頭查對應的篇章。
- 能在 Colab 上 train 一個 PyTorch 模型並把權重儲存成 .pt(Day 6、Day 9、Day 42)。
- 能寫出 PyTorch 的自訂
Dataset與DataLoader,並用 albumentations 處理影像與遮罩同步變換(Day 41、Day 42、Day 23)。 - 能正確選擇分類指標(accuracy、F1、AUROC)並計算混淆矩陣(Day 8、Day 43)。
- 能在同一份資料上比較 YOLO11、Faster R-CNN、DETR 三種偵測器,並說明 mAP 差異的來源(Day 13–16)。
- 能把 U-Net 改成 DeepLabV3+,並用 smp 套件載入 ImageNet pretrained encoder(Day 19、Day 20)。
- 能寫出 SAM 的提示式分割呼叫,並用它給 MVTec AD 瑕疵做 cold-start 標註(Day 22)。
- 能完整 train GAN、Diffusion,並解釋 FID 與 IS 的數學定義(Day 34、Day 35、Day 38)。
- 能把 PyTorch .pt 匯出成 ONNX opset 17,並用 onnxruntime 1.19 載入推論(Day 14、Day 44)。
- 能用 FastAPI 0.115 寫一個 /predict 端點,回傳 JSON 含分類與分割結果(Day 44)。
- 能用 Streamlit 1.39 寫展示頁,把推論結果即時視覺化(Day 44)。
- 能在 test set 上做完整的錯誤分類(FN、FP、Localization、Duplicate)並解釋成因(Day 17、Day 43)。
- 能解釋為什麼 MVTec AD train 全 good、test 才有 defect(Day 41)。
- 能針對 anomaly detection 場景選擇 PatchCore 或 PaDiM 而非 supervised classifier(Day 25、延伸閱讀)。
這 13 條覆蓋了分類、偵測、分割、姿態、生成、部署六個面向,每一條都對應到具體的篇章;如果有 3 條以上答不出來,建議先補課再進入下一步。
常見錯誤與踩雷
錯誤一:學完 45 天覺得自己「都會了」就直接上工。CV 的實際專案遠比 Day 41–44 複雜:客戶資料的格式可能不是 MVTec AD 風格、光源不固定、瑕疵定義模糊、產品線變化快。建議先在小型 demo 證明技術可行,再逐漸擴大範圍。
錯誤二:忽略資料合約與設定檔。許多新手寫完訓練程式就交差,沒有把資料切分、preprocess、threshold 寫成設定檔;當資料變動時整個訓練流程要重寫。Day 41 我們把 manifest 與 project_config.py 寫得很完整,正是要避開這個坑。
錯誤三:用 Python list / dict 當 ML 系統的「資料庫」。Day 44 的服務把產線結果寫進 JSON 是 demo 等級;正式 production 要用 PostgreSQL 或 MongoDB 儲存,且 schema 要固定。建議在 Day 41–44 之上再做一個「資料庫層」設計。
錯誤四:版本混亂。整個系列我們固定 2024 年底版本,但工業界常見的踩雷是「同事裝了 2025 年的新版本,結果某些 API 被 deprecate」。建議用 requirements.txt 或 pyproject.toml 鎖版本,或用 Docker image 鎖住整個環境。
錯誤五:忽略可觀察性。服務上線後沒 log、沒 metrics、沒 alert,等於瞎子摸象。Day 44 的服務應該加上 logging 與 metrics(FastAPI 的 prometheus middleware),把每個 request 的 latency、mask 面積、瑕疵機率寫到 Prometheus + Grafana,工業界已把這個當成標準做法。下面這段示範把推論結果寫成 CSV log,供下游 dashboard 繪圖:
# 6. 為部署的服務加上基本的 CSV log,方便日後做長期的品質追蹤
import csv
from datetime import datetime, timezone, timedelta
from pathlib import Path
LOG_PATH = Path("inference_log.csv")
HEADER = ["timestamp", "filename", "label", "prob_defect", "mask_area_pixels", "latency_ms"]
def log_request(filename, result, latency_ms):
ts = datetime.now(timezone(timedelta(hours=8))).isoformat()
with LOG_PATH.open("a", newline="", encoding="utf-8") as f:
csv.DictWriter(f, fieldnames=HEADER).writerow({
"timestamp": ts,
"filename": filename,
"label": result["label"],
"prob_defect": round(result["prob_defect"], 4),
"mask_area_pixels": result["mask_area_pixels"],
"latency_ms": round(latency_ms, 1),
})
# 範例:寫入一筆 2024-12-15 的測試 log
if not LOG_PATH.exists():
with LOG_PATH.open("w", encoding="utf-8") as f:
f.write(",".join(HEADER) + "\n")
# 假裝一個 request:傳入一張 bottle 影像,推論結果
import time
t0 = time.time()
mock_result = {"label": "defect", "prob_defect": 0.8123, "mask_area_pixels": 612}
log_request("bottle_test_001.png", mock_result, latency_ms=(time.time() - t0) * 1000 + 250)
print(f"已寫入 inference_log.csv,目前 {LOG_PATH.stat().st_size} bytes")
# 輸出範例(每次會 append 一筆):
# 已寫入 inference_log.csv,目前 132 bytes
效能與實務提醒
45 天學完後,最常見的時間分配建議:30% 寫程式、30% 讀論文、20% 看教學影片、20% 做 side project。寫程式是基本功、讀論文吸收前沿、看影片理解思路、做 side project 整合應用。
另外一個工程上的提醒:學完 45 天不等於你能獨立解所有 CV 問題,但你有足夠基礎去讀論文、debug 模型、與其他工程師合作。每週投入 8–10 小時、3 個月就能從這個基礎走到「可獨立負責小型 CV 專案」的程度;6 個月走到「可主導中型專案」。
最後,CV 是 AI 中「落地速度最快」的子領域之一,因為它有非常具體的業務問題(瑕疵、人臉、車牌、文件 OCR 等)。把這系列學到的工具組合起來,你應該能在 3 個月內做出第一個 demo,並在 6 個月內拓展到正式產品。
小結
今天把 45 天的學習路徑整理成一張地圖:七個階段從導論、分類、偵測、分割、姿態、生成、到專案;四個貫穿主題——資料、指標、訓練/推論權衡、錯誤分析;五個常見職涯方向;六個延伸學習方向;以及 13 條自我評估清單。我們的目標不是讓你「會訓練最先進的模型」,而是讓你「能獨立完成一個能 demo、能部署、能解釋的 CV 專案」。這 45 天結束了,但 CV 學習的路還很長;希望這篇能讓你有一張帶得走的「地圖」,在未來遇到問題時知道該回頭查哪一篇。
結語
今天是整個系列的最後一篇。回頭看這 45 天,我們從 Day 1 的任務地圖出發,一路過了分類(Day 3–9)、偵測(Day 10–17)、分割(Day 18–25)、姿態(Day 26–32)、生成(Day 33–40)、最後在 Day 41–44 把所有工具組合成一個可以在 CPU 上跑的瑕疵檢測服務,並在 Day 43 的評估中發現「contamination」是模型瓶頸、在 Day 44 的部署中用 threshold 0.30 做了最有把握的 trade-off。這整個過程是一個完整的「資料 → 模型 → 評估 → 部署」閉環,是工業界最基本也最重要的四步。
最值得帶走的觀念有三個:第一,「資料永遠比模型重要」——一個好的資料流程帶來的提升,往往比換模型還多;第二,「指標必須對應業務問題」——單看 mAP 或 mIoU 容易誤導,必須搭配錯誤案例視覺化與信心門檻掃描;第三,「永遠準備好 retrain」——上線後的服務要有批次再訓練的機制,這是工業界常見的閉環。這三個觀念不只適用於 Day 41–44 的瑕疵檢測,也適用於整個 CV 領域的任何任務。
系列完結,但學習沒有終點。希望這個系列能幫助你走進 CV 領域,並在工廠、醫療、零售等場景中看到「學會的工具可以用在哪裡」。祝你在後續的學習中,找到自己有興趣的方向、做出有影響力的 CV 專案。如果有任何回饋或問題,請透過部落格的聯絡頁找到我。再見。
延伸資源
- PyTorch 官方網站(2024):
https://pytorch.org/,教學、文件、範例與社群入口。 - Timmm(timm)官方 GitHub(1.0.x,2024):
https://github.com/huggingface/pytorch-image-models,最新預訓練模型清單與 benchmark。 - Ultralytics 文件(8.3.x,2024):
https://docs.ultralytics.com/,YOLO11 與 SAM 2 的官方推論、訓練、匯出範例。 - segmentation_models_pytorch(0.3.x,2024):
https://github.com/qubvel/segmentation_models.pytorch,9 種以上分割架構 + 10+ encoder 的統一介面。 - MVTec AD 官方網站(CC BY-NC-SA 4.0):https://www.mvtec.com/company/research/datasets/mvtec-ad,15 類工業影像與 anomaly detection 官方評估基準。
- FastAPI 官方教學(0.115,2024):https://fastapi.tiangolo.com/zh-tw/tutorial/,HTTP 服務、async、Pydantic、依賴注入的標準範例。
- Streamlit 官方文件(1.39,2024):https://docs.streamlit.io/,ML Demo UI 的快速搭建工具。
- 《Deep Learning for Computer Vision》專書(2024):Adrian Rosebrock, Deep Learning for Computer Vision,PyImageSearch 系列,從基礎到 deployment 的全面指南。
- Stanford CS231n:
http://cs231n.stanford.edu/,經典 CV 深度學習課程,2024 年版含 Transformer 與多模態章節(持續開課中)。 - arXiv 電腦視覺每日清單:
https://arxiv.org/list/cs.CV/recent,最新 CV 論文的 RSS feed。
留言
張貼留言