AI技術分享 https://blog.itsmygo.uk vibe coding 學習 Fri, 30 Jan 2026 19:20:15 +0000 zh-TW hourly 1 https://wordpress.org/?v=6.9 https://blog.itsmygo.uk/wp-content/uploads/2026/01/cropped-logo-1-32x32.png AI技術分享 https://blog.itsmygo.uk 32 32 翁家翌:從開源少年到 OpenAI 核心工程師的長期主義之路 https://blog.itsmygo.uk/2026/01/31/%e7%bf%81%e5%ae%b6%e7%bf%8c%ef%bc%9a%e5%be%9e%e9%96%8b%e6%ba%90%e5%b0%91%e5%b9%b4%e5%88%b0-openai-%e6%a0%b8%e5%bf%83%e5%b7%a5%e7%a8%8b%e5%b8%ab%e7%9a%84%e9%95%b7%e6%9c%9f%e4%b8%bb%e7%be%a9%e4%b9%8b/ https://blog.itsmygo.uk/2026/01/31/%e7%bf%81%e5%ae%b6%e7%bf%8c%ef%bc%9a%e5%be%9e%e9%96%8b%e6%ba%90%e5%b0%91%e5%b9%b4%e5%88%b0-openai-%e6%a0%b8%e5%bf%83%e5%b7%a5%e7%a8%8b%e5%b8%ab%e7%9a%84%e9%95%b7%e6%9c%9f%e4%b8%bb%e7%be%a9%e4%b9%8b/#respond Fri, 30 Jan 2026 19:20:15 +0000 https://blogmygo.zeabur.app/2026/01/31/%e7%bf%81%e5%ae%b6%e7%bf%8c%ef%bc%9a%e5%be%9e%e9%96%8b%e6%ba%90%e5%b0%91%e5%b9%b4%e5%88%b0-openai-%e6%a0%b8%e5%bf%83%e5%b7%a5%e7%a8%8b%e5%b8%ab%e7%9a%84%e9%95%b7%e6%9c%9f%e4%b8%bb%e7%be%a9%e4%b9%8b/ 本集 WhynotTV Podcast 邀請到 OpenAI 核心工程師翁家翌,深度回顧他從清華大學到 CMU、再到加入 OpenAI 的完整成長歷程。翁家翌自 2022 年加入 OpenAI 後,深度參與了 GPT-3.5、GPT-4 到 GPT-5 的核心模型開發,他的三大貢獻領域——強化學習、Post-training(後訓練)與 Infra(基礎設施)——正是推動大型語言模型關鍵躍遷的幕後力量。


原影片連結:https://www.youtube.com/watch?v=I0DrcsDf3Os

影片重點

  • 翁家翌從小就具備「投資未來」的超前學習意識,初中便開始自學高中數學
  • 在清華大學開源所有課程作業,致力於打破資訊差,視開源為一種「慈善」
  • 開發「天授」(Tianshou)強化學習框架,僅用兩週完成第一版,性能碾壓主流平台
  • 建立 tuixue online 簽證查詢系統,累積破千萬點擊,服務廣大留學生群體
  • 在 OpenAI 搭建的 Post-training RL 基礎設施,成為支撐 GPT 系列模型的核心系統
  • 認為工程能力比純研究能力更重要,Infra 是當前 AI 發展最大瓶頸
  • 對 AGI 的判斷:實現取決於 Infra 迭代速度,未來組織將由 AI Agent 管理
  • 採用「假裝自由意志存在」的實用主義哲學面對確定性世界觀

詳細內容

[02:33] 童年與「投資未來」的思維方式

翁家翌從小就展現出與眾不同的學習策略。他在小學一年級就開始接觸數學奧林匹克訓練,但最關鍵的不是他有多聰明,而是他很早就建立了「投資未來」的意識——初中時便開始超前學習高中數學,透過建立知識樹的方式快速連結不同知識點,實現高效解題。這種超前投資的思維模式貫穿了他此後的整個成長歷程。

[08:10] 高中計算機競賽與升學抉擇

翁家翌在高中時期投入了資訊學競賽(OI),在福建省信息學競賽中表現突出,以最小二分覆蓋題獲得省隊唯一的銅牌。這個成績為他爭取到了清華大學「降 60 分」錄取的資格。面對清華降分錄取和上海交大全額錄取的選擇,他最終選擇了清華。

[16:02] 在清華開源作業與打破資訊差

進入清華後,翁家翌做了一件讓他「火遍校園」的事:他將所有課程作業和資料開源。這不是為了炫耀,而是出於一個樸素的信念——打破資訊差。他認為「資訊平權」比捐樓更具社會價值。在他的價值觀裡,開源不是履歷裝飾,而是一種對世界的投入方式,追求的不是掌聲,而是 impact(影響力)。他甚至修復了清華校園網的漏洞。

[19:23] 本科與強化學習結緣

在本科期間,翁家翌開始接觸強化學習(Reinforcement Learning),這成為他日後職業生涯的核心方向。強化學習是一種透過環境互動來優化策略的機器學習方法,與監督學習不同的是,RL 需要 agent 在環境中不斷嘗試、獲取回饋、調整策略。

[28:00] 在 Yoshua Bengio 組暑研做 NLP

翁家翌曾在深度學習先驅 Yoshua Bengio 的實驗室進行暑期研究,嘗試了 Mixture of Experts(MOE)架構的 NLP 研究。雖然最終沒有取得突破性成果,但這段經歷讓他對 NLP 和強化學習兩個領域都有了更深入的理解。

[30:38] 對前 ChatGPT 時代 NLP 和 RL 的反思

回顧 ChatGPT 出現之前的學術環境,翁家翌認為當時學術界的 RL 研究存在根本性問題:過度關注 toy benchmark 的調參,而忽略了真正的工業級應用。學術界追求的目標與工業界需要解決的真實問題之間存在巨大鴻溝。

[32:47] 留學申請季的挫折與成長

翁家翌在留學申請季經歷了不小的挫折——PhD 申請並不順利,最終接受了碩士項目的錄取。但這段經歷讓他重新思考了什麼才是真正重要的。他開始掙脫固有評價體系的束縛,不再執著於學術頭銜,而是專注於實際的影響力和價值創造。

[41:08] 天授(Tianshou)強化學習框架

「天授」框架的誕生源自一個真實的痛點:翁家翌不想再浪費時間「煉丹」。2019 年底,他意識到 RL 領域的問題不在算法本身,而在實驗平台。他看了當時最主流的 RLlib 源代碼,發現其抽象極度複雜,幾十萬行代碼幾乎無法下手。

於是他在 2020 年春節假期推倒重來,兩週內完成了第一版——整個平台只用 1500 行左右的代碼,卻在已有的 toy scenarios 上完勝所有其他平台。「天授」追求極致的一致性和簡潔性,迅速成為強化學習社群的標杆。

[48:07] tuixue online 簽證查詢系統

另一個開源項目 tuixue online 源自翁家翌的親身需求——他急需一個實時爬蟲工具來查詢美國簽證預約狀態。這個項目一上線就爆發,初期便有超過一百萬點擊,累積至今已破千萬。雖然後來因美領館系統升級而失效,但它完成了其社會價值。他把天授和 tuixue 都稱作「做慈善」——「完全 nonprofit(非營利),這種慈善項目讓我感覺非常滿足。」

[49:54] 追求 Impact 的底層邏輯

翁家翌的核心驅動力是 impact(影響力),但不是那種追求掌聲的影響力。他認為「創造實用工具即慈善」,把做工具視為一種對世界的投入方式。這種價值觀驅動著他的每一個選擇——從開源作業到開發天授,再到後來加入 OpenAI。

[56:21] CMU 讀研與加入 OpenAI

翁家翌在 CMU 完成碩士學業後,面臨多個職業選擇。2020 年他獲得了多家科技公司的 offer,包括幻方量化(DeepSeek 前身)、NVIDIA、TikTok 和 Facebook AI Research(FAIR)。但他最終選擇了 OpenAI,原因很簡單:「當時 OpenAI 和 DeepMind 是強化學習做得最好的兩個 lab。」

[59:46] 與 John Schulman 的面試故事

翁家翌由 OpenAI 聯合創始人 John Schulman 親自面試錄用。John Schulman 本身就是強化學習領域的重要人物,是 PPO(Proximal Policy Optimization)算法的主要作者。這次面試不僅改變了翁家翌的職業軌跡,也讓他進入了 AI 風暴的正中心。

[01:01:54] 為什麼沒有讀 PhD、研究 vs. 工程能力

翁家翌解釋了為什麼沒有選擇繼續讀 PhD——他認為在當前的 AI 時代,工程能力的重要性已經超越了純研究能力。他的觀點直截了當:「教一個 researcher 如何做好 engineering,比教一個 engineer 如何做好 research 難得多。」這並非否定研究的價值,而是強調在工業界,快速迭代和執行力才是制勝關鍵。

[01:06:31] Infra 的重要性

翁家翌特別強調了基礎設施(Infra)在 AI 發展中的核心地位。當模型的參數量和並發規模達到一定程度時,GPU 協同、分散式通信與可複現的實驗迭代成為決定性因素。他認為 Infra 是當前 AI 發展的最大瓶頸——不是演算法不夠好,而是基礎設施跟不上。「修 bug 數量決定模型品質」,這句話深刻反映了工業級 AI 開發的現實。

[01:09:28] 還會鼓勵學生讀 AI PhD 嗎?

面對這個敏感問題,翁家翌的回答頗為務實。他認為傳統的 AI PhD 路徑正在面臨挑戰,因為研究員可能是最先被 AI 取代的群體之一。他並非全盤否定 PhD 的價值,而是建議學生們要更加務實地思考自己的職業規劃。

[01:13:13] 什麼是強化學習與 Post-training

翁家翌用通俗的方式解釋了強化學習和 Post-training 的概念。Post-training(後訓練)是指在模型完成初始的預訓練(Pre-training)之後,透過強化學習、人類回饋(RLHF)等方式進一步精煉模型的過程。這個階段對模型最終的表現品質至關重要——它決定了模型能否真正理解人類意圖、提供有用的回應。

[01:14:22] 加入 OpenAI 時 ChatGPT 並非主線

一個有趣的事實是:翁家翌 2022 年加入 OpenAI 時,ChatGPT 並不是公司的主線項目。ChatGPT 最初只是一個實驗性的回饋收集產品,團隊並沒有預料到它會引發如此大規模的成功。加入之初,翁家翌參與的是 WebGPT 的後續項目,透過強化學習讓模型更好地與使用者互動。

[01:19:18] 2022 年加入 OpenAI 的初印象

翁家翌描述了他 2022 年初次踏入 OpenAI 的感受。最讓他印象深刻的是公司的人才密度——每個人都極其優秀,資訊流動效率非常高。在 OpenAI,你遇到的每個同事都可能是某個領域的頂尖人物。他自嘲是「賣鏟子裡最面向客戶的那位」,因為強化學習模組處於基礎設施棧的頂端。

[01:24:09] GPT 後訓練的前世今生與 RLHF 突破

翁家翌深入介紹了 GPT 系列模型 Post-training 的發展歷程。2022 年做 RLHF 時面臨許多關鍵挑戰:從技術結構上看,這套 Post-training 系統的難度遠高於他曾開發的天授框架。Toy task 的瓶頸在環境(計算只要幾微秒),而大模型的瓶頸在模型本身(訓練和採樣需要幾百甚至上千秒)。他負責構建的 RL 訓練系統在 ChatGPT 爆發式上線之前,已成為公司內部主力使用的 Infra 之一。

[01:27:01] 工業級 RL Infra 的挑戰

工業級的 RL Infra 與學術界的實驗平台有著天壤之別。翁家翌面對的是真實的分散式系統挑戰:數千張 GPU 的協同訓練、模型的高效採樣、訓練過程的可複現性等。他正是那個站在強化學習、系統工程與大語言模型交叉點的人——不僅要懂 RL 的邏輯,也要理解分散式系統、語言模型的推理方式以及底層架構。

[01:32:08] 未來 5-10 年大語言模型的挑戰

翁家翌認為未來大語言模型面臨的核心挑戰包括:基礎設施的迭代速度能否跟上需求、如何避免 reward hacking(獎勵作弊)、以及如何有效衡量模型的真實能力。Infra 的吞吐效率才是模型競爭的核心指標。

[01:36:30] 現在的路徑能達到 AGI 嗎?

關於 AGI 的定義,翁家翌表示 OpenAI 內部並沒有統一標準。他個人的看法很務實:「如果它能完成 80%、90% 我認為有意義的任務,那它可能就是 AGI 了。」他認為 AGI 的實現取決於 Infra 迭代速度,並預測未來組織將由擁有無限 context 的 AI Agent 來管理,以解決人類協作的瓶頸。

[01:38:34] OpenAI 還 Open 嗎?

面對這個尖銳的問題,翁家翌澄清了 OpenAI 的「Open」含義:並非對所有同行開放所有技術細節,而是「盡可能以低門檻的方式讓普通人用上強大工具」。這是一種產品層面的開放,而非源代碼層面的開放。

[01:43:30] OpenAI 實現 AGI 使命的最大挑戰

翁家翌認為 OpenAI 實現 AGI 使命面臨的最大挑戰在於:如何在快速發展的競爭環境中保持技術領先,同時確保安全性。被問到 OpenAI 為何能做出如此爆款產品,他歸結於兩個因素:一是單位時間迭代效率足夠高,二是領導層真正懂技術。

[01:44:02] 內部視角看 Sam Altman 被開除事件

翁家翌以 OpenAI 內部人員的視角回顧了 2023 年的 Sam Altman 開除事件。他提到 Ilya Sutskever 把 Sam 和 Greg 分別叫進會議通知解職,這場風波的根源在於技術安全與快速部署之間的理念分歧。

[01:46:37] 如何看待人才流失與 AI 競賽

關於 OpenAI 的人才流失問題,翁家翌並沒有過度擔憂。他認為在 AI 領域,人才的流動是正常的。對於 DeepSeek 等競爭對手,他認為真正引發警覺的不是榜單成績,而是其迭代速度——「idea 是廉價的,關鍵是快速驗證」。

[01:52:48] 未來與宿命論

節目尾聲,對話轉向了更深層的哲學議題。翁家翌持有一種確定性的世界觀,但他的應對方式很實用主義:「假裝自由意志存在」,將精力聚焦於可驗證的技術問題,而非陷入哲學困境。他不考慮創業,而是希望十年後的自己仍然在做有意義的技術工作,最大化在 OpenAI Blog 上出現的次數。

我的想法

這期兩小時的深度訪談,最打動我的不是翁家翌的技術成就,而是他那套一以貫之的價值體系——「投資未來」和「追求 impact」。

從開源清華作業到開發天授框架、再到建設 OpenAI 的 RL Infra,翁家翌的每一步都不是為了短期回報,而是在構建長期的影響力。這讓我想到一個有趣的對比:在當前 AI 領域「搶發論文、追求 benchmark」的浮躁氛圍中,翁家翌代表了另一種路徑——做基礎設施、做工具、做那些別人不願意做但又不可或缺的事情。

他關於「工程能力比研究能力更重要」的觀點雖然爭議性強,但確實切中了當前 AI 產業的痛點。在大模型時代,真正的競爭壁壘不是一篇論文裡的新演算法,而是能否高效、穩定地把這個演算法跑在數千張 GPU 上。翁家翌用他的職業軌跡證明了這一點。

另一個值得深思的觀點是他對 AGI 的務實定義。比起學術界對 AGI 的抽象定義,「能完成 80%-90% 有意義的任務」這個標準更具可操作性。或許我們不需要等待一個「完美的 AGI」——一個足夠好的系統,配合高效的 Infra,就能改變世界。

最後,他「假裝自由意志存在」的生活哲學也令人深思。在一個可能是確定性的宇宙中,選擇「如同自己有自由意志般行動」,這本身就是一種很有力量的生活態度。

進階測驗:翁家翌——從開源少年到 OpenAI 核心工程師

測驗目標:驗證你是否能在實際情境中應用所學,深入理解翁家翌的技術觀點與 AI 產業邏輯。
共 5 題,包含情境題與錯誤診斷題。

1. AI 團隊的技術決策 情境題

你是一家 AI 新創公司的技術主管,團隊正在開發大型語言模型。 目前團隊有兩位頂尖的 ML 研究員,但模型訓練經常因為分散式系統的 bug 而中斷, GPU 利用率只有 40%,實驗迭代週期長達兩週。 根據翁家翌在 OpenAI 的經驗,你應該優先採取什麼行動?
  • A. 招聘更多 ML 研究員來加速演算法創新,用更好的演算法彌補基礎設施的不足
  • B. 優先招聘系統工程師來改善 Infra,提升 GPU 利用率和實驗迭代速度
  • C. 購買更多 GPU 來解決算力瓶頸,用硬體數量彌補利用率的問題
  • D. 先發表幾篇論文提升團隊學術聲譽,再用聲譽吸引更多人才加入

2. 開源項目的價值判斷 情境題

你開發了一個強化學習框架,在學術基準測試上表現優異。 現在你面臨選擇:繼續在學術界維護這個框架並發表更多論文, 還是放棄學術維護,轉向工業界去解決真正的大規模問題。 你發現學術界的 RL 研究大多停留在 toy benchmark 調參, 與工業界真實需求之間存在巨大鴻溝。 根據翁家翌從「天授」到 OpenAI 的經歷,最合理的決策邏輯是什麼?
  • A. 堅持維護學術框架,論文引用數是衡量 impact 最客觀的標準
  • B. 同時維護學術框架和工業項目,兩邊都不放棄才能最大化影響力
  • C. 轉向工業界,因為真正的 impact 來自解決真實問題而非 toy benchmark
  • D. 將框架商業化成立公司,用商業成功來證明技術價值

3. 面對 AI 競爭對手的策略 情境題

你所在的 AI 公司發現競爭對手在某個公開排行榜上超過了你們的模型。 團隊內部產生恐慌,有人建議立即投入資源針對該排行榜進行優化, 也有人建議先分析對手的技術路線。 根據翁家翌對 DeepSeek 競爭的看法,團隊最應該關注的核心指標是什麼?
  • A. 排行榜成績,因為排名直接影響用戶信任和市場份額
  • B. 模型參數量,更大的模型通常意味著更強的能力
  • C. 論文發表數量,學術影響力是技術領先的最佳證明
  • D. 對手的迭代速度和基礎設施吞吐效率,因為這才是長期競爭力的核心

4. Post-training 系統的效能瓶頸 錯誤診斷

一位工程師正在為大型語言模型搭建 Post-training RL 系統。 他直接套用了學術界 RL 框架(類似天授)的架構設計: – 環境模擬:使用 Prompt 作為環境(計算只需幾微秒) – 模型採樣:每次採樣需要幾百到上千秒 – 訓練流程:按照 toy task 的方式串行處理 結果系統效能極差,GPU 利用率不到 10%。 這位工程師的核心錯誤在哪裡?
  • A. 不應該用 Prompt 作為環境,應該用更複雜的模擬器
  • B. 忽略了大模型的瓶頸在模型本身而非環境,需要重新設計分散式訓練和採樣架構
  • C. 使用的 RL 演算法過時了,應該換成最新的演算法
  • D. GPU 數量不夠,只需要增加硬體就能解決問題

5. 對「Open」的誤解 錯誤診斷

一位科技記者寫了以下評論: 「OpenAI 的名字裡有 Open,但它既不公開模型權重,也不分享訓練數據。 它背叛了自己的創立使命,已經變成了一家純粹的閉源商業公司。 真正的 ‘Open’ 應該像 DeepSeek 那樣公開一切。」 根據翁家翌對 OpenAI「Open」含義的解釋,這段評論的核心認知錯誤是什麼?
  • A. DeepSeek 其實也沒有完全開源,記者的對比不成立
  • B. OpenAI 其實有公開部分模型權重,記者的事實陳述有誤
  • C. 記者誤解了 OpenAI 的「Open」含義——它指的是「以低門檻讓普通人用上強大工具」的產品層面開放,而非源代碼層面的開放
  • D. OpenAI 從一開始就是閉源公司,名字裡的 Open 只是品牌命名
]]>
https://blog.itsmygo.uk/2026/01/31/%e7%bf%81%e5%ae%b6%e7%bf%8c%ef%bc%9a%e5%be%9e%e9%96%8b%e6%ba%90%e5%b0%91%e5%b9%b4%e5%88%b0-openai-%e6%a0%b8%e5%bf%83%e5%b7%a5%e7%a8%8b%e5%b8%ab%e7%9a%84%e9%95%b7%e6%9c%9f%e4%b8%bb%e7%be%a9%e4%b9%8b/feed/ 0
It Got Worse (Clawdbot) https://blog.itsmygo.uk/2026/01/30/it-got-worse-clawdbot/ https://blog.itsmygo.uk/2026/01/30/it-got-worse-clawdbot/#respond Fri, 30 Jan 2026 03:49:45 +0000 https://blog.itsmygo.uk/2026/01/30/it-got-worse-clawdbot/ Clawdbot(一個基於 Claude 的 AI 聊天機器人產品)的安全災難持續惡化。本片揭露了數百甚至數千個 Clawdbot 實例遭到駭客入侵的現況,包括 Nginx 反向代理漏洞、技能倉庫的供應鏈攻擊,以及 API 金鑰外洩等嚴重問題,並提供了一系列實用的安全防護建議。


原影片連結:https://www.youtube.com/watch?v=rPAKq2oQVBs

影片重點

  • 數百至數千個 Clawdbot 實例已被駭客入侵,控制面板完全暴露在公開網路上
  • 透過 Shodan 等服務搜尋特定關鍵字,即可找到大量未受保護的 Clawdbot 伺服器
  • Nginx 反向代理的設定漏洞讓攻擊者能完全存取使用者的控制面板、訊息歷史和 API 金鑰
  • 技能倉庫(Claude Hub / MoltHub)缺乏安全審查機制,容易遭受供應鏈攻擊
  • 白帽駭客 Jameson 成功建立了偽造的後門技能,並將下載次數灌到 4,000 以上
  • 建議使用非預設端口、設定密碼、更新至最新版本、配置 trusted proxies
  • 安裝技能前應仔細審查所有檔案,並透過第三方 AI 驗證其安全性
  • 所有已暴露的 API 金鑰都應立即輪換(rotate)

詳細內容

00:00 Clawdbot 安全災難現況

影片開頭,Nick Saraev 表示在查看 Clawdbot 的最新狀況後發現事態比想像中更嚴重。目前已有使用者被 Claude 永久封禁帳號,有人在 Claude Hub 上建立惡意技能,甚至取得其他人控制面板的 root 權限。估計已有數百到數千個 Clawdbot 實例遭到入侵。

他形容這是「Vibe Coding 的紅色婚禮」——一場正在即時上演的災難。

01:00 公開暴露的控制面板

大多數使用者將 Clawdbot 部署在 VPS 上,需要將其發布到公開可存取的 URL。然而,像 Shodan 這類服務會不斷掃描並索引網路上所有可用的 URL。只要在這些公開索引資料庫中搜尋「Clawbot control」這段文字,就能找到數千台正在運行的伺服器,而且只需點擊連結就能直接存取。

Nick 展示了一個實際案例——某人的 Clawdbot 控制面板頁面。他特別挑選了一個顯示「已斷線、需要身份驗證」的安全範例,以避免實際存取他人的 API 憑證。

02:15 Nginx 反向代理漏洞

一位名為 Jameson 的安全研究員發現,如果 Clawdbot 伺服器使用 Nginx 作為反向代理,由於 Nginx 與 Clawdbot 之間的交互方式存在漏洞,攻擊者可以完全存取任何人的 Clawdbot 控制面板。這意味著不僅能讀取所有收發的訊息,還能取得所有技能設定、配置資訊以及 API 金鑰。

這個問題之所以如此嚴重,是因為大多數使用者會將所有 API 金鑰、Token 和各平台(如 Anthropic 等)的密鑰都上傳到 Clawdbot 中。一旦被入侵,攻擊者等於掌握了使用者的全部數位生活。

03:30 白帽駭客的發現

Jameson 作為白帽駭客,透過這個漏洞找到了一位自稱「AI 系統工程師」的使用者資訊,成功完整辨識其身份並取得所有訊息歷史。Nick 指出目前有數百位安全專家正在批評 Clawdbot 的安全狀況有多糟糕,同時也有使用者給予 Clawdbot root 權限後系統完全失控的案例。

04:30 安全防護建議一:鎖定基礎設施

Nick 開始提供具體的安全建議。首先是更改預設端口。目前最常被掃描的 Clawdbot 端口是 18789(預設端口)。使用預設端口等於讓掃描服務能快速鎖定你的伺服器。建議使用亂數產生器選擇一個非傳統端口(例如 44892),避免使用 443、80、8080、3000 等常見端口。

如果不知道如何操作,可以直接讓 Claude Code 存取你的伺服器來進行設定。

05:40 安全防護建議二:設定密碼與更新版本

第二個建議是一定要設定密碼,不要留空。雖然密碼是預設設定,但仍有部分使用者未設定。

第三個建議是更新 Clawdbot 到最新版本。最新版本已修補了 Nginx 反向代理的漏洞。但由於所有人都是自行架設,沒有自動更新機制,必須手動更新。

對於尚未更新的使用者,務必設定 gateway.trusted_proxies,尤其是使用 Nginx/Caddy 反向代理的情況。如果不設定,控制面板會將所有存取者視為 localhost,等同於對任何人敞開大門。

如果想要最高安全性,建議使用 Tailscale 或其他 VPN 方案。

07:00 安全防護建議三:輪換 API 金鑰

如果你已經將 Clawdbot 發布到公開 URL 但尚未做任何安全措施,應該立即輪換所有 API 金鑰。大多數知名服務都提供金鑰輪換功能,可以在金鑰洩漏時快速更換。

07:20 供應鏈攻擊:技能倉庫的風險

另一個重大攻擊向量是供應鏈層面——也就是人們用來擴展 Clawdbot 功能的技能和工具倉庫。Claude Hub(已更名為 MoltHub)提供了各種附加功能,如網頁聊天、音訊通知、決策樹等。

問題在於這些倉庫缺乏安全審查機制。Jameson 實際建立了一個偽造的後門技能,並將下載次數灌到 4,000 以上。由於 MoltHub 的排名演算法非常簡單(僅根據單位時間的下載量排序),這個惡意技能很快就被推上了首頁推薦位置。當不知情的使用者下載並安裝這個技能後,所有 API Token 都可能被竊取。

08:45 如何安全使用技能倉庫

Nick 提供了幾個保護建議:首先,交叉驗證網站的可信度,在社群媒體上搜尋是否有可信的人在討論這個網站。

其次,在執行任何技能之前,閱讀其中的每一個檔案,不要只看頂層的 skill.md。更好的做法是將整個技能檔案丟給一個全新的 Claude、Gemini 或 ChatGPT 實例,讓它分析這個技能是否真的做了它聲稱要做的事。

再者,檢查作者資訊,確認他們是否有真實的聲譽、真實的面孔和關聯的 GitHub 帳號。有真實 commit 歷史的開發者通常不會冒險發布惡意內容。

最後,Nick 建議開發者們將 Claude Hub 等技能倉庫視為「早期的 npm」——假設所有內容都未經審查,每個下載的套件都可能有問題。

10:00 總結

Nick 表示他非常看好這類技術的未來,但目前絕不會將所有 API 金鑰託付給 Clawdbot。他宣布這是他最後一次在頻道上討論 Clawdbot 的話題,祝大家好運。

我的想法

這部影片揭示了 Vibe Coding 時代一個被嚴重低估的問題:當非技術使用者能夠快速部署複雜系統時,安全性往往是最先被忽略的環節。Clawdbot 的案例完美展現了「易用性」與「安全性」之間的永恆矛盾。

供應鏈攻擊的部分特別值得關注。MoltHub 的排名機制如此容易被操控,反映出整個 AI Agent 生態系統在安全基礎設施上的不成熟。這與早期 npm 生態系統遭遇的問題如出一轍,但 AI Agent 的風險更高——因為它們通常需要更多權限(API 金鑰、系統存取權等)。

對於正在使用類似工具的開發者,最實用的建議可能是:永遠假設你的系統會被掃描到,以此為前提來設計安全策略。使用 VPN(如 Tailscale)、非預設端口、強密碼,以及定期輪換金鑰,這些都是基本但有效的防護措施。

進階測驗:It Got Worse (Clawdbot)

測驗目標:驗證你是否能在實際情境中應用 Clawdbot 安全防護知識。
共 5 題,包含情境題與錯誤診斷題。

1. 你剛將 Clawdbot 部署到 VPS 上,需要選擇一個端口來暴露控制面板。以下哪種做法最安全? 情境題

目前設定: – VPS 已設定防火牆 – Clawdbot 使用預設端口 18789 – 控制面板已設定密碼 – 尚未配置反向代理
  • A. 保持預設端口 18789,因為已經有防火牆和密碼保護
  • B. 改用常見端口 443,因為 HTTPS 預設端口更安全
  • C. 使用亂數產生的非傳統端口(如 44892),並搭配 Tailscale VPN
  • D. 改用端口 3000,因為開發用端口較少被攻擊

2. 你在 MoltHub(原 Claude Hub)上發現一個很受歡迎的技能,下載量超過 4,000 次。你打算安裝到自己的 Clawdbot。以下哪個步驟最關鍵? 情境題

技能資訊: – 名稱:Super AI Assistant Pro – 下載量:4,200+ – 上架時間:3 天前 – 作者:無 GitHub 連結、無社群資料
  • A. 下載量超過 4,000 表示已被社群驗證,可以直接安裝
  • B. 將技能所有檔案餵給獨立的 AI 實例,分析是否包含惡意指令
  • C. 只閱讀頂層 skill.md 確認功能描述正確即可安裝
  • D. 等下載量超過 10,000 再安裝,屆時更安全

3. 你發現自己的 Clawdbot 控制面板可能已經被公開索引。你已經上傳了多個平台的 API 金鑰。應該優先採取什麼行動? 情境題

已知情況: – Clawdbot 使用預設端口 18789 – 未設定 gateway.trusted_proxies – 使用 Nginx 反向代理 – 已上傳 Anthropic、Twitter、Discord 等 API 金鑰
  • A. 先更新 Clawdbot 到最新版本,再處理其他問題
  • B. 先更改端口為非預設值,讓掃描服務找不到
  • C. 先設定 gateway.trusted_proxies,修補 Nginx 漏洞
  • D. 立即輪換所有已上傳的 API 金鑰,因為它們可能已經洩漏

4. 小王將 Clawdbot 部署到 VPS 並使用 Nginx 作為反向代理,但發現任何人只要知道 URL 就能完整存取控制面板,無需登入。最可能的根本原因是什麼? 錯誤診斷

症狀: – 控制面板已設定密碼 – 直接用 IP + 端口存取時會要求登入 – 但透過域名(經過 Nginx)存取時,不需要登入就能看到所有內容 – Clawdbot 版本為舊版
  • A. Nginx 設定檔中的密碼保護規則有誤
  • B. 未設定 gateway.trusted_proxies,導致控制面板將所有經過 Nginx 的請求視為 localhost
  • C. 控制面板的密碼設定被 Nginx 覆寫
  • D. Nginx 的 SSL 憑證過期導致認證機制失效

5. 小李在 Shodan 上發現自己的 Clawdbot 伺服器已被索引。他更改了端口並設定了密碼,但幾天後伺服器再次出現在掃描結果中。最可能的問題是什麼? 錯誤診斷

小李的操作: 1. 將端口從 18789 改為 8080 2. 設定控制面板密碼 3. 未更新 Clawdbot 版本 4. 未設定 VPN
  • A. 端口 8080 仍是常見端口,在 Shodan 的高優先掃描清單中
  • B. 密碼設定後需要重新啟動 Clawdbot 才會生效
  • C. Shodan 有快取機制,顯示的是舊資料
  • D. 因為沒有更新 Clawdbot 版本,密碼保護功能不可用
]]>
https://blog.itsmygo.uk/2026/01/30/it-got-worse-clawdbot/feed/ 0
VS Code 呂鵬:VS Code 團隊的 AI 工作流進化論 https://blog.itsmygo.uk/2026/01/30/vs-code-%e5%91%82%e9%b5%ac%ef%bc%9avs-code-%e5%9c%98%e9%9a%8a%e7%9a%84-ai-%e5%b7%a5%e4%bd%9c%e6%b5%81%e9%80%b2%e5%8c%96%e8%ab%96/ https://blog.itsmygo.uk/2026/01/30/vs-code-%e5%91%82%e9%b5%ac%ef%bc%9avs-code-%e5%9c%98%e9%9a%8a%e7%9a%84-ai-%e5%b7%a5%e4%bd%9c%e6%b5%81%e9%80%b2%e5%8c%96%e8%ab%96/#respond Thu, 29 Jan 2026 16:21:55 +0000 https://blog.itsmygo.uk/2026/01/30/vs-code-%e5%91%82%e9%b5%ac%ef%bc%9avs-code-%e5%9c%98%e9%9a%8a%e7%9a%84-ai-%e5%b7%a5%e4%bd%9c%e6%b5%81%e9%80%b2%e5%8c%96%e8%ab%96/ VS Code 團隊工程經理呂鵬(Penn)分享了 VS Code 在 AI 智能體整合方面的最新進展。從 2025 年 2 月推出 Agent 模式以來,團隊已發展出本地前台、後台、雲端三種智能體類型,並正在探索如何統一管理這些多元化的智能體會話。本次對談深入探討了大型程式碼庫面臨的專案就緒度、程式碼審查瓶頸,以及如何將 AI 工作流融入日常開發實踐。


原影片連結:https://www.bilibili.com/video/BV11zkVBHED3

影片重點

  • VS Code 已推出自訂智能體、完整 MCP 支援、規劃模式等大量 AI 功能
  • 團隊將智能體分為三類:本地前台(互動式)、後台(非干擾式)、雲端(完全自主)
  • 七月引入 Coding Agent 整合,可從 GitHub Issue 觸發智能體自動處理問題
  • Copilot CLI 已整合至 VS Code,統一各類智能體體驗
  • 大型專案(如 VS Code 本身)需要「專案就緒度」設定才能有效使用後台/雲端智能體
  • AI 生成程式碼的審查成為新瓶頸——人類反而成了流程中最慢的環節
  • 工作流優化是持續演進的過程:從手動指令到共享工具再到自訂代理
  • 設計規範文件可同時作為開發計畫和測試計畫,是團隊協作的核心

詳細內容

[00:00] 講者介紹與功能概覽

呂鵬(Penn)是 VS Code 團隊的工程經理,2016 年加入團隊,先後負責 Monaco 編輯器、VS Code 與 GitHub 整合、原生 Notebook 功能等開發。近年來深度投入 AI 整合與 Copilot 工作。

自 2025 年 2 月推出智能體模式以來,VS Code 已陸續推出自訂智能體、完整規格 MCP 支援、規劃模式等功能。Penn 和 Ben 的小團隊重點聚焦在智能體與智能體會話管理領域。

[01:03] Coding Agent 整合與統一智能體體驗

七月份,VS Code 引入了 Coding Agent 整合功能。使用者可以在 github.com 上建立 Issue,智能體會代為處理該問題,或在 GitHub Action 中遠端修復漏洞。當使用者返回 VS Code 時,可以瀏覽和審查修改內容,並與智能體互動協作。

下一步是將 Copilot CLI 整合到 VS Code,統一智能體體驗。透過與 Codex 擴充功能的整合,使用者可以使用各種類型的代理——無論是雲端版本、終端介面、後台運行還是前台運行。

[01:49] 三種智能體類型的定義

隨著多種不同類型的代理出現,管理它們成為新挑戰。世界正從「單一代理同步運行在前台」轉向「可管理多種類型代理的大規模並行代理會話」時代。團隊將智能體分為三類:

本地/前台智能體:就是每天在側邊欄使用的那個。它需要響應迅速、具備互動性,使用者期待快速回應,不想等十分鐘才得到回覆。

後台智能體:更像是「這是任務和上下文,你去執行吧」的模式。它不會干擾當前的編輯器和終端,不會不斷詢問權限,需要一定程度的自主行動能力。它仍在同一台機器運行,可存取已設定的 MCP 服務器。完成後會發送通知提醒使用者查看結果。

雲端智能體:運行更隔離,完全在雲端遠端運行,可從任何地方啟動。典型工作流程是在 Issue 上觸發,也可以在離開電腦前將活躍的前台任務發送至雲端繼續運行。

[05:51] 統一視圖管理的挑戰

最初本地代理、後台代理和雲代理都在聊天編輯器中,但各類代理行為不同,造成使用者困惑。這推動團隊思考如何提供統一的視圖管理,同時讓使用者理解各類代理有不同的預期和能力。

[06:35] 專案就緒度問題

對 VS Code 這樣擁有數百萬行程式碼的大型專案,讓後台或雲端智能體有效運作需要仔細的專案設定。例如,要在後台代理中執行測試(單元測試、整合測試、冒煙測試),加上 Playwright 這樣的 MCP 服務器來啟動瀏覽器和截圖,都需要確保 MCP 服務器生成的內容不僅供人類查看,還要供代理審查和迭代。

如果專案未正確設定就推送到後台,可能得不到好結果——甚至運行結束後程式碼仍無法編譯。團隊認為可以透過定義 Hook、技能(Skill)、Prompt 規則或工作流程來降低使用門檻,提高後台和雲端代理的成功率。

[08:56] 代理產物的展示挑戰

目前 VS Code 在每次會話後會展示程式碼更改,但程式碼並非唯一的產物。例如使用代理運行測試可能花費 20-30 分鐘,過程中產生的截圖和推理過程也很重要。Penn 表示他不會百分之百信任代理的輸出,仍想瀏覽推理過程和關鍵截圖。目前 VS Code 工作台還沒有很好的方式展示這些非程式碼產物。

[09:51] 大型專案的程式碼審查困境

對於個人小型專案,Penn 不太介意 AI 生成的程式碼——如果不好用,撤銷重寫也只需一小時。但 VS Code 是龐大的開源產品,對程式碼品質、架構預期和程式碼異味都有很高要求。

想像一下:VS Code 每月有三千個 Issue,其中很多是 Bug。如果搭建完美的自動化流水線——分析程式碼庫、找出根本原因、進行修改、編譯驗證——每月可能產出大量 PR。但這時,人類成了流程中的審查瓶頸。這正是 VS Code 團隊需要在工具層面解決的問題,讓開發者既能保持創意和專注關鍵路徑,又能有效地與代理協作。

[11:36] 工作流優化的演進模式

Penn 分享了他個人在工作流優化上的持續演進。最初需要明確的程式碼規範指令,因為代理常常忘記遵循。但隨著模型越來越智能,它已能自行讀取 package.json、執行 npm install、處理 Node 版本問題。

他觀察到一個模式:先與代理協作完成前台工作,觀察代理犯了哪些錯誤,如果自己不斷重複同樣的糾正,就將其提取為共享工具。一個五步流程可以變成自訂代理、技能(Skill),或加上 Hook。這是一個從「觀察痛點」到「結構化工具」的持續優化循環。

[13:04] 設計規範作為活文件

Penn 傾向於將規劃保存為文件文件,作為「活文件」(Living Document)使用。當團隊為 VS Code 構建功能時,從一個 Issue 開始,列出常見場景和使用方式,成為團隊的北極星指引。

現在他將這些規範交給代理自主工作,最終希望另一個代理也能測試功能。有趣的是,同一份設計規範既是開發計畫,也可以轉變為測試計畫——讓代理驗證變更是否按步驟正確執行。這種「自然語言規範即計畫即測試」的模式在小型專案中效果顯著,但對中大型專案仍需要更多思考。

[14:24] 多代理並行與持續學習

Penn 提到現在可以同時運行多個代理會話。之前只能運行一個時,他的策略是在同一對話中不斷加入新提示。現在支持並行異步運行多個代理後,後台機制的核心在於隔離性——防火牆隔離、環境隔離、甚至設備隔離。

最後,Penn 強烈鼓勵大家親身嘗試,將 AI 智能體融入日常工作流程,感受其中的「小摩擦」,然後反饋給團隊以改進產品。

我的想法

這場對談讓我印象最深的是 Penn 提出的「人類成為瓶頸」這個觀點。當 AI 代理能夠自動分析 Bug、修改程式碼、通過測試時,反而是人類的程式碼審查速度跟不上了。這是一個有趣的角色反轉——過去我們擔心 AI 不夠好,現在卻要思考如何在保證品質的前提下加速人類的審核流程。

三種智能體類型(本地/後台/雲端)的分類框架非常實用。這不僅是 VS Code 的設計思路,也為所有開發者提供了一個思考如何分配 AI 任務的心智模型:需要即時互動的用前台代理,定義明確的任務用後台代理,完全自主的長時間任務用雲端代理。

另一個值得關注的是「專案就緒度」的概念。這提醒我們,光有強大的 AI 工具還不夠,專案本身的基礎設施(測試覆蓋率、MCP 配置、CI/CD 流程)才是決定 AI 代理能否有效工作的關鍵。對於想充分發揮 AI 代理能力的團隊,投資在專案的可自動化程度上可能比選擇哪個 AI 模型更重要。

進階測驗:VS Code 團隊的 AI 工作流進化論

測驗目標:驗證你是否能在實際情境中應用 VS Code AI 工作流的概念。
共 5 題,包含情境題與錯誤診斷題。

1. 選擇合適的智能體類型 情境題

你正在 VS Code 中開發一個功能,同時需要讓 AI 幫你處理一個 GitHub Issue 上報告的 Bug。 你希望 Bug 修復過程不要干擾你目前的編輯器和終端,但仍然在同一台機器上運行, 並且可以存取你已設定的 MCP 服務器。完成後通知你查看結果。 你應該使用哪種智能體類型?
  • A. 本地前台智能體——在側邊欄直接互動處理
  • B. 後台智能體——不干擾當前會話,完成後通知
  • C. 雲端智能體——完全隔離在雲端遠端運行
  • D. 同時開啟兩個前台智能體會話並行處理

2. 大型專案的 AI 代理策略 情境題

你的團隊維護一個擁有數百萬行程式碼的大型開源專案, 想要讓雲端智能體自動處理每月數千個 Bug Issue。 但你發現代理經常生成無法編譯的程式碼,測試也未通過。 根據 VS Code 團隊的經驗,你應該優先做什麼?
  • A. 更換更強大的 AI 模型以提高程式碼品質
  • B. 增加更多人力來審查 AI 生成的 PR
  • C. 提升專案就緒度——設定 Hook、MCP 服務器、測試流程,確保代理能正確編譯和驗證
  • D. 限制代理只處理簡單的文件修改,避免觸碰核心程式碼

3. 工作流優化的演進路徑 情境題

你發現自己每次和前台代理協作時,都要重複提醒它: 「先執行 lint 檢查,再跑測試,最後確認 build 通過」。 這個五步流程你已經手動重複了十幾次。 根據 Penn 分享的工作流優化模式,下一步最佳做法是什麼?
  • A. 寫一份詳細的提示範本,每次複製貼上給代理
  • B. 將這個流程提取為自訂代理、技能(Skill)或 Hook,使其成為可共享的結構化工具
  • C. 放棄使用代理,自己手動完成這些步驟會更快
  • D. 等待模型變得更聰明,自動學會這些步驟

4. 代理產物審查的盲點 錯誤診斷

團隊設定了一套自動化流程: 1. 雲端智能體接收 GitHub Issue 2. 代理分析程式碼庫並找出根本原因 3. 代理進行程式碼修改 4. 代理使用 Playwright MCP 執行 E2E 測試(耗時 25 分鐘) 5. 代理回報:「所有測試通過,已建立 PR」 團隊直接合併了這個 PR,但上線後出現了 UI 錯位問題。 最可能的問題出在哪裡?
  • A. Playwright 測試框架本身有 Bug,無法正確檢測 UI 問題
  • B. 雲端智能體的運算能力不足,導致測試不完整
  • C. GitHub Issue 的描述不夠詳細,代理理解錯了需求
  • D. 團隊未審查代理的推理過程和測試截圖等非程式碼產物,僅依賴代理的文字總結就信任了結果

5. 多代理管理的混亂 錯誤診斷

小華同時啟動了三個代理會話: – 會話 A:前台代理,正在修改 auth 模組 – 會話 B:後台代理,正在重構 database 層 – 會話 C:雲端代理,正在處理一個 UI Bug 小華發現會話 B 完成後,他的前台編輯器中打開的檔案突然出現了 意外的修改,和會話 A 的工作產生了衝突。 根據 VS Code 團隊對三種智能體的設計原則,最可能的根本原因是什麼?
  • A. 雲端代理(會話 C)意外修改了本地檔案
  • B. 後台代理(會話 B)未具備足夠的環境隔離,直接修改了與前台代理共享的工作區檔案
  • C. 前台代理(會話 A)自行拉取了會話 B 的變更
  • D. 三個代理使用了不同的 AI 模型,導致程式碼風格衝突
]]>
https://blog.itsmygo.uk/2026/01/30/vs-code-%e5%91%82%e9%b5%ac%ef%bc%9avs-code-%e5%9c%98%e9%9a%8a%e7%9a%84-ai-%e5%b7%a5%e4%bd%9c%e6%b5%81%e9%80%b2%e5%8c%96%e8%ab%96/feed/ 0
簡單講講 Clawbot:安裝完確實祛魅了,但這裡還是有很多有意思的部分 https://blog.itsmygo.uk/2026/01/29/%e7%b0%a1%e5%96%ae%e8%ac%9b%e8%ac%9b-clawbot%ef%bc%9a%e5%ae%89%e8%a3%9d%e5%ae%8c%e7%a2%ba%e5%af%a6%e7%a5%9b%e9%ad%85%e4%ba%86%ef%bc%8c%e4%bd%86%e9%80%99%e8%a3%a1%e9%82%84%e6%98%af%e6%9c%89%e5%be%88/ https://blog.itsmygo.uk/2026/01/29/%e7%b0%a1%e5%96%ae%e8%ac%9b%e8%ac%9b-clawbot%ef%bc%9a%e5%ae%89%e8%a3%9d%e5%ae%8c%e7%a2%ba%e5%af%a6%e7%a5%9b%e9%ad%85%e4%ba%86%ef%bc%8c%e4%bd%86%e9%80%99%e8%a3%a1%e9%82%84%e6%98%af%e6%9c%89%e5%be%88/#respond Thu, 29 Jan 2026 15:52:26 +0000 https://blog.itsmygo.uk/2026/01/29/%e7%b0%a1%e5%96%ae%e8%ac%9b%e8%ac%9b-clawbot%ef%bc%9a%e5%ae%89%e8%a3%9d%e5%ae%8c%e7%a2%ba%e5%af%a6%e7%a5%9b%e9%ad%85%e4%ba%86%ef%bc%8c%e4%bd%86%e9%80%99%e8%a3%a1%e9%82%84%e6%98%af%e6%9c%89%e5%be%88/ ErlichLiu 分享了他對近期爆紅的開源 AI Agent 軟體 Clawbot 的第一手體驗。從最初的抵觸與害怕,到實際部署後發現其實非常簡單,他以開發者的視角深入分析了 Clawbot 的設計理念、Agency 長時間執行的核心機制、使用成本的現實考量,以及軟體開發方式正在發生的深刻變化。

影片重點

  • Clawbot 是一個開源 AI Agent 軟體,短短幾天就從十幾 K 漲到近 50K Star
  • 部署過程非常簡單,只需複製貼上命令即可安裝
  • 模型配置推薦使用 MiniMax,速度快、成本低、功能支援較全
  • Clawbot 依賴大量第三方 API 和 Skills 來實現各種功能
  • 實際體驗並沒有想像中那麼強大,使用者需要有清晰的需求邊界
  • 軟體程式設計的風向已變,大量 AI Vibe Coding 產出的程式碼品質特徵明顯
  • Agency 長時間自動執行的核心設計是讓 AI 自行處理失敗並嘗試新方案
  • API 呼叫成本非常高,24 小時運行可能花費數千美元

詳細內容

[00:01] 初見 Clawbot 的感受

ErlichLiu 提到最近關注 AI 的人都會被 Clawbot 這個新一代 Agency 刷屏。他坦言自己兩天前看到這個軟體時,第一感覺是抵觸和害怕。作為開發者,他意識到自己不應該有這樣的感受,但眼睜睜看著這個開源專案從十幾 K Star 漲到 49.5K Star,每天大約漲一萬多 Star,感覺非常瘋狂。

他分析了自己害怕的原因:擔心配置很麻煩、專案太大看不懂、配置 AI 模型會很複雜,甚至擔心如果技術太過先進,意味著自己現在做的東西都落後了。但在昨天晚上全部跑過一遍後,他發現其實相當簡單。

[01:09] 部署過程展示

部署 Clawbot 的過程出乎意料地簡單。首先找到 Clawbot 的開源專案(Star 數最高的那個),找到 Install 部分,無腦複製命令到終端機即可。

對於國內使用者需要注意:終端機環境預設不掛代理,安裝時需要設定代理或將 NPM 源切換到國內供應商(如清華源),這樣會快很多。安裝完成後會先安裝一些依賴,然後配置模型。

[02:38] 模型選擇與配置

模型配置方面,ErlichLiu 推薦使用 MiniMax。原因有幾點:整體速度比較快、成本比較低。由於現在很多開發者生態傾向支援 Anthropic(API)的請求格式,而 MiniMax 在 API 層面做了比較多的工作,支援的功能相對更完善,用起來比較省心。

他特別提到一個實用技巧:MiniMax 的程式設計包(編程包)本身也可以直接把 API Key 複製進去使用。

[04:46] Skills 安裝與第三方整合

Clawbot 安裝過程中會讓使用者安裝大量 Skills,這也說明它背後確實大範圍依賴 Skills 在運行。比較震驚的是它甚至可以整合 1Password,風險相當高。此外還有 Apple Calendar、Reminders、Notes 等整合選項。

在 API Key 配置方面,Clawbot 的很多進階功能依賴大量第三方 API,包括:Google 搜尋相關的 Key、Gemini 用來生圖、OpenAI 的圖像生成、Whisper 語音識別、Eleven Labs 語音生成等。網上有一個案例是用 Clawbot 自動打電話預訂餐廳——它會先用 Eleven Labs 生成語音,然後播放出去完成預訂。

[07:04] 實際體驗感受

ErlichLiu 坦言實際體驗下來,Clawbot 並沒有想像中那麼強大。他總結了幾個重要觀察:

第一,如果你希望 Agency 能完成期望的工作,首先需要一份邊界清晰、規則清晰的工作要求。其次,你需要有大量與 Agent 或 AI 協作互動的經驗,才能知道哪些工作它可以勝任。

[07:52] 開發者視角:程式設計的風向變了

從開發者角度觀察,ErlichLiu 認為程式設計的風向已經改變。掃一下 Clawbot 的程式碼庫就能發現,它本身也是大量 Vibe Coding 出來的。整個 UI 有各種各樣的小問題和 Bug,遍地都是 Glitch。如果是人工手寫且真正在意品質,是不會容忍這些 Bug 存在的,順手就會修掉。但大量使用 AI 產出的程式碼,可能就會一直存在這類問題。

[08:38] 關於安全性與適用人群

ErlichLiu 嚴格聲明:Clawbot 現階段並不是針對所有大眾使用者的,所以不用感到恐慌。它的執行成功率沒有那麼高,而且風險比較大,因為它獲得的系統權限實在太高。很多人因此選擇另外購買一台 Mac Mini,專門用來跑 Clawbot,避免重要資料被搞亂或搞砸。

[09:20] Agency 長時間執行的設計原理

關於 Clawbot 為什麼能實現網上所說的長時間自動執行,ErlichLiu 認為核心設計理念與過去不同。過去像 Claude Code 背後的 SDK,核心設計是 Human in the Loop——人需要在整個互動循環中參與決策、設計和主導方向。但 Clawbot 則希望人不再做任何干擾。

實現方式其實並不複雜:在提示詞中始終帶上「無論如何把所有失敗結果描述出來,並想新的方案,在網上繼續找新方案」。只有在重複多輪嘗試後仍找不到方案時,才向人類發送訊息求助。本質上就是要求 Agent 自行嘗試所有方案,持續遍歷執行。

[11:51] 成本的現實考量

長時間執行面臨的最大問題就是成本。如果不走訂閱包而使用 API 介面,成本會非常驚人。網上有人開玩笑說開 24 小時能用出一套房的錢——雖然誇張,但如果真的滿負荷運轉 24 小時,大概會有數千到上萬次 API 請求。

以 ErlichLiu 團隊的經驗,使用 Anthropic 的 API,3000 次請求的成本大約是 115 美金。他們有好多天每天消耗差不多就是這個數字。對大多數工作來說,並不需要等那麼長時間、花那麼多錢。這個事情實驗性質比較大。

[13:01] 未來展望與建議

ErlichLiu 預測接下來大家會在各種細分方向上找到適合自動化的場景,但離所有東西都自動化還非常遠。他強調要謹慎對待成本問題,一天嘗試下來如果走 API 路線,1000 塊人民幣可能打不住。

他再次推薦使用 MiniMax 作為模型選擇——速度快、功能支援全、配置省心,還有程式設計包可以使用。最後他也鼓勵開發者去看一看 Clawbot 的設計思路,認為後面的 Agency 開發會有一些可以參考的地方。

我的想法

這部影片最有價值的部分是 ErlichLiu 以開發者身份對 Clawbot 的冷靜分析,而非盲目追捧。幾個觀察值得延伸思考:

首先,關於 Vibe Coding 的風向變化。當一個擁有近 50K Star 的熱門開源專案本身就是大量 AI 生成的程式碼,且開發者對 UI Bug 和 Glitch 的容忍度明顯提高時,這確實反映了軟體開發標準正在被重新定義。速度和功能實現優先於程式碼品質和使用者體驗細節,這對傳統開發者而言既是機會也是挑戰。

其次,Agency 長時間執行的設計其實並不神秘——本質上就是「失敗後自動重試並換方案」的迴圈。但這也暴露了當前 AI Agent 的局限性:沒有真正的「理解」,只有不斷嘗試。這意味著清晰的需求定義和合理的任務邊界劃分,仍然是人類不可替代的價值所在。

最後,成本問題是很多人忽略的現實。每天 115 美金的 API 費用,對個人開發者來說確實是不小的負擔。在選擇使用 AI Agent 工具時,先想清楚投入產出比,找到真正適合自動化的場景,可能比盲目跟風更為重要。


原影片連結:https://www.bilibili.com/video/BV1jX6MBnEpi

進階測驗:簡單講講 Clawbot

測驗目標:驗證你是否能在實際情境中應用從影片中學到的 AI Agent 知識。
共 5 題,包含情境題與錯誤診斷題。

1. 選擇適合的模型供應商 情境題

你是一位獨立開發者,剛部署好 Clawbot,準備配置 AI 模型。 你的需求是:回應速度快、API 功能支援完整、成本盡量低。 你不想在模型配置上花太多時間排查相容性問題。 你應該優先選擇哪個模型方案?
  • A. 直接使用 OpenAI GPT-4o,因為它是最知名的模型
  • B. 使用 MiniMax,因為速度快、功能支援全、配置省心
  • C. 使用 Gemini,因為 Google 生態比較完整
  • D. 同時配置多個模型,讓 Clawbot 自動切換選擇最佳的

2. 評估 AI Agent 的任務適用性 情境題

你的團隊想使用 Clawbot 來自動化一些工作。 以下有四個候選任務,根據影片中對 AI Agent 適用場景的分析, 哪個任務最適合交給 Clawbot 長時間自動執行?
  • A. 設計公司的品牌 Logo 和視覺風格
  • B. 制定下季度的產品發展策略
  • C. 整理大量文件並抓取網上相關資訊進行彙總
  • D. 與客戶進行即時的需求溝通與談判

3. Agency 長時間執行的安全策略 情境題

你打算讓 Clawbot 在你的電腦上長時間自動運行, 處理一些文件整理和程式碼生成的工作。 你的電腦上有重要的個人資料和工作文件。 根據影片中的建議,你應該怎麼做?
  • A. 直接在本機運行,Clawbot 不會存取你沒授權的檔案
  • B. 設定唯讀權限,限制 Clawbot 只能讀取特定資料夾
  • C. 在本機建立一個虛擬環境,隔離 Clawbot 的執行範圍
  • D. 使用另一台獨立設備(如 Mac Mini)專門跑 Clawbot,避免重要資料被影響

4. 診斷 Agent 自動執行失敗的原因 錯誤診斷

小華設定 Clawbot 自動執行一個複雜的資料分析任務。 他只給了一句提示詞:「幫我分析數據」。 結果 Clawbot 反覆嘗試了多種方案, 最終執行了 3 個小時也沒有產出有用的結果, 消耗了大量 API 費用。 最可能的根本原因是什麼?
  • A. Clawbot 的 AI 模型能力不足,無法處理資料分析任務
  • B. 需求邊界不清晰,缺乏具體明確的工作要求和規則定義
  • C. 沒有安裝足夠的 Skills,導致缺少必要的工具支援
  • D. API 呼叫頻率過高被限流,導致任務無法正常完成

5. 診斷成本失控的問題 錯誤診斷

小明用 Anthropic 的 API 介面讓 Clawbot 自動運行了一整天。 到了晚上他發現帳單金額已經超過 800 人民幣。 他很驚訝,因為他以為 AI Agent 不會花這麼多錢。 以下哪個說法最準確地描述了這個問題?
  • A. 這是 API 供應商的計費錯誤,應該向客服申訴退款
  • B. Clawbot 存在 Bug 導致重複呼叫 API,正常運行不應該花這麼多
  • C. 長時間自動執行本身就會產生數千次 API 請求,這是預期內的高成本,應事先設定限制
  • D. 使用訂閱制模型就能完全解決成本問題,API 介面本身就不適合 Agent 使用
]]>
https://blog.itsmygo.uk/2026/01/29/%e7%b0%a1%e5%96%ae%e8%ac%9b%e8%ac%9b-clawbot%ef%bc%9a%e5%ae%89%e8%a3%9d%e5%ae%8c%e7%a2%ba%e5%af%a6%e7%a5%9b%e9%ad%85%e4%ba%86%ef%bc%8c%e4%bd%86%e9%80%99%e8%a3%a1%e9%82%84%e6%98%af%e6%9c%89%e5%be%88/feed/ 0
Clawdbot Sucks, Actually — Clawdbot 其實很糟糕 https://blog.itsmygo.uk/2026/01/29/clawdbot-sucks-actually-claudebot-%e5%85%b6%e5%af%a6%e5%be%88%e7%b3%9f%e7%b3%95/ https://blog.itsmygo.uk/2026/01/29/clawdbot-sucks-actually-claudebot-%e5%85%b6%e5%af%a6%e5%be%88%e7%b3%9f%e7%b3%95/#respond Thu, 29 Jan 2026 15:23:14 +0000 https://blog.itsmygo.uk/2026/01/29/clawdbot-sucks-actually-claudebot-%e5%85%b6%e5%af%a6%e5%be%88%e7%b3%9f%e7%b3%95/ Nick Saraev 在這部影片中對近期爆紅的 Clawdbot(現已更名為 Moltbot)進行了深入剖析。他認為 Clawdbot 大部分只是行銷炒作,背後還牽涉加密貨幣拉高出貨騙局。影片從功能評測、加密貨幣事件、荒謬用例、安全隱患到社群媒體炒作手法,全面揭露了這波熱潮的真相,提醒觀眾保持懷疑態度。

影片重點

  • Clawdbot 本質上是運行 Claude Opus 4.5 的 Telegram 機器人,搭配 cron 排程功能
  • 這些功能並非範式轉移,人們數月前就已經在做類似的事
  • Clawdbot 的爆紅很大程度上被加密貨幣拉高出貨(pump and dump)騙局推波助瀾
  • Anthropic 對原專案發出停止侵權通知,迫使其從 Clawdbot 改名為 Moltboth
  • 品牌重塑過程中,舊帳號被騙子搶走並用於發行加密貨幣
  • 網路上的 Clawdbot 用例大多荒謬,如用 AI 整理下載資料夾
  • 超過 900 個 Clawdbot 實例存在嚴重安全漏洞,端口完全暴露
  • 許多推廣 Clawdbot 的人背後動機是銷售課程或賺取流量

詳細內容

[00:00] 開場與結論預告

Nick 開場提到,當所有人都在談論 Clawdbot 這隻「巨大的紅色龍蝦」時,他也決定親自試一試。他仔細閱讀了 Claude.bot 網站上的留言、相關的部落格文章和報導,也看了官方的說明。但他得出的結論是:Clawdbot 其實很糟糕。

[00:39] Clawdbot 是什麼

Clawdbot 的核心是 Anthropic 的尖端模型 Opus 4.5,大部分時間運行 Claude Code。它整合了 Telegram 即時通訊平台,讓用戶可以透過雲端機器人發送和接收訊息,無需通過 VS Code 或其他介面。此外還有 cron 排程功能,讓 Clawdbot 可以主動發送訊息,而不需要用戶總是主動發起對話。

[01:17] 實際測試體驗

Nick 按照說明在 Telegram 中設定了 Clawdbot,並安排它在 1 分鐘後發送早安訊息。結果到了預定時間,它完全沒有執行。經過一番痛苦的來回溝通後,才終於收到了預定的訊息。他承認透過手機安排任務確實很酷,但這些功能根本不是什麼範式轉移。

[01:54] 不是範式轉移

Nick 指出,包括他自己在內,人們幾個月來一直在做類似的事情——使用 AI agent 工作流程、基於雲端的排程等等。Clawdbot 大部分只是行銷炒作,而背後有一個非常巧妙的原因。

[02:09] 加密貨幣拉高出貨事件

Clawdbot 在開發者 Peter Steinberger 發布後迅速走紅,他將專案完全開源並展示了精彩的演示。然而,由於使用了「Claude」這個名稱,Anthropic 發出了停止侵權通知,迫使專案改名為 Moltbot。

品牌重塑過程中,原來的 Clawdbot X 帳戶和 GitHub 組織名稱短暫暴露,被不法分子搶走。他們利用這些帳號發行了一種 Solana 上的 Claude 加密代幣,用大量被盜帳戶進行拉高出貨操作,讓人誤以為與合法專案有關。代幣市值一度達到 1,600 萬美元,但最終崩潰了 90%。Peter Steinberger 本人也公開表示他與這件事毫無關係。

[03:46] 炒作手法分析

Nick 解釋,雖然 Clawdbot 最初確實有一些真實的技術價值,但目前在網路上鋪天蓋地的宣傳,很大程度上是加密貨幣拉高出貨領域常見的手法——註冊大量社群媒體帳號,甚至付費請人盡可能把某件事炒作得沸沸揚揚,讓其他人誤以為這是件大事。

[04:11] 荒謬的用例

Nick 批評目前網上流傳的 Clawdbot 用例大多荒謬可笑。例如有人展示用 Clawdbot 按文件類型整理下載資料夾——但 Mac 的 Finder 只需點一下就能做到。還有很多人在談論用它做「研究」,Nick 認為「研究」這個詞已經成為包羅萬象的術語,意思其實是「我現在什麼正事都沒做」。

有人說用 Cloudbot 每天自動給妻子發早安和晚安訊息,24 小時後 AI 竟然能代替自己進行完整對話。Nick 諷刺地指出,這根本不是 Cloudbot 的獨特能力,而是 AI 本身就能做到的事。

[05:12] 成本與動機質疑

Clawdbot 的運行非常燒錢,有人僅在兩天內就花了 300 美元在相當基礎的任務上。Nick 提醒觀眾,當看到某個技術被大肆宣傳時,要問問那些宣傳者的動機是什麼。他舉例指出,社群媒體上有人一篇貼文獲得 5,600 個讚和近 80 萬瀏覽量,但他們討論的功能與 Claude Opus 4.5 一週前就能做的事情並無差異。

[06:20] 安全隱患

Nick 引用一位安全專家的警告:Claude 即將面臨一場安全災難,因為大量用戶把 Clawdbot 託管在 VPS 上,卻不看文件就隨意開放端口。掃描發現超過 900 個 Cloudbot 實例完全沒有安全措施,任何人都可以進入並讀取 OAuth 令牌或 ENV 環境變數。Nick 感嘆,這種巨大的安全噩夢卻得不到像「AI 自動跟妻子聊天」那樣的關注度。

[07:08] 安裝困難與創辦人警告

Nick 觀察到,大約一半安裝 Clawdbot 的用戶不得不用普通的 Claude 來除錯安裝問題。這個工具被當作消費品來推銷,但實際上並非如此。連 Cloudbot 的創辦人自己都明確表示:「大多數非技術人員不應該安裝這個軟體。它還沒有完成,我知道它有很多不足之處,而且它發布還不到 3 個月。」

[07:40] 社群媒體淘金熱

很多教學影片的製作者自己都不太清楚在做什麼,卻教人用危險且愚蠢的方法來設定 Clawdbot。Nick 強調,普通的 Claude 就能做到 Twitter 研究、市場監控和 Telegram 聊天記錄總結,而且安全得多。他提醒觀眾,那些聲稱 Clawdbot 是印鈔機的人,最終目的往往是推銷自己的付費課程。

[08:18] 總結

Nick 坦言,Cloudbot 其實並不能幫你賺錢,也不是從零到一夜爆紅的革命性產品。它只不過是朝著去中心化 AI 方向的一個迭代改進——這種 AI 運行在 VPS 上,擁有自主權和獨立的電子郵件地址等。他決定不再恢復自己的 Clawdbot Telegram 聊天,回歸使用雲端版 Claude。

我的想法

這部影片提出了一個在 AI 領域非常重要的觀點:技術炒作與實際價值之間的落差。Clawdbot 的故事其實是一個典型案例——一個有一定技術基礎的開源專案,在社群媒體效應和加密貨幣投機的雙重推動下,被過度放大了。

特別值得注意的是安全問題。當 900 多個實例在沒有任何保護的情況下暴露在網路上,這不只是技術問題,更是整個 AI 工具生態系統的警訊。許多人在追趕 AI 熱潮時,往往忽略了最基本的安全實踐。

對於開發者和技術愛好者來說,這是一個很好的提醒:評估任何新工具時,不要被社群媒體上的熱度所迷惑,而是要問自己幾個關鍵問題——它能做到什麼現有工具做不到的事?部署的安全性如何?宣傳者的動機是什麼?保持獨立思考,遠比追逐每一波技術炒作更為重要。


原影片連結:https://www.youtube.com/watch?v=esXXuejofgk

進階測驗:Clawdbot 其實很糟糕

測驗目標:驗證你是否能在實際情境中辨識 AI 工具炒作與安全風險。
共 5 題,包含情境題與錯誤診斷題。

1. 你的同事興奮地跟你說,他看到一個爆紅的開源 AI 工具,社群媒體上到處都在討論,已有數千個讚和數十萬瀏覽量。他想立刻在公司伺服器上部署。根據影片的觀點,你應該先做什麼? 情境題

情境:同事在社群媒體上看到大量推薦某 AI 工具的貼文, 部分貼文有 5,600 個讚、近 80 萬瀏覽量。 他認為這一定是突破性的產品,想要盡快在公司環境中使用。
  • A. 立刻跟著部署,畢竟這麼多人推薦不可能有問題
  • B. 先報名推薦者提供的付費課程學習如何使用
  • C. 先調查推廣者的動機、確認功能是否現有工具無法做到、評估安全風險
  • D. 等代幣價格上漲後再決定是否採用

2. 你打算將 Clawdbot 部署在 VPS 上,透過 Telegram 遠端操作 AI。根據影片揭露的安全問題,最關鍵的安全措施是什麼? 情境題

情境:你在 VPS 上安裝了 Clawdbot, 設定了 Telegram 機器人,配置了 API 金鑰和 OAuth 令牌。 你希望能透過手機隨時操作。
  • A. 確保 Telegram 機器人名稱夠吸引人
  • B. 閱讀文件並確保端口不對外暴露,保護 OAuth 和 ENV 令牌的安全
  • C. 盡快把部署成功的截圖發到社群媒體上
  • D. 購買更多 API 代幣額度以確保運行順暢

3. 一個開源 AI 專案因品牌侵權被迫改名。你發現原來的社群帳號被其他人搶走並開始推廣加密貨幣。作為該專案的使用者,你應該如何應對? 情境題

情境:你一直在使用某開源 AI 專案。 因為商標問題,該專案被迫更改名稱和 GitHub 組織。 幾天後,你發現舊的 X(Twitter)帳號開始推廣 一種基於 Solana 的加密代幣,並聲稱與該專案有關。
  • A. 趕快購買代幣,因為與知名 AI 專案有關一定會漲
  • B. 在社群媒體上轉發代幣資訊,幫助專案方籌款
  • C. 忽略這件事,品牌更名跟自己無關
  • D. 向原始開發者確認是否有關聯,同時認識到這可能是拉高出貨騙局

4. 小明看到社群媒體上的教學後,在 VPS 上部署了 Clawdbot。幾天後他發現帳戶被盜、API 金鑰外洩。根據影片內容,最可能的原因是什麼? 錯誤診斷

小明的部署步驟: 1. 在 VPS 上安裝 Clawdbot 2. 在 .env 檔案中設定 OAuth 令牌和 API 金鑰 3. 打開所有端口以確保 Telegram 連線順暢 4. 沒有閱讀官方文件 5. 跟著 YouTube 教學一步步操作
  • A. Telegram 的伺服器被駭客攻擊了
  • B. 沒有閱讀文件就隨意開放端口,導致任何人都能存取 ENV 令牌
  • C. Clawdbot 的程式碼本身包含後門
  • D. VPS 供應商的問題,與 Clawdbot 無關

5. 有人在社群上發文稱:「Clawdbot 是革命性產品!它能自動發 Telegram 訊息、整理下載資料夾、做 Twitter 研究——這是前所未有的功能!」根據影片觀點,這段描述最大的問題是什麼? 錯誤診斷

社群媒體貼文: 「Clawdbot 徹底改變了我的工作方式!🔥 ✅ 自動發送 Telegram 早安/晚安訊息 ✅ 按檔案類型整理下載資料夾 ✅ 自動進行 Twitter 研究和市場監測 ✅ 每日群聊內容總結 這是 AI 的未來!趕快學習!(報名連結在 bio)」
  • A. 列出的功能太少,Clawdbot 其實能做更多事
  • B. 價格太貴,不值得投資
  • C. 這些功能 Claude 本身或現有工具早就能做到,並非 Clawdbot 的獨特能力,且發文者的動機可能是推銷課程
  • D. Telegram 不是好的通訊平台,應該改用其他工具
]]>
https://blog.itsmygo.uk/2026/01/29/clawdbot-sucks-actually-claudebot-%e5%85%b6%e5%af%a6%e5%be%88%e7%b3%9f%e7%b3%95/feed/ 0
【YOLO 物件偵測教學】#05 部署與優化:將 YOLO 模型應用到實際場景 https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9105-%e9%83%a8%e7%bd%b2%e8%88%87%e5%84%aa%e5%8c%96%ef%bc%9a%e5%b0%87-yolo-%e6%a8%a1%e5%9e%8b%e6%87%89%e7%94%a8%e5%88%b0/ https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9105-%e9%83%a8%e7%bd%b2%e8%88%87%e5%84%aa%e5%8c%96%ef%bc%9a%e5%b0%87-yolo-%e6%a8%a1%e5%9e%8b%e6%87%89%e7%94%a8%e5%88%b0/#respond Wed, 28 Jan 2026 14:07:26 +0000 https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9105-%e9%83%a8%e7%bd%b2%e8%88%87%e5%84%aa%e5%8c%96%ef%bc%9a%e5%b0%87-yolo-%e6%a8%a1%e5%9e%8b%e6%87%89%e7%94%a8%e5%88%b0/

測驗:YOLO 部署與優化

共 5 題,點選答案後會立即顯示結果

1. 為什麼訓練完成的 PyTorch 模型(.pt 檔案)不適合直接部署到生產環境?

  • A. PyTorch 模型無法進行推論
  • B. 需要完整 PyTorch 環境、推論速度較慢、跨平台支援有限
  • C. PyTorch 模型只能在 Windows 上執行
  • D. PyTorch 模型檔案太小,缺少必要資訊

2. 如果要在 NVIDIA GPU 上獲得最佳推論速度,應該匯出為哪種格式?

  • A. ONNX
  • B. CoreML
  • C. TensorRT (engine)
  • D. TFLite

3. 量化技術中,FP16 半精度相較於 FP32 全精度,主要的特性是什麼?

  • A. 模型大小不變,精度完全相同
  • B. 模型大小減半,精度損失極小,速度提升 1.5-2 倍
  • C. 模型大小增加一倍,精度提升
  • D. 只能在 CPU 上使用

4. 在即時影片偵測中,如果 FPS 不足,以下哪個方法最有效?

  • A. 使用更大的模型(如 YOLOv8x)
  • B. 提高輸入解析度到 1280×1280
  • C. 增加 batch size
  • D. 降低輸入解析度(如 640 改為 320)或實作跳幀處理

5. 在 Raspberry Pi(無 GPU)上部署 YOLO 模型,應該優先選擇哪種匯出格式?

  • A. TensorRT
  • B. NCNN 或 TFLite
  • C. CoreML
  • D. 原始 PyTorch 格式

前言

經過前四篇的學習,你已經能夠訓練出自己的 YOLO 模型。但訓練完成只是第一步——如何將模型部署到實際應用中,才是真正的挑戰。

本篇將帶你了解:

  • 如何將 PyTorch 模型匯出為不同格式
  • 各種部署平台的選擇與考量
  • 如何優化模型以獲得更好的推論速度
  • 建立即時偵測應用的完整流程

模型匯出:從 .pt 到部署格式

為什麼需要匯出?

YOLO 訓練完成後,你會得到一個 .pt 檔案(PyTorch 格式)。這個格式在開發時很方便,但在實際部署時有幾個問題:

  1. 需要完整的 PyTorch 環境:部署環境需要安裝 PyTorch,佔用大量空間
  2. 推論速度較慢:PyTorch 格式未針對推論優化
  3. 跨平台支援有限:不是所有平台都能直接使用 PyTorch

因此,我們需要將模型「匯出」為更適合部署的格式。

基本匯出指令

# 匯出為 ONNX 格式(最通用)
yolo export model=best.pt format=onnx

# 匯出為 TensorRT 格式(NVIDIA GPU 最佳化)
yolo export model=best.pt format=engine

# 匯出為 CoreML 格式(Apple 裝置)
yolo export model=best.pt format=coreml

# 匯出為 TFLite 格式(行動裝置、邊緣運算)
yolo export model=best.pt format=tflite

執行後,你會在同一目錄下看到對應格式的檔案:

runs/detect/train/weights/
├── best.pt          # 原始 PyTorch 模型
├── best.onnx        # ONNX 格式
├── best.engine      # TensorRT 格式
└── best.mlmodel     # CoreML 格式

匯出參數詳解

yolo export model=best.pt format=onnx imgsz=640 half=True simplify=True

讓我們看看這些參數的意義:

參數 說明 常用值
model 模型路徑 best.ptyolov8n.pt
format 匯出格式 onnx, engine, coreml, tflite
imgsz 輸入圖片尺寸 640, 320, 1280
half 使用 FP16 半精度 True, False
simplify 簡化 ONNX 模型 True, False
dynamic 動態輸入尺寸 True, False
batch 批次大小 1, 8, 16

各格式比較

格式比較表
┌─────────────┬──────────────┬──────────────┬─────────────┐
│    格式     │    適用場景   │     優點     │     缺點    │
├─────────────┼──────────────┼──────────────┼─────────────┤
│ PyTorch     │ 開發測試     │ 最靈活       │ 部署不便    │
│ ONNX        │ 跨平台部署   │ 通用性最高   │ 速度中等    │
│ TensorRT    │ NVIDIA GPU   │ 速度最快     │ 僅限 NVIDIA │
│ CoreML      │ Apple 裝置   │ 整合度高     │ 僅限 Apple  │
│ TFLite      │ 行動/邊緣    │ 檔案小       │ 精度可能降  │
└─────────────┴──────────────┴──────────────┴─────────────┘

量化技術:讓模型更小更快

什麼是量化?

量化(Quantization)是將模型的權重從高精度(FP32)轉換為低精度(FP16 或 INT8)的技術。想像一下:

  • FP32:用 32 位元儲存一個數字,精度高但佔空間
  • FP16:用 16 位元儲存,精度稍低但大小減半
  • INT8:用 8 位元儲存,大小再減半但精度損失更多
精度與大小關係
┌──────────┬──────────┬──────────┬────────────┐
│   精度   │ 模型大小 │ 推論速度 │  精度損失  │
├──────────┼──────────┼──────────┼────────────┤
│  FP32    │   100%   │  基準    │    無      │
│  FP16    │    50%   │  1.5-2x  │   極小     │
│  INT8    │    25%   │  2-4x    │   可接受   │
└──────────┴──────────┴──────────┴────────────┘

FP16 半精度量化

最簡單的量化方式,幾乎不損失精度:

# 匯出時啟用 FP16
yolo export model=best.pt format=onnx half=True

在 Python 中使用:

from ultralytics import YOLO

# 載入模型時指定半精度
model = YOLO('best.pt')
results = model.predict('image.jpg', half=True)

INT8 量化

需要校準資料集來確保精度:

# TensorRT INT8 量化
yolo export model=best.pt format=engine int8=True data=coco.yaml

這裡 data=coco.yaml 提供校準資料,讓模型知道如何最佳化數值範圍。

量化效果實測

以 YOLOv8n 為例,在 RTX 3080 上的表現:

實測數據(輸入 640x640)
┌──────────┬──────────┬──────────┬──────────┐
│   模式   │ 模型大小 │   FPSmAP    │
├──────────┼──────────┼──────────┼──────────┤
│ FP32     │  6.3 MB  │   180    │  37.3%   │
│ FP16     │  3.2 MB  │   280    │  37.2%   │
│ INT8     │  1.6 MB  │   420    │  36.8%   │
└──────────┴──────────┴──────────┴──────────┘

FP16 幾乎不損失精度,但速度提升明顯,是最推薦的選擇。

部署場景與平台選擇

伺服器部署:最大效能

適合需要處理大量請求的場景,如雲端 API 服務。

# server_deploy.py - 使用 FastAPI 建立偵測 API
from fastapi import FastAPI, UploadFile
from ultralytics import YOLO
import cv2
import numpy as np

app = FastAPI()
model = YOLO('best.engine')  # 使用 TensorRT 格式

@app.post("/detect")
async def detect(file: UploadFile):
    # 讀取上傳的圖片
    contents = await file.read()
    nparr = np.frombuffer(contents, np.uint8)
    img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

    # 執行偵測
    results = model(img)

    # 整理結果
    detections = []
    for r in results:
        for box in r.boxes:
            detections.append({
                'class': model.names[int(box.cls)],
                'confidence': float(box.conf),
                'bbox': box.xyxy[0].tolist()
            })

    return {'detections': detections}

啟動伺服器:

uvicorn server_deploy:app --host 0.0.0.0 --port 8000

邊緣裝置部署:Jetson 系列

NVIDIA Jetson(如 Jetson Nano、Orin)是邊緣 AI 的熱門選擇。

環境準備:

# 在 Jetson 上安裝 ultralytics
pip install ultralytics

# 確認 CUDA 可用
python -c "import torch; print(torch.cuda.is_available())"

匯出 TensorRT 模型:

# 直接在 Jetson 上匯出,確保相容性
yolo export model=best.pt format=engine device=0

注意事項:

  • 在目標裝置上匯出 TensorRT 模型,避免相容性問題
  • Jetson Nano 建議使用 YOLOv8n(最小模型)
  • 適當降低輸入尺寸(如 320×320)可大幅提升 FPS

邊緣裝置部署:Raspberry Pi

Raspberry Pi 沒有 GPU,需要使用 CPU 優化的格式。

# 匯出為 NCNN 格式(ARM CPU 優化)
yolo export model=best.pt format=ncnn

# 或使用 TFLite
yolo export model=best.pt format=tflite

效能期望(Pi 4B):

  • YOLOv8n + NCNN:約 5-10 FPS
  • YOLOv8n + TFLite:約 3-5 FPS

如果需要更高 FPS,考慮使用 Coral USB Accelerator。

即時影片偵測應用

基本架構

# realtime_detect.py - 即時攝影機偵測
import cv2
from ultralytics import YOLO
import time

def main():
    # 載入模型
    model = YOLO('best.pt')  # 或 best.onnx, best.engine

    # 開啟攝影機
    cap = cv2.VideoCapture(0)  # 0 = 預設攝影機
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

    # FPS 計算
    prev_time = time.time()

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 執行偵測
        results = model(frame, verbose=False)

        # 在畫面上繪製結果
        annotated_frame = results[0].plot()

        # 計算並顯示 FPS
        curr_time = time.time()
        fps = 1 / (curr_time - prev_time)
        prev_time = curr_time
        cv2.putText(annotated_frame, f'FPS: {fps:.1f}', (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

        # 顯示結果
        cv2.imshow('YOLO Detection', annotated_frame)

        # 按 'q' 退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

優化即時偵測效能

1. 降低輸入解析度

# 使用較小的輸入尺寸
results = model(frame, imgsz=320)  # 預設是 640

效果:FPS 可提升 2-4 倍,但小物件偵測效果會下降。

2. 跳幀處理

不需要每一幀都偵測:

frame_count = 0
skip_frames = 2  # 每 3 幀偵測 1 次

while True:
    ret, frame = cap.read()
    frame_count += 1

    if frame_count % (skip_frames + 1) == 0:
        results = model(frame)
        last_results = results

    # 使用上次的結果繪製
    if last_results:
        annotated_frame = last_results[0].plot()

3. 使用多執行緒

將讀取影像和推論分開:

import threading
from queue import Queue

class VideoStream:
    def __init__(self, src=0):
        self.cap = cv2.VideoCapture(src)
        self.queue = Queue(maxsize=2)
        self.stopped = False

    def start(self):
        threading.Thread(target=self._update, daemon=True).start()
        return self

    def _update(self):
        while not self.stopped:
            ret, frame = self.cap.read()
            if not self.queue.full():
                self.queue.put(frame)

    def read(self):
        return self.queue.get()

    def stop(self):
        self.stopped = True

# 使用方式
stream = VideoStream(0).start()
while True:
    frame = stream.read()
    results = model(frame)

效能評估與監控

關鍵指標

部署後需要監控這些指標:

指標 說明 理想值
FPS 每秒處理幀數 依應用需求,通常 >15
Latency 單幀處理延遲 <100ms
GPU 使用率 GPU 負載 60-80%(有餘裕)
記憶體使用 顯存/記憶體佔用 低於上限

效能測試腳本

# benchmark.py - 效能測試
from ultralytics import YOLO
import time
import numpy as np

def benchmark(model_path, num_iterations=100):
    model = YOLO(model_path)

    # 使用假圖片測試
    dummy_input = np.random.randint(0, 255, (640, 640, 3), dtype=np.uint8)

    # 暖機(讓 GPU 進入工作狀態)
    for _ in range(10):
        model(dummy_input, verbose=False)

    # 正式測試
    times = []
    for _ in range(num_iterations):
        start = time.time()
        model(dummy_input, verbose=False)
        times.append(time.time() - start)

    times = np.array(times) * 1000  # 轉換為毫秒

    print(f"模型: {model_path}")
    print(f"平均延遲: {times.mean():.2f} ms")
    print(f"標準差: {times.std():.2f} ms")
    print(f"FPS: {1000 / times.mean():.1f}")
    print(f"最快: {times.min():.2f} ms")
    print(f"最慢: {times.max():.2f} ms")

# 比較不同格式
benchmark('best.pt')
benchmark('best.onnx')
benchmark('best.engine')  # 需要 TensorRT

典型輸出

模型: best.pt
平均延遲: 12.45 ms
標準差: 1.23 ms
FPS: 80.3
最快: 10.21 ms
最慢: 18.67 ms

模型: best.engine
平均延遲: 4.32 ms
標準差: 0.45 ms
FPS: 231.5
最快: 3.89 ms
最慢: 5.67 ms

常見問題與解決方案

Q1: TensorRT 匯出失敗

錯誤訊息: TensorRT export requires TensorRT>=7.0.0

解決方案:

# 安裝 TensorRT
pip install tensorrt

# 或者在 Jetson 上使用系統自帶的 TensorRT

Q2: ONNX 模型推論結果不同

可能原因: opset 版本不相容

解決方案:

# 指定 opset 版本
yolo export model=best.pt format=onnx opset=12

Q3: 記憶體不足

解決方案:

  1. 使用較小的模型(n < s < m < l < x)
  2. 降低輸入解析度
  3. 減少 batch size
  4. 使用 FP16 或 INT8 量化

Q4: 邊緣裝置 FPS 太低

優化順序:

  1. 確認使用正確的匯出格式(TensorRT for Jetson)
  2. 降低輸入尺寸(640 -> 320)
  3. 使用較小的模型
  4. 實作跳幀處理

部署檢查清單

在正式上線前,確認以下項目:

部署前檢查
[ ] 模型已匯出為目標格式
[ ] 在目標硬體上測試過效能
[ ] FPS 符合應用需求
[ ] 記憶體使用在合理範圍
[ ] 錯誤處理機制已實作
[ ] 有監控和日誌機制
[ ] 已準備回滾方案

系列總結

恭喜你完成了 YOLO 物件偵測的完整學習旅程!讓我們回顧一下:

篇章 主題 你學會了
#01 基礎概念 YOLO 的原理與架構
#02 環境與快速開始 安裝環境與執行推論
#03 資料集準備 標註與格式轉換
#04 訓練與評估 訓練模型與分析指標
#05 部署與優化 匯出、量化與即時應用

下一步建議

  1. 嘗試不同的部署場景:從本地應用到雲端 API
  2. 探索進階功能:追蹤、分割、姿態估計
  3. 優化模型架構:針對特定場景客製化
  4. 學習 MLOps:模型版本控制、持續訓練

參考資源

進階測驗:YOLO 部署與優化 進階

共 5 題情境應用題,測試你對部署與優化的深入理解

情境:你正在為一家物流公司開發包裹偵測系統,需要部署在配備 NVIDIA RTX 3080 的伺服器上,每秒需處理至少 200 張圖片,同時 mAP 損失不能超過 1%。

1. 根據文章中的實測數據,哪種配置最符合需求?

  • A. YOLOv8n + FP32,FPS 180,mAP 37.3%
  • B. YOLOv8n + INT8,FPS 420,mAP 36.8%
  • C. YOLOv8n + FP16,FPS 280,mAP 37.2%
  • D. 使用原始 PyTorch 格式,保持最高精度
情境:你需要將 YOLO 模型部署到 Jetson Orin 邊緣裝置上。你已經在開發機(RTX 4090)上訓練好模型,現在要準備部署。

2. 根據文章建議,TensorRT 模型的匯出應該在哪裡進行?為什麼?

  • A. 在開發機上匯出,因為效能更好可以更快完成匯出
  • B. 在目標 Jetson 裝置上匯出,因為 TensorRT 針對特定硬體優化,避免相容性問題
  • C. 在雲端伺服器上匯出,然後下載到 Jetson
  • D. 不需要匯出,直接使用 .pt 檔案即可
情境:你開發的即時偵測應用在 Jetson Nano 上只能達到 8 FPS,但客戶要求至少 15 FPS。你已經使用 YOLOv8n 和 TensorRT 格式。

3. 根據文章的優化建議,下一步應該優先嘗試什麼?

  • A. 換用 YOLOv8s 模型以提高精度
  • B. 將模型匯出為 ONNX 格式
  • C. 增加輸入解析度到 1280×1280
  • D. 降低輸入尺寸(如 640 改為 320)並實作跳幀處理
情境:你要進行 INT8 量化以進一步壓縮模型大小,但發現匯出指令中需要額外的 data 參數。

4. 這個 data=coco.yaml 參數的作用是什麼?

yolo export model=best.pt format=engine int8=True data=coco.yaml
  • A. 指定輸出檔案的命名格式
  • B. 定義模型要偵測的類別數量
  • C. 提供校準資料集,讓模型知道如何最佳化數值範圍
  • D. 設定訓練時使用的超參數
情境:你正在使用多執行緒優化即時偵測應用,參考了文章中的 VideoStream 類別實作。

5. 這種多執行緒架構的主要優點是什麼?

class VideoStream: def __init__(self, src=0): self.cap = cv2.VideoCapture(src) self.queue = Queue(maxsize=2) self.stopped = False def start(self): threading.Thread(target=self._update, daemon=True).start() return self
  • A. 可以同時使用多個 GPU 進行推論
  • B. 將影像讀取和模型推論分離,避免 I/O 阻塞影響推論效能
  • C. 可以提高模型的偵測精度
  • D. 減少模型的記憶體使用量
]]>
https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9105-%e9%83%a8%e7%bd%b2%e8%88%87%e5%84%aa%e5%8c%96%ef%bc%9a%e5%b0%87-yolo-%e6%a8%a1%e5%9e%8b%e6%87%89%e7%94%a8%e5%88%b0/feed/ 0
【YOLO 物件偵測教學】#04 訓練自己的 YOLO 模型:從零開始到完成 https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9104-%e8%a8%93%e7%b7%b4%e8%87%aa%e5%b7%b1%e7%9a%84-yolo-%e6%a8%a1%e5%9e%8b%ef%bc%9a%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b/ https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9104-%e8%a8%93%e7%b7%b4%e8%87%aa%e5%b7%b1%e7%9a%84-yolo-%e6%a8%a1%e5%9e%8b%ef%bc%9a%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b/#respond Wed, 28 Jan 2026 14:07:18 +0000 https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9104-%e8%a8%93%e7%b7%b4%e8%87%aa%e5%b7%b1%e7%9a%84-yolo-%e6%a8%a1%e5%9e%8b%ef%bc%9a%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b/

YOLO 模型訓練基礎測驗

1. 在 YOLO 訓練指令中,data 參數的用途是什麼?

2. 使用遷移學習(預訓練權重)相比從頭訓練的主要優勢是什麼?

3. 在訓練過程中,如果發現訓練 loss 持續下降但驗證 loss 開始上升,這表示模型發生了什麼問題?

4. 訓練完成後,部署模型時應該使用哪個權重檔案?

5. 當遇到「CUDA out of memory」錯誤時,以下哪個做法無法解決問題?

測驗結果

前言

在前幾篇文章中,我們學會了如何使用預訓練的 YOLO 模型進行推論,也了解了資料標註的流程。現在,是時候將這些知識結合起來,訓練一個專屬於你的 YOLO 模型了。

本篇文章將帶你走過完整的訓練流程,從啟動訓練指令到解讀訓練結果,讓你能夠獨立完成模型訓練。


訓練的基本指令

訓練 YOLO 模型只需要一行指令:

yolo train data=data.yaml model=yolov8n.pt epochs=100

讓我們拆解這個指令的每個部分:

參數 說明 範例值
data 資料集設定檔路徑 data.yaml
model 預訓練權重或模型架構 yolov8n.pt
epochs 訓練週期數 100

data.yaml 的結構

這個檔案告訴 YOLO 你的資料集在哪裡:

# data.yaml
path: /path/to/dataset    # 資料集根目錄
train: images/train       # 訓練圖片目錄(相對於 path)
val: images/val           # 驗證圖片目錄
test: images/test         # 測試圖片目錄(選填)

# 類別定義
names:
  0: person
  1: car
  2: dog

當你看到這個檔案時,重點關注:

  • path:確認這個路徑是否正確指向你的資料集
  • names:類別 ID 必須從 0 開始,且與標註檔案中的 ID 一致

預訓練權重:遷移學習的起點

什麼是遷移學習?

遷移學習是指利用已經在大量資料上訓練好的模型,作為你自己任務的起點。

從頭訓練        遷移學習

隨機權重        預訓練權重
    |               |
    v               v
  需要              需要
大量資料          較少資料
長時間訓練        短時間微調

預訓練權重的選擇

YOLOv8 提供不同大小的預訓練模型:

# 最小最快(推薦新手開始)
yolo train model=yolov8n.pt ...

# 中等大小
yolo train model=yolov8s.pt ...
yolo train model=yolov8m.pt ...

# 最大最準(需要更多資源)
yolo train model=yolov8l.pt ...
yolo train model=yolov8x.pt ...

選擇建議:

  • 資料集 < 1000 張:使用 yolov8n.ptyolov8s.pt
  • 資料集 1000-5000 張:使用 yolov8s.ptyolov8m.pt
  • 資料集 > 5000 張:可以嘗試更大的模型

從頭訓練 vs 遷移學習

# 遷移學習:使用預訓練權重(.pt 檔案)
yolo train model=yolov8n.pt data=data.yaml

# 從頭訓練:只使用模型架構(.yaml 檔案)
yolo train model=yolov8n.yaml data=data.yaml

實務上,除非你的任務非常特殊(例如醫療影像),否則幾乎都應該使用遷移學習。


重要的超參數

超參數是訓練前需要設定的參數,它們會影響訓練的效果和速度。

epochs(訓練週期)

yolo train ... epochs=100
  • 意義:模型會看過整個資料集幾次
  • 太少:模型還沒學好(欠擬合)
  • 太多:模型記住訓練資料但無法泛化(過擬合)
  • 建議起始值:100-300

batch(批次大小)

yolo train ... batch=16
  • 意義:每次更新權重前,模型會看幾張圖片
  • 太小:訓練不穩定,權重更新方向不準
  • 太大:需要更多 GPU 記憶體
  • 建議:根據 GPU 記憶體選擇(8GB GPU 約用 batch=8-16)

使用自動批次大小:

yolo train ... batch=-1  # 自動選擇最大可用 batch size

imgsz(圖片尺寸)

yolo train ... imgsz=640
  • 意義:訓練時將圖片縮放到的尺寸
  • 較大:能偵測更小的物件,但需要更多記憶體
  • 較小:訓練更快,但可能遺漏小物件
  • 常見值:640(預設)、416、320

lr0(初始學習率)

yolo train ... lr0=0.01
  • 意義:每次權重更新的幅度
  • 太大:訓練不穩定,loss 跳動
  • 太小:訓練太慢,可能卡在局部最小值
  • 建議:通常不需調整,預設值經過優化

完整的訓練指令範例

yolo train \
  data=my_dataset.yaml \
  model=yolov8s.pt \
  epochs=150 \
  batch=16 \
  imgsz=640 \
  patience=50 \
  project=runs/detect \
  name=my_experiment

新增的參數說明:

  • patience=50:如果驗證指標 50 個 epoch 沒進步,提前停止
  • projectname:指定訓練結果的儲存位置

訓練過程監控

當訓練開始後,你會看到類似這樣的輸出:

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      1/100      3.42G      1.234      2.156      1.532        142        640
      2/100      3.42G      1.198      1.987      1.489        156        640
      ...

理解 Loss 數值

YOLO 的訓練會顯示三種 loss:

box_loss    物件框定位的損失
            ↓ 數值越低,框的位置越準

cls_loss    分類的損失
            ↓ 數值越低,類別判斷越準

dfl_loss    分佈焦點損失(YOLOv8 特有)
            ↓ 數值越低,框的邊界越精確

健康的訓練趨勢:

  • 三種 loss 都應該逐漸下降
  • 下降速度會越來越慢(這是正常的)
  • 如果 loss 突然上升或劇烈震盪,可能需要調整學習率

解讀 mAP 指標

每個 epoch 結束後,YOLO 會在驗證集上計算 mAP:

                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95)
                   all        200        542      0.812      0.756      0.789      0.523
                person        200        312      0.856      0.801      0.834      0.578
                   car        200        230      0.768      0.711      0.744      0.468
指標 意義 好的數值
P(Precision) 預測為正確的準確率 > 0.7
R(Recall) 找到所有目標的比例 > 0.7
mAP50 IoU 50% 時的平均精度 > 0.7
mAP50-95 多個 IoU 閾值的平均 > 0.5

mAP50-95 是最嚴格的指標,通常數值會比 mAP50 低 0.2-0.3。


驗證與測試

val 和 test 的差別

訓練集 (train)
├── 用於訓練模型
└── 模型直接從這裡學習

驗證集 (val)
├── 用於訓練中的評估
├── 影響 early stopping
└── 幫助調整超參數

測試集 (test)
├── 完全不參與訓練
├── 最後評估模型真實能力
└── 模擬實際應用場景

訓練完成後的驗證

# 使用驗證集評估
yolo val model=runs/detect/my_experiment/weights/best.pt data=data.yaml

# 使用測試集評估(如果有的話)
yolo val model=best.pt data=data.yaml split=test

訓練結果解讀

訓練完成後,YOLO 會在指定目錄產生以下檔案:

runs/detect/my_experiment/
├── weights/
│   ├── best.pt          # 驗證集上表現最好的權重
│   └── last.pt          # 最後一個 epoch 的權重
├── results.csv          # 每個 epoch 的指標
├── results.png          # 訓練曲線圖
├── confusion_matrix.png # 混淆矩陣
├── F1_curve.png         # F1 分數曲線
├── PR_curve.png         # Precision-Recall 曲線
└── ...

關鍵檔案說明

best.pt vs last.pt

best.pt  →  驗證集上 mAP 最高的那個 epoch 的權重
            (推薦用於部署)

last.pt  →  訓練結束時的權重
            (用於繼續訓練)

results.png 訓練曲線

這張圖包含多個子圖,重點關注:

  • Loss 曲線:應該穩定下降
  • mAP 曲線:應該穩定上升
  • train vs val:兩者的差距反映過擬合程度

常見問題排解

過擬合(Overfitting)

症狀

  • 訓練 loss 持續下降
  • 驗證 loss 開始上升
  • 驗證 mAP 不再進步

解決方法

# 1. 減少訓練週期
yolo train ... epochs=50

# 2. 增加資料增強
yolo train ... augment=True

# 3. 使用更簡單的模型
yolo train ... model=yolov8n.pt  # 改用較小的模型

# 4. 增加資料集(治本方法)

欠擬合(Underfitting)

症狀

  • 訓練 loss 居高不下
  • 驗證 mAP 很低

解決方法

# 1. 增加訓練週期
yolo train ... epochs=300

# 2. 使用更大的模型
yolo train ... model=yolov8m.pt

# 3. 提高學習率(小心調整)
yolo train ... lr0=0.02

# 4. 檢查資料標註是否正確

訓練不穩定

症狀

  • Loss 劇烈震盪
  • 訓練過程中 mAP 忽高忽低

解決方法

# 1. 降低學習率
yolo train ... lr0=0.001

# 2. 增加 batch size(如果記憶體允許)
yolo train ... batch=32

# 3. 使用 warmup(預設已啟用)
yolo train ... warmup_epochs=3

GPU 記憶體不足

錯誤訊息CUDA out of memory

解決方法

# 1. 減少 batch size
yolo train ... batch=4

# 2. 減少圖片尺寸
yolo train ... imgsz=416

# 3. 使用更小的模型
yolo train ... model=yolov8n.pt

繼續訓練(Resume)

如果訓練中斷,可以從上次停止的地方繼續:

yolo train resume=True model=runs/detect/my_experiment/weights/last.pt

這會載入 last.pt 並繼續訓練,包括:

  • 權重狀態
  • 優化器狀態
  • 已完成的 epoch 數

實戰檢查清單

訓練前的確認事項:

□ data.yaml 路徑是否正確
□ 類別 ID 是否從 0 開始
□ 標註檔案是否與圖片對應
□ 訓練/驗證集是否有合理分割
□ GPU 記憶體是否足夠

訓練中的觀察重點:

□ Loss 是否穩定下降
□ 驗證 mAP 是否逐步提升
□ GPU 記憶體使用是否穩定
□ 沒有 NaN 或 Inf 出現

訓練後的評估:

□ 使用 best.pt 而非 last.pt
□ 在測試集上驗證最終效果
□ 查看混淆矩陣找出弱點類別
□ 視覺化幾張預測結果確認品質

小結

本篇文章涵蓋了 YOLO 模型訓練的完整流程:

  • 基本指令yolo train data=... model=... epochs=...
  • 遷移學習:使用 .pt 預訓練權重可以大幅加速訓練
  • 超參數:epochs、batch、imgsz、lr0 是最重要的參數
  • 監控訓練:關注 loss 下降和 mAP 上升的趨勢
  • 問題排解:過擬合、欠擬合、訓練不穩定各有對策

下一篇文章,我們將學習如何將訓練好的模型部署到實際應用中。


延伸閱讀

YOLO 模型訓練進階測驗

情境分析與問題解決能力測試

情境分析

1. 訓練日誌分析

你正在訓練一個 YOLO 模型,觀察到以下訓練日誌:
Epoch 1/100:  box_loss=1.52, cls_loss=2.34, mAP50=0.12
Epoch 20/100: box_loss=0.85, cls_loss=1.12, mAP50=0.58
Epoch 40/100: box_loss=0.42, cls_loss=0.65, mAP50=0.72
Epoch 60/100: box_loss=0.28, cls_loss=0.41, mAP50=0.71
Epoch 80/100: box_loss=0.15, cls_loss=0.22, mAP50=0.69
Epoch 100/100: box_loss=0.08, cls_loss=0.12, mAP50=0.65

根據這份日誌,你認為最佳的模型權重應該在哪個 epoch 附近?為什麼?

問題診斷

2. 超參數調整策略

你的資料集有 800 張圖片,使用 yolov8m.pt 訓練了 200 個 epoch。訓練結果顯示:
  • 訓練集 mAP50-95:0.82
  • 驗證集 mAP50-95:0.45
  • 訓練曲線:訓練 loss 持續下降,驗證 loss 從 epoch 50 後開始上升

針對這個情況,最有效的改善策略是什麼?

實務應用

3. data.yaml 設定問題

你設定了以下 data.yaml 檔案:
path: /home/user/dataset
train: train/images
val: validation/images

names:
  1: cat
  2: dog
  3: bird
訓練開始後,模型完全無法偵測任何物件。你的標註檔案(.txt)內容格式如下:
0 0.5 0.5 0.3 0.4
1 0.2 0.3 0.1 0.15

最可能的問題原因是什麼?

綜合分析

4. 訓練策略選擇

你需要訓練一個偵測工廠瑕疵品的模型,情況如下:
  • 資料集:3000 張高解析度圖片(4000×3000)
  • 瑕疵大小:通常只占圖片的 1-3%
  • 硬體:單張 RTX 3080(10GB)
  • 需求:高召回率(不漏檢),推論速度次要

最合適的訓練配置是什麼?

進階概念

5. 訓練指標解讀

訓練完成後,你在驗證集上得到以下結果:
Class      Images  Instances   P       R     mAP50  mAP50-95
all          500      1200   0.85    0.72    0.79     0.52
person       500       600   0.92    0.88    0.91     0.68
car          500       400   0.88    0.75    0.82     0.55
bicycle      500       200   0.75    0.53    0.64     0.33

根據這個結果,最需要優先改善的是什麼?

測驗結果

]]>
https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9104-%e8%a8%93%e7%b7%b4%e8%87%aa%e5%b7%b1%e7%9a%84-yolo-%e6%a8%a1%e5%9e%8b%ef%bc%9a%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b/feed/ 0
【YOLO 物件偵測教學】#03 資料集準備:標註、格式轉換與資料增強 https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9103-%e8%b3%87%e6%96%99%e9%9b%86%e6%ba%96%e5%82%99%ef%bc%9a%e6%a8%99%e8%a8%bb%e3%80%81%e6%a0%bc%e5%bc%8f%e8%bd%89%e6%8f%9b/ https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9103-%e8%b3%87%e6%96%99%e9%9b%86%e6%ba%96%e5%82%99%ef%bc%9a%e6%a8%99%e8%a8%bb%e3%80%81%e6%a0%bc%e5%bc%8f%e8%bd%89%e6%8f%9b/#respond Wed, 28 Jan 2026 14:07:09 +0000 https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9103-%e8%b3%87%e6%96%99%e9%9b%86%e6%ba%96%e5%82%99%ef%bc%9a%e6%a8%99%e8%a8%bb%e3%80%81%e6%a0%bc%e5%bc%8f%e8%bd%89%e6%8f%9b/

YOLO 資料集準備 – 基礎測驗

1. YOLO 標註檔的格式中,座標值的範圍是多少?

2. YOLO 標註檔每一行的格式順序是什麼?

3. 在 YOLOv8 的資料集目錄結構中,圖片和標註檔應該放在哪裡?

4. Mosaic 資料增強技術的特點是什麼?

5. data.yaml 設定檔的主要作用是什麼?

測驗完成!

0/5

前言

訓練 YOLO 模型就像教小孩認識物品,你需要準備大量的「教材」——也就是已經標記好答案的圖片。這篇文章會帶你走過資料集準備的完整流程:從標註工具的選擇、YOLO 格式的理解,到資料增強技術的應用。

這是系列第 3 篇,假設你已經讀過前兩篇,了解 YOLO 的基本概念和環境設定。


一、標註工具介紹

標註工具的作用是讓你在圖片上畫框框,告訴模型「這裡有一隻貓」、「那裡有一輛車」。以下是三款常見的標註工具:

1. LabelImg(本地端、免費)

LabelImg 是經典的桌面標註工具,直接支援 YOLO 格式輸出。

安裝方式:

pip install labelImg

啟動方式:

labelImg

操作流程:

  1. 開啟圖片資料夾(Open Dir)
  2. 設定輸出格式為 YOLO(左側選單)
  3. W 鍵開始畫框
  4. 選擇類別名稱
  5. Ctrl+S 儲存標註

小提醒:LabelImg 會為每張圖片產生一個同名的 .txt 檔案。

2. Roboflow(雲端、有免費方案)

Roboflow 是一站式的資料集管理平台,特別適合團隊協作。

優點:

  • 網頁介面,不需安裝
  • 自動資料增強功能
  • 支援多種匯出格式
  • 提供預訓練資料集

使用流程:

  1. 建立帳號並新增專案
  2. 上傳圖片
  3. 在網頁上進行標註
  4. 匯出為 YOLOv8 格式

3. CVAT(自建或雲端、開源免費)

CVAT(Computer Vision Annotation Tool)是 Intel 開發的開源標註工具,功能最完整。

適合場景:

  • 大型專案、需要多人協作
  • 需要影片標註功能
  • 企業內部自建標註系統

本地部署(使用 Docker):

git clone https://github.com/opencv/cvat.git
cd cvat
docker compose up -d

二、YOLO 標註格式解析

YOLO 的標註格式是一種簡潔的純文字格式,每張圖片對應一個 .txt 檔案。

格式結構

每一行代表一個物件,格式為:

<class_id> <x_center> <y_center> <width> <height>

各欄位說明:

欄位 說明 範圍
class_id 類別編號(從 0 開始) 整數
x_center 框框中心點的 X 座標(正規化) 0.0 ~ 1.0
y_center 框框中心點的 Y 座標(正規化) 0.0 ~ 1.0
width 框框寬度(正規化) 0.0 ~ 1.0
height 框框高度(正規化) 0.0 ~ 1.0

正規化座標的意義

「正規化」是指將實際像素座標除以圖片的寬度或高度。這樣做的好處是:

  • 不同尺寸的圖片可以使用相同的座標系統
  • 訓練時圖片縮放不會影響標註

計算公式:

x_center = (x_min + x_max) / 2 / image_width
y_center = (y_min + y_max) / 2 / image_height
width = (x_max - x_min) / image_width
height = (y_max - y_min) / image_height

實際範例

假設有一張 640×480 的圖片,上面有一隻貓(類別 0),框框位置為左上角 (100, 150),右下角 (300, 350):

# 原始像素座標
x_min, y_min = 100, 150
x_max, y_max = 300, 350
image_width, image_height = 640, 480

# 計算正規化座標
x_center = (100 + 300) / 2 / 640  # = 0.3125
y_center = (150 + 350) / 2 / 480  # = 0.5208
width = (300 - 100) / 640          # = 0.3125
height = (350 - 150) / 480         # = 0.4167

# 標註檔內容
# 0 0.3125 0.5208 0.3125 0.4167

對應的 image001.txt 內容:

0 0.3125 0.5208 0.3125 0.4167

如果同一張圖片有多個物件,每個物件一行:

0 0.3125 0.5208 0.3125 0.4167
1 0.7500 0.6000 0.2000 0.3000

三、資料集目錄結構

YOLOv8 預期的資料集結構非常明確:

dataset/
├── data.yaml           # 資料集設定檔
├── train/
│   ├── images/         # 訓練圖片
│   │   ├── img001.jpg
│   │   ├── img002.jpg
│   │   └── ...
│   └── labels/         # 訓練標註
│       ├── img001.txt
│       ├── img002.txt
│       └── ...
├── valid/
│   ├── images/         # 驗證圖片
│   └── labels/         # 驗證標註
└── test/               # (選用)測試集
    ├── images/
    └── labels/

關鍵規則:

  • 圖片和標註檔必須同名(只有副檔名不同)
  • images/labels/ 資料夾必須在同一層目錄下
  • 沒有物件的圖片,對應的 .txt 檔可以是空的(或不建立)

四、data.yaml 設定檔

data.yaml 是告訴 YOLO 資料集在哪裡、有哪些類別的設定檔。

基本結構

# 資料集路徑(可用絕對或相對路徑)
path: /path/to/dataset    # 資料集根目錄
train: train/images       # 訓練集相對於 path 的路徑
val: valid/images         # 驗證集相對於 path 的路徑
test: test/images         # (選用)測試集

# 類別定義
names:
  0: cat
  1: dog
  2: bird

實際範例:寵物偵測資料集

path: ./pet_dataset
train: train/images
val: valid/images

names:
  0: cat
  1: dog
  2: rabbit
  3: hamster

使用這個設定檔訓練

from ultralytics import YOLO

model = YOLO('yolov8n.pt')
results = model.train(data='pet_dataset/data.yaml', epochs=100)

五、格式轉換

如果你的標註檔是其他格式(例如 COCO、Pascal VOC),需要轉換為 YOLO 格式。

COCO 格式轉 YOLO 格式

COCO 格式使用 JSON 檔案,標註是絕對像素座標:

{
  "images": [...],
  "annotations": [
    {
      "image_id": 1,
      "category_id": 1,
      "bbox": [100, 150, 200, 200]  // [x, y, width, height]
    }
  ],
  "categories": [...]
}

轉換腳本:

import json
import os

def coco_to_yolo(coco_json_path, output_dir, image_dir):
    """將 COCO 格式轉換為 YOLO 格式"""

    with open(coco_json_path, 'r') as f:
        coco_data = json.load(f)

    # 建立圖片 ID 到檔名和尺寸的映射
    images = {img['id']: img for img in coco_data['images']}

    # 建立類別 ID 映射(COCO 類別 ID 可能不連續)
    category_map = {cat['id']: idx for idx, cat in enumerate(coco_data['categories'])}

    # 依照圖片分組標註
    annotations_by_image = {}
    for ann in coco_data['annotations']:
        img_id = ann['image_id']
        if img_id not in annotations_by_image:
            annotations_by_image[img_id] = []
        annotations_by_image[img_id].append(ann)

    os.makedirs(output_dir, exist_ok=True)

    # 轉換每張圖片的標註
    for img_id, img_info in images.items():
        img_w = img_info['width']
        img_h = img_info['height']
        file_name = os.path.splitext(img_info['file_name'])[0]

        yolo_lines = []
        for ann in annotations_by_image.get(img_id, []):
            # COCO bbox: [x, y, width, height](左上角座標)
            x, y, w, h = ann['bbox']

            # 轉換為 YOLO 格式(中心點、正規化)
            x_center = (x + w / 2) / img_w
            y_center = (y + h / 2) / img_h
            width = w / img_w
            height = h / img_h

            class_id = category_map[ann['category_id']]
            yolo_lines.append(f"{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}")

        # 寫入 YOLO 標註檔
        output_path = os.path.join(output_dir, f"{file_name}.txt")
        with open(output_path, 'w') as f:
            f.write('\n'.join(yolo_lines))

# 使用方式
coco_to_yolo(
    'annotations.json',
    'labels/',
    'images/'
)

Pascal VOC 格式轉 YOLO 格式

Pascal VOC 使用 XML 檔案,每張圖片一個:

<annotation>
  <size>
    <width>640</width>
    <height>480</height>
  </size>
  <object>
    <name>cat</name>
    <bndbox>
      <xmin>100</xmin>
      <ymin>150</ymin>
      <xmax>300</xmax>
      <ymax>350</ymax>
    </bndbox>
  </object>
</annotation>

轉換腳本:

import xml.etree.ElementTree as ET
import os

def voc_to_yolo(xml_path, class_names):
    """將單個 VOC XML 轉換為 YOLO 格式字串"""

    tree = ET.parse(xml_path)
    root = tree.getroot()

    # 取得圖片尺寸
    size = root.find('size')
    img_w = int(size.find('width').text)
    img_h = int(size.find('height').text)

    yolo_lines = []
    for obj in root.findall('object'):
        class_name = obj.find('name').text
        if class_name not in class_names:
            continue

        class_id = class_names.index(class_name)

        bbox = obj.find('bndbox')
        xmin = float(bbox.find('xmin').text)
        ymin = float(bbox.find('ymin').text)
        xmax = float(bbox.find('xmax').text)
        ymax = float(bbox.find('ymax').text)

        # 轉換為 YOLO 格式
        x_center = (xmin + xmax) / 2 / img_w
        y_center = (ymin + ymax) / 2 / img_h
        width = (xmax - xmin) / img_w
        height = (ymax - ymin) / img_h

        yolo_lines.append(f"{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}")

    return '\n'.join(yolo_lines)

# 批次轉換
def batch_convert_voc_to_yolo(voc_dir, output_dir, class_names):
    os.makedirs(output_dir, exist_ok=True)

    for xml_file in os.listdir(voc_dir):
        if not xml_file.endswith('.xml'):
            continue

        xml_path = os.path.join(voc_dir, xml_file)
        yolo_content = voc_to_yolo(xml_path, class_names)

        output_path = os.path.join(output_dir, xml_file.replace('.xml', '.txt'))
        with open(output_path, 'w') as f:
            f.write(yolo_content)

# 使用方式
class_names = ['cat', 'dog', 'bird']
batch_convert_voc_to_yolo('voc_annotations/', 'yolo_labels/', class_names)

六、資料增強策略

資料增強是用程式自動產生更多變化版本的訓練資料,讓模型學到更多樣的特徵。

YOLOv8 內建的資料增強

YOLOv8 訓練時會自動套用這些增強:

from ultralytics import YOLO

model = YOLO('yolov8n.pt')

# 這些是預設值,可以自行調整
results = model.train(
    data='data.yaml',
    epochs=100,

    # 幾何變換
    flipud=0.0,        # 上下翻轉機率
    fliplr=0.5,        # 左右翻轉機率
    degrees=0.0,       # 旋轉角度範圍(-degrees ~ +degrees)
    translate=0.1,     # 平移範圍(圖片尺寸的比例)
    scale=0.5,         # 縮放範圍
    shear=0.0,         # 剪切角度
    perspective=0.0,   # 透視變換

    # 色彩變換
    hsv_h=0.015,       # 色相變化範圍
    hsv_s=0.7,         # 飽和度變化範圍
    hsv_v=0.4,         # 明度變化範圍

    # 進階增強
    mosaic=1.0,        # Mosaic 增強機率
    mixup=0.0,         # MixUp 增強機率
    copy_paste=0.0,    # Copy-Paste 增強機率
)

Mosaic 增強

Mosaic 是 YOLO 的招牌資料增強技術,將 4 張圖片拼成一張:

+--------+--------+
| 圖片 1  | 圖片 2  |
+--------+--------+
| 圖片 3  | 圖片 4  |
+--------+--------+

好處:

  • 一次訓練看到更多物件
  • 學習不同背景下的物件
  • 提升小物件的偵測能力

MixUp 增強

MixUp 將兩張圖片「混合」(透明度疊加),標註也按比例混合:

混合圖片 = 0.5 * 圖片A + 0.5 * 圖片B

七、使用 Albumentations 進行進階資料增強

Albumentations 是專業的影像增強函式庫,可以和 YOLO 搭配使用。

安裝

pip install albumentations

基本範例:離線增強資料集

import albumentations as A
import cv2
import os

def augment_dataset(image_dir, label_dir, output_image_dir, output_label_dir, num_augmented=3):
    """對資料集進行離線增強"""

    # 定義增強流程(標註會自動轉換)
    transform = A.Compose([
        A.HorizontalFlip(p=0.5),
        A.RandomBrightnessContrast(p=0.5),
        A.GaussNoise(var_limit=(10, 50), p=0.3),
        A.Blur(blur_limit=3, p=0.2),
        A.Rotate(limit=15, p=0.3),
    ], bbox_params=A.BboxParams(
        format='yolo',           # 使用 YOLO 格式
        label_fields=['class_labels']
    ))

    os.makedirs(output_image_dir, exist_ok=True)
    os.makedirs(output_label_dir, exist_ok=True)

    for image_file in os.listdir(image_dir):
        if not image_file.lower().endswith(('.jpg', '.png', '.jpeg')):
            continue

        # 讀取圖片
        image_path = os.path.join(image_dir, image_file)
        image = cv2.imread(image_path)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

        # 讀取標註
        label_file = os.path.splitext(image_file)[0] + '.txt'
        label_path = os.path.join(label_dir, label_file)

        bboxes = []
        class_labels = []
        if os.path.exists(label_path):
            with open(label_path, 'r') as f:
                for line in f:
                    parts = line.strip().split()
                    if len(parts) == 5:
                        class_id = int(parts[0])
                        bbox = [float(x) for x in parts[1:5]]
                        bboxes.append(bbox)
                        class_labels.append(class_id)

        # 儲存原始圖片
        base_name = os.path.splitext(image_file)[0]
        cv2.imwrite(
            os.path.join(output_image_dir, image_file),
            cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
        )
        if bboxes:
            with open(os.path.join(output_label_dir, label_file), 'w') as f:
                for cls, bbox in zip(class_labels, bboxes):
                    f.write(f"{cls} {bbox[0]:.6f} {bbox[1]:.6f} {bbox[2]:.6f} {bbox[3]:.6f}\n")

        # 產生增強版本
        for i in range(num_augmented):
            try:
                transformed = transform(
                    image=image,
                    bboxes=bboxes,
                    class_labels=class_labels
                )

                aug_image = transformed['image']
                aug_bboxes = transformed['bboxes']
                aug_labels = transformed['class_labels']

                # 儲存增強後的圖片
                aug_image_file = f"{base_name}_aug{i}.jpg"
                cv2.imwrite(
                    os.path.join(output_image_dir, aug_image_file),
                    cv2.cvtColor(aug_image, cv2.COLOR_RGB2BGR)
                )

                # 儲存增強後的標註
                aug_label_file = f"{base_name}_aug{i}.txt"
                with open(os.path.join(output_label_dir, aug_label_file), 'w') as f:
                    for cls, bbox in zip(aug_labels, aug_bboxes):
                        f.write(f"{cls} {bbox[0]:.6f} {bbox[1]:.6f} {bbox[2]:.6f} {bbox[3]:.6f}\n")

            except Exception as e:
                print(f"增強失敗 {image_file}: {e}")
                continue

# 使用方式
augment_dataset(
    'dataset/train/images',
    'dataset/train/labels',
    'dataset_augmented/train/images',
    'dataset_augmented/train/labels',
    num_augmented=3  # 每張圖產生 3 個增強版本
)

常用的增強組合

# 輕度增強(適合資料量充足時)
light_transform = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(brightness_limit=0.1, contrast_limit=0.1, p=0.5),
], bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))

# 中度增強(一般情況)
medium_transform = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.1, rotate_limit=15, p=0.5),
    A.RandomBrightnessContrast(p=0.5),
    A.GaussNoise(p=0.2),
], bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))

# 重度增強(資料量不足時)
heavy_transform = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.VerticalFlip(p=0.2),
    A.ShiftScaleRotate(shift_limit=0.2, scale_limit=0.3, rotate_limit=30, p=0.7),
    A.RandomBrightnessContrast(brightness_limit=0.3, contrast_limit=0.3, p=0.5),
    A.GaussNoise(var_limit=(10, 80), p=0.3),
    A.Blur(blur_limit=5, p=0.3),
    A.CLAHE(p=0.2),
    A.HueSaturationValue(p=0.3),
], bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))

八、實作練習:準備一個完整資料集

以下是準備資料集的完整流程:

步驟 1:收集圖片

# 假設你已經有一批圖片在 raw_images/ 資料夾
import os
import shutil

def organize_images(source_dir, dest_dir, train_ratio=0.8):
    """將圖片分成訓練集和驗證集"""

    images = [f for f in os.listdir(source_dir)
              if f.lower().endswith(('.jpg', '.png', '.jpeg'))]

    # 隨機打亂
    import random
    random.shuffle(images)

    # 計算分割點
    split_idx = int(len(images) * train_ratio)
    train_images = images[:split_idx]
    valid_images = images[split_idx:]

    # 建立目錄結構
    for split, image_list in [('train', train_images), ('valid', valid_images)]:
        img_dir = os.path.join(dest_dir, split, 'images')
        lbl_dir = os.path.join(dest_dir, split, 'labels')
        os.makedirs(img_dir, exist_ok=True)
        os.makedirs(lbl_dir, exist_ok=True)

        for img in image_list:
            shutil.copy(
                os.path.join(source_dir, img),
                os.path.join(img_dir, img)
            )

    print(f"訓練集:{len(train_images)} 張")
    print(f"驗證集:{len(valid_images)} 張")

organize_images('raw_images/', 'my_dataset/')

步驟 2:使用 LabelImg 標註

# 啟動 LabelImg
labelImg my_dataset/train/images my_dataset/classes.txt my_dataset/train/labels

classes.txt 內容(每行一個類別):

cat
dog
bird

步驟 3:建立 data.yaml

# 自動產生 data.yaml
def create_data_yaml(dataset_dir, class_names, output_path):
    import yaml

    data = {
        'path': os.path.abspath(dataset_dir),
        'train': 'train/images',
        'val': 'valid/images',
        'names': {i: name for i, name in enumerate(class_names)}
    }

    with open(output_path, 'w') as f:
        yaml.dump(data, f, default_flow_style=False, allow_unicode=True)

    print(f"data.yaml 已建立:{output_path}")

create_data_yaml(
    'my_dataset/',
    ['cat', 'dog', 'bird'],
    'my_dataset/data.yaml'
)

步驟 4:驗證資料集

def validate_dataset(data_yaml_path):
    """檢查資料集的完整性"""
    import yaml

    with open(data_yaml_path, 'r') as f:
        data = yaml.safe_load(f)

    base_path = data['path']

    for split in ['train', 'val']:
        img_dir = os.path.join(base_path, data[split])
        lbl_dir = img_dir.replace('images', 'labels')

        images = set(os.path.splitext(f)[0] for f in os.listdir(img_dir)
                    if f.lower().endswith(('.jpg', '.png', '.jpeg')))
        labels = set(os.path.splitext(f)[0] for f in os.listdir(lbl_dir)
                    if f.endswith('.txt'))

        missing_labels = images - labels
        orphan_labels = labels - images

        print(f"\n{split} 資料集:")
        print(f"  圖片數量:{len(images)}")
        print(f"  標註數量:{len(labels)}")

        if missing_labels:
            print(f"  缺少標註:{len(missing_labels)} 個")
        if orphan_labels:
            print(f"  孤立標註:{len(orphan_labels)} 個")

validate_dataset('my_dataset/data.yaml')

總結

這篇文章涵蓋了資料集準備的完整流程:

主題 重點
標註工具 LabelImg(本地)、Roboflow(雲端)、CVAT(企業級)
YOLO 格式 class x_center y_center width height,座標正規化到 0~1
目錄結構 images/ 和 labels/ 對應,檔名相同
data.yaml 定義路徑和類別名稱
資料增強 YOLOv8 內建 Mosaic、可搭配 Albumentations

下一篇我們會進入模型訓練,學習如何調整超參數、監控訓練過程,以及處理常見的訓練問題。


延伸資源

YOLO 資料集準備 – 進階測驗

測試你對格式轉換、座標計算和資料增強的深入理解

1. 座標計算題 計算題

假設有一張 800×600 的圖片,物件框框的左上角座標是 (200, 150),右下角是 (400, 450)。請計算 YOLO 格式的 x_center 值(取到小數點後兩位)。

2. 格式差異題 比較分析

COCO 格式的 bbox 是 [x, y, width, height],其中 (x, y) 代表什麼?這和 YOLO 格式有什麼不同?

3. 資料增強配置題 實作應用

在 YOLOv8 訓練時,以下哪個增強配置最適合用於「訓練後期減少增強干擾」的情境?

# 配置 A
mosaic=1.0, mixup=0.5

# 配置 B
mosaic=0.0, hsv_h=0.015

# 配置 C
fliplr=0.5, degrees=45

# 配置 D
mosaic=0.0, mixup=0.0, fliplr=0.5

4. 程式碼分析題 除錯

以下的 VOC 轉 YOLO 程式碼有一個潛在問題,是什麼?

def voc_to_yolo(xml_path, class_names):
    tree = ET.parse(xml_path)
    root = tree.getroot()
    size = root.find('size')
    img_w = int(size.find('width').text)
    img_h = int(size.find('height').text)

    for obj in root.findall('object'):
        class_name = obj.find('name').text
        class_id = class_names.index(class_name)  # <-- 這行
        # ... 後續處理

5. Albumentations 應用題 進階應用

使用 Albumentations 進行物件偵測的資料增強時,為什麼需要設定 bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels'])

進階測驗完成!

0/5

]]>
https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9103-%e8%b3%87%e6%96%99%e9%9b%86%e6%ba%96%e5%82%99%ef%bc%9a%e6%a8%99%e8%a8%bb%e3%80%81%e6%a0%bc%e5%bc%8f%e8%bd%89%e6%8f%9b/feed/ 0
【YOLO 物件偵測教學】#02 環境建置:用 Ultralytics 跑你的第一個 YOLO 模型 https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9102-%e7%92%b0%e5%a2%83%e5%bb%ba%e7%bd%ae%ef%bc%9a%e7%94%a8-ultralytics-%e8%b7%91%e4%bd%a0%e7%9a%84%e7%ac%ac%e4%b8%80/ https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9102-%e7%92%b0%e5%a2%83%e5%bb%ba%e7%bd%ae%ef%bc%9a%e7%94%a8-ultralytics-%e8%b7%91%e4%bd%a0%e7%9a%84%e7%ac%ac%e4%b8%80/#respond Wed, 28 Jan 2026 14:07:01 +0000 https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9102-%e7%92%b0%e5%a2%83%e5%bb%ba%e7%bd%ae%ef%bc%9a%e7%94%a8-ultralytics-%e8%b7%91%e4%bd%a0%e7%9a%84%e7%ac%ac%e4%b8%80/

測驗:YOLO 環境建置與第一個模型

共 5 題,點選答案後會立即顯示結果

1. 安裝 Ultralytics 套件時,會自動安裝哪些依賴?

  • A. torch、tensorflow、numpy
  • B. torch、opencv-python、numpy
  • C. keras、opencv-python、pandas
  • D. torch、pillow、scipy

2. YOLOv8 模型名稱中的字母代表什麼意義?例如 yolov8n、yolov8s、yolov8m

  • A. 訓練資料集的版本編號
  • B. 模型的發布日期代碼
  • C. 模型大小,n=nano, s=small, m=medium 等
  • D. 支援的影像解析度等級

3. 使用 Python API 取得偵測結果時,box.xyxy 的座標格式代表什麼?

  • A. 左上角 (x1, y1) 和右下角 (x2, y2) 座標
  • B. 中心點 (cx, cy) 和寬高 (w, h)
  • C. 四個角落的 x 座標
  • D. 相對於圖片的百分比位置

4. YOLOv8 預訓練模型使用哪個資料集訓練,可以辨識多少種物件?

  • A. ImageNet,1000 種物件
  • B. COCO,80 種物件
  • C. PASCAL VOC,20 種物件
  • D. Open Images,500 種物件

5. 當信心度(confidence)為 0.72 時,這代表模型對這個偵測的把握程度如何?

  • A. 很確定(0.9 以上)
  • B. 還蠻確定(0.7-0.9)
  • C. 有點不確定(0.5-0.7)
  • D. 可能是誤判(0.5 以下)

前言

上一篇我們認識了 YOLO 的核心概念,了解它如何一次看完整張圖片來偵測物件。這篇要動手做了——安裝 Ultralytics 套件,然後用預訓練模型跑一張圖片,看看 YOLO 能偵測出什麼。

讀完這篇,你會學到:

  • 安裝 Ultralytics 套件和相關依賴
  • 使用預訓練模型進行物件偵測
  • 理解 YOLO 的輸入輸出格式
  • 用 Python 和 CLI 兩種方式執行偵測

環境需求

在開始之前,先確認你的環境符合以下條件:

Python 版本

Python 3.8 以上(建議 3.10 或 3.11

檢查你的 Python 版本:

python --version
# 輸出範例:Python 3.11.4

GPU 支援(可選但建議)

YOLO 可以純 CPU 跑,但 GPU 會快很多。如果你有 NVIDIA 顯卡,確認已安裝 CUDA:

nvidia-smi

看到類似這樣的輸出就表示 GPU 可用:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05   Driver Version: 535.104.05   CUDA Version: 12.2    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0  On |                  N/A |
+-------------------------------+----------------------+----------------------+

沒有 GPU 也沒關係,Ultralytics 會自動偵測並使用 CPU。

安裝 Ultralytics

基本安裝

最簡單的方式,一行搞定:

pip install ultralytics

這會安裝 Ultralytics 套件和所有必要的依賴,包括:

  • torch(PyTorch,深度學習框架)
  • opencv-python(影像處理)
  • numpy(數值運算)

驗證安裝

安裝完成後,確認可以正常 import:

from ultralytics import YOLO
print("Ultralytics 安裝成功!")

或用 CLI 檢查版本:

yolo version
# 輸出範例:8.0.200

下載預訓練模型

Ultralytics 提供多種預訓練模型,差別在於大小和準確度:

模型 參數量 速度 準確度
YOLOv8n 3.2M 最快 較低
YOLOv8s 11.2M 中等
YOLOv8m 25.9M 中等 較高
YOLOv8l 43.7M
YOLOv8x 68.2M 最慢 最高

字母代表大小:n(nano)、s(small)、m(medium)、l(large)、x(extra large)。

新手建議從 yolov8n 開始,輕量又快速。

模型會自動下載

第一次使用時,Ultralytics 會自動下載模型到 ~/.cache/ultralytics/ 目錄:

from ultralytics import YOLO

# 第一次執行會自動下載 yolov8n.pt
model = YOLO("yolov8n.pt")

你也可以手動下載:

yolo predict model=yolov8n.pt source=https://ultralytics.com/images/bus.jpg

CLI 使用方式

Ultralytics 提供了方便的命令列工具,不用寫程式就能跑偵測。

基本語法

yolo predict model=模型檔 source=輸入來源

偵測圖片

yolo predict model=yolov8n.pt source=image.jpg

偵測資料夾內所有圖片

yolo predict model=yolov8n.pt source=./images/

偵測影片

yolo predict model=yolov8n.pt source=video.mp4

使用網路攝影機

yolo predict model=yolov8n.pt source=0

調整信心閾值

只顯示信心度超過 0.5 的偵測結果:

yolo predict model=yolov8n.pt source=image.jpg conf=0.5

輸出結果

預設結果會存到 runs/detect/predict/ 目錄。你可以指定輸出位置:

yolo predict model=yolov8n.pt source=image.jpg project=output name=my_result

結果會存到 output/my_result/

Python API 使用方式

如果你想在程式中使用 YOLO,Python API 更靈活。

最簡單的範例

from ultralytics import YOLO

# 載入預訓練模型
model = YOLO("yolov8n.pt")

# 執行偵測
results = model("image.jpg")

# 顯示結果
results[0].show()

儲存結果圖片

from ultralytics import YOLO

model = YOLO("yolov8n.pt")
results = model("image.jpg")

# 儲存標註後的圖片
results[0].save("output.jpg")

取得偵測資訊

這是最重要的部分——如何讀懂偵測結果:

from ultralytics import YOLO

model = YOLO("yolov8n.pt")
results = model("image.jpg")

# 取得第一張圖的結果
result = results[0]

# 遍歷每個偵測到的物件
for box in result.boxes:
    # 取得 bounding box 座標 (x1, y1, x2, y2)
    coords = box.xyxy[0].tolist()
    x1, y1, x2, y2 = coords

    # 取得信心度(0-1 之間)
    confidence = box.conf[0].item()

    # 取得類別 ID
    class_id = int(box.cls[0].item())

    # 取得類別名稱
    class_name = result.names[class_id]

    print(f"偵測到:{class_name}")
    print(f"  位置:({x1:.0f}, {y1:.0f}) 到 ({x2:.0f}, {y2:.0f})")
    print(f"  信心度:{confidence:.2%}")
    print()

輸出範例:

偵測到:person
  位置:(42, 85) 到 (198, 520)
  信心度:92.34%

偵測到:car
  位置:(320, 200) 到 (580, 380)
  信心度:87.65%

解讀偵測結果

讓我們深入理解 YOLO 的輸出格式。

Bounding Box(邊界框)

YOLO 用矩形框住偵測到的物件。座標有兩種格式:

xyxy 格式(左上角和右下角):

box.xyxy  # tensor([[x1, y1, x2, y2]])
  • (x1, y1):左上角座標
  • (x2, y2):右下角座標

xywh 格式(中心點和寬高):

box.xywh  # tensor([[cx, cy, w, h]])
  • (cx, cy):中心點座標
  • (w, h):寬度和高度

Confidence(信心度)

表示模型對這個偵測的把握程度,範圍 0 到 1:

box.conf  # tensor([0.9234])
  • 0.9 以上:很確定
  • 0.7-0.9:還蠻確定
  • 0.5-0.7:有點不確定
  • 0.5 以下:可能是誤判

Class(類別)

YOLOv8 預訓練模型使用 COCO 資料集,能辨識 80 種物件:

# 類別 ID(整數)
box.cls  # tensor([0])  # 0 = person

# 查詢類別名稱
result.names[0]  # 'person'

常見類別對照:

  • 0: person
  • 1: bicycle
  • 2: car
  • 3: motorcycle
  • 5: bus
  • 7: truck
  • 16: dog
  • 17: cat

完整列表可以這樣查看:

from ultralytics import YOLO
model = YOLO("yolov8n.pt")
print(model.names)

完整範例:偵測圖片中的所有物件

把以上學到的串起來:

from ultralytics import YOLO

def detect_objects(image_path, conf_threshold=0.5):
    """偵測圖片中的物件並列出結果"""

    # 載入模型
    model = YOLO("yolov8n.pt")

    # 執行偵測,設定信心閾值
    results = model(image_path, conf=conf_threshold)

    # 取得結果
    result = results[0]

    # 統計各類別數量
    counts = {}

    for box in result.boxes:
        class_id = int(box.cls[0].item())
        class_name = result.names[class_id]
        confidence = box.conf[0].item()

        # 統計
        counts[class_name] = counts.get(class_name, 0) + 1

        # 印出詳細資訊
        coords = box.xyxy[0].tolist()
        print(f"{class_name}: {confidence:.1%} @ {[int(c) for c in coords]}")

    print(f"\n總共偵測到 {len(result.boxes)} 個物件")
    print("各類別數量:", counts)

    # 儲存標註後的圖片
    result.save("detected.jpg")
    print("結果已儲存到 detected.jpg")

# 使用範例
detect_objects("street.jpg")

常見問題

Q: 第一次執行很慢?

A: 第一次會下載模型和編譯 CUDA kernel,之後就快了。

Q: 出現 CUDA out of memory?

A: 試試較小的模型(如 yolov8n)或降低圖片大小:

results = model("image.jpg", imgsz=640)  # 預設 640,可以改小

Q: 偵測不到想要的物件?

A: 預訓練模型只能辨識 COCO 資料集的 80 種物件。如果你要偵測其他物件(如特定零件、產品),需要自己訓練模型,這是後續文章的內容。

Q: 如何提高偵測準確度?

A: 換用較大的模型(如 yolov8m 或 yolov8l),但速度會變慢。

小結

這篇我們學會了:

  1. 安裝 Ultralytics:一行 pip install ultralytics 搞定
  2. 選擇模型:n/s/m/l/x 代表不同大小,越大越準但越慢
  3. CLI 用法yolo predict model=模型 source=來源 快速測試
  4. Python API:載入模型、執行偵測、解讀結果
  5. 輸出格式:bounding box 座標、confidence 信心度、class 類別

下一篇,我們會學習如何準備自己的訓練資料集,為訓練自訂模型做準備。


延伸資源

進階測驗:YOLO 環境建置與第一個模型

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你需要在一個資源有限的嵌入式裝置上部署物件偵測功能,需要在速度和準確度之間取得平衡。你應該選擇哪個模型? 情境題

  • A. yolov8x – 追求最高準確度
  • B. yolov8n – 最輕量快速,適合資源受限環境
  • C. yolov8l – 大模型通常更穩定
  • D. yolov8m – 中等大小一定是最佳選擇

2. 小華執行偵測程式時出現以下錯誤訊息,最可能的原因是什麼? 錯誤診斷

RuntimeError: CUDA out of memory. Tried to allocate 256.00 MiB
  • A. Python 版本不相容
  • B. Ultralytics 套件安裝不完整
  • C. GPU 記憶體不足,應換用較小的模型或降低圖片大小
  • D. 輸入的圖片格式不支援

3. 你想從偵測結果中篩選出所有信心度超過 80% 的「person」類別。根據文件內容,以下哪段程式碼的邏輯是正確的? 情境題

for box in result.boxes: class_id = int(box.cls[0].item()) class_name = result.names[class_id] confidence = box.conf[0].item() # 篩選條件寫在這裡
  • A. if class_name == “person” and confidence > 80:
  • B. if class_name == “person” and confidence > 0.8:
  • C. if class_id == “person” and confidence > 0.8:
  • D. if result.names == “person” and box.conf > 80:

4. 小明想偵測工廠產線上的特定零件瑕疵,但執行預訓練模型後完全偵測不到任何物件。根據文件內容,最可能的原因是什麼? 錯誤診斷

  • A. 圖片解析度太低
  • B. 預訓練模型只能辨識 COCO 資料集的 80 種物件,特定零件不在其中
  • C. 需要先執行 nvidia-smi 啟用 GPU
  • D. 信心閾值設定太低導致過濾掉所有結果

5. 你需要用 CLI 偵測 images 資料夾中的所有圖片,只顯示信心度超過 0.6 的結果,並將輸出存到 results/test1 目錄。以下哪個指令是正確的? 情境題

  • A. yolo predict model=yolov8n.pt source=images conf=60 output=results/test1
  • B. yolo detect model=yolov8n.pt source=./images/ conf=0.6 save=results/test1
  • C. yolo predict model=yolov8n.pt source=./images/ threshold=0.6 project=results name=test1
  • D. yolo predict model=yolov8n.pt source=./images/ conf=0.6 project=results name=test1
]]>
https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9102-%e7%92%b0%e5%a2%83%e5%bb%ba%e7%bd%ae%ef%bc%9a%e7%94%a8-ultralytics-%e8%b7%91%e4%bd%a0%e7%9a%84%e7%ac%ac%e4%b8%80/feed/ 0
【YOLO 物件偵測教學】#01 YOLO 是什麼?一次看完就懂的物件偵測入門 https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9101-yolo-%e6%98%af%e4%bb%80%e9%ba%bc%ef%bc%9f%e4%b8%80%e6%ac%a1%e7%9c%8b%e5%ae%8c%e5%b0%b1%e6%87%82%e7%9a%84%e7%89%a9/ https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9101-yolo-%e6%98%af%e4%bb%80%e9%ba%bc%ef%bc%9f%e4%b8%80%e6%ac%a1%e7%9c%8b%e5%ae%8c%e5%b0%b1%e6%87%82%e7%9a%84%e7%89%a9/#respond Wed, 28 Jan 2026 14:06:53 +0000 https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9101-yolo-%e6%98%af%e4%bb%80%e9%ba%bc%ef%bc%9f%e4%b8%80%e6%ac%a1%e7%9c%8b%e5%ae%8c%e5%b0%b1%e6%87%82%e7%9a%84%e7%89%a9/

測驗:YOLO 是什麼?物件偵測入門

共 5 題,點選答案後會立即顯示結果

1. YOLO 的全名是什麼?

  • A. Your Object Locator Online
  • B. You Only Locate Once
  • C. You Only Look Once
  • D. Yield Object Learning Output

2. 物件偵測與圖像分類最大的差異是什麼?

  • A. 物件偵測只能處理黑白圖片
  • B. 物件偵測需要同時判斷物體的類別和位置
  • C. 物件偵測只能辨識一種物體
  • D. 物件偵測的準確度一定比較低

3. YOLO 相較於傳統兩階段偵測器(如 Faster R-CNN)的主要優勢是什麼?

  • A. 準確度更高
  • B. 需要更少的訓練資料
  • C. 可以偵測更多類別
  • D. 速度更快,適合即時處理

4. YOLO 的網格系統中,哪個網格負責偵測一個物體?

  • A. 物體佔據最多面積的網格
  • B. 物體左上角所在的網格
  • C. 物體中心點所在的網格
  • D. 所有與物體重疊的網格

5. NMS(Non-Maximum Suppression)的主要用途是什麼?

  • A. 提高模型的訓練速度
  • B. 移除重複的偵測框
  • C. 增加偵測的類別數量
  • D. 調整圖片的輸入大小

前言

當你在使用 AI 輔助開發時,是否曾遇過需要在影像中找出特定物體的需求?無論是自駕車偵測行人、監控系統辨識可疑行為,還是零售店的自動結帳系統,這些應用的背後都有一個共同的技術:物件偵測(Object Detection)

而在眾多物件偵測演算法中,YOLO(You Only Look Once) 因其驚人的速度和不錯的準確度,成為業界最受歡迎的選擇之一。本篇文章將帶你從零開始認識 YOLO,讓你在閱讀專案程式碼或使用相關 AI 工具時,能夠理解背後的運作原理。


物件偵測是什麼?

在深入 YOLO 之前,讓我們先釐清三個常被混淆的電腦視覺任務:

圖像分類 vs 物件偵測 vs 語義分割

任務 輸入 輸出 回答的問題
圖像分類 一張圖片 一個類別標籤 這張圖片「是什麼」?
物件偵測 一張圖片 多個邊界框 + 類別 圖片中「有什麼」、「在哪裡」?
語義分割 一張圖片 每個像素的類別 每個像素「屬於什麼」?

簡單來說:

  • 圖像分類:判斷整張圖片屬於哪一類(例如:這是一隻貓)
  • 物件偵測:找出圖片中所有物體的位置和類別(例如:左上角有一隻貓,右下角有一隻狗)
  • 語義分割:為圖片中每一個像素標記類別(例如:這些像素是天空,那些是建築物)

物件偵測在實際應用中最為常見,因為我們通常需要知道物體「在哪裡」才能做出對應的決策。


YOLO 的核心理念:You Only Look Once

YOLO 的全名是 You Only Look Once,中文可以理解為「只看一眼」。這個名字精準地描述了 YOLO 的設計哲學。

傳統方法:兩階段偵測器

在 YOLO 出現之前,主流的物件偵測方法是兩階段偵測器(Two-Stage Detector),最具代表性的就是 Faster R-CNN:

第一階段:區域提議網路(RPN)
├── 掃描整張圖片
├── 產生數千個「可能有物體」的候選區域
└── 輸出候選框(Region Proposals)

第二階段:分類與精修
├── 對每個候選區域進行分類
├── 精修邊界框座標
└── 輸出最終偵測結果

這種方法準確度高,但速度慢。想像一下:你要在一張圖片中找到所有的車輛,傳統方法是先標記出數千個「可能是車」的區域,然後逐一檢查每個區域是不是真的有車。

YOLO 的革新:單階段偵測器

YOLO 打破了這個範式,將整個偵測流程濃縮成一次前向傳播

YOLO 的處理流程
├── 輸入圖片
├── 通過單一卷積神經網路
└── 直接輸出所有物體的位置和類別

這就像是:一個經驗豐富的駕駛員只需要掃視一眼路況,就能同時注意到前方的車輛、行人、紅綠燈,而不需要逐一確認每個物體。


YOLO 如何運作?網格與邊界框

讓我們用一個簡化的例子來理解 YOLO 的運作原理:

步驟一:將圖片切成網格

YOLO 首先將輸入圖片劃分成 S x S 的網格(最初版本是 7×7):

┌───┬───┬───┬───┬───┬───┬───┐
│   │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┤
│   │   │ * │   │   │   │   │  ← 物體中心落在這個格子
├───┼───┼───┼───┼───┼───┼───┤
│   │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┤
│   │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┤
│   │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┤
│   │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┤
│   │   │   │   │   │   │   │
└───┴───┴───┴───┴───┴───┴───┘

關鍵規則:如果物體的中心點落在某個網格中,該網格就負責偵測這個物體。

步驟二:每個網格預測邊界框

每個網格會預測 B 個邊界框(Bounding Box),每個邊界框包含 5 個值:

# 邊界框的 5 個預測值
bounding_box = {
    'x': 0.5,        # 邊界框中心的 x 座標(相對於網格)
    'y': 0.3,        # 邊界框中心的 y 座標(相對於網格)
    'w': 0.4,        # 邊界框寬度(相對於整張圖)
    'h': 0.6,        # 邊界框高度(相對於整張圖)
    'confidence': 0.85  # 信心分數:這個框包含物體的機率
}

步驟三:預測類別機率

除了邊界框,每個網格還會預測 C 個類別機率(C 是資料集中的類別數量):

# 假設有 3 個類別
class_probabilities = {
    'car': 0.8,
    'person': 0.1,
    'dog': 0.1
}

步驟四:組合輸出

將以上資訊組合起來,YOLO 的輸出是一個形狀為 S x S x (B * 5 + C) 的張量:

對於 7x7 網格、2 個邊界框、20 個類別:
輸出形狀 = 7 x 7 x (2 * 5 + 20) = 7 x 7 x 30

步驟五:後處理(NMS)

由於多個網格可能偵測到同一個物體,YOLO 使用非極大值抑制(Non-Maximum Suppression, NMS) 來移除重複的偵測框:

NMS 流程:
1. 按信心分數排序所有偵測框
2. 選取信心最高的框
3. 移除與該框重疊度(IoU)過高的其他框
4. 重複步驟 2-3 直到處理完所有框

YOLO 版本演進:從 v1 到 v11

YOLO 自 2015 年問世以來,經歷了多次重大改版。以下是各版本的重要里程碑:

原始系列(Joseph Redmon)

版本 年份 主要特色
YOLOv1 2015 開創性的單階段偵測架構,使用 24 層 CNN
YOLOv2 2016 加入 Batch Normalization、Anchor Boxes、多尺度訓練
YOLOv3 2018 引入 Darknet-53 骨幹網路、多尺度預測

社群發展系列

版本 年份 主要特色
YOLOv4 2020 CSPDarknet53 骨幹、大量資料增強技巧
YOLOv5 2020 PyTorch 實作、輕量化設計、易於部署
YOLOv6 2022 全解耦頭部架構、RepVGG 風格設計
YOLOv7 2022 E-ELAN 架構、進階模型縮放
YOLOv8 2023 無錨點(Anchor-Free)設計、統一框架
YOLOv9 2024 GELAN 架構、可程式化梯度資訊
YOLOv10 2024 無 NMS 訓練、一致性雙重分配
YOLOv11 2024 C3k2 區塊、C2PSA 空間注意力機制

YOLOv11 的重要改進

作為 2024 年 Ultralytics 推出的最新版本,YOLOv11 帶來了幾項關鍵改進:

  1. 更高效的架構:使用 C3k2 區塊取代 C2f,提升推論速度
  2. 空間注意力機制:C2PSA 模組增強特徵提取能力
  3. 更少的參數:相比 YOLOv8m 減少 22% 的參數量
  4. 更快的推論:比 YOLOv10 快約 2%
YOLOv11 模型大小比較:
┌─────────┬────────────┬─────────┐
│ 模型    │ 參數量     │ mAP@50  │
├─────────┼────────────┼─────────┤
│ YOLO11n │ 2.6M       │ ~39.5%  │
│ YOLO11s │ 9.4M       │ ~47.0%  │
│ YOLO11m │ 20.1M      │ ~50.3%  │
└─────────┴────────────┴─────────┘

為什麼 YOLO 這麼快?

YOLO 的速度優勢來自其架構設計:

速度比較

模型 速度(FPS) GPU 延遲
Faster R-CNN 5-7 ~54 ms
YOLOv1 45
YOLOv8 100+ ~1.3 ms

快速的原因

  1. 單次前向傳播:整張圖片只需經過網路一次
  2. 無區域提議:不需要生成候選區域
  3. 端到端訓練:整個網路同時優化
  4. 高效的骨幹網路:專為速度優化的卷積架構

準確度與速度的權衡

┌─────────────────────────────────────────────────┐
│                                                 │
│  高準確度                                        │
│     ▲                                           │
│     │           ┌───────────────┐               │
│     │           │ Faster R-CNN  │               │
│     │           └───────────────┘               │
│     │                                           │
│     │                    ┌───────────┐          │
│     │                    │ YOLOv8    │          │
│     │                    └───────────┘          │
│     │                                           │
│     │    ┌───────────┐                          │
│     │    │ YOLOv1    │                          │
│     │    └───────────┘                          │
│     │                                           │
│     └───────────────────────────────────► 高速度 │
│                                                 │
└─────────────────────────────────────────────────┘

YOLO 的限制

雖然 YOLO 很強大,但也有其限制:

1. 小物體偵測困難

由於每個網格只能偵測有限數量的物體,YOLO 在偵測密集的小物體時表現較差。例如:一群鳥、體育場中的人群。

2. 重疊物體的處理

當多個物體的中心落在同一個網格時,YOLO 可能無法正確偵測所有物體。

3. 泛化能力

對於訓練資料中沒有見過的物體形狀或比例,YOLO 可能會有較差的表現。


YOLO 的實際應用場景

自駕車

YOLO 被廣泛應用於自動駕駛系統,用於即時偵測:

  • 行人和自行車騎士
  • 其他車輛
  • 交通號誌和標誌
  • 路面障礙物

監控系統

在安防領域,YOLO 可用於:

  • 即時人員偵測
  • 入侵監測
  • 人流分析
  • 異常行為辨識

零售自動化

零售業使用 YOLO 實現:

  • 無人商店的商品辨識
  • 智慧結帳系統
  • 庫存管理
  • 顧客行為分析

讀懂 YOLO 程式碼的關鍵概念

當你在專案中遇到 YOLO 相關程式碼時,以下是需要理解的核心概念:

常見術語對照

術語 中文 說明
Backbone 骨幹網路 負責提取圖片特徵的主要網路
Neck 頸部網路 融合不同尺度特徵的中間層
Head 頭部網路 輸出最終偵測結果的層
Anchor Box 錨點框 預定義的參考邊界框
IoU 交併比 兩個框重疊程度的指標
NMS 非極大值抑制 移除重複偵測的後處理方法
mAP 平均精度均值 衡量偵測準確度的指標

典型的 YOLO 推論程式碼結構

from ultralytics import YOLO

# 載入模型
model = YOLO('yolo11n.pt')

# 執行推論
results = model('image.jpg')

# 解析結果
for result in results:
    boxes = result.boxes      # 邊界框資訊
    for box in boxes:
        xyxy = box.xyxy      # [x1, y1, x2, y2] 座標
        conf = box.conf      # 信心分數
        cls = box.cls        # 類別編號

總結

本篇文章介紹了 YOLO 物件偵測的基本概念:

  1. 物件偵測不同於圖像分類和語義分割,它需要同時判斷物體的類別和位置
  2. YOLO 是單階段偵測器,將偵測濃縮成一次前向傳播,實現即時處理
  3. 網格系統是 YOLO 的核心設計,每個網格負責偵測中心落在其中的物體
  4. 版本演進從 v1 到 v11,持續在速度和準確度之間取得更好的平衡
  5. 實際應用涵蓋自駕車、監控、零售等多個領域

在下一篇文章中,我們將實際動手安裝 YOLO 環境,並執行第一個物件偵測範例。


參考資源

進階測驗:YOLO 是什麼?進階

共 5 題,需要深入理解文章內容才能作答

1. 若 YOLO 使用 7×7 網格、每個網格預測 2 個邊界框、且有 20 個類別,輸出張量的形狀是什麼?

  • A. 7 x 7 x 22
  • B. 7 x 7 x 25
  • C. 7 x 7 x 30
  • D. 7 x 7 x 50

2. YOLOv11 相較於 YOLOv8 的主要改進包括以下哪項?

  • A. 引入 Anchor Boxes 機制
  • B. 改用兩階段偵測架構
  • C. 使用 Darknet-53 骨幹網路
  • D. 使用 C3k2 區塊和 C2PSA 空間注意力機制

3. 邊界框的 5 個預測值中,x 和 y 座標是相對於什麼而言?w 和 h 又是相對於什麼?

  • A. x, y, w, h 都是相對於整張圖片
  • B. x, y 相對於網格;w, h 相對於整張圖片
  • C. x, y, w, h 都是相對於網格
  • D. x, y 相對於整張圖片;w, h 相對於網格

4. YOLO 在哪種場景下表現較差?

  • A. 偵測密集的小物體(如一群鳥)
  • B. 偵測單一大型物體
  • C. 即時影像串流處理
  • D. 自駕車的行人偵測

5. NMS 流程中,IoU(Intersection over Union)的作用是什麼?

  • A. 計算模型的整體準確度
  • B. 決定邊界框的類別
  • C. 衡量兩個偵測框的重疊程度,決定是否要移除
  • D. 計算網格的劃分方式
]]>
https://blog.itsmygo.uk/2026/01/28/%e3%80%90yolo-%e7%89%a9%e4%bb%b6%e5%81%b5%e6%b8%ac%e6%95%99%e5%ad%b8%e3%80%9101-yolo-%e6%98%af%e4%bb%80%e9%ba%bc%ef%bc%9f%e4%b8%80%e6%ac%a1%e7%9c%8b%e5%ae%8c%e5%b0%b1%e6%87%82%e7%9a%84%e7%89%a9/feed/ 0